概要
API(Application Programming Interface)はシステム間の通信を担うインターフェースで、現代のWebアプリケーション・マイクロサービス・モバイルアプリの基盤です。SC試験では「認証・認可の不備」「JWTの安全な使い方」「レート制限」など、API 固有の脆弱性が問われます。
仕組みと動作原理
REST API の認証・認可モデル
| 方式 | 特徴 | 用途 |
|---|---|---|
| APIキー | シンプル。ヘッダまたはクエリに含める | サーバ間通信・公開API |
| Basic認証 | Base64エンコードのみ(暗号化なし) | 非推奨(TLS必須) |
| Bearer Token(JWT) | ステートレス。署名付きトークン | 現代のWebアプリ・モバイル |
| OAuth 2.0 | 認可フレームワーク。スコープで権限を制御 | 第三者API連携 |
| mTLS | クライアント証明書による相互認証 | マイクロサービス間通信 |
JWT(JSON Web Token)の仕組みと落とし穴
JWTは ヘッダ.ペイロード.署名 の3パートをBase64URLエンコードしたトークンです。
JWTの典型的なセキュリティ問題:
| 脆弱性 | 内容 | 対策 |
|---|---|---|
alg: none 攻撃 | アルゴリズムを none に書き換えて署名を省略 | none を明示的に拒否する |
| 弱い秘密鍵 | HMAC-SHA256 の秘密鍵が短すぎてブルートフォース可能 | 256ビット以上のランダムな秘密鍵 |
| 署名の未検証 | サーバ側でデコードのみしてペイロードを信用 | 必ず署名を検証 |
| 有効期限なし | exp クレームが設定されていない | 適切な有効期限(15分〜1時間が一般的)を設定 |
| アクセストークンの長期保存 | ローカルストレージに保存するとXSSで盗取される | HTTPOnly Cookieに保存 |
OWASP API Security Top 10(2023)
| 順位 | 脆弱性 | 概要 |
|---|---|---|
| API1 | オブジェクトレベル認可の不備(BOLA) | 他ユーザのリソースIDを指定してアクセスできる |
| API2 | 認証の不備 | 認証メカニズムが弱い・バイパス可能 |
| API3 | オブジェクトプロパティレベル認可の不備 | 変更を許可されていないフィールドを書き換えられる |
| API4 | リソース消費の無制限 | レート制限なし・ページサイズ無制限 |
| API5 | 機能レベル認可の不備(BFLA) | 一般ユーザが管理者向けAPIを呼び出せる |
| API6 | 機密ビジネスフローへの無制限アクセス | ボットによる大量注文・割引コードの総当り |
| API7 | サーバサイドリクエストフォージェリ(SSRF) | APIを通じて内部ネットワークへのリクエストを送信 |
| API8 | セキュリティの設定ミス | デバッグ情報の公開・不要なHTTPメソッドの許可 |
| API9 | インベントリ管理の不備 | 古いAPIバージョンが残存・シャドウAPI |
| API10 | APIの不安全な利用 | サードパーティAPIからの応答を検証せずに使用 |
BOLAとBFLAの具体例
BOLA(Broken Object Level Authorization):
# 本来は自分のデータのみアクセス可能なはずが…
GET /api/orders/12345 → 自分の注文(正常)
GET /api/orders/12346 → 他人の注文が返ってくる(BOLA)
対策:すべてのオブジェクトアクセスでログイン中のユーザが所有者かを確認。
BFLA(Broken Function Level Authorization):
# 一般ユーザが管理者向けAPIを呼べてしまう
DELETE /api/admin/users/123 → 一般ユーザからでも実行できてしまう(BFLA)
対策:エンドポイントごとにロールベースの認可を実装。
レート制限とスロットリング
| 手法 | 説明 |
|---|---|
| リクエスト数制限 | 単位時間あたりのリクエスト数を制限(例: 100 req/min) |
| スロットリング | 制限超過時にリクエストを遅延させる(拒否しない) |
| IPベース制限 | 同一IPからの過剰リクエストをブロック |
| ユーザ/APIキーベース制限 | 認証済みユーザごとに制限 |
レート制限がないと、資格情報スタッフィング・ブルートフォース攻撃・スクレイピングなどに悪用されます。
SC試験での頻出ポイント
- JWTの署名検証の重要性:ペイロードはBase64エンコードのみで「暗号化されていない」ことに注意
- BOLAが最も多い脆弱性:OWASP API Top 10の1位。オブジェクトIDの推測しやすさと認可チェックの漏れが原因
- レート制限の目的:ブルートフォース・スクレイピング・DoSの緩和
- SSRFとAPI:外部URLを受け取るAPIエンドポイントが内部ネットワークへの踏み台になる
- 古いAPIバージョンの残存(シャドウAPI):v1が放置されていてv2で修正した脆弱性が残っているパターン
よくある誤問・ひっかけパターン
誤り① 「JWTはBase64エンコードされているので内容は見えない」→ 誤。Base64はエンコードであり暗号化ではありません。JWTのペイロードはデコードすれば誰でも読めます。
誤り② 「APIキーをURLクエリパラメータで送ることは一般的な方法である」→ 問題あり。URLはサーバログ・ブラウザ履歴・Refererヘッダに残るため、APIキーは Authorization ヘッダで送るべきです。
誤り③ 「認証があれば認可の確認は不要」→ 誤。「誰であるか(認証)」と「何ができるか(認可)」は別です。BOLAはログイン済みユーザが他ユーザのリソースにアクセスする脆弱性です。
関連用語
- セキュアコーディング — APIの実装でも同じ原則が適用される
- OAuth 2.0 と OIDC — API認可の標準フレームワーク
- CSRF — Cookie認証を使うAPIはCSRFの対象になり得る
重要キーワード
| 用語 | 説明 |
|---|---|
| JWT | ヘッダ・ペイロード・署名をBase64URLエンコードしたトークン形式 |
| BOLA | オブジェクトレベルの認可不備。他人のリソースIDでアクセスできる脆弱性 |
| BFLA | 機能レベルの認可不備。一般ユーザが管理者機能を呼び出せる脆弱性 |
| レート制限 | 単位時間あたりのAPIリクエスト数を制限して乱用を防ぐ仕組み |
| SSRF | サーバ側にリクエストを発行させて内部ネットワークにアクセスする攻撃 |
| シャドウAPI | 管理されていない古いAPIバージョン。セキュリティパッチが当たっていない |