コンテンツへスキップ
Guide

OWASP API セキュリティ トップ 10: 修正を含むチェックリスト

| 12 min read

実際の攻撃シナリオ、具体的な修正、セキュリティ レビュー用のコピー&ペーストのチェックリストを使用して、OWASP API の 10 個のセキュリティ リスク (2023 年版) をすべて説明します。

Cybersecurity command center with multiple monitoring screens
Photo by Adi Goldstein on Unsplash

API は 1 時間あたり 10,000 件のリクエストを処理します。 これらのリクエストのうち 3 つは、変更を加えた攻撃者からのものです。 の order_id パラメータを使用して、データベース内のすべての顧客レコードをダウンロードします。 あなたは見つけます ユーザーがTwitterに投稿したときに公開します。

OWASP API セキュリティ トップ 10 (2023 年版) には、大部分の原因となる 10 のリスクがカタログ化されています。 API違反。 このガイドでは、各リスクを 1 段落で説明し、現実的な攻撃について説明します。 シナリオと具体的な修正。 Botoi API エンドポイントがリスクの検出または防止に役立つ場合、 関連するエンドポイントは動作するものに含まれています curl 指示。

API1:2023 オブジェクトレベルの認証が壊れている (BOLA)

BOLA は、API がリクエストしているかどうかを確認せずにオブジェクト ID に基づいてデータを返す場合に発生します。 ユーザーはそのオブジェクトを所有します。 攻撃者が電話をかける GET /api/orders/1001、データを取得して反復します を通して 10021003、 等々。 テーブル内のすべてのレコードが公開されます。 BOLA は、2019 年の最初の OWASP API セキュリティ リスト以来、API リスクのトップにランクされています。

攻撃シナリオ: フードデリバリーアプリが暴露 GET /api/orders/:id。 攻撃者は 1 から 100,000 までのループを作成し、配送先住所を含むすべての注文をダウンロードします。 電話番号、支払い方法の詳細。

脆弱なコードは次のとおりです。

// Vulnerable: no ownership check
app.get("/api/orders/:id", async (req, res) => {
  const order = await db.orders.findById(req.params.id);
  res.json(order); // Any user can read any order
});

そして修正は次のとおりです。

// Fixed: verify the requesting user owns the resource
app.get("/api/orders/:id", async (req, res) => {
  const order = await db.orders.findById(req.params.id);

  if (!order) return res.status(404).json({ error: "Not found" });
  if (order.userId !== req.user.id) {
    return res.status(403).json({ error: "Forbidden" });
  }

  res.json(order);
});

クライアントから ID を受け入れるすべてのエンドポイントには、所有権のチェックが必要です。 例外はありません。 使用する ミドルウェアまたはクエリ フィルター (例: WHERE user_id = ?) これをデータ層で強制します。

API2:2023 認証の失敗

壊れた認証には、弱いトークンの生成、トークン検証の欠如、資格情報のスタッフィングが含まれます。 攻撃、および期限切れまたは改ざんされたトークンを受け入れるエンドポイント。 攻撃者はログイン エンドポイントを次のようにターゲットにします。 侵害された資格情報のリスト、または安全でないストレージからトークンを盗みます。

攻撃シナリオ: 攻撃者は、次のサイトから 1,000 万件の電子メールとパスワードのペアのリストを取得します。 データ侵害。 彼らは、各ペアをあなたのものに対してテストするスクリプトを書きます。 POST /api/login 終点。 API にはログイン試行に対するレート制限がないため、攻撃者は 2,000 のアカウントを侵害します。 1時間。

修理: 認証エンドポイントにレート制限を適用します (IP ごとに 1 分あたり 5 回の試行)。 機密性の高い操作には多要素認証が必要です。 ユーザー資格情報を既知のものと照合する アカウントの作成を許可する前に違反を検出してください。

Botoi侵害チェックAPI かどうかを教えてくれます 既知のデータ侵害で使用された電子メール アドレス:

curl -s -X POST https://api.botoi.com/v1/breach/check \\
  -H "Content-Type: application/json" \\
  -d '{
    "email": "user@example.com"
  }'

応答:

{
  "success": true,
  "data": {
    "breached": true,
    "count": 3,
    "breaches": [
      { "name": "ExampleCorp", "date": "2024-01-15", "dataTypes": ["email", "password"] },
      { "name": "DataDump2023", "date": "2023-08-22", "dataTypes": ["email", "username"] },
      { "name": "LeakedDB", "date": "2022-11-03", "dataTypes": ["email", "phone"] }
    ]
  }
}

電話 /v1/breach/check サインアップ中またはパスワードのリセット中。 電子メールが侵害された場合、 ユーザーに、より強力で一意のパスワードを選択し、2 要素認証を有効にするよう求めます。

API3:2023 壊れたオブジェクトのプロパティレベルの認可

このリスクには、大量の割り当てと過度のデータ漏洩が組み合わされています。 一括割り当ては API の場合に発生します リクエスト本文フィールドをフィルタリングせずにデータ モデルに直接バインドします。 ユーザーが送信する "role": "admin" プロファイルの更新で、昇格された権限を取得します。 過剰なデータ漏洩 API が内部フィールド (データベース ID、ハッシュ化されたパスワード、管理者フラグ) をクライアントに返すときに発生します。 決して見るべきではありません。

攻撃シナリオ: SaaS アプリを使用すると、ユーザーは次の方法でプロフィールを更新できます。 PUT /api/users/:id。 バックエンドは完全なリクエスト本文を受け入れ、それをデータベースに書き込みます。 攻撃者は追加します "plan": "enterprise" リクエストに応じてプレミアム機能に無料でアクセスできます。

修理: 書き込み可能なフィールドには明示的な許可リストを使用します。 生のリクエストデータを決してバインドしないでください。 データモデル。 内部フィールドを除外する個別の応答 DTO を使用します。 すべての受信プロパティを検証する 処理前にスキーマに対して。

API4:2023 無制限のリソース消費

無制限のリクエストを受け入れる API により、攻撃者はインフラストラクチャの料金を使い果たし、データベースを使い果たすことができます 接続を停止したり、サービス拒否をトリガーしたりします。 これは、レート制限の欠如、無制限のクエリに適用されます。 パラメータ (例: ?limit=1000000)、サイズ上限なしのファイルアップロード、およびエンドポイント 高価なバックグラウンド ジョブをトリガーします。

攻撃シナリオ: API エンドポイントは PDF レポートを生成します。 攻撃者は 500 を送信します 同時リクエストでは、それぞれ 200 ページのレポートがリクエストされます。 ワーカープールがいっぱいになり、正当な状態になります 次の 20 分間、ユーザーは 503 エラーを受け取ります。

修理: ユーザーごとおよび IP ごとにレート制限を追加します。 サーバー側でページネーションの制限を制限する 最大値。 ファイルのアップロード サイズ制限を設定します。 負荷の高い操作にはキューベースの処理を使用します。

// Express rate limiter per user
import rateLimit from "express-rate-limit";

const apiLimiter = rateLimit({
  windowMs: 60 * 1000, // 1 minute
  max: 30,             // 30 requests per minute per IP
  standardHeaders: true,
  legacyHeaders: false,
  message: { error: "Rate limit exceeded. Try again in 60 seconds." },
});

app.use("/api/", apiLimiter);

API5:2023 機能レベルの承認が壊れています

機能レベルの承認の欠陥により、通常のユーザーが管理エンドポイントを呼び出すことができます。 典型的なパターン: 管理パネルの呼び出し DELETE /api/admin/users/:id。 フロントエンドはボタンを非表示にします 非管理ユーザーですが、API エンドポイント自体はロールをチェックしません。 認証されたユーザーであれば、 URL がアカウントを削除できることを発見します。

攻撃シナリオ: 開発者が見つけた /api/admin/export-all-users JavaScript バンドルに含まれています。 通常のユーザー トークンを使用して呼び出し、完全なユーザーをダウンロードします。 データベース。

修理: すべての管理エンドポイントの API レイヤーでのユーザーのロールを確認します。 依存しないでください フロントエンドの機能を非表示にします。 グループ管理者は、検証するミドルウェアの背後にあるルートを確認します。 role === "admin" リクエストを処理する前に。

API6:2023 機密性の高いビジネス フローへの無制限のアクセス

一部の API フローは、個々のリクエストが承認されていても、大規模になると危険です。 購入する 在庫に限りのあるアイテム、無料トライアルアカウントの作成、紹介コードの送信。 これらの流れ 自動化すると壊れます。 ボットが 10,000 の無料アカウントにサインアップするか、フラッシュ セールですべてのチケットを購入します 実際のユーザーがページをロードする前に。

攻撃シナリオ: スニーカーの再販業者が、次のようなボットを作成します。 POST /api/checkout 限定ドロップの最初の1秒間で500回。 どのペアも売れています ボットに。 人間の顧客には、ページの読み込みが完了する前に「売り切れ」が表示されます。

修理: 高価値フローに CAPTCHA またはproof-of-work チャレンジを追加します。 トラックデバイス 自動化を検出するための指紋。 ユーザーごとの購入制限を設定します。 キューベースのアクセスを使用して、 先着順のエンドポイントの代わりにフラッシュ販売を行います。

API7:2023 サーバー側リクエスト フォージェリ (SSRF)

SSRF は、API がクライアントから URL を受け入れ、それをサーバー側で取得するときに発生します。 ターゲットを検証しています。 攻撃者が提供するもの http://169.254.169.254/latest/meta-data/ サーバーは AWS インスタンスの認証情報を返します。 あるいは彼らはターゲットにする http://localhost:6379/ Redis インスタンスと対話します。

攻撃シナリオ: Webhook 統合により、ユーザーはコールバック URL を指定できます。 攻撃者はコールバックを次のように設定します http://169.254.169.254/latest/meta-data/iam/security-credentials/ そして、Webhook ペイロードでクラウド プロバイダーの IAM ロール認証情報を受け取ります。

// Block internal network requests
const BLOCKED_RANGES = [
  /^10\\./, /^172\\.(1[6-9]|2\\d|3[01])\\./, /^192\\.168\\./,
  /^127\\./, /^0\\./, /^169\\.254\\./,
  /^localhost$/i, /^\\[::1\\]$/,
];

function isSafeUrl(urlString) {
  try {
    const url = new URL(urlString);
    const hostname = url.hostname;
    return !BLOCKED_RANGES.some((re) => re.test(hostname));
  } catch {
    return false;
  }
}

app.post("/api/fetch-url", async (req, res) => {
  const { url } = req.body;
  if (!isSafeUrl(url)) {
    return res.status(400).json({ error: "URL targets a blocked network range" });
  }
  // proceed with external fetch
});

修理: 宛先 URL を検証して許可リストに登録します。 プライベート IP 範囲とクラウドをブロックする メタデータエンドポイント。 DNS の再バインドを防ぐために、リクエストを行う前に DNS を解決してください。 アウトバウンドの実行 隔離されたネットワークセグメントからのリクエスト。

API8:2023 セキュリティの構成ミス

構成ミスは最も広範なリスク カテゴリです。 CORS 制限の欠如、詳細エラーが含まれます スタック トレースを漏洩するメッセージ、管理パネルのデフォルトの認証情報、有効になっている不要な HTTP メソッド、 TLS が強制されておらず、セキュリティ ヘッダーが欠落しています。 構成ミスが 1 つでもあると、エントリ ポイントが作成されます。

攻撃シナリオ: API は、運用エラー応答で完全なスタック トレースを返します。 アン 攻撃者は意図的にエラーを引き起こし、スタック トレースを読み取り、ORM とデータベースのバージョンを特定します。 次に、そのバージョンの既知の脆弱性に基づいてインジェクション ペイロードを作成します。

修理: 実稼働応答からスタック トレースを削除します。 自分のドメインのみを許可するように CORS を設定します。 使用しない HTTP メソッドを無効にします。 あらゆる場所で TLS を強制します。 自動セキュリティヘッダーチェックを実行します。 XSS を防ぐために、すべての HTML 出力をサニタイズします。

公開された HTML サニタイズ API ストリップ ユーザーが指定した HTML からの悪意のあるタグと属性:

curl -s -X POST https://api.botoi.com/v1/html-sanitize \\
  -H "Content-Type: application/json" \\
  -d '{
    "html": "<p>Hello</p><script>document.cookie</script><img onerror=alert(1) src=x>"
  }'

応答:

{
  "success": true,
  "data": {
    "sanitized": "<p>Hello</p><img src=\\"x\\">"
  }
}

<script> タグと onerror 属性が削除されます。 安全な HTML が返されます。 ユーザーが提供した HTML を保存またはレンダリングする前に、このエンドポイントを呼び出します。

API9:2023 不適切な在庫管理

古い API バージョン、忘れられたステージング エンドポイント、文書化されていないルートにより、攻撃対象領域が形成されます。 監視しないでください。 攻撃者は以下をスキャンします /v1//v2//api-dev/、 そして /internal/ パス。 セキュリティ管理が欠如している非推奨のエンドポイントを発見しました 現在のバージョンに追加しました。

攻撃シナリオ: あなたのチームは出荷されました /v2/users 役割ベースのアクセスを使用する コントロール。 しかし /v1/users 実稼働環境ではまだ承認なしで実行されています。 攻撃者 パブリック Swagger ファイルを介して v1 パスを検出し、ユーザー テーブル全体をプルします。

修理: 完全な API インベントリを維持します。 古いバージョンを廃止します。 彼らを残さないでください 「誰かがまだ使用している場合に備えて」実行中です。 同じ認証ミドルウェアの背後ですべてのバージョンをゲートします。 スキャン 定期的なスケジュールでパスを公開するための独自のインフラストラクチャ。

API10:2023 API の安全でない使用

API は、決済処理業者、電子メール プロバイダー、ジオコーディング API などのサードパーティ サービスを呼び出します。 もしあなたが 検証せずに応答を信頼すると、侵害されたサードパーティまたは悪意のあるサードパーティがデータを挿入する可能性があります あなたのシステムに。 これには、リダイレクト URL の信頼、未検証の JSON の解析、または保存が含まれます。 サニタイズを行わないサードパーティの応答。

攻撃シナリオ: アプリがサードパーティのエンリッチメント API から企業データを取得します そして、 company_name フィールドをデータベースに直接追加します。 エンリッチメント API が取得するのは、 侵害され、攻撃者がインジェクトします <script> 会社名にタグを付けます。 毎 ダッシュボードで会社プロファイルを表示するユーザーがスクリプトを実行します。

修理: 保存またはレンダリングする前に、すべてのサードパーティの応答を検証してサニタイズします。 彼ら。 受信データに対してスキーマ検証を使用します。 外部呼び出しにタイムアウトを設定します。 同じ入力を適用します ユーザー入力に適用するサードパーティ データの検証。

API 応答内の機密データの漏洩を検出する

リスク API1 と API3 により、機密データが API から流出することがよくあります。 の Botoi PII 検出 API テキストをスキャンします 社会保障番号、クレジット カード番号、電子メール アドレス、電話番号、IP アドレス、 生年月日。 統合テストで API レスポンスボディに対して実行して、偶発的なエラーを検出します。 導入前のデータ漏洩。

curl -s -X POST https://api.botoi.com/v1/pii/detect \\
  -H "Content-Type: application/json" \\
  -d '{
    "text": "Customer SSN is 123-45-6789 and card is 4111111111111111"
  }'

応答:

{
  "success": true,
  "data": {
    "found": true,
    "count": 2,
    "findings": [
      {
        "type": "ssn",
        "value": "123-45-6789",
        "start": 17,
        "end": 28,
        "masked": "***-**-6789"
      },
      {
        "type": "credit_card",
        "value": "4111111111111111",
        "start": 42,
        "end": 58,
        "masked": "************1111"
      }
    ]
  }
}

API 応答が検出結果をトリガーした場合、エンドポイントはクライアントに表示されるべきではないデータを返しています。 これらのフィールドを除外するようにクエリまたは DTO を修正してください。

保存中の機密データを暗号化する

API が機密性の高い構成、トークン、または認証情報を保存する場合は、書き込む前に暗号化してください。 データベースに。 の Botoi暗号化API AES-256-CBC 暗号化を提供します。

curl -s -X POST https://api.botoi.com/v1/encrypt/encrypt \\
  -H "Content-Type: application/json" \\
  -d '{
    "text": "sensitive-api-token-abc123",
    "password": "your-secret-key"
  }'

応答:

{
  "success": true,
  "data": {
    "encrypted": "U2FsdGVkX1+abc...encrypted_output_here",
    "algorithm": "aes-256-cbc"
  }
}

暗号化された出力を保存します。 で復号化します /v1/encrypt/decrypt 値が次の場合のみ 必要です。 これにより、攻撃者がデータベースへの読み取りアクセスを取得した場合の攻撃範囲が制限されます。 BOLA または SQL インジェクションの脆弱性。

OWASP API セキュリティ トップ 10 チェックリスト

この表を印刷するか、セキュリティ レビュー テンプレートに追加します。 API リリース前に各項目を確認してください。

リスク チェック ボトイエンドポイント
API1 はあった オブジェクト ID を受け入れるすべてのエンドポイントは所有権を検証します
API2 認証の破損 ログイン率は制限されています。 トークンは期限切れになります。 機密性の高い運用に関する MFA /v1/breach/check
API3 プロパティ認証 リクエストフィールドが許可リストに登録されています。 応答 DTO は内部を除外します /v1/pii/detect
API4 リソース制限 レート制限、ページネーションの上限、ファイル サイズ制限の適用
API5関数認証 管理エンドポイントはフロントエンドではなく API レイヤーでロールをチェックします
API6のビジネスフロー 高価値フローの CAPTCHA/プルーフ・オブ・ワーク。 ユーザーごとの制限
API7 SSRF ユーザー指定の URL が検証されました。 プライベート範囲がブロックされました
API8 の設定ミス スタックトレースはありません。 CORS が制限されています。 HTMLサニタイズ済み /v1/html-sanitize
API9 インベントリ 古い API バージョンは廃止されました。 すべてのルートが文書化されている
API10 安全でない消費 サードパーティの回答は保存前に検証され、サニタイズされます /v1/html-sanitize

ここからどこへ行くか

OWASP API セキュリティ トップ 10 の完全なドキュメントは、次の場所にあります。 owasp.org/API-Security。 各リスク ページには、検出方法、攻撃シナリオの例、CWE への参照が含まれています。

自動チェックの場合は、上記の botoi エンドポイントを CI パイプラインに統合します。 PII 検出を実行する API レスポンス フィクスチャに対して。 保存された HTML を書き込み時にサニタイズします。 新しいユーザーのメールが侵害されていないかチェックする サインアップ中のデータベース。 これらは、リスク スキャナーをキャッチするテスト スイートへの小さな追加です。 ミス。

FAQ

OWASP API セキュリティ トップ 10 とは何ですか?
OWASP API セキュリティ トップ 10 は、Open Worldwide Application Security Project によって管理されている 10 個の最も重要な API セキュリティ リスクのリストです。 2023 年版では、壊れたオブジェクト レベルの認可、壊れた認証、壊れたオブジェクト プロパティ レベルの認可、無制限のリソース消費、壊れた機能レベルの認可、機密ビジネス フローへの無制限のアクセス、サーバー側のリクエスト フォージェリ、セキュリティの誤った構成、不適切なインベントリ管理、API の安全でない使用がカバーされています。
OWASP API セキュリティ トップ 10 はどのくらいの頻度で更新されますか?
OWASP は、2019 年に最初の API セキュリティ トップ 10 をリリースし、2023 年に更新しました。固定された更新スケジュールはありません。 プロジェクト チームは、セキュリティ インシデント、バグ報奨金レポート、コミュニティからの投稿からデータを収集し、脅威の状況が変化して新版が必要になったときに、新しい版を発行します。
BOLA とは何ですか?また、それが API リスクの最大の理由であるのはなぜですか?
BOLA (オブジェクトレベル認証の失敗) は、API エンドポイントがクライアントからオブジェクト ID を受け取り、要求元のユーザーがそのオブジェクトを所有しているかどうかを確認せずにデータを返すときに発生します。 攻撃者はリクエスト内の ID を変更し、別のユーザーのデータにアクセスします。 一般的であり、悪用が容易であり、機密記録が大規模に公開されることが多いため、第 1 位にランクされています。
自動化ツールは OWASP API セキュリティ トップ 10 のリスクをすべて検出できますか?
いいえ。自動スキャナーは、構成ミス (API8)、レート制限の欠如 (API4)、および一部の注入パターン (API8 経由) を検出します。 しかし、認証の欠陥 (API1、API3、API5) には、スキャナーに欠けているビジネス ロジックの理解が必要です。 完全にカバーするには、手動のコードレビュー、侵入テスト、アーキテクチャレベルのチェックが必要です。
どの OWASP API リスクを最初に修正するかを優先するにはどうすればよいですか?
直接的なデータ侵害につながるため、API1 (BOLA) と API2 (認証の失敗) から始めます。 次に、サービス拒否を防ぐために API4 (無制限のリソース消費) に対処します。 その後、アプリケーション内で最も機密性の高いデータをどのエンドポイントが処理するかに基づいて、残りのリスクに対処します。

botoiで開発を始めよう

150以上のAPIエンドポイント。検索、テキスト処理、画像生成、開発者ユーティリティに対応。無料プラン、クレジットカード不要。