2026 年 6 月 1 日、InfoQ が A Trailing Slash Bypassed AWS API Gateway Authorization を報じ、エンジニアコミュニティに衝撃が走りました。セキュリティ研究者の調査によれば、AWS HTTP API のパス末尾に / を付けるだけで Lambda Authorizer による認証が完全にスキップされるという挙動が確認され、あるフィンテックでは未認証のまま送金 API が呼び出せる状態になっていたといいます。根本原因は パス正規化(path normalization)のズレ——認可レイヤーが見るパスと、ルーティングが解決するパスが一致しないことで「認可されていないが到達できる」エンドポイントが生まれたのです。
これは「珍しいバグ」ではなく、API 認可を「フレームワーク任せ」にした設計が抱える構造的な盲点です。受託で中堅企業の API 基盤やフィンテック・SaaS を支える立場では、「認証 = ログイン」だけを見て「認可 = どのパスに誰が到達できるか」を検証していない現場を数多く見てきました。これまで AWS セキュリティエージェント・ペンテスト受託(GH Media) で扱った 攻撃者視点の検証、GitHub CodeQL 宣言的セキュリティ受託(GH Media) で扱った 静的解析の自動化、JWT / Cookie セッション Web 認証監査受託(GH Media) で扱った 認証情報の取り扱いと接続して、本記事では 「API 認可セキュリティ監査」を 受託パッケージとして整理します。
なぜ「末尾スラッシュ」で認可が崩れるのか
| レイヤー | 役割 | バイパスが起きる理由 |
|---|---|---|
| クライアント | リクエスト送信 | /transfer と /transfer/ を別物として扱える |
| API Gateway ルーティング | パスマッチング | 末尾スラッシュを「同一ルート」に吸収 |
| Lambda Authorizer | 認可判定 | 正規化前のパスで methodArn を評価 |
| バックエンド | 業務処理 | 認可済み前提で処理を実行 |
つまり問題は 「どのパス文字列を正とするか」の合意が層をまたいで取れていないことにあります。Authorizer は /transfer/ を「ポリシーに無いパス」と見なしてキャッシュや評価をすり抜け、ルーティングは /transfer に解決してバックエンドへ通す——この わずかな表記ゆれが認可の壁を無効化します。
受託案件で頻出する 3 つの認可アンチパターン
アンチパターン 1: 「認証されていれば認可済み」と混同する
ログイン(誰であるか)が通れば全 API を叩けてしまう設計は、水平権限昇格(他人のデータ参照)と 垂直権限昇格(管理者操作)の両方を許します。受託では リソース単位のアクセス制御(ABAC / ReBAC)を前提に、「認証」と「認可」を分離した設計レビューを行います。
アンチパターン 2: パス正規化をフレームワーク任せにする
末尾スラッシュ・大文字小文字・%2F などの エンコード差異・.. を含むパスは、層ごとに解釈が異なります。受託では 正規化ルールを一元化し、Authorizer・WAF・バックエンドで同一の正規化済みパスを評価するよう統一します。
アンチパターン 3: Authorizer のキャッシュキーを過信する
API Gateway の Authorizer はパスやトークンをキャッシュキーにします。キャッシュキーが正規化前のパスだと、/x の許可結果が /x/ に誤って再利用される事故が起きます。受託では キャッシュキー設計とTTL を監査項目に含めます。
受託で提供する「API 認可セキュリティ監査」5 フェーズ
フェーズ 1: 棚卸し・脅威モデリング(1〜2 週間)
- API インベントリ作成(REST / HTTP API / WebSocket / 内部 API)
- 認証方式(Cognito / Lambda Authorizer / IAM / API キー)の棚卸し
- データ機密度マッピング(送金・個人情報・決済)
- STRIDE ベースの脅威モデリング
フェーズ 2: 認可ロジック静的解析(1〜2 週間)
- Authorizer / ポリシーの IaC レビュー
- パス正規化ルールの層別突合
methodArn評価ロジックの検証- CodeQL / Semgrep による認可漏れ検出
フェーズ 3: 動的検証・疑似攻撃(2〜3 週間)
- 末尾スラッシュ / エンコード差異 / HTTP メソッド override の総当たり
- 水平・垂直権限昇格テスト
- IDOR(オブジェクト参照)検証
- レート制限・WAF バイパス検証
フェーズ 4: 修正・ガードレール実装(2〜4 週間)
- 正規化ミドルウェアの一元化
- Authorizer キャッシュキー再設計
- WAF ルール(パストラバーサル / エンコード)追加
- 拒否デフォルト(deny-by-default)への切り替え
フェーズ 5: 継続監査・回帰防止(継続)
- CI への認可テスト組み込み
- 新規エンドポイントの自動スキャン
- 月次の認可ドリフトレビュー
- インシデント発生時のランブック更新
受託向け技術スタック標準セット
| レイヤ | 推奨技術 | 代替 |
|---|---|---|
| API ゲートウェイ | AWS API Gateway / ALB + Lambda | Kong / Apigee |
| 認可 | Cedar / OPA | カスタム Authorizer |
| 正規化 | 共通ミドルウェア | WAF 正規化ルール |
| 静的解析 | CodeQL / Semgrep | Snyk Code |
| 動的検証 | ZAP / Burp / 自作ファザー | Nuclei |
| WAF | AWS WAF | Cloudflare WAF |
| 監視 | CloudWatch + GuardDuty | Datadog Security |
| シークレット | Secrets Manager / Vault | SSM Parameter Store |
どの案件に必要か / 不要か
| 必要な案件 | 不要な案件 |
|---|---|
| 送金・決済・個人情報を扱う API | 公開情報のみの読み取り API |
| Lambda Authorizer / カスタム認可を実装 | フルマネージド認可のみ |
| マイクロサービスで API 数が多い | 単一エンドポイントの小規模 |
| PCI DSS / 金融庁監督対象 | 監査対象外 |
| 認可ロジックを内製している | 認可を一切持たない静的サイト |
受託契約に書く 6 つの条項
| 条項 | 内容 | 顧客が確認すべきこと |
|---|---|---|
| 検証範囲 | 対象 API / 環境(本番 or ステージング) | 本番疑似攻撃の可否 |
| 報告義務 | 重大脆弱性の即時通知 SLA | 通知から修正までの猶予 |
| 責任分界 | 検出 vs 修正 vs 運用の責任 | 既存資産起因の扱い |
| 証跡保持 | 検査ログ / レポートの保管期間 | 監査提出要件 |
| 再発防止 | CI 組み込み・回帰テスト | 引き渡し後の保守 |
| 守秘 / 開示 | 脆弱性の公表ポリシー | 取引先への報告義務 |
価格モデル — API 認可セキュリティ監査パッケージ
| プラン | 金額 | 対象 | 内容 |
|---|---|---|---|
| スポット診断 | 120 万円〜(4 週間) | API 20 本まで | 棚卸し + 静的 + 動的検証 + レポート |
| Lite | 40 万円〜 / 月 | API 〜50 本 | 月次回帰スキャン + 新規 API 監査 |
| Standard | 90 万円〜 / 月 | API 50〜200 本 | + WAF 運用 + 月次脅威モデル更新 |
| Enterprise | 220 万円〜 / 月 | API 200 本超 / 金融 | + 専任 + インシデント対応 SLA |
| 初期実装 | 350 万円〜(一括) | 正規化基盤 + CI 組み込み | 全プラン共通 |
顧客側 ROI 試算(API 120 本 / 決済を含む SaaS 想定)
| 項目 | 既存(認可を実装任せ) | 監査・ガードレール導入後 | 差分 |
|---|---|---|---|
| 認可起因インシデント(年) | 2 件 | 0.2 件 | -1.8 件 |
| 1 件あたり想定損害 | 3,000 万円 | — | — |
| 脆弱性修正リードタイム | 3 週間 | 3 日 | -18 日 |
| 監査対応工数(年) | 320 時間 | 120 時間 | -200 時間 |
| 年間効果 | — | — | 想定損害回避 約 5,400 万円 + 工数削減 約 160 万円 |
Standard プラン(年額 1,080 万円)でも、1 件のインシデント回避で十分に回収可能です。
ハマりやすい 5 つの落とし穴
落とし穴 1: 認証テストだけで「セキュアだ」と判断する
ログインが通ることと、そのトークンで叩けてはいけない API が守られていることは別問題です。認可テストを独立した監査項目にします。
落とし穴 2: ステージングでしか検証しない
本番固有の WAF・キャッシュ・ルーティング設定がバイパスを生みます。本番疑似攻撃の合意を契約段階で取り付けます。
落とし穴 3: 正規化を WAF にだけ任せる
WAF をすり抜けた変則パスが Authorizer とバックエンドで別解釈されます。正規化はアプリ層で一元化します。
落とし穴 4: 一度きりの診断で終える
新規エンドポイント追加のたびに穴が空きます。CI へ認可テストを組み込み、回帰を防ぎます。
落とし穴 5: 「allow リスト」ではなく「deny リスト」で守る
明示拒否では漏れが出ます。deny-by-default + 明示 allow へ切り替えます。
90 日アクションプラン
| 週 | アクション |
|---|---|
| Week 1〜2 | API 棚卸し + 脅威モデリング |
| Week 3〜4 | 認可ロジック静的解析 + 正規化突合 |
| Week 5〜7 | 動的検証 + 疑似攻撃(末尾スラッシュ含む) |
| Week 8〜11 | 正規化一元化 + Authorizer 再設計 + WAF 強化 |
| Week 12 | CI 組み込み + 回帰テスト + 月次運用開始 |
まとめ — 「認証は通った」で止めず「認可は守られているか」まで検証する
末尾スラッシュ 1 文字で送金 API が突破された今回の事例は、「認可をフレームワーク任せにしたツケ」が最悪のタイミングで噴出した典型例です。受託で API 基盤を支える立場では、認証と認可を分離し、パス正規化を層をまたいで統一し、deny-by-default をデフォルトに据える 「API 認可セキュリティ監査」が新しい主力サービスです。
弊社では スポット診断 / Lite / Standard / Enterprise の 4 段階で本パッケージを提供しています。「自社 API の認可が本当に守られているか不安」「金融・決済 API の監査を任せたい」「新規 API のたびに穴がないか自動で検証したい」というご相談は お問い合わせフォーム からお気軽にどうぞ。