
Docker 기반 랩으로, Webhood의 인증되지 않은 PocketBase 관리자 생성 취약점인 CVE-2024-31218을 재현하며, PoC, 탐지, 그리고 완화 검증을 포함합니다.
이 프로젝트는 CVE-2024-31218에 대한 통제된 보안 연구 및 취약점 재현 실습으로, Webhood 0.9.1 이전 버전에 영향을 미치는 치명적인 인증 취약점입니다.
이 취약점은 관리자 계정이 존재하지 않을 때 PocketBase 관리자 계정이 인증 없이 생성되는 것과 관련이 있습니다. 영향을 받는 API에 접근할 수 있는 공격자는 사전 인증 없이 관리자 계정을 생성할 수 있습니다.
이 실습의 목표는 다음과 같습니다:
안전: 이 프로젝트는 격리된 로컬 실습 환경에서만 사용하도록 의도되었습니다. 취약한 애플리케이션은 절대 공용 인터넷에 노출되거나 승인 없이 시스템에 사용되어서는 안 됩니다.
| 필드 | 세부 정보 |
|---|
| CVE | CVE-2024-31218 |
| 프로젝트 | Webhood |
| 영향받는 버전 | Webhood <= 0.9.0 |
| 수정된 버전 | Webhood 0.9.1 |
| 심각도 | 치명적 |
| CVSS v3.1 | 9.8 |
| CWE | CWE-306 — 중요 기능에 대한 인증 누락 |
| 공격 벡터 | 네트워크 |
| 공격 복잡도 | 낮음 |
| 필요한 권한 | 없음 |
| 사용자 상호작용 | 없음 |
| 기밀성 | 높음 |
| 무결성 | 높음 |
| 가용성 | 높음 |
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
2. 취약점 설명
CVE-2024-31218은 영향을 받는 Webhood/PocketBase 애플리케이션에서 관리자 생성에 대한 불충분한 인증 보호로 인해 발생합니다.
애플리케이션에 구성된 관리자 계정이 없을 때, 관리자 생성 기능에 인증 없이 접근할 수 있습니다.
따라서 영향을 받는 API에 접근할 수 있는 공격자는 첫 번째 관리자 계정을 생성하려고 시도할 수 있습니다.
성공적인 악용은 애플리케이션에 대한 관리자 접근 권한을 초래할 수 있습니다.
이 취약점은 다음과 같이 분류됩니다:
CWE-306: 중요 기능에 대한 인증 누락
3. 영향받는 버전 및 수정된 버전
취약한 범위는 다음과 같습니다:
Webhood <= 0.9.0
취약점은 다음에서 수정되었습니다:
Webhood 0.9.1
따라서 완화 검증에는 패치된 버전을 사용해야 합니다.
4. 공격 표면
관련 공격 표면은 PocketBase 관리자 API입니다.
취약한 기능은 관리자 계정 생성과 관련이 있습니다.
개념적으로 공격 흐름은 다음과 같습니다:
공격자
|
| HTTP 요청
v
Webhood / PocketBase API
|
| 관리자 생성 엔드포인트
v
관리자 계정 생성
|
v
비인가 관리자 접근
이 공격은 취약한 초기 관리자 조건이 존재할 때 기존 인증된 세션을 필요로 하지 않습니다.
5. 근본 원인
근본 원인은 인증 제어 실패입니다.
관리자 계정이 존재하지 않을 때 관리자 생성 기능이 접근을 충분히 제한하지 않았습니다.
보안 경계는 권한 있는 관리자 기능이 인증되지 않은 원격 클라이언트에 의해 악용될 수 없도록 보장해야 합니다.
따라서 취약한 동작은 보안에 민감한 작업에 대한 인증 검사 누락을 나타냅니다.
6. 통제된 실습 아키텍처
실습은 CVE-2024-31218의 기반이 되는 PocketBase 관리자 API 동작을 재현합니다.
Docker 환경은 완전한 Webhood 0.9.0 애플리케이션을 패키징한다고 주장하는 대신 PocketBase 구성 요소를 직접 사용합니다.
실습 아키텍처는 다음과 같습니다:
+-------------------------+
| 호스트 머신 |
| |
| PowerShell / Python |
+------------+------------+
|
| 127.0.0.1:8090
v
+-------------------------+
| Docker 컨테이너 |
| |
| +-------------------+ |
| | PocketBase | |
| | 관리자 API | |
| +-------------------+ |
| |
+-------------------------+
서비스는 localhost에만 바인딩되며 공용 인터넷에 노출되지 않습니다.
재현 중 사용되는 모든 자격 증명은 합성 실습 자격 증명입니다.
7. 저장소 구조
CVE-2024-31218-WEBHOOD-LAB/
│
├── README.md
│
├── vulnerable/
│ ├── Dockerfile
│ └── docker-compose.yml
│
├── exploit/
│ └── reproduce.py
│
├── detection/
│ └── detect.py
│
├── patched/
│ └── README.md
│
├── evidence/
│ └── README.md
│
└── blog/
└── CVE-2024-31218-Technical-Blog.pdf
8. 취약한 환경
취약한 환경은 격리된 Docker 컨테이너에서 CVE-2024-31218과 관련된 PocketBase 관리자 API 동작을 재현하도록 설계되었습니다.
실습은 완전한 Webhood 0.9.0 애플리케이션을 재현한다고 주장하는 대신 영향을 받는 구성 요소로 PocketBase를 직접 사용합니다.
Docker 구성은 다음을 수행합니다:
- 실습 환경을 빌드합니다.
- PocketBase를 로컬에서 시작합니다.
- 서비스를 localhost에 바인딩합니다.
- 서비스를 외부 시스템으로부터 격리합니다.
- 테스트를 위한 재현 가능한 환경을 제공합니다.
- 재현 스크립트가 관리자 API와 상호작용할 수 있도록 합니다.
현재 실습은 합성 관리자 계정을 사용하며 실제 사용자 데이터나 자격 증명을 포함하지 않습니다.
9. 재현 방법론
재현 절차는 로컬 실습 전용으로 설계되었습니다.
1단계 — 취약한 컨테이너 시작
docker compose up --build
2단계 — 서비스 확인
구성 요소 수준 실습에 사용되는 PocketBase 서비스가 로컬에서 응답하는지 확인합니다.
3단계 — 통제된 재현 스크립트 실행
재현 스크립트는 로컬 취약 인스턴스에 관련 요청을 전송합니다.
예:
python exploit/reproduce.py
4단계 — 응답 관찰
응답은 애플리케이션이 인증되지 않은 관리자 생성 요청을 수락하는지 여부를 보여주어야 합니다.
5단계 — 결과 상태 확인
실습은 관리자 계정이 생성되었는지 확인해야 합니다.
외부 대상은 절대 사용되어서는 안 됩니다.
10. 탐지
탐지는 비인가 관리자 생성 시도와 관련된 지표를 식별해야 합니다.
잠재적 지표는 다음과 같습니다:
관리자 생성 기능에 대한 요청
관리자 엔드포인트에 대한 인증되지 않은 요청
예상치 못한 첫 번째 관리자 계정 생성
예상치 못한 클라이언트에서 발생한 HTTP 요청
반복적인 관리자 생성 시도
애플리케이션 초기화 직후 관리자 계정 생성
탐지 스크립트는 다음 위치에 있습니다:
detection/detect.py
11. 완화
주요 완화 방법은 Webhood를 수정된 버전으로 업그레이드하는 것입니다:
Webhood 0.9.1
취약한 릴리스는 프로덕션에서 사용되어서는 안 됩니다.
문서화된 우회 방법은 즉시 업그레이드를 수행할 수 없는 경우 영향을 받는 관리자 API 기능에 대한 접근을 제한하는 것입니다.
완화 후:
취약한 컨테이너를 중지합니다.
취약한 버전을 수정된 버전으로 교체합니다.
컨테이너를 다시 빌드합니다.
패치된 환경을 시작합니다.
재현 시도를 반복합니다.
취약한 동작이 더 이상 불가능한지 확인합니다.
예상치 못한 관리자 요청에 대해 애플리케이션 로그를 검토합니다.
12. 완화 및 검증
CVE-2024-31218에 대한 공식 Webhood 수정은 실제 Webhood `v0.9.1` 소스 릴리스를 사용하여 검증되었습니다.
수정 커밋은 다음과 같습니다:
`735e7fa2814edeec9a2c07778ed51b3c018609f9`
수정은 다음 마이그레이션을 추가합니다:
`src/backend/migrations/1712252550_generate_random_admin.js`
마이그레이션은 관리자가 이미 존재하는지 확인합니다. 관리자가 존재하지 않으면 무작위로 생성된 비밀번호로 관리자 계정을 생성합니다. 이는 인증되지 않은 요청자가 노출된 `/api/admins` 엔드포인트를 통해 첫 번째 관리자를 차지하는 것을 방지합니다.
#### 검증 절차
1. 공식 Webhood `v0.9.1` 소스 태그를 체크아웃했습니다.
2. Dockerfile을 사용하여 공식 소스에서 백엔드를 로컬로 빌드했습니다.
3. 결과 이미지를 localhost의 포트 `8091`에서 실행했습니다.
4. 취약한 실습에 사용된 것과 동일한 인증되지 않은 관리자 생성 요청을 수정된 백엔드에 재전송했습니다.
5. 취약한 환경은 이전에 HTTP `200`으로 요청을 수락했습니다.
6. 수정된 `v0.9.1` 백엔드는 동일한 요청을 HTTP `401`로 거부했습니다.
관찰된 수정 환경 응답:
```text
HTTP status: 401
{"code":401,"message":"The request requires valid admin authorization token to be set.","data":{}}
이는 이전에 시연된 인증되지 않은 관리자 생성 공격 경로가 로컬로 빌드된 Webhood v0.9.1 백엔드에서 차단되었음을 확인합니다.
완화 검증됨: 예
증거:
evidence/05-remediation-verified.png
13. 보안 영향
성공적인 악용은 비인가 당사자에게 관리자 권한을 제공할 수 있습니다.
잠재적 결과는 다음과 같습니다:
비인가 관리자 접근
애플리케이션 데이터 수정
애플리케이션 정보 노출
레코드 수정 또는 삭제
애플리케이션의 추가 관리자 악용
따라서 심각도는 발표된 CVSS 평가에 따라 치명적으로 분류됩니다.
14. 증거
evidence/ 디렉터리는 다음을 보여주는 스크린샷을 포함하도록 의도되었습니다:
취약한 애플리케이션 시작
Docker 컨테이너 상태
취약한 버전
재현 요청
성공적인 취약한 동작
탐지 출력
패치된 버전
완화 후 실패/차단된 재현
스크린샷에는 실제 자격 증명, 개인 정보, API 키 또는 기타 민감한 데이터가 포함되어서는 안 됩니다.
15. 제한 사항
이 실습을 준비하는 동안 로컬 Windows 환경에서 Docker Linux 백엔드를 시작하는 데 문제가 발생했습니다.
Windows는 다음을 반환했습니다:
Error: 14098
The component store has been corrupted.
필요한 Windows 기능도 처음에는 비활성화되어 있었습니다:
VirtualMachinePlatform
Microsoft-Windows-Subsystem-Linux
따라서 모든 재현 결과 또는 스크린샷은 다음을 정확히 구분해야 합니다:
취약점 연구
실습 구성
의도된 재현 절차
성공적으로 실행된 재현
격리된 실습에서 실제로 수행되지 않은 한 성공적인 익스플로잇 실행을 주장해서는 안 됩니다.
16. 안전 고려 사항
이 프로젝트는 승인된 보안 연구 전용입니다.
실습은 다음을 수행해야 합니다:
로컬에서 실행.
공용 노출 회피.
실제 자격 증명 회피.
실제 사용자 데이터 회피.
제3자 시스템에 대한 테스트 회피.
일회용 테스트 계정 사용.
격리된 Docker 네트워크 사용.
테스트 후 취약한 환경 파괴.
정리 예:
docker compose down
17. 참고 자료
National Vulnerability Database — CVE-2024-31218
Webhood 보안 권고
Webhood/PocketBase 소스 저장소
CVE-2024-31218과 관련된 수정 커밋
CWE-306 — 중요 기능에 대한 인증 누락
FIRST CVSS v3.1 사양
18. 면책 조항
이 저장소는 사이버 보안 교육 및 취약점 연구 프로젝트입니다.
취약한 구성은 통제된 테스트를 위해 의도적으로 재현되었습니다. 공개적으로 접근 가능한 서비스로 배포되어서는 안 됩니다.
저자는 이 저장소에 포함된 기술이나 아티팩트의 비인가 사용에 대해 어떠한 책임도 지지 않습니다.