cors フックは http-request 専門知識 を支える決定論的なエンジンで、自分で実行することもできます。1 つのコマンドで 2 つのモードが使えます:scan モードはソースコードをスキャンして回避可能なオリジン許可リスト(攻撃者のホストがすり抜けられる、ホスト検証用の正規表現)を探し、score モードは 1 つの CORS オリジンの値を wildcard、null、safe のいずれかに判定します。
コードベースをスキャンする
フラグを付けなければ、プロジェクト全体をスキャンします。
- プロジェクト全体
- ディレクトリ
- 1 つのファイル
npx lagune read cors
npx lagune read cors --dir src/server
npx lagune read cors --file internal/auth/origin.go
回避可能な許可リストを、ファイルごとにまとめて 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 以外の終了コードで終了します。
- 1 つのオリジン
- 複数のオリジン
npx lagune read cors --origin '*' # => wildcard
npx lagune read cors --origin 'null' # => null
npx lagune read cors --origin 'https://app.example.com' # => safe
--origin を繰り返し指定すると、許可リスト全体を 1 回の呼び出しで判定でき、指定した順に 1 行に 1 つずつ判定を出力します。
npx lagune read cors \
--origin 'https://app.example.com' \
--origin '*' \
--origin 'null'
# => safe
# => wildcard
# => null
| 判定 | 意味 |
|---|---|
safe | *、null、* を使ったグロブのいずれでもない。オリジンの形式が正しいことまでは保証しない。 |
wildcard | *、またはサブドメイン、ホスト、ポートのグロブ:どのサイト(あるいは広範なサイト群)でもレスポンスを読み取れる。 |
null | null オリジン。サンドボックス化された 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 のような攻撃者のホストがすり抜けてしまいます。
