
攻撃者が制御できる HTTP リクエストヘッダーに基づいて認証・認可・信頼の判断を行うコードを検出する、小さな Semgrep ルールパックです。
この脆弱性クラスの代表的な例が
CVE-2025-29927 です。Next.js
はミドルウェアを実行するかどうかの判断に x-middleware-subrequest ヘッダーを信頼しており、
細工された値を送り込んだインバウンドリクエストはミドルウェアを完全にスキップできました。
同様の形は、さまざまなフレームワークやエコシステムで繰り返し発生しています。
このパックには、2 つの言語ファミリーと、このバグの 3 つのサブクラスに対するルールが 含まれています。完全に調整された CI ゲートではなく、コードレビューの補助として意図されて います。ルールは精度よりも再現率を優先しており、それぞれの検出結果について人間が判断する 対話的な実行に最も適しています。
この脆弱性クラスとこのパックの設計判断についての詳細は、bk-security.github.io を参照してください。
| ルール | 言語 | 深刻度 | 検出内容 |
|---|---|---|---|
nodejs-header-flag-auth-bypass | JS / TS | Warning | 内部プロトコルや認証バイパスに使われることを示唆する名前のヘッダーの読み取り (x-internal, x-bypass-auth, x-middleware-subrequest, x-admin-override, x-impersonate など) |
nodejs-header-as-identity | JS / TS | Warning | ユーザー ID を運ぶために慣例的に使われるヘッダーの読み取り (x-forwarded-user, x-authenticated-user, x-remote-user など) |
nodejs-forwarded-for-trust | JS / TS | Info | セキュリティ上の判断で一般に信頼される x-forwarded-for、x-real-ip、および類似の送信元 IP ヘッダーの読み取り |
python-header-flag-auth-bypass | Python | Warning | Node.js 版と同じ。Django スタイルの request.META["HTTP_X_*"] アクセスも含む |
python-header-as-identity | Python | Warning | Node.js 版と同じ。Python 版 |
python-forwarded-for-trust | Python | Info | Node.js 版と同じ。Python 版 |
Semgrep をインストールします:
pip install semgrep
ターゲットに対してパックを実行します:
semgrep --config /path/to/auth-header-trust-rules/rules /path/to/target
または、単一のルールを実行します:
semgrep --config /path/to/auth-header-trust-rules/rules/nodejs/header-flag-auth-bypass.yaml /path/to/target
同梱のフィクスチャに対してルールを検証します:
semgrep --test --config rules/ tests/
期待される出力:
6/6: ✓ All tests passed
ルールは、信頼すると危険であることが知られているヘッダー名のキュレーションされたリストに マッチします。一般的なケースは検出できますが、以下は検出できません:
x-some-novel-name を読み取る
getInternalFlag(req) という名前のカスタムヘルパーはルールを通過します。x-internal-*、x-trust-*、x-bypass-* の
ようなパターンを含めることで再現率を優先していますが、新しい名前は
すり抜けます。特定のコードベース向けにパックを拡張する場合、最も価値が高い追加は通常、
フレームワーク固有のヘルパー関数パターンです。コードベースに
isInternalRequest(req) ヘルパーがある場合、それを検出するルールは YAML 1 行で記述できます。
rules/<lang>/<name>.yaml の下にルールを作成します。tests/<lang>/<name>.<ext> の下にテストフィクスチャを作成し、ポジティブな
例には # ruleid: <rule-id>、ネガティブな例には # ok: <rule-id> という
注釈を付けます。semgrep --test --config rules/ tests/ を実行します。新しいルールとフィクスチャは
自動的に検出されます。変更を送信する前にテストが成功している必要があります。MIT.
Bruce Kang. 関連ブログ記事のソースは bk-security.github.io にあります。