OpenWrt cgi-io: ACL-Bypass und Lesen beliebiger Root-Dateien über cgi-download
In OpenWrt cgi-io prüft der cgi-download-Handler den angefragten Pfad vor der ACL-Autorisierung nicht kanonisch, sodass ein authentifizierter Nutzer mit pfadbeschränkter file-ACL über eine ../-Sequenz die Beschränkung umgeht und beliebige, für root lesbare Dateien wie /etc/shadow ausliest.
Advisory-ID: TP-2026-034
Produkt: OpenWrt cgi-io (privilegiertes CGI-Hilfsprogramm für Datei-Up-/Download über rpcd/LuCI)
Schwachstellentyp: Path Traversal / ACL-Bypass durch fehlende Pfad-Kanonisierung vor der Autorisierung (CWE-22)
CVE: CVE-2026-62947
CVSS 3.1: 4.9 (Mittel) · CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:N/A:N
Betroffene Versionen: cgi-io <= 25.12.4 (HEAD 658b14b)
Behoben in: Fix-Commit 72990b74 (Master, 27. Juni 2026)
Hersteller-Advisory: GHSA-jw5r-xhf5-2xcq
Gemeldet: 27. Juni 2026
Zusammenfassung
OpenWrt cgi-io ist ein privilegiertes CGI-Hilfsprogramm, das Datei-Up- und -Downloads für rpcd und LuCI abwickelt und als root läuft. Der cgi-download-Handler liest das path-POST-Feld und reicht es in der verwundbaren Version unverändert an die ACL-Prüfung und danach an open() weiter. Die ACL-Autorisierung in rpcd nutzt fnmatch() ohne das Flag FNM_PATHNAME, sodass ein *-Wildcard in einer erlaubten file-Glob über / hinweg greift. Ein authentifizierter Nutzer mit cgi-io download-Recht und einem Wildcard-file-Read-Grant (z. B. /etc/apk/keys/*) umgeht so die Pfadbeschränkung und liest beliebige, für root lesbare Dateien. turingpoint hat die Schwachstelle verifiziert und gemeldet; der Hersteller hat sie durch Pfad-Kanonisierung vor der ACL-Prüfung behoben.
Ursache
main_download liest das path-POST-Feld und übergab es in der verwundbaren Version ungeprüft an session_access() und open() (main.c:525, :549, :566). Die Autorisierung läuft über den rpcd-access-Aufruf und verwendet fnmatch() ohne FNM_PATHNAME, wodurch ein * in einer erlaubten file-Glob auch / matcht (main.c:105, session_access). Ein Pfad wie /etc/apk/keys/../../../../etc/shadow matcht die ACL gegen das erlaubte Präfix, während der Kernel die eingebetteten .. auflöst und open() eine Datei ausserhalb des gewährten Bereichs erreicht. Der Upload-Handler und rpcd-mod-file kanonisieren den Pfad bereits vor der ACL-Prüfung und weisen dieselbe Eingabe daher ab. Der Fix ergänzt canonicalize_path() vor der ACL-Prüfung in main_download (main.c:547, Commit 72990b74) und gleicht den Download-Pfad an die Geschwister-Handler an.
Proof of Concept
# Authentifizierte Sitzung mit `cgi-io download`-Recht und einem
# Wildcard-`file`-Read-Grant, z. B. /etc/apk/keys/*
curl http://target/cgi-bin/cgi-download \
--data-urlencode sessionid=<SID> \
--data-urlencode 'path=/etc/apk/keys/../../../../etc/shadow' \
--data-urlencode filename=shadow
# -> Inhalt von /etc/shadow, obwohl die ACL nur /etc/apk/keys/* erlaubt.
Die ACL-Glob /etc/apk/keys/* matcht das literale Präfix des Pfads (fnmatch ohne FNM_PATHNAME), während open() die ..-Sequenzen zu /etc/shadow auflöst. rpcd verweigert derselben eingeschränkten Sitzung den direkten Zugriff auf /etc/shadow; nur der nicht kanonisierte Download-Pfad umgeht die Prüfung.
Auswirkung
- Lesen beliebiger, für root (uid 0) lesbarer Dateien trotz pfadbeschränkter
file-ACL. - Offenlegung des Root-Passwort-Hashes (
/etc/shadow, offline knackbar). - Auslesen von
/etc/config/*(WLAN-PSKs, VPN-Keys, Zugangsdaten) sowie SSH- und TLS-Private-Keys. - Voraussetzung ist eine authentifizierte Sitzung mit
cgi-io downloadund einem Wildcard-file-Read-Grant; keine Nutzerinteraktion.
Referenzen
Steckt so etwas in Ihrer Software?
Diese Schwachstelle hat unser Team im Rahmen seiner Arbeit gefunden. Lassen Sie Ihre Anwendungen von denselben Spezialisten prüfen, mit einem Penetrationstest von turingpoint.
