<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Tue, 29 Sep 2026 02:10:13 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-55419</title>
      <link>https://vulnerability.circl.lu/vuln/fkie_cve-2026-55419</link>
      <description>&lt;p&gt;Reachy Mini is an SDK for controlling Reachy Mini robots. Prior to 1.8.2, the Reachy Mini daemon exposes the /api/media/sounds/upload endpoint implemented by the upload_sound method in src/reachy_mini/daemon/app/routers/media.py without authentication, file-extension checks, content validation, or size validation. The daemon binds to 0.0.0.0 by default and uses permissive CORS allow_origins=[&amp;#34;*&amp;#34;], allowing an unauthenticated network attacker to upload arbitrary file types that are written to /tmp/reachy_mini_sounds/&amp;lt;original_filename&amp;gt;. Malicious files can compromise stored-data integrity and can serve as a foothold when combined with other vulnerabilities. This issue is fixed in version 1.8.2.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Reachy Mini is an SDK for controlling Reachy Mini robots. Prior to 1.8.2, the Reachy Mini daemon exposes the /api/media/sounds/upload endpoint implemented by the upload_sound method in src/reachy_mini/daemon/app/routers/media.py without authentication, file-extension checks, content validation, or size validation. The daemon binds to 0.0.0.0 by default and uses permissive CORS allow_origins=[&amp;#34;*&amp;#34;], allowing an unauthenticated network attacker to upload arbitrary file types that are written to /tmp/reachy_mini_sounds/&amp;lt;original_filename&amp;gt;. Malicious files can compromise stored-data integrity and can serve as a foothold when combined with other vulnerabilities. This issue is fixed in version 1.8.2.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/fkie_cve-2026-55419</guid>
    </item>
    <item>
      <title>GHSA-m2pc-3q4q-w6jr — reachy_mini Allows Unrestricted Upload of File with Dangerous Type</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-m2pc-3q4q-w6jr</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: reachy-mini&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;## Compromise Chain: Unauthenticated to Full Root Access&lt;/p&gt;
&lt;p&gt;This issue is part of a full compromise chain allowing an unauthenticated user to gain root access on the Reachy’s operating system:&lt;/p&gt;
&lt;p&gt;1. Unrestricted File Upload in Media Sounds Upload API \&amp;lt;= current finding  
2. Bluetooth Authentication Bypass  
3. Bluetooth Directory Traversal&lt;/p&gt;
&lt;p&gt;## Description&lt;/p&gt;
&lt;p&gt;The root cause of the issue is at the handler located in “***src/daemon/app/routers/media.py***” file at the “upload\_sound” method:&lt;/p&gt;
&lt;p&gt;```py
@router.post(&amp;#34;/sounds/upload&amp;#34;)
async def upload_sound(
    file: UploadFile = File(...),
) -&amp;gt; dict[str, str]:
    &amp;#34;&amp;#34;&amp;#34;Upload a sound file to the daemon&amp;#39;s temporary sound directory.
    The file is saved to ``/tmp/reachy_mini_sounds/&amp;lt;original_filename&amp;gt;``.
    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.
    &amp;#34;&amp;#34;&amp;#34;
    if not file.filename:
        raise HTTPException(status_code=400, detail=&amp;#34;Filename is required&amp;#34;)
    # Reject path traversal
    filename = Path(file.filename).name
    if not filename or filename in (&amp;#34;.&amp;#34;, &amp;#34;..&amp;#34;):
        raise HTTPException(status_code=400, detail=&amp;#34;Invalid filename&amp;#34;)
    os.makedirs(SOUNDS_TMP_DIR, exist_…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: reachy-mini&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;## Compromise Chain: Unauthenticated to Full Root Access&lt;/p&gt;
&lt;p&gt;This issue is part of a full compromise chain allowing an unauthenticated user to gain root access on the Reachy’s operating system:&lt;/p&gt;
&lt;p&gt;1. Unrestricted File Upload in Media Sounds Upload API \&amp;lt;= current finding  
2. Bluetooth Authentication Bypass  
3. Bluetooth Directory Traversal&lt;/p&gt;
&lt;p&gt;## Description&lt;/p&gt;
&lt;p&gt;The root cause of the issue is at the handler located in “***src/daemon/app/routers/media.py***” file at the “upload\_sound” method:&lt;/p&gt;
&lt;p&gt;```py
@router.post(&amp;#34;/sounds/upload&amp;#34;)
async def upload_sound(
    file: UploadFile = File(...),
) -&amp;gt; dict[str, str]:
    &amp;#34;&amp;#34;&amp;#34;Upload a sound file to the daemon&amp;#39;s temporary sound directory.
    The file is saved to ``/tmp/reachy_mini_sounds/&amp;lt;original_filename&amp;gt;``.
    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.
    &amp;#34;&amp;#34;&amp;#34;
    if not file.filename:
        raise HTTPException(status_code=400, detail=&amp;#34;Filename is required&amp;#34;)
    # Reject path traversal
    filename = Path(file.filename).name
    if not filename or filename in (&amp;#34;.&amp;#34;, &amp;#34;..&amp;#34;):
        raise HTTPException(status_code=400, detail=&amp;#34;Invalid filename&amp;#34;)
    os.makedirs(SOUNDS_TMP_DIR, exist_…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-m2pc-3q4q-w6jr</guid>
    </item>
    <item>
      <title>PYSEC-2026-3916 — reachy_mini Allows Unrestricted Upload of File with Dangerous Type</title>
      <link>https://vulnerability.circl.lu/vuln/pysec-2026-3916</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: reachy-mini&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;## Compromise Chain: Unauthenticated to Full Root Access&lt;/p&gt;
&lt;p&gt;This issue is part of a full compromise chain allowing an unauthenticated user to gain root access on the Reachy’s operating system:&lt;/p&gt;
&lt;p&gt;1. Unrestricted File Upload in Media Sounds Upload API \&amp;lt;= current finding  
2. Bluetooth Authentication Bypass  
3. Bluetooth Directory Traversal&lt;/p&gt;
&lt;p&gt;## Description&lt;/p&gt;
&lt;p&gt;The root cause of the issue is at the handler located in “***src/daemon/app/routers/media.py***” file at the “upload\_sound” method:&lt;/p&gt;
&lt;p&gt;```py
@router.post(&amp;#34;/sounds/upload&amp;#34;)
async def upload_sound(
    file: UploadFile = File(...),
) -&amp;gt; dict[str, str]:
    &amp;#34;&amp;#34;&amp;#34;Upload a sound file to the daemon&amp;#39;s temporary sound directory.
    The file is saved to ``/tmp/reachy_mini_sounds/&amp;lt;original_filename&amp;gt;``.
    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.
    &amp;#34;&amp;#34;&amp;#34;
    if not file.filename:
        raise HTTPException(status_code=400, detail=&amp;#34;Filename is required&amp;#34;)
    # Reject path traversal
    filename = Path(file.filename).name
    if not filename or filename in (&amp;#34;.&amp;#34;, &amp;#34;..&amp;#34;):
        raise HTTPException(status_code=400, detail=&amp;#34;Invalid filename&amp;#34;)
    os.makedirs(SOUNDS_TMP_DIR, exist_…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: reachy-mini&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;## Compromise Chain: Unauthenticated to Full Root Access&lt;/p&gt;
&lt;p&gt;This issue is part of a full compromise chain allowing an unauthenticated user to gain root access on the Reachy’s operating system:&lt;/p&gt;
&lt;p&gt;1. Unrestricted File Upload in Media Sounds Upload API \&amp;lt;= current finding  
2. Bluetooth Authentication Bypass  
3. Bluetooth Directory Traversal&lt;/p&gt;
&lt;p&gt;## Description&lt;/p&gt;
&lt;p&gt;The root cause of the issue is at the handler located in “***src/daemon/app/routers/media.py***” file at the “upload\_sound” method:&lt;/p&gt;
&lt;p&gt;```py
@router.post(&amp;#34;/sounds/upload&amp;#34;)
async def upload_sound(
    file: UploadFile = File(...),
) -&amp;gt; dict[str, str]:
    &amp;#34;&amp;#34;&amp;#34;Upload a sound file to the daemon&amp;#39;s temporary sound directory.
    The file is saved to ``/tmp/reachy_mini_sounds/&amp;lt;original_filename&amp;gt;``.
    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.
    &amp;#34;&amp;#34;&amp;#34;
    if not file.filename:
        raise HTTPException(status_code=400, detail=&amp;#34;Filename is required&amp;#34;)
    # Reject path traversal
    filename = Path(file.filename).name
    if not filename or filename in (&amp;#34;.&amp;#34;, &amp;#34;..&amp;#34;):
        raise HTTPException(status_code=400, detail=&amp;#34;Invalid filename&amp;#34;)
    os.makedirs(SOUNDS_TMP_DIR, exist_…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/pysec-2026-3916</guid>
    </item>
  </channel>
</rss>
