フック

cors フック:CORS オリジンを監査する

コマンドラインから、ソースコードをスキャンして回避可能な CORS オリジン許可リストを探したり、1 つのオリジン値の許可範囲が広すぎないかを判定したりできます。

cors フックは http-request 専門知識 を支える決定論的なエンジンで、自分で実行することもできます。1 つのコマンドで 2 つのモードが使えます:scan モードはソースコードをスキャンして回避可能なオリジン許可リスト(攻撃者のホストがすり抜けられる、ホスト検証用の正規表現)を探し、score モードは 1 つの CORS オリジンの値を wildcard、null、safe のいずれかに判定します。

コードベースをスキャンする​

フラグを付けなければ、プロジェクト全体をスキャンします。

npx lagune read cors

回避可能な許可リストを、ファイルごとにまとめて 1 つの見出しの下に一覧表示します。信頼するホストのサフィックスより前のオーソリティ部分に .+/.* があるホスト検証(^https?://.+\.trusted\.com)では、your-site.com.attacker.com のような攻撃者のホストがすり抜けてしまいます。

Origin-allowlist patterns with a greedy wildcard (bypassable, review):

internal/auth/origin.go
^https?://.+\.trusted\.com

これは確定した検出事項ではなく、要確認の手がかりです。その正規表現が実際の信頼判断を左右しているかどうかはテキストからは判定できないため、スキャンによって終了コードが変わることはありません。一つひとつ読んで、許可リストが完全一致で比較しているかを確認してください。何も見つからなければ、1 行だけ出力します。

npx lagune read cors --dir src/clean
# => no bypassable origin allowlist found

オリジンを判定する​

各オリジンを --origin で渡します。フックはオリジンごとに 1 語を出力し、wildcard または null が 1 つでもあれば 0 以外の終了コードで終了します。

npx lagune read cors --origin '*' # => wildcard
npx lagune read cors --origin 'null' # => null
npx lagune read cors --origin 'https://app.example.com' # => safe
判定意味
safe*、null、* を使ったグロブのいずれでもない。オリジンの形式が正しいことまでは保証しない。
wildcard*、またはサブドメイン、ホスト、ポートのグロブ:どのサイト(あるいは広範なサイト群)でもレスポンスを読み取れる。
nullnull オリジン。サンドボックス化された iframe やリダイレクトで偽装できる。

許可を意味するのは safe だけです。また、--origin は値のオラクルです。判定するのはハンドラーではなく値なので、ハンドラーは http-request 専門知識で確認してください。

CLI オプション​

オプション値説明
--originオリジン1 つのオリジン値を判定する。繰り返し指定すると複数を判定し、1 行に 1 つずつ出力する。
--dirディレクトリスキャン対象をディレクトリに絞る。繰り返し指定でき、--file と併用できる。
--fileファイルスキャン対象を 1 つのファイルに絞る。繰り返し指定でき、--dir と併用できる。

オプションを指定しなければ、プロジェクト全体をスキャンします。--origin は score モードで、--dir や --file とは併用できません。

対象外の範囲

スキャンが読み取るのは回避可能な正規表現という形で、--origin が判定するのはオリジンの値です。ソースコード上の次の 2 つのパターンは対象外です:リクエストの Origin の反射(サーバーが受け取った Origin をそのまま返す、または認証情報と組み合わせて返す)と、endsWith や部分文字列による緩い許可リストです。これらはコードを読んで見分け、http-request 専門知識 の説明に沿って対処してください。

よくある質問

サンドボックス化された iframe や一部のリダイレクトは Origin: null を送信するため、null を信頼する許可リストは、そうしたコンテキストに読み取りアクセスを与えてしまいます。cors フックは、ワイルドカードと並んでこれも指摘します。

コードベースに対して npx lagune read cors を実行します。信頼するサフィックスより前に貪欲なワイルドカードがあるホスト検証用の正規表現を指摘します。こうした正規表現では、your-site.com.attacker.com のような攻撃者のホストがすり抜けてしまいます。