
GoKart は Go の静的解析ツールであり、Go ソースコードの SSA(単一静的代入形式)を利用して脆弱性を検出します。変数や関数引数の発生元をトレースし、入力ソースが安全かどうかを判断できるため、他の Go セキュリティスキャナに比べて誤検知が少なくなります。例えば、変数と連結された SQL クエリは従来 SQL インジェクションとフラグが立てられることがありますが、GoKart はその変数が実際には定数または定数と同等であるかどうかを判断できるため、脆弱性がない場合は報告しません。
GoKart はまた、Praetorian のセキュリティプラットフォーム Chariot を強化するために使用されています。Chariot はソースコードやクラウド環境の脆弱性の発見、管理、修正を支援します。Chariot を使えば、GoKart スキャンを自動的かつ継続的にソースコードに対して実行することが簡単に行えます。GoKart を試してみたい場合は、こちら をクリックして数分で無料の Chariot アカウントを設定できます。
静的解析はソースコードの脆弱性を見つける強力な手法です。しかし、そのアプローチはノイズが多いという問題を抱えてきました。つまり、多くの静的解析ツールは実際には存在しない「脆弱性」を多数検出してしまいます。これにより、開発者がツールの「狼が来た」と何度も言うのに飽きてしまい、摩擦が生じていました。
GoKart の動機はこの問題に対処することにありました。既存のツールよりも大幅に誤検知率の低いスキャナを作成できるか? 実験の結果、その答えは「はい」です。ソースからシンクへのトレースと SSA を活用することで、GoKart は変数代入間の変数の汚染を追跡でき、検出結果の精度を大幅に向上させています。私たちはユーザビリティに重点を置いています。実用的には、誤警報を減らすためにアプローチを最適化したことを意味します。
詳細については、こちらのブログ記事 をお読みください。
以下のいずれかの方法で GoKart をローカルにインストールできます。
go install でインストール$ go install github.com/praetorian-inc/gokart@latest
リリースページ からお使いの OS 用のバイナリをダウンロードします。
(オプション)checksums.txt ファイルをダウンロードしてアーカイブの整合性を確認します。
# ダウンロードしたアーカイブのチェックサムを確認
$ shasum -a 256 gokart_${VERSION}_${ARCH}.tar.gz
b05c4d7895be260aa16336f29249c50b84897dab90e1221c9e96af9233751f22 gokart_${VERSION}_${ARCH}.tar.gz
$ cat gokart_${VERSION}_${ARCH}_checksums.txt | grep gokart_${VERSION}_${ARCH}.tar.gz
b05c4d7895be260aa16336f29249c50b84897dab90e1221c9e96af9233751f22 gokart_${VERSION}_${ARCH}.tar.gz
$ tar -xvf gokart_${VERSION}_${ARCH}.tar.gz
gokart バイナリを PATH に移動します:$ mv ./gokart /usr/local/bin/
# GoKart リポジトリをクローン
$ git clone https://github.com/praetorian-inc/gokart.git
# リポジトリディレクトリに移動してビルド
$ cd gokart
$ go build
# gokart バイナリを PATH に移動
$ mv ./gokart /usr/local/bin
Docker イメージをビルド
docker build -t gokart .
ローカルスキャンでコンテナを実行(ローカルスキャンディレクトリをコンテナイメージにマウントする必要があります)
docker run -v /path/to/scan-dir:/scan-dir gokart scan /scan-dir
リモートスキャンでコンテナを実行(認証に秘密鍵を指定する場合、その鍵もコンテナにマウントする必要があります)
docker run gokart scan -r https://github.com/praetorian-inc/gokart
# プライベートリポジトリのSSH認証用に秘密鍵を指定
docker run -v /path/to/key-dir/:/key-dir gokart scan -r [email protected]:praetorian-inc/gokart.git -k /key-dir/ssh_key
# ディレクトリを指定しない場合、デフォルトで '.' になります
gokart scan <flags>
gokart scan <directory> <flags>
gokart help
以下の手順で、Contrast Security チームによる意図的に脆弱性を含む Go アプリケーション Go Test Bench に対して GoKart を実行できます。
# サンプルの脆弱なアプリケーションをクローン
git clone https://github.com/Contrast-Security-OSS/go-test-bench.git
gokart scan go-test-bench/
出力には、特定された脆弱性がいくつか表示され、それぞれに脆弱な関数と特定されたユーザ入力の発生元が示されます。
さらに GoKart の機能をテストするには、以下に示す CLI フラグを使用してスキャンできます。
# 詳細フラグを使用してこれらの脆弱性の完全なトレースを表示
gokart scan go-test-bench/ -v
# globalsTainted フラグを使用してホワイトリスト登録された Source を無視
# 誤検知が増加する可能性があります
gokart scan go-test-bench/ -v -g
# デバッグフラグを使用して内部解析情報を表示
# 開発やデバッグに役立ちます
gokart scan go-test-bench/ -d
# 結果を sarif 形式で出力
gokart scan go-test-bench/ -s
# 結果をファイルに出力
gokart scan go-test-bench/ -o gokart-go-test-bench.txt
# sarif 形式の結果をファイルに出力
gokart scan go-test-bench/ -o gokart-go-test-bench.txt -s
# リモートの公開リポジトリをスキャン
# リポジトリはローカルにクローンされ、スキャン後に削除されます
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -v
# スキャンするリモートブランチを指定
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -b actions_fix
# SSH 経由でリモートのプライベートリポジトリをスキャン
gokart scan -r [email protected]:Contrast-Security-OSS/go-test-bench.git
# リモートのプライベートリポジトリをスキャンし、必要に応じてSSH認証用の鍵を指定
gokart scan -r [email protected]:Contrast-Security-OSS/go-test-bench.git -k /home/gokart/.ssh/github_rsa_key
# リモートスキャンと出力フラグを組み合わせてシームレスなセキュリティレビューを実現
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -o gokart-shiftleft-go-demo.txt -v
# リモートスキャン、出力、sarif フラグを組み合わせてCI/CDへのスムーズな統合を実現
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -o gokart-shiftleft-go-demo.txt -s
GoKart の拡張性を試すには、GoKart が使用する設定ファイルを変更して、新しい脆弱性シンクを解析に導入できます。デフォルトの設定ファイル util/analyzers.yml には Test Sink アナライザが定義されています。util/analyzers.yml を編集して Test Sink アナライザのコメントを解除し、-i フラグで変更した設定ファイルを指定して GoKart を実行します。
# 変更した analyzers.yml ファイルを使用してスキャンし、完全なトレースを出力
gokart scan go-test-bench/ -v -i <path-to-gokart>/util/analyzers.yml
出力には、新たに「ユーザ入力によって到達可能な Test Sink」脆弱性を含む、追加の脆弱性が表示されるはずです。
以下のコマンドを GoKart のルートディレクトリから実行して、付属のテストを実行できます。
go test -v ./...