
이 저장소는 Croogo CMS에서 CVE-2026-16219로 추적되는 경로 권한 부여(path-authorization) 결함을 문서화하고 안전하게 시연합니다. 본인 소유 시스템이나 명시적으로 평가를 승인받은 시스템을 테스트하는 방어자, 유지보수자, 학생, 연구자를 대상으로 합니다.
안전 경계: 포함된 HTTP proof of concept은 리터럴 루프백 주소
127.0.0.1만 허용하며, 고정된 비웹(non-web) 대상 디렉터리/tmp/croogo-cve-2026-16219/에 생성된.txt마커만 작성하고, 리디렉션을 따르지 않으며, 명시적인 실습실 승인 없이는 실행을 거부합니다. 실행 가능한 페이로드나 원격 대상 모드는 포함되어 있지 않습니다.
스냅샷 날짜: 2026-07-20.
| 필드 | 값 |
|---|---|
| 제품 | Croogo CMS, Admin File Manager |
| NVD 영향 버전 | 4.0.0 ~ 4.0.7 |
| 취약점 | CWE-22, 경로 순회 / 부적절한 경로 제한 |
| NVD CNA CVSS v3.1 | 6.3 중간(Medium) |
| 권한 | 인증된 FileManager 사용 가능 계정 |
| 사용자 상호작용 | 인증 후 없음 |
| 공개 정보 | 업스트림 이슈 및 공개 공격 정보 존재 |
| 패치 버전 | 인용된 권고 스냅샷에서 식별되지 않음 |
현재 상태는 변경될 수 있습니다. 프로덕션 결정을 내리기 전에 docs/references.md의 1차 출처를 다시 확인하십시오.
Croogo는 WWW_ROOT/assets와 같은 좁은 편집 가능 루트를 구성합니다. 영향받는 헬퍼는 Configure::read()가 아닌 Configure::check()를 사용하여 FileManager.editablePaths를 얻습니다. check()는 키가 존재하는지 여부만 응답하며 구성된 경로 목록을 반환하지 않습니다. 그 결과인 Boolean이 경로 포함 검사에 사용되어 의도된 권한 부여 경계를 약화시킵니다.
File Manager의 생성 및 편집 작업은 해당 검사를 신뢰합니다. 업스트림 보고서에 설명된 조건에서, 인증된 FileManager 사용자는 PHP 서비스 계정이 선택한 위치에 쓸 수 있을 때 구성된 편집 가능 루트 밖에 쓸 수 있습니다.
데이터 흐름은 docs/technical-analysis.md에서, 강화 지침은 docs/remediation.md에서 확인하십시오.
.
|-- demo/ 독립형 로직 시연; Croogo 불필요
|-- docs/ 분석, 실습실 구성, 탐지, 수정, 참고 자료
|-- patches/ 설명용 심층 방어(defense-in-depth) 패치
|-- poc/ 엄격한 루프백, 텍스트 마커 HTTP PoC 및 정리 도구
|-- tests/ 가드레일(guardrail) 및 데모 테스트
|-- .github/workflows/validate.yml
|-- DISCLAIMER.md
|-- GITHUB_UPLOAD.md
|-- LICENSE
|-- Makefile
|-- SECURITY.md
`-- VERSION
독립형 모델은 취약한 CMS를 실행하거나 네트워크 요청을 보내지 않고도 버그를 설명합니다:
php demo/path_authorization_demo.php
예상 결과:
Buggy modeled check for outside path: ALLOWED
Safe boundary check for outside path: DENIED
이 데모는 운영 체제 임시 디렉터리에 임시 파일을 생성하고 종료 전에 제거합니다.
docs/lab-setup.md를 따르십시오. 애플리케이션을 127.0.0.1에만 바인딩하고 Croogo와 동일한 VM 또는 컨테이너 내부에 고정 마커 디렉터리를 생성합니다:
sudo install -d -o www-data -g www-data -m 0750 \
/tmp/croogo-cve-2026-16219
일회용 실습실에서 www-data를 PHP-FPM 또는 웹 서버 계정으로 바꾸십시오.
본인 실습실의 합법적인 File Manager 요청에서 전체 Cookie 헤더와 CakePHP CSRF 토큰을 얻으십시오. 절대 커밋하지 마십시오.
export BASE='http://127.0.0.1:8080'
export COOKIE='CAKEPHP=lab-session; csrfToken=lab-cookie-token'
export CSRF_TOKEN='lab-request-token'
export LAB_ACK='I_OWN_THIS_LAB'
POC_VALIDATE_ONLY=1 ./poc/croogo_local_poc.sh
./poc/croogo_local_poc.sh
스크립트는 생성된 파일 이름과 HTTP 상태를 출력합니다. HTTP 리디렉션 또는 성공 응답만으로는 증명이 되지 않습니다. Croogo VM 또는 컨테이너 내부에서 마커를 확인하십시오:
sudo ./poc/verify_marker.sh
WWW_ROOT/assets 밖의 마커는 권한 부여 실패를 입증합니다. 마커는 일반 텍스트이며 웹에서 실행할 수 없습니다.
sudo LAB_ACK='I_OWN_THIS_LAB' ./poc/cleanup_marker.sh
unset COOKIE CSRF_TOKEN LAB_ACK BASE
make test
테스트는 셸 구문을 확인하고, 비루프백 및 URL 혼동 입력을 거부하며, 검증 중에 비밀이 출력되지 않는지 확인하고, 독립형 모델의 예상 결과를 검증합니다.
Configure::read()를 사용하도록 구성 검색을 수정하십시오.patches/illustrative-hardening.patch의 유틸리티 패치와 patches/create-file-hardening-example.md의 컨트롤러 지침은 검토 보조 자료이며 공식 공급업체 수정 사항이 아닙니다. 실제 배포된 브랜치에 대해 테스트하십시오.
이 저장소는 본인 소유이거나 명시적인 서면 승인을 받은 시스템에서만 사용하십시오. 공개 대상을 위한 PoC, 실행 가능한 페이로드, 지속성, 자격 증명 접근 또는 파괴적 행위에 PoC를 개조하지 마십시오. SECURITY.md 및 DISCLAIMER.md를 참조하십시오.
MIT. LICENSE를 참조하십시오.