CVE-2026-24770: Verified Repro With Script Download
CVE-2026-24770: RAGFlow MinerU parser Zip Slip allows arbitrary file overwrite and potential RCE via malicious ZIP archives.
CVE-2026-24770 is verified against ragflow (RAGFlow) · pip (per GitHub advisory). Affected versions: Versions prior to 0.23.1 (advisory text says 0.23.1 and possibly earlier; dbugs says prior to 0.23.1). Fixed in 0.23.1 (ticket); GitHub advisory lists patched versions: none; patch commit 64c75d558e4a17a4a48953b4c201526431d8338f. Vulnerability class: RCE. This critical reproduction includes runnable sandbox proof, artifacts, and a plain-text agent view under REPRO-2026-00086.
What Is CVE-2026-24770?
CVE-2026-24770 is a Zip Slip path-traversal vulnerability in RAGFlow's MinerU parser, where a malicious ZIP archive can cause the parser to write files outside its intended extraction directory, enabling arbitrary file overwrite and potential remote code execution. Pruva reproduced it (reproduction REPRO-2026-00086).
CVE-2026-24770 Severity & CVSS Score
CVE-2026-24770 is rated critical severity, with a CVSS base score of 9.8 out of 10.
Critical — the most severe class — typically remotely exploitable with severe impact. Treat as an emergency.
Affected ragflow (RAGFlow) Versions
ragflow (RAGFlow) · pip (per GitHub advisory) versions Versions prior to 0.23.1 (advisory text says 0.23.1 and possibly earlier; dbugs says prior to 0.23.1) are affected.
How to Reproduce CVE-2026-24770
pruva-verify REPRO-2026-00086 curl -O https://pruva.dev/api/v1/reproductions/REPRO-2026-00086/artifacts/reproduction_steps.sh && chmod +x reproduction_steps.sh && ./reproduction_steps.sh Proof of Reproduction for CVE-2026-24770
Reproduced by Pruva's autonomous agents — 112 tool calls over 8 min. Full root-cause analysis and the complete transcript are below.
How the agent worked
Root Cause and Exploit Chain for CVE-2026-24770
Summary
RAGFlow versions prior to 0.23.1 contain a Zip Slip path traversal in the MinerU parser. The _extract_zip_no_root routine accepts ZIP member filenames verbatim and joins them with the extraction directory, allowing crafted ZIP entries to escape the intended destination and overwrite arbitrary files. By embedding an entry like test//tmp/ragflow_zip_slip_pwned, an attacker can cause the parser to write to /tmp when the ZIP is processed.
Impact
- Component:
deepdoc/parser/mineru_parser.py(MinerUParser._extract_zip_no_root). - Affected versions: RAGFlow < 0.23.1 (verified on v0.23.0).
- Risk: High. Arbitrary file overwrite enables potential RCE by replacing executables, configuration, or scripts executed by the service.
Root Cause
MinerUParser._extract_zip_no_root iterates ZIP entries, strips a presumed root folder, and concatenates the remaining path with the extraction directory using os.path.join. It does not normalize or validate the member path for traversal (../), absolute paths, or alternative separators. As a result, a filename like test//tmp/ragflow_zip_slip_pwned resolves outside the extraction root and gets written directly to /tmp. The fix in commit 64c75d558e4a17a4a48953b4c201526431d8338f adds checks for absolute paths, traversal segments, symlinks, and enforces that the resolved path remains under the extraction directory.
Reproduction Steps
- Run
repro/reproduction_steps.sh. - The script checks out RAGFlow v0.23.0, crafts a ZIP with a malicious entry, and calls
MinerUParser._extract_zip_no_rootto extract it. - Expected evidence:
/tmp/ragflow_zip_slip_pwnedis created with attacker-controlled content.
Evidence
- Script output (stdout):
"[+] Vulnerability reproduced: /tmp/ragflow_zip_slip_pwned created". - Evidence file:
/tmp/ragflow_zip_slip_pwnedexists after running the script. - Environment: Python packages installed via pip in the script (numpy, pdfplumber, Pillow, strenum, requests, beartype).
Recommendations / Next Steps
- Apply the upstream patch from commit
64c75d558e4a17a4a48953b4c201526431d8338f(upgrade to >= 0.23.1). - Add path normalization and explicit checks to reject absolute paths, traversal segments, and symlink entries in ZIP archives.
- Add regression tests that ensure ZIP entries cannot escape the extraction directory.
Additional Notes
- The reproduction script was executed twice successfully and is idempotent.
- The script stubs
deepdoc.parser.pdf_parserto avoid unrelated dependencies while exercising the vulnerable extraction routine directly.
CVE-2026-24770 Reproduction Transcript
The agent's step-by-step process — every tool call, every handoff, the moment the exploit fired.
Full session Replay every step — scrub the timeline or play it back.
git clone https://github.com/infiniflow/ragflow.git /data/pruva/runs/b1402954-3aa7-4ba3-b79c-1b0a8eae7772/ragflowCloning into '/data/pruva/runs/b1402954-3aa7-4ba3-b79c-1b0a8eae7772/ragflow'...
git checkout v0.23.0Note: switching to 'v0.23.0'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. Example:
Artifacts and Evidence for CVE-2026-24770
Scripts, logs, diffs, and output captured during the reproduction.
No artifacts available
How to Fix CVE-2026-24770
Upgrade ragflow (RAGFlow) · pip (per GitHub advisory) to 0.23.1 (ticket); GitHub advisory lists patched versions: none; patch commit 64c75d558e4a17a4a48953b4c201526431d8338f or later.
FAQ: CVE-2026-24770
How does the RAGFlow MinerU Zip Slip attack work?
Which versions of RAGFlow are affected by CVE-2026-24770, and where is it fixed?
How severe is CVE-2026-24770?
How can I reproduce CVE-2026-24770?
References for CVE-2026-24770
Authoritative sources for CVE-2026-24770 — official vulnerability databases and the upstream advisory. Pruva's reproduction verifies the issue firsthand; these are the primary records to corroborate it.