
CVE-2023-27524 Broken Object Level Authorization(BOLA)脆弱性を、脆弱なFlask API実装と修正済みFlask API実装を用いて実演し、セキュリティ教育向けに提供します。
# 🔐 Broken Object Level Authorization (BOLA) デモンストレーション
## CVE-2023-27524 セキュリティ分析と修正
---
## 📌 プロジェクト概要
このプロジェクトは、FlaskベースのAPIを使用して、実際の **Broken Object Level Authorization (BOLA)** 脆弱性とその安全な修正方法を示します。
この脆弱性は **CVE-2023-27524** に基づいてモデル化されており、APIリクエスト内のオブジェクト識別子(ID)を変更することで、攻撃者が権限のないオブジェクトにアクセスしたり操作したりできるようになる、不適切な認可制御を含みます。
このリポジトリには以下が含まれます:
- ❌ vulnerable_api.py: 脆弱なバージョンのAPI
- ✅ fixed_vulnerable_api.py: 適切なオブジェクトレベルの認可を実装したセキュアな修正版
---
## ⚠️ BOLA とは?
**Broken Object Level Authorization (BOLA)** は、アプリケーションが以下のような場合に発生します:
- オブジェクトIDを公開する(例: `/profile?id=2`)
- 認証されたユーザーがそのオブジェクトにアクセスする権限があるかを検証しない
### 🔴 影響:
攻撃者は以下のことが可能になります:
- 他のユーザーのプライベートデータへのアクセス
- 権限のないリソースの変更や削除
- 水平特権昇格の実行
---
## 💥 脆弱な実装
### 例(脆弱なコード)
```python
@app.route('/profile')
def profile():
user_id = request.args.get("id")
return users.get(int(user_id))
/profile?id=1 → アリスのデータ
/profile?id=2 → ボブのデータ(不正アクセス)
@app.route('/profile')
def profile():
requested_id = int(request.args.get("id", session["user_id"]))
# オブジェクトレベルの認可チェック
if requested_id != session["user_id"]:
return "403 Forbidden - Access Denied", 403
return users.get(requested_id)
この実装は、以下を実施することで BOLA を防止します:
✔ セッションベースの認証 ✔ オブジェクト所有権の検証 ✔ サーバーサイドの認可チェック ✔ ID改ざん攻撃の防止
サーバーサイドで認可を検証せずに、ユーザーから提供されたオブジェクト識別子を決して信頼してはいけません。
認証だけでは不十分です — 認可はオブジェクトレベルで強制されなければなりません。
User → API Request (/profile?id=2) → Direct DB Access → Data Leak
User → API Request → Session Check → Ownership Validation → Allowed/Denied
pip install flask
python fixed_vulnerable_api.py or vulnerable_api.py
http://127.0.0.1:5000
api-bola-demo/
│
├── vulnerable_api.py # 安全でないバージョン
├── fixed_vulnerable_api.py # BOLA修正版
└── README.md