crAPIを使ったAPIセキュリティの分析についてまとめてみた - Shikata Ga Nai

Shikata Ga Nai

Private? There is no such things.

crAPIを使ったAPIセキュリティの分析についてまとめてみた

Hello there, ('ω')ノ

crAPIという意図的に脆弱性を含むAPIを使用して、セキュリティ上の問題点を学ぶことに。

GitHub - OWASP/crAPI: completely ridiculous API (crAPI)


1. crAPIの概要とセットアップ

1.1 crAPIとは?

  • crAPIは、意図的に脆弱性を含むRESTful APIを提供する学習ツールです。
  • 車の所有者が車のメンテナンスを検索、リクエストできるウェブサイトをシミュレーションしています。
  • Docker Composeを使用して簡単にセットアップ可能。

1.2 セットアップコマンド

以下のコマンドを使用してDocker ComposeでcrAPIを起動します:

$ docker compose -f docker-compose.yml --compatibility up -d

コマンドのポイント

  • --compatibilityフラグ: Docker Composeの新バージョンで後方互換性を確保するためのオプションです。
  • コンテナ一覧: crAPIは以下のコンテナを含みます:
コンテナ名 目的
api.mypremiumdealership.com 脆弱なAPI
crapi-community コミュニティフォーラム
crapi-identity 認証エンドポイント
crapi-web ウェブUI
crapi-workshop 車のメンテナンス機能
mailhog メールサービス
mongodb データベース (MongoDB)
postgresdb データベース (Postgres)

起動後、http://localhost:8888/にアクセスすると、ログイン画面にリダイレクトされます。


2. 初歩的な分析

2.1 ユーザ登録

crAPIのサインアップページに無効なデータ(例: 特殊文字や空の電話番号)を入力してみます。例えば、電話番号を空にした状態で送信すると、バックエンドの詳細情報が返されます。

結果

  • Spring Frameworkで構築されていることが判明。
  • バックエンドの実装技術に関するヒントが得られます。

2.2 ログインとトークンの取得

フォームに有効なデータを入力してログインすると、サーバーからBearerトークンが返されます。このトークンは、後続のリクエストで認証に使用されます。


3. 車の登録とエンドポイントの発見

3.1 車両の登録

車を登録する際、車両識別番号(VIN)やPINが必要です。これらは、登録時に指定したメールアドレスに送られるので、http://localhost:8025でMailhogサービスを使いメールを確認します。

エンドポイントの発見

  • ログイン後: /api/v2/user
  • 車両登録時: /api/v2/vehicle
  • 車両リスト取得時: /api/v2/vehicle/vehicles

4. Broken Object Level Authorization (BOLA) の再現

4.1 問題の背景

BOLAは、適切なアクセス制御が実装されていない場合に発生します。認証済みユーザが、他人のデータに不正アクセスできる状態を指します。

4.2 実験: 他の車両データへのアクセス

以下の手順で他人の車両データを取得します:

  1. ログインしてBearerトークンを取得: ログイン後にトークンを受け取り、リクエストの認証に使用します。

  2. curlコマンドで他人のデータを取得: 車両ID(UUID)を推測して、以下のコマンドを実行します:

   $ curl http://localhost:8888/identity/api/v2/vehicle/<UUID>/location \
   --header 'Content-Type: application/json' \
   --header 'Authorization: Bearer <認証トークン>'

結果

  • 他のユーザが所有する車両の位置情報(緯度・経度)を取得できることを確認。
  • これはBOLAの典型的な例です。

5. コミュニティセクションの問題

5.1 他人の車両IDの公開

コミュニティセクションで他の車両所有者が投稿した内容を見ると、車両IDが含まれています。このような情報公開は、セキュリティ上好ましくありません。

リスク

  • 車両IDが公開されると、推測攻撃や不正アクセスのきっかけとなります。

まとめ

crAPIを使ったセキュリティテストの実験では、以下の学びが得られました:

  1. 初歩的なリクエストで脆弱性を発見: 特殊文字や空データを使った簡単な入力でバックエンドの詳細を取得。
  2. トークンを利用した不正アクセスの再現: BOLAの典型例を確認。
  3. 公開情報の過剰露出: 車両IDの不適切な公開により、さらなる攻撃の可能性を発見。

Best regards, (^^ゞ