
CVE-2023-27524 객체 수준 권한 부여(BOLA) 취약점을 보여주며, 보안 교육을 위해 취약한 Flask API 구현과 수정된 Flask API 구현을 함께 제공합니다.
# 🔐 객체 수준 인증 위반(BOLA) 데모
## CVE-2023-27524 보안 분석 및 수정
---
## 📌 프로젝트 개요
이 프로젝트는 Flask 기반 API를 사용하여 실제 **객체 수준 인증 위반(BOLA)** 취약점과 그에 대한 안전한 수정 방법을 보여줍니다.
이 취약점은 **CVE-2023-27524**를 모델로 하며, 공격자가 API 요청에서 객체 식별자(ID)를 수정하여 승인되지 않은 객체에 접근하거나 조작할 수 있도록 하는 부적절한 인증 제어와 관련됩니다.
이 저장소는 다음을 포함합니다:
- ❌ vulnerable_api.py: 취약한 API 버전
- ✅ fixed_vulnerable_api.py: 적절한 객체 수준 권한 부여를 구현한 안전한 수정 버전
---
## ⚠️ BOLA란 무엇인가?
**객체 수준 인증 위반(BOLA)**은 애플리케이션이 다음과 같은 경우 발생합니다:
- 객체 ID를 노출함 (예: `/profile?id=2`)
- 인증된 사용자가 해당 객체에 접근할 권한이 있는지 확인하지 않음
### 🔴 영향:
공격자는 다음을 수행할 수 있습니다:
- 다른 사용자의 개인 데이터 접근
- 권한 없는 리소스 수정 또는 삭제
- 수평적 권한 상승 수행
---
## 💥 취약한 구현
### 예시 (취약 코드)
```python
@app.route('/profile')
def profile():
user_id = request.args.get("id")
return users.get(int(user_id))
```
### ❌ 문제점:
* 인증 확인 없음
* 소유권 검증 없음
* 사용자 제어 ID가 데이터베이스 객체에 직접 접근
### 🔓 익스플로잇 시나리오:
```
/profile?id=1 → Alice data
/profile?id=2 → Bob data (unauthorized access)
```
---
## 🔒 수정된 안전한 구현
### 예시 (안전한 코드)
```python
@app.route('/profile')
def profile():
requested_id = int(request.args.get("id", session["user_id"]))
# Object-level authorization check
if requested_id != session["user_id"]:
return "403 Forbidden - Access Denied", 403
return users.get(requested_id)
```
---
## ✅ 적용된 보안 수정
이 구현은 다음을 강제하여 BOLA를 방지합니다:
✔ 세션 기반 인증
✔ 객체 소유권 검증
✔ 서버 측 인증 확인
✔ ID 변조 공격 방지
---
## 🧠 주요 보안 교훈
> 서버 측에서 권한을 확인하지 않고 사용자가 제공한 객체 식별자를 신뢰하지 마십시오.
인증만으로는 충분하지 않습니다. — **객체 수준에서 권한 부여가 적용되어야 합니다.**
---
## 📊 공격 흐름 vs 안전한 흐름
### ❌ 취약한 흐름:
```
User → API Request (/profile?id=2) → Direct DB Access → Data Leak
```
### ✅ 안전한 흐름:
```
User → API Request → Session Check → Ownership Validation → Allowed/Denied
```
---
## 🧪 실행 방법
### 1. 종속성 설치
```bash
pip install flask
```
### 2. 애플리케이션 실행
```bash
python fixed_vulnerable_api.py or vulnerable_api.py
```
### 3. 앱 접속
```
http://127.0.0.1:5000
```
---
## 📁 프로젝트 구조
```
api-bola-demo/
│
├── vulnerable_api.py # insecure version
├── fixed_vulnerable_api.py # Fixed BOLA version
└── README.md
```