
Python의 Ormar ORM에서 발견된 심각한 SQL 인젝션에 대한 심층 분석 — 재현, 수정, 그리고 테스트
Python 비동기 ORM의 치명적인(CVSS 9.8) SQL 인젝션 취약점에 대한 심층 분석 — 재현, 분석, 수정 포함.
Ormar는 FastAPI 및 Starlette와 함께 자주 사용되는 인기 있는 Python용 비동기 미니 ORM입니다. 0.9.9부터 0.22.0까지의 버전에는 min() 및 max() 집계 메서드에 SQL 인젝션 취약점이 있습니다.
근본 원인은 "부분 구현" 버그입니다. sum() 및 avg()는 열 매개변수가 실제 숫자 필드를 참조하는지 검증하는 반면, min() 및 max()는 이 검사를 완전히 건너뛰고 사용자 입력을 sqlalchemy.text() — 원시 SQL 싱크 — 에 직접 전달합니다.
공격자는 "열" 매개변수로 하위 쿼리를 주입할 수 있습니다:
# 예상 사용법
await Item.objects.max("price") # → SELECT max(price) FROM items
# 공격 페이로드
await Item.objects.max("(SELECT password FROM users LIMIT 1)")
# → SELECT max((SELECT password FROM users LIMIT 1)) FROM items
# 관리자의 비밀번호를 반환합니다!
| 속성 | 값 |
|---|---|
| CVE ID | CVE-2026-26198 |
| CVSS 점수 | 9.8 (치명적) |
| CWE | CWE-89: SQL 인젝션 |
| 영향 버전 | ormar 0.9.9 – 0.22.0 |
| 수정 버전 | ormar 0.23.0 |
| 공개일 | 2026년 2월 24일 |
| 인증 필요? | 없음 — 인증 불필요 |
├── README.md ← 현재 위치
├── vulnerable_app.py ← 취약한 패턴이 포함된 최소 FastAPI 앱
├── exploit_demo.py ← 인젝션 동작을 보여주는 안전한 PoC
├── patched_app.py ← 입력 검증이 포함된 수정 버전
├── test_vulnerability.py ← 취약점 존재 및 수정 효과를 증명하는 테스트
├── requirements.txt
└── analysis/
└── root_cause.md ← 버그에 대한 상세 코드 수준 분석
git clone https://github.com/YOUR_USERNAME/CVE-2026-26198-analysis.git
cd CVE-2026-26198-analysis
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
# 테스트 실행 (외부 DB 불필요 — SQLite 사용)
python -m pytest test_vulnerability.py -v
# 대화형 익스플로잇 데모 실행
python exploit_demo.py
수정은 열 매개변수가 sqlalchemy.text()에 도달하기 전에 모델의 실제 필드와 일치하는지 검증합니다. 이는 화이트리스트 접근 방식을 통해 수행됩니다: 모델의 필드 정의에 존재하는 열 이름만 허용됩니다.
구현은 patched_app.py를, 전체 분석은 analysis/root_cause.md를 참조하세요.
sum()/avg()는 검증되었지만 min()/max()는 검증되지 않았다는 사실이 잘못된 안전감을 조성했습니다.MIT