Headplane: Path Traversal & RBAC-Bypass

Path Traversal und RBAC-Bypass in Headplane: Jeder authentifizierte OIDC-Nutzer kann fremde Nodes und Benutzer umbenennen und ablaufen lassen.

Advisory-ID: TP-2026-003
Produkt: Headplane (Web-Oberfläche für Headscale)
Schwachstellentyp: Path Traversal (CWE-22) + Autorisierungsfehler / RBAC-Bypass (CWE-863)
CVE: CVE-2026-46484
CVSS 3.1: 8.1 (Hoch) · CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H
Betroffene Versionen: Stable ≤ 0.6.2, Beta 0.7.0-beta.1 und 0.7.0-beta.2
Gepatcht in: 0.6.3, 0.7.0-beta.3
Hersteller-Advisory: GHSA-vgj6-hcf2-fqf6
Gemeldet: 26. April 2026

Zusammenfassung

Headplane ist eine verbreitete Web-Oberfläche zur Verwaltung von Headscale, dem selbst gehosteten Kontrollserver für Tailscale-Netze. Die Funktion renameNode interpoliert den vom Nutzer gelieferten Namen ohne URL-Kodierung in den Headscale-Anfragepfad. Node.js normalisiert die Pfad-Traversal-Sequenzen vor dem Senden, sodass die Anfrage auf einen fremden Endpunkt umgelenkt wird, während die Berechtigungsprüfung nur den mitgesendeten eigenen Node validiert. Im Ergebnis kann jeder authentifizierte OIDC-Nutzer, unabhängig von seiner Rolle, beliebige Nodes und Benutzerkonten umbenennen und ablaufen lassen (expire).

Ursache

Die Aktion renameNode baut den Headscale-Pfad v1/node/${nodeId}/rename/${newName} und wendet auf newName kein encodeURIComponent an (app/server/headscale/api/endpoints/nodes.ts:149). Die Anfrage wird über new URL(url, baseUrl) gesendet, das ../-Segmente normalisiert, sodass aus v1/node/1/rename/../../2/expire der Pfad v1/node/2/expire wird (app/server/headscale/api/index.ts:126). Die Autorisierungsprüfung validiert den Node aus dem Formularfeld node_id, also den eigenen Node des Angreifers, statt des Traversal-Ziels (app/routes/machines/machine-actions.ts:64). Dasselbe ungeschützte Muster existiert in renameUser (app/server/headscale/api/endpoints/users.ts:84), dort hinter der Capability write_users. encodeURIComponent() wird auf keines der beiden Pfadsegmente angewendet.

Proof of Concept

Eine gültige, niedrig privilegierte OIDC-Session genügt. Der Rename-Wert enthält eine Traversal-Sequenz auf den Expire-Endpunkt eines fremden Nodes:

POST /admin/machines HTTP/1.1
Cookie: _hp_auth=<Session eines niedrig privilegierten OIDC-Nutzers>
Content-Type: application/x-www-form-urlencoded

action_id=rename&node_id=<eigene_node_id>&name=../../<fremde_node_id>/expire

Headplane normalisiert den Pfad über new URL() und leitet POST /api/v1/node/<fremde_node_id>/expire an Headscale weiter, das den Aufruf ausführt. Live getestet mit caps=0, caps=1 und caps=1323: alle lassen einen Node ablaufen, der dem Angreifer nicht gehört.

Auswirkung

  • Beliebige Nodes ablaufen lassen, inklusive Admin-Nodes, und so deren Konnektivität kappen.
  • Beliebige Nodes umbenennen, wodurch MagicDNS-Namen brechen.
  • Headscale-Benutzer umbenennen über den write_users-Pfad.
  • Ausnutzbar durch jeden authentifizierten OIDC-Nutzer ohne Capability-Bits.

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.