Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Tools/GitHubGitHub/0xmrma/cve-2026-14361
SchwachstellenanalyseCode-AnalyseExploitationLernen & Bildung
GitHub0xmrma/cve-2026-14361

CVE-2026-14361

Das writeToFile-Hilfsprogramm von Consul Template öffnete ein vom Operator angegebenes Ziel direkt und folgte verlinkten Pfadkomponenten, sodass gerenderte Ausgabe das vorgesehene Verzeichnis verlassen und eine bereits vorhandene Datei überschreiben konnte.

Repository anzeigen
2vor 1 MonatNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-14361

Der writeToFile-Helper von Consul Template öffnete ein vom Betreiber angegebenes Ziel direkt und folgte verlinkten Pfadkomponenten, wodurch gerenderte Ausgaben das vorgesehene Verzeichnis verlassen und eine bereits vorhandene Datei überschreiben konnten.

Intro

Ich fand dieses Problem bei der Überprüfung von HashiCorp Consul Template, mit einer direkten Dateisystem-Sicherheitsfrage im Hinterkopf:

Wenn writeToFile einen Pfad erhält, der scheinbar innerhalb des vorgesehenen Verzeichnisses liegt, wird dann geprüft, wohin das Dateisystem die Daten tatsächlich schreibt?

In diesem Fall lautete die Antwort nein.

Der Template-Helper writeToFile öffnete den endgültigen, vom Benutzer bereitgestellten Pfad direkt über os.Create() oder os.OpenFile().

Diese Operationen folgten symbolischen Links, Directory Junctions und gleichwertigen Dateisystem-Umleitungen, die bereits im Zielpfad vorhanden waren.

Das bedeutete, dass die Pfadzeichenkette innerhalb des vom Betreiber vorgesehenen Wurzelverzeichnisses bleiben konnte, während der tatsächliche Schreibvorgang woanders landete.

In meinem kontrollierten Proof of Concept leitete ein verlinktes Elternverzeichnis die gerenderte Ausgabe außerhalb des vorgesehenen Verzeichnisbaums um und führte dazu, dass eine bereits vorhandene Zieldatei überschrieben wurde.

Dieses Problem wurde zu CVE-2026-14361.

HashiCorp-Bulletin: HCSEC-2026-20
IBM-Bulletin: CVE-2026-14361 security bulletin
CVE: CVE-2026-14361
Behoben in: 0.42.1

photo0


Angriffskette

vom Betreiber angegebenes Ziel scheint innerhalb des vorgesehenen Wurzelverzeichnisses zu liegen -> Angreifer platziert vorab ein verlinktes Eltern- oder Endpfad-Element -> writeToFile öffnet den Pfad direkt -> das Dateisystem löst den Schreibvorgang außerhalb des vorgesehenen Verzeichnisses auf -> gerendertes Geheimnis wird umgeleitet -> bereits vorhandenes Ziel kann überschrieben werden


Was writeToFile tut

Consul Template rendert Daten aus Quellen wie Consul und Vault.

Der Helper writeToFile ermöglicht es einem Template, ausgewählte Inhalte in eine separate lokale Datei zu schreiben, während ein gewünschter Besitzer, eine Gruppe und ein Berechtigungsmodus angewendet werden.

HashiCorps Dokumentation demonstriert den Helper ausdrücklich mit PKI-Material:

root@kitploit:~
private key -> writeToFile /my/path/to/cert.key
certificate authority -> writeToFile /my/path/to/cert.pem
certificate -> append to /my/path/to/cert.pem

Das macht dies zu mehr als einem gewöhnlichen Ausgabe-Helper.

Die Inhalte, die diese Grenze überschreiten, können umfassen:

  • private Schlüssel
  • Zertifikate
  • von Vault abgerufene Geheimnisse
  • Konfigurationswerte
  • Dienst-Anmeldedaten

Die wichtige Frage war nicht, ob writeToFile einen angeforderten Dateinamen erstellen konnte.

Die eigentliche Frage war:

Schreibt der Prozess an den vom Betreiber vorgesehenen Dateisystemort oder lediglich an das Objekt, auf das der Pfad zum Zeitpunkt des Öffnens aufgelöst wird?

In verwundbaren Versionen vertraute er Letzterem.


Warum diese Angriffsfläche einen Blick wert war

Schreib-Helper sind Sicherheitsflächen mit hohem Wert, weil sie von Anwendungsdaten zur Dateisystem-Mutation übergehen.

Die interessanten Fehler sind oft keine klassische ../-Traversal.

Es sind Auflösungsfehler:

  • die Zeichenkette sieht sicher aus
  • der Verzeichnisbaum sieht betreiberkontrolliert aus
  • eine verlinkte Komponente ändert das tatsächliche Ziel
  • der Open-Aufruf folgt dieser Umleitung automatisch

Das ist besonders wichtig, wenn der Prozess mit mehr Dateisystemrechten läuft als der Angreifer.

Ein lokaler Angreifer mit niedrigen Rechten kann möglicherweise keine sensible Datei direkt überschreiben.

Aber wenn er eine Pfadkomponente unter einem vorgesehenen Schreibverzeichnis beeinflussen kann, könnte ein privilegierterer Consul-Template-Prozess den Schreibvorgang für ihn ausführen.

Das war die Grenze, auf die ich mich konzentriert habe.


Die Grenze, auf die ich mich konzentriert habe

Ich bin dies nicht als generische Path-Traversal-Überprüfung angegangen.

Der bereitgestellte Pfad benötigte keine ..-Segmente.

Er konnte die gesamte Zeit lexikalisch innerhalb des vorgesehenen Wurzelverzeichnisses bleiben.

Die stärkere Frage war:

Werden verlinkte Zielkomponenten abgelehnt, bevor sensible Inhalte geschrieben werden?

Diese Frage ist wichtig für beides:

  • einen verlinkten endgültigen Dateinamen
  • eine verlinkte Verzeichniskomponente, die den gesamten verbleibenden Pfad umleitet

Der zweite Fall ist besonders nützlich, weil Logs und Konfiguration weiterhin einen harmlos aussehenden Pfad unter dem erwarteten Verzeichnis zeigen.

Das Dateisystem löst ihn jedoch woanders auf.


Grundursache

Die Grundursache war eine direkte, pfadbasierte Dateierstellung ohne link-bewusste Validierung.

In der getesteten Revision wählte writeToFile() einen von zwei Öffnungspfaden.

Der Anhänge-Modus verwendete:

root@kitploit:~
f, err = os.OpenFile(
    path,
    os.O_APPEND|os.O_WRONLY|os.O_CREATE,
    perm,
)

Der normale Schreibmodus verwendete:

root@kitploit:~
dirPath := filepath.Dir(path)

if _, err := os.Stat(dirPath); err != nil {
    err := os.MkdirAll(dirPath, os.ModePerm)
    if err != nil {
        return "", err
    }
}

f, err = os.Create(path)

Keiner der beiden Pfade lehnte verlinkte Zielkomponenten ab, bevor die Datei geöffnet wurde.

Das ist wichtig, weil:

  • os.Create(path) bestehenden Dateisystem-Umleitungen folgt und die aufgelöste Datei kürzt
  • os.OpenFile(path, ...) verlinkten Pfadkomponenten im Anhänge-Modus folgt
  • ein verlinktes Verzeichnis ändert, wo der endgültige Dateiname aufgelöst wird
  • eine verlinkte Endkomponente das Öffnen auf eine andere vorhandene Datei umleiten kann

Die gleiche pfadbasierte Annahme setzte sich nach dem Schreiben fort.

Besitzer und Berechtigungen wurden erneut über den Pfad angewendet:

root@kitploit:~
err = os.Chown(path, uid, gid)
err = os.Chmod(path, perm)

Das bedeutete, dass Metadaten-Operationen ebenfalls an einen veränderbaren Pfadnamen gebunden waren, statt an den bereits geöffneten Dateideskriptor.

Warum dies ausnutzbar ist

Weil der Angreifer die Umleitung vorbereiten kann, bevor writeToFile ausgeführt wird.

Für den grundlegenden Angriff ist kein probabilistischer Wettlauf erforderlich.

Die Abfolge ist unkompliziert:

  • der Betreiber konfiguriert ein Ziel unter einem erwarteten Wurzelverzeichnis
  • der Angreifer erlangt genügend lokalen Zugriff, um eine verlinkte Komponente unterhalb dieses Schreiborts zu erstellen oder zu ersetzen
  • die Pfadzeichenkette scheint weiterhin unter dem vorgesehenen Wurzelverzeichnis zu bleiben
  • writeToFile öffnet sie direkt
  • das Betriebssystem folgt dem Link oder der Junction
  • die gerenderte Ausgabe landet am aufgelösten Ziel
  • wenn dieses Ziel bereits existiert, kürzt und überschreibt der normale Erstellungsmodus es

Das ist die gesamte Verwundbarkeit.


Was dies zu einem Sicherheitsproblem macht, nicht nur zu normalem Symlink-Verhalten

Es stimmt, dass Betriebssysteme bei pfadbasierten Datei-Öffnungen normalerweise Symlinks folgen.

Das macht dies nicht zu einem sicheren Anwendungsverhalten.

Die Sicherheitsfrage ist nicht:

„Hat sich Go wie dokumentiert verhalten?"

Die eigentliche Frage ist:

Hat ein Helper, der sensible gerenderte Daten schreibt, verifiziert, dass das aufgelöste Ziel mit dem vom Betreiber vorgesehenen Ort übereinstimmt?

In verwundbaren Versionen tat er das nicht.

Diese Unterscheidung ist wichtig, weil Consul Template ausgeführt werden kann:

  • als langlebiger Dienst
  • mit Zugriff auf von Vault abgeleitete Geheimnisse
  • unter einem Konto mit erhöhten Rechten
  • mit Schreibzugriff, den der lokale Angreifer nicht direkt hat

Das Befolgen einer vom Angreifer positionierten Dateisystem-Umleitung in diesem Kontext erzeugt ein echtes Problem an der Privilegien- und Vertrauensgrenze.


Proof of Concept

Ich habe einen eigenständigen Reproduktionstest rund um das exakte writeToFile-Verhalten im getesteten Commit erstellt.

Das kontrollierte Setup verwendete:

  • ein vorgesehenes Ausgabe-Wurzelverzeichnis
  • ein externes Verzeichnis außerhalb dieses Wurzelverzeichnisses
  • eine verlinkte Elternkomponente unterhalb des vorgesehenen Wurzelverzeichnisses
  • eine bereits vorhandene Zieldatei im umgeleiteten Verzeichnis
  • kontrollierten geheimen Inhalt, der an writeToFile übergeben wurde

Der Reproduktionsablauf war:

  1. Das vorgesehene Ausgabe-Wurzelverzeichnis erstellen.
  2. Ein separates externes Zielverzeichnis erstellen.
  3. Eine bereits vorhandene Zieldatei im externen Verzeichnis platzieren.
  4. Ein verlinktes Elternverzeichnis unter dem vorgesehenen Wurzelverzeichnis erstellen, das auf das externe Verzeichnis aufgelöst wird.
  5. Den endgültigen Zielpfad unter Verwendung des verlinkten Elternverzeichnisses aufbauen, während die Pfadzeichenkette unter dem vorgesehenen Wurzelverzeichnis bleibt.
  6. Den verwundbaren Schreibpfad mit kontrolliertem geheimen Inhalt aufrufen.
  7. Das tatsächliche Ziel auflösen und untersuchen.
  8. Die endgültigen Dateibytes und SHA-256 mit dem geheimen Eingabeinhalt vergleichen.

Das beobachtete Verhalten war:

  • die vorgesehene Zielzeichenkette blieb unter dem vorgesehenen Wurzelverzeichnis
  • das verlinkte Elternverzeichnis leitete den tatsächlichen Schreibvorgang außerhalb dieses Wurzelverzeichnisses um
  • writeToFile folgte der Umleitung
  • das bereits vorhandene externe Ziel wurde überschrieben
  • die endgültige externe Datei entsprach dem geheimen Eingabeinhalt exakt per SHA-256

Damit wurden beide Teile der Behauptung belegt:

  • Ausgabe konnte den vorgesehenen Verzeichnisbaum verlassen
  • eine vorhandene Datei am aufgelösten Ziel konnte überschrieben werden

Warum der PoC auf diese Weise gewählt wurde

Ein Symlink als Endkomponente hätte bereits unsicheres Link-Folgen demonstriert.

Aber eine verlinkte Elternkomponente beweist einen stärkeren operativen Punkt:

  • der konfigurierte Dateiname kann völlig normal aussehen
  • der Pfad kann lexikalisch unter dem vorgesehenen Wurzelverzeichnis bleiben
  • die Umleitung kann weiter oben im Pfad erfolgen
  • der endgültige Schreibvorgang kann dennoch woanders landen

Auch das bereits vorhandene Ziel war wichtig.

Ohne es würde der PoC nur unerwartete Dateierstellung zeigen.

Indem mit einer vorhandenen Datei begonnen und ihr endgültiger Hash verifiziert wurde, bewies die Reproduktion das Überschreibverhalten direkt.

Das machte das Ergebnis konkreter als eine reine Quellcode-Behauptung.


Ausnutzungsanforderungen und Umfang

Dieses Problem erfordert lokalen Dateisystem-Einfluss.

Ein Angreifer benötigt genügend Zugriff, um einen Symlink, eine Directory Junction oder eine gleichwertige Umleitung in oder unterhalb des vorgesehenen Schreiborts zu erstellen oder zu ändern.

Der Consul-Template-Prozess muss dann durch diesen Pfad schreiben.

Die Auswirkungen hängen stark von den Prozessrechten und dem gerenderten Inhalt ab.

Die praktischen Ergebnisse umfassen:

  • Umleiten von Template-Ausgaben außerhalb des vom Betreiber vorgesehenen Verzeichnisses
  • Platzieren sensibler gerenderter Daten an einem für den Angreifer lesbaren Ort
  • Überschreiben einer bereits vorhandenen Datei am aufgelösten Ziel
  • erhöhte Auswirkungen, wenn der Prozess mit erhöhten Rechten läuft
  • erhöhtes Vertraulichkeitsrisiko, wenn der Inhalt Schlüssel, Zertifikate oder Geheimnisse enthält

Dies war kein entfernter, nicht authentifizierter beliebiger Schreibvorgang aus einer Standardinstallation.

Aber es war ein klarer lokaler Vertrauensgrenzen-Fehler mit bedeutenden Auswirkungen in privilegierten oder gemeinsamen Dateisystem-Bereitstellungen.


Schweregrad und Klassifizierung

HashiCorp klassifizierte das Problem als:

  • CWE-59: Improper Link Resolution Before File Access (Unzulässige Link-Auflösung vor Dateizugriff)
  • CVSS 3.1:
root@kitploit:~
CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:N/A:N

Der veröffentlichte Basis-Score ist:

root@kitploit:~
4.7 / Medium

Dieser Vektor spiegelt wider:

  • lokalen Angreiferzugriff
  • niedrige Rechte, die zur Beeinflussung des Pfads erforderlich sind
  • hohe Angriffskomplexität
  • keine Benutzerinteraktion
  • potenziell hohe Vertraulichkeitsauswirkungen, wenn sensible gerenderte Ausgaben umgeleitet werden

Die offiziellen Bulletins dokumentieren außerdem ausdrücklich, dass der umgeleitete Schreibvorgang eine bereits vorhandene Datei überschreiben kann.

Der Score ist moderat, weil die Ausnutzung von lokalen Pfadkontrollbedingungen abhängt, nicht weil der Dateisystem-Effekt theoretisch wäre.


Betroffene Versionen

Das HashiCorp-Bulletin listet:

root@kitploit:~
Affected: consul-template up to and including 0.42.0
Fixed:    consul-template 0.42.1

Der Fix wurde in der Version 0.42.1 am 8. Juli 2026 veröffentlicht.


Analyse des Fixes

Der Patch 0.42.1 härte den Schreibpfad auf mehreren Ebenen.

1. Verlinkte Zielkomponenten ablehnen

Der gepatchte Helper verwendet os.Lstat(), um zu prüfen:

  • das unmittelbare Elternverzeichnis
  • die endgültige Zielkomponente

und lehnt diese Komponenten ab, wenn es sich um Links handelt.

Das schließt die direkten Fälle von Elternverzeichnis-Umleitung und Enddatei-Symlink ab, die vom Bericht und von den Regressionstests abgedeckt werden.

2. O_NOFOLLOW für das endgültige Öffnen verwenden, wo unterstützt

Auf unterstützten Unix-Plattformen wird das Ziel mit O_NOFOLLOW geöffnet.

Dadurch schlägt das Öffnen selbst fehl, wenn die Endkomponente zwischen der Vorprüfung und dem Öffnen zu einem Symlink wird.

Das ist wichtig, weil eine reine Vorprüfung allein ein weiteres TOCTOU-Fenster erzeugen kann.

Die plattformspezifische Implementierung ist unter Windows ein No-op, wo O_NOFOLLOW nicht über denselben Mechanismus verfügbar ist.

3. Metadaten über den geöffneten Deskriptor anwenden

Der Patch ersetzte pfadbasierte Besitzer- und Modus-Operationen durch deskriptorbasierte Operationen:

root@kitploit:~
f.Chown(uid, gid)
f.Chmod(perm)

Das bindet Metadatenänderungen an die tatsächlich geöffnete Datei, anstatt den Pfad später erneut aufzulösen.

4. Fail closed bei unerwarteten Stat-Fehlern

Der Helper erstellt das Elternverzeichnis nun nur dann, wenn der Stat-Fehler tatsächlich os.IsNotExist ist.

Andere Fehler, wie Berechtigungsfehler, werden zurückgegeben, anstatt in den Schreibpfad fortzufahren.

Regressionstests

Der Patch fügte gezielte Tests hinzu für:

  • Ablehnung eines Symlinks als Endkomponente
  • Ablehnung eines verlinkten Elternverzeichnisses
  • Erfolg bei normalen Pfaden
  • Ablehnung eines Symlinks als Endkomponente im Anhänge-Modus
  • Byte-Verifikation, dass das sensible Ziel unverändert bleibt

Eine wichtige Grenze des Fixes

Die öffentliche Patch-Diskussion dokumentiert eine wichtige Einschränkung klar.

Die neue Validierung prüft:

  • das unmittelbare Elternverzeichnis
  • die endgültige Pfadkomponente

Sie durchläuft und lehnt nicht jede höhere Vorfahrenkomponente ab.

Die Maintainer wählten diese Grenze, weil writeToFile kein konfiguriertes Sandbox-Wurzelverzeichnis hat, an dem eine vollständige Containment-Prüfung verankert werden könnte, und gängige Betriebssysteme legitime verwaltete Links in Pfadpräfixen enthalten können, wie /var -> /private/var unter macOS.

O_NOFOLLOW schützt ebenfalls die Endkomponente, nicht jedes Vorfahrenverzeichnis.

Das ändert nichts am Status der gemeldeten Verwundbarkeit oder der offiziellen behobenen Version.

Es verdeutlicht jedoch die genaue Sicherheitseigenschaft, die der Patch liefert:

  • die gemeldeten Umleitungspfade über unmittelbares Elternverzeichnis und Endkomponente werden abgelehnt
  • Metadaten-Operationen sind an den geöffneten Deskriptor gebunden
  • der Helper beansprucht nicht, eine allgemeine Dateisystem-Sandbox für jeden Vorfahrenpfad zu bieten

Diese Unterscheidung ist es wert, in einem technischen Bericht erhalten zu bleiben.


Offenlegung

Ich meldete dieses Problem am 21. März 2026 privat an HashiCorp Security als zweiten unabhängigen Consul-Template-Fund.

Der Bericht umfasste:

  • Root-Cause-Analyse auf Quellcode-Ebene
  • einen eigenständigen Proof of Concept
  • Laufzeitausgabe
  • Nachweise für vorgesehenen und aufgelösten Pfad
  • Dateiverhalten vorher/nachher
  • SHA-256-Bestätigung, dass das umgeleitete Ziel dem geheimen Eingabeinhalt entsprach
  • Details zur betroffenen Revision

Die ursprüngliche Folge-E-Mail war nicht in der Berichtswarteschlange des Sicherheitsteams vorhanden, wahrscheinlich weil sie von einem Spam-Filter der Mailingliste abgefangen wurde.

Nachdem ich den vollständigen Bericht erneut weitergeleitet hatte, verband sich HashiCorp mit dem Ingenieurteam und untersuchte ihn getrennt vom ersten Consul-Template-Problem.

HashiCorp behob die Verwundbarkeit in 0.42.1 und veröffentlichte HCSEC-2026-20 am 8. Juli 2026.

IBM veröffentlichte ein entsprechendes Sicherheitsbulletin für dieselbe CVE.

Beide offiziellen Bulletins erkannten den Bericht an als:

Mohamed Abdelaal (0xmrma)


Was dieser Bug tatsächlich lehrt

Die wichtigste Lektion ist einfach:

eine Pfadzeichenkette ist nicht dasselbe wie das Dateisystemobjekt, das sie benennt

Diese Unterscheidung ist wichtig, wann immer privilegierter Code angreiferbeeinflusste Pfade schreibt.

Zu prüfen, dass eine Zeichenkette mit einem vorgesehenen Verzeichnis beginnt, reicht nicht aus.

Selbst ein sauberer Pfad ohne Traversal-Sequenzen kann woanders hin aufgelöst werden durch:

  • symbolische Links
  • Directory Junctions
  • Mount-Umleitungen
  • veränderbare Pfadkomponenten

Die sensible Operation muss an ein Ziel gebunden sein, dessen Identität an der richtigen Grenze validiert wurde.

Dieses Problem unterstreicht auch eine breitere Regel:

wenn man bereits einen geöffneten Dateideskriptor hat, sollte man sicherheitskritische Operationen über diesen Deskriptor anwenden, anstatt den Pfad erneut aufzulösen

Genau deshalb sind die deskriptorbasierten Chown- und Chmod-Änderungen wichtig.


Kernpunkte

  • writeToFile ist für sensibles Material wie Zertifikate und private Schlüssel dokumentiert
  • verwundbare Versionen öffneten das Ziel direkt mit os.Create oder os.OpenFile
  • verlinkte Eltern- und Endkomponenten konnten den tatsächlichen Schreibvorgang umleiten
  • der konfigurierte Pfad konnte unter dem vorgesehenen Wurzelverzeichnis bleiben, während das aufgelöste Ziel außerhalb lag
  • der normale Erstellungsmodus konnte ein bereits vorhandenes Ziel kürzen und überschreiben
  • pfadbasierte Chown- und Chmod-Operationen führten zusätzliches Vertrauen in veränderbare Pfade ein
  • der PoC bewies Umleitung und Überschreiben mit byte-exaktem SHA-256-Vergleich
  • Version 0.42.1 fügte Link-Prüfungen, O_NOFOLLOW wo unterstützt, deskriptorbasierte Metadaten-Operationen und Regressionstests hinzu

Schlusswort

Bei dieser Verwundbarkeit ging es nicht um ../-Traversal.

Die Pfadzeichenkette sah korrekt aus.

Das Dateisystemziel war es nicht.

Consul Template akzeptierte den vom Betreiber vorgesehenen Pfad, folgte einer vom Angreifer positionierten Umleitung und schrieb den gerenderten Inhalt in eine andere Datei.

Deshalb wurde dies zu CVE-2026-14361.

Behoben in consul-template 0.42.1.

Tool herunterladen