CVE-2026-55419Medium· 5.3▾ Sunlitreachy_mini Allows Unrestricted Upload of File with Dangerous Type
▾ Sunlit zone — Low / medium · no exploitation signal
impact 29.2 · likelihood 0.1 · exploitation 0
Need a working PoC? Pro members can cast a request and our team develops one — it lands right here.
Exploit-prediction probability, daily snapshots since Aug 26.
Disclosure to exploitation, from the record and what we observed since indexing it.
Disclosed via OSV
0.3%
Last analysed / modified upstream
0.3% → 0.5%
The Reachy Mini daemon exposes the “/api/media/sounds/upload” endpoint without authentication and file validation mechanisms.
An attacker can use this endpoint to upload malicious files into the file system that will propagate in future attacks.
This issue is part of a full compromise chain allowing an unauthenticated user to gain root access on the Reachy’s operating system:
The root cause of the issue is at the handler located in “src/daemon/app/routers/media.py” file at the “upload_sound” method:
@router.post("/sounds/upload")
async def upload_sound(
file: UploadFile = File(...),
) -> dict[str, str]:
"""Upload a sound file to the daemon's temporary sound directory.
The file is saved to ``/tmp/reachy_mini_sounds/<original_filename>``.
If a file with the same name already exists it is overwritten.
Returns:
JSON with the absolute *path* of the saved file on the daemon.
"""
if not file.filename:
raise HTTPException(status_code=400, detail="Filename is required")
# Reject path traversal
filename = Path(file.filename).name
if not filename or filename in (".", ".."):
raise HTTPException(status_code=400, detail="Invalid filename")
os.makedirs(SOUNDS_TMP_DIR, exist_ok=True)
dest = os.path.join(SOUNDS_TMP_DIR, filename)
content = await file.read()
with open(dest, "wb") as f:
f.write(content)
return {"status": "ok", "path": dest}
This endpoint lacks multiple defence mechanisms:
Additionally, the daemon is bound to the 0.0.0.0 network interfaces (a.k.a. all network interfaces) by default along with permissive CORS ( allow_origins=[“*”] ) meaning the following API endpoint is exposed to every network interface the daemon is connected to.
.venv/bin/mjpython -m reachy_mini.daemon.app.main --sim --no-media
curl -X POST http://<daemon_domain>:<daemon_port>/api/media/sounds/upload \
-F "file=@/path/to/your/file.wav"
curl -X POST http://<daemon_domain>:<daemon_port>/api/media/sounds/upload \
-F "file=@/path/to/your/script.sh"
Due to this issue, an attacker can upload malicious files instead of the intended sounds files, harming the integrity of the stored data and allowing an attacker to propagate a foothold in cases another vulnerabilities would arise.
Perform the following check on the API endpoint:
The vulnerability was discovered by Natan Nehorai of the JFrog Vulnerability Research team.
reachy-mini < 1.8.2Upgrade to a patched release:
reachy-mini 1.8.2Connected by shared product, vendor, weakness, or advisory.
CVE-2024-10901Critical· 9.1DB-GPT Arbitrary File Write vulnerability
CVE-2025-14199Medium· 6.3A flaw has been found in Verysync 微力同步 up to 2.21.3
CVE-2025-11347High· 7.3A vulnerability was found in code-projects Student Crud Operation up to 3.3
CVE-2025-11318High· 7.3A security flaw has been discovered in Tipray 厦门天锐科技股份有限公司 Data Leakage Prevention System 天锐数据泄露防护系统 1.0
CVE-2025-11908Medium· 6.3A security flaw has been discovered in Shenzhen Ruiming Technology Streamax Crocus 1.3.40
CVE-2025-11398Medium· 6.3A weakness has been identified in SourceCodester Hotel and Lodge Management System 1.0