Wekan: Arbitrary File Read & DoS
Ein selbst registrierter Board-Nutzer kann in Wekan über das Attachment-Feld versions.original.path beliebige Dateien lesen und den Server zum Absturz bringen.
Advisory-ID: TP-2026-004
Produkt: Wekan (Open-Source-Kanban-Board)
Schwachstellentyp: Path Traversal (CWE-22) + unkontrollierter Ressourcenverbrauch (CWE-400)
CVE: pending
CVSS 3.1: 7.1 (Hoch)
Hersteller-Advisory: GHSA-g6vm-7757-pr88
Behoben in: 9.31
Gemeldet: 30. Mai 2026
Zusammenfassung
Wekan ist ein weit verbreitetes Open-Source-Kanban-Board. Beim Anlegen von Attachments prüft die Autorisierung nur den Board-Schreibzugriff, nicht aber das vom Client gelieferte versions-Objekt. Ein selbst registriertes Board-Mitglied kann dadurch ein Attachment einfügen, dessen versions.original.path auf eine beliebige absolute Datei zeigt und mit storage: "fs" einen Dateisystem-Lesezugriff erzwingt. turingpoint hat in einer laufenden Instanz verifiziert, dass sich so beliebige für den Serverprozess lesbare Dateien auslesen und der Server gezielt zum Absturz bringen lassen.
Ursache
getReadStream() liest originalPath = v.path direkt, ohne Containment-Prüfung gegen das Speicherverzeichnis (models/lib/fileStoreStrategy.js:334-335,383-389). getFileStrategy wählt das Speicher-Backend aus dem angreifergesetzten versions[version].storage, sodass storage:"fs" einen Dateisystem-Lesezugriff erzwingt (fileStoreStrategy.js:76-78). Die Regel Attachments.allow({insert}) prüft nur den Board-Schreibzugriff und inspiziert das eingefügte versions-Objekt nicht (server/permissions/attachments.js:6-9). Die Schwester-Regel update blockiert versions.*.path-Schreibzugriffe mit dem Kommentar "block direct client-side $set operations on 'versions.*.path' to prevent path traversal attacks", der Insert-Pfad besitzt diese Absicherung jedoch nicht (server/permissions/attachments.js:10-22). api.attachment.download puffert den gesamten Read-Stream ohne Größenbegrenzung, sodass ein path auf /dev/zero den Speicher erschöpft (server/attachmentApi.js:117-173).
Proof of Concept
Da die Registrierung standardmäßig offen ist, genügt ein selbst angelegtes Konto mit einem öffentlichen Board:
// 1) Attachment mit absolutem Pfad anlegen
{ "name": "x.txt",
"versions": { "original": { "path": "/proc/self/environ",
"storage": "fs", "type": "text/plain", "size": 4096, "meta": {} } },
"meta": { "boardId": "<board-id>", "source": "x" } }
// 2) Datei abrufen
GET /cdn/storage/attachments/<attachment-id>
Der gesetzte storage:"fs" erzwingt einen Dateisystem-Lesezugriff, sodass sich beliebige für den Serverprozess lesbare Dateien auslesen lassen, etwa /proc/self/environ mit der MONGO_URL. Zeigt der Pfad stattdessen auf /dev/zero, stürzt der Serverprozess ab (Denial of Service).
Auswirkung
- Lesen jeder für den Serverprozess (uid 999) lesbaren Datei: Umgebungsvariablen,
MONGO_URL, Credentials. - Offenlegung der
MONGO_URLliefert den DB-Connection-String; das Standard-MongoDB hat keine Authentifizierung. - Wiederholbarer Denial of Service: ein
/dev/zero-Pfad bringt den Serverprozess bei jedem Abruf zum Absturz. - Ausnutzbar durch einen selbst registrierten Nutzer ohne Adminrechte.
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.
