
RAGFlow 3개 취약점 감사 도구 (CVE-2026-28797 / CVE-2026-24770 / CVE-2025-69286)
RAGFlow 3개 취약점 감사 도구 (CVE-2026-28797 / CVE-2026-24770 / CVE-2025-69286)
순수 Python 표준 라이브러리만 사용하며, 타사 의존성이 없습니다. Python 3.8+에서 바로 실행할 수 있습니다.
python3 ragflow-audit.py [-h] {ssti,zipslip,apikey} ...
python3 ragflow-audit.py ssti --url http://TARGET:9380 --auth "AUTH_HEADER" [--component StringTransform|Message] [--newline]
--url: RAGFlow 웹 주소--auth: 로그인 응답 헤더 Authorization의 전체 값--component: 대상 컴포넌트, 기본값 StringTransform--newline: 개행을 사용한 페이로드 우회 ( 정규식 탐지 우회)_is_jinjia2흐름: 악성 canvas DSL 구성 -> POST /v1/canvas/set 캔버스 생성 -> POST /v1/canvas/completion 실행 트리거 -> 출력에서 uid= 매칭으로 RCE 성공 여부 판단.
python3 ragflow-audit.py zipslip --zip evil.zip [--extract-dir /tmp/out]
오프라인으로 zip 항목을 검사하여 세 가지 위험 유형을 표시합니다: 경로 탐색(..), 절대 경로, 심볼릭 링크.
python3 ragflow-audit.py apikey --beta "分享链接token" --node "攻击者user_id后12位"
공개 공유 링크의 beta token에서 uuid1 본체를 복원하고 time_low를 열거하여 후보 token을 출력합니다. 실제 악용 시 후보 token 각각에 대해 인증이 필요한 API를 호출합니다(200 적중 / 401 계속).
RAGFlow의 로그인 자격 증명은 로그인 응답 헤더 Authorization에 있으며, body의 access_token이 아닙니다. body의 access_token은 단지 UUID일 뿐이며, API를 호출하면 401이 발생합니다.
curl -i -X POST http://TARGET:9380/v1/user/login \
-H 'Content-Type: application/json' \
-d '{"email":"[email protected]","password":"<RSA加密后的密码>"}'
응답 헤더 authorization:의 값을 --auth 매개변수로 사용하세요.
참고: 등록/로그인 비밀번호는 먼저 RSA로 암호화해야 합니다(공개 키는 /ragflow/conf/public.pem, PKCS1_v1_5, 암호화 대상은 base64 인코딩된 평문). 평문 비밀번호를 직접 전송하면 오류가 발생합니다.
| CVE | 유형 | 영향 버전 | 수정 버전 |
|---|---|---|---|
| CVE-2026-28797 | SSTI(StringTransform/Message 컴포넌트) | < 0.25.0(NVD: 0.24.0 and prior) | 0.25.0(샌드박스 수정, 2026-03-02 병합) |
| CVE-2026-24770 | MinerU 파서 Zip Slip | < 0.23.1 | 0.23.1 |
| CVE-2025-69286 | API key 유도 가능(uuid1 + tenant_id 키) | < 0.22.0 | 0.22.0 |
이 도구는 승인된 보안 테스트와 취약점 연구에만 사용됩니다. 승인 없이 타인 시스템에 이 도구를 사용하여 발생한 결과는 사용자 본인이 전적으로 책임집니다.