Listen to this Post
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.
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]:
if not file.filename:
raise HTTPException(status_code=400, detail="Filename is required")
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 defense mechanisms:
- No authentication mechanism.
- No file extension validation.
- No file content/size validation.
Additionally, the daemon is bound to the `0.0.0.0` network interfaces by default along with permissive CORS (allow_origins=[""]), meaning the API endpoint is exposed to every network interface the daemon is connected to. This issue is part of a full compromise chain allowing an unauthenticated user to gain root access on the Reachy’s operating system. The vulnerability is fixed in version 1.8.2.
DailyCVE Form:
Platform: Reachy Mini SDK
Version: < 1.8.2
Vulnerability: Unrestricted File Upload
Severity: Medium (CVSS 5.3)
date: 2026-08-25
Prediction: Patch already available (1.8.2)
What Undercode Say:
Analytics:
- CWE: CWE-434 (Unrestricted Upload of File with Dangerous Type)
- Attack Vector: Network
- Privileges Required: None
- User Interaction: None
- Impact: Integrity (Low)
Bash Commands & Code:
Start the daemon in simulation mode:
.venv/bin/mjpython -m reachy_mini.daemon.app.main --sim --no-media
Upload a legitimate `.wav` file:
curl -X POST http://<daemon_domain>:<daemon_port>/api/media/sounds/upload \ -F "file=@/path/to/your/file.wav"
Upload a malicious `.sh` script:
curl -X POST http://<daemon_domain>:<daemon_port>/api/media/sounds/upload \ -F "file=@/path/to/your/script.sh"
The script file will be successfully written to /tmp/reachy_mini_sounds/<original_filename>.
Exploit: (Educational Purposes!)
An attacker can exploit this vulnerability by sending a POST request to the `/api/media/sounds/upload` endpoint with a malicious file, such as a shell script, as the `file` parameter. Since the endpoint lacks authentication and file validation, the file is uploaded and stored in the `/tmp/reachy_mini_sounds/` directory. This can serve as a foothold when combined with other vulnerabilities.
Protection:
- Upgrade to Reachy Mini SDK version 1.8.2 or later.
- Validate that the file extension contains only desired extensions (allow-list approach).
- Validate that the uploaded file’s content matches the desired extension (Magic numbers, and known file structure per file type).
- Enforce authentication on the file upload endpoint.
Impact:
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 other vulnerabilities would arise.
🎯Let’s Practice Exploiting & Learn Patching For Free:
🎓 Live Courses & Certifications:
Join Undercode Academy for Verified Certifications
🚀 Request a Custom Project:
Secure, high-velocity infrastructure and disruptive technological engineering. Contact our engineering team for high-tier development and proprietary systems:
[email protected]
💎 Smart Architecture | 🛡️ Secure by Design | ⭐ Trusted by Thousands
Sources:
Reported By: github.com
Extra Source Hub:
Undercode

