
「攻撃対象領域こそが脆弱性だ。そこでバグを見つけるのは単なる詳細にすぎない。」
-- Mark Dowd
「ある詳細は、他の詳細よりも重要である。」
-- Fedor G. Pikus
脆弱性調査を容易にするための私のSemgrepルール集です。
# high priority scan (quick wins)
semgrep --severity ERROR --config "p/0xdea"
# high and medium priority scan (recommended)
semgrep --severity ERROR --severity WARNING --config "p/0xdea"
# full scan (might include marginal findings and more false positives)
semgrep --config "p/0xdea"
あるいは、このGitHubリポジトリをローカルにクローンして、次のように実行することもできます:
# full scan
semgrep --config semgrep-rules/rules /path/to/source
# specific rule scan
semgrep --config semgrep-rules/rules/c/command-injection.yaml /path/to/source
[!TIP]
--no-git-ignoreスイッチを指定すると、Gitの追跡ステータスや.gitignoreルールに関係なくファイルをスキャンできます。
よりスムーズに進めるには、Semgrepスキャン出力をSARIF形式で保存し、VS codeでSARIF Explorerを使用することをお勧めします:
semgrep --sarif --sarif-output=/path/to/source/SEMGREP.sarif --config semgrep-rules/rules /path/to/source
code /path/to/source # then open the SEMGREP.sarif file in VS code with SARIF Explorer
同梱のSARIF出力の例も参照してください。
Semgrep CLI 1.169.0でテスト済み。
実戦で検証済みのC(場合によってはC++)ルールセット。
getsの使用。strcpy、stpcpy、strcatの使用。sprintfおよびvsprintfの使用。scanfファミリーの潜在的に安全でないAPI関数の使用。strncatに渡すサイズ引数の誤り。strncpy、memcpy、およびその亜種に渡すサイズ引数の誤り。strlenの戻り値をshortにキャストすると危険な場合がある。allocaの使用。free後の潜在的な使用。free。freeを呼び出している。malloc、calloc、reallocなどの戻り値をチェックしていない。putenvを呼び出している。systemまたはpopenによる潜在的なOSコマンドインジェクション。access、stat、lstatなどの使用。mktemp、tmpnam、tempnamの使用。signalの使用。setuidおよびseteuidの戻り値をチェックしていない。memsetへの引数の順序の誤り。randおよびsrandの使用。scanfファミリーの関数の戻り値をチェックしていない。atoi、atol、atofの使用。これらのルールはノイズが多すぎる可能性があり、一般的な使用には適さないと見なされています。
--timeベンチマークを実施し、最適化が必要な低速ルールを見つける。snprintfsizeof演算子を誤って使用。strncpyおよびstpncpyの後に明示的なNUL終端がない。snprintfおよびvsnprintfの戻り値の潜在的に安全でない使用。strlcpyおよびstrlcatの戻り値の潜在的に安全でない使用。