Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-14361 — L'helper writeToFile di Consul Template ha aperto direttamente una destinazione fornita dall'operatore e ha seguito i componenti di percorso collegati, consentendo all'output generato di fuoriuscire dalla directory prevista e di sovrascrivere un file preesistente. | Kitploit
Strumenti/GitHubGitHub/0xmrma/cve-2026-14361
Analisi delle VulnerabilitàAnalisi del CodiceExploitApprendimento e Formazione
GitHub0xmrma/cve-2026-14361

CVE-2026-14361

L'helper writeToFile di Consul Template ha aperto direttamente una destinazione fornita dall'operatore e ha seguito i componenti di percorso collegati, consentendo all'output generato di fuoriuscire dalla directory prevista e di sovrascrivere un file preesistente.

Vedi Repository
21 mese faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-14361

L'helper writeToFile di Consul Template apriva direttamente una destinazione fornita dall'operatore e seguiva i componenti di percorso linkati, consentendo all'output renderizzato di fuoriuscire dalla directory prevista e sovrascrivere un file preesistente.

Introduzione

Ho trovato questo problema durante la revisione di HashiCorp Consul Template, con una domanda diretta sulla sicurezza del filesystem in mente:

Se writeToFile riceve un percorso che sembra essere all'interno della directory prevista, verifica dove il filesystem scriverà effettivamente i dati?

In questo caso, la risposta è stata no.

L'helper di template writeToFile apriva direttamente il percorso finale fornito dall'utente tramite os.Create() o os.OpenFile().

Queste operazioni seguivano i collegamenti simbolici, le junction di directory e le equivalenti redirezioni del filesystem già presenti nel percorso di destinazione.

Ciò significava che la stringa del percorso poteva rimanere sotto la root prevista dall'operatore mentre la scrittura effettiva finiva altrove.

Nella mia prova di concetto controllata, una directory padre linkata ha reindirizzato l'output renderizzato al di fuori dell'albero previsto e ha causato la sovrascrittura di un file di destinazione preesistente.

Questo problema è diventato .

CVE-2026-14361

Bollettino HashiCorp: HCSEC-2026-20
Bollettino IBM: bollettino di sicurezza CVE-2026-14361
CVE: CVE-2026-14361
Corretto in: 0.42.1

photo0


Catena di Attacco

la destinazione fornita dall'operatore appare all'interno della root prevista -> l'attaccante posiziona preventivamente un componente padre o finale linkato -> writeToFile apre il percorso direttamente -> il filesystem risolve la scrittura al di fuori della directory prevista -> il segreto renderizzato viene reindirizzato -> il target preesistente può essere sovrascritto


Cosa Fa writeToFile

Consul Template renderizza dati da fonti come Consul e Vault.

L'helper writeToFile consente a un template di scrivere contenuto selezionato in un file locale separato applicando proprietario, gruppo e permessi richiesti.

La documentazione di HashiCorp mostra specificamente l'helper con materiale PKI:

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

Questo lo rende più di un semplice helper di output.

Il contenuto che attraversa questo confine può includere:

  • chiavi private
  • certificati
  • segreti recuperati da Vault
  • valori di configurazione
  • credenziali di servizio

La domanda importante non era se writeToFile potesse creare un nome file richiesto.

La vera domanda era:

Il processo scrive nella posizione del filesystem prevista dall'operatore, o semplicemente in qualunque oggetto a cui il percorso si risolve al momento dell'apertura?

Nelle versioni vulnerabili, si fidava di quest'ultimo.


Perché Questa Superficie Valeva la Pena di Essere Esaminata

Gli helper di scrittura sono superfici di sicurezza ad alto valore perché passano dai dati dell'applicazione alla mutazione del filesystem.

I guasti interessanti spesso non sono la classica traversal ../.

Sono guasti di risoluzione:

  • la stringa sembra sicura
  • l'albero delle directory sembra controllato dall'operatore
  • un componente linkato cambia la destinazione reale
  • la chiamata di apertura segue automaticamente quella redirezione

Questo è particolarmente importante quando il processo viene eseguito con più privilegi sul filesystem rispetto all'attaccante.

Un attaccante locale a bassi privilegi potrebbe non essere in grado di sovrascrivere direttamente un file sensibile.

Ma se può influenzare un componente del percorso sotto una directory di scrittura prevista, un processo Consul Template più privilegiato potrebbe eseguire la scrittura al suo posto.

Questo era il confine su cui mi sono concentrato.


Il Confine su Cui Mi Sono Concentrato

Non ho affrontato questo come una generica revisione di path traversal.

Il percorso fornito non richiedeva segmenti ...

Poteva rimanere lessicalmente all'interno della root prevista per tutto il tempo.

La domanda più forte era:

I componenti di destinazione linkati vengono rifiutati prima che il contenuto sensibile venga scritto?

Questa domanda è importante per entrambi:

  • un nome file finale linkato
  • un componente di directory linkato che reindirizza l'intero percorso rimanente

Il secondo caso è particolarmente utile perché i log e la configurazione mostrano ancora un percorso dall'aspetto innocuo sotto la directory prevista.

Il filesystem lo risolve altrove.


Causa Radice

La causa radice era la creazione diretta di file basata sul percorso senza validazione consapevole dei link.

Alla revisione testata, writeToFile() selezionava uno dei due percorsi di apertura.

La modalità append usava:

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

La normale modalità di scrittura usava:

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)

Nessuno dei due percorsi rifiutava i componenti di destinazione linkati prima dell'apertura del file.

Questo è importante perché:

  • os.Create(path) segue le redirezioni esistenti del filesystem e tronca il file risolto
  • os.OpenFile(path, ...) segue i componenti di percorso linkati durante la modalità append
  • una directory linkata cambia il punto in cui viene risolto il nome file finale
  • un componente finale linkato può reindirizzare l'apertura verso un diverso file esistente

La stessa assunzione basata sul percorso continuava dopo la scrittura.

Proprietà e permessi venivano applicati usando di nuovo il percorso:

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

Ciò significava che anche le operazioni sui metadati erano legate a un nome di percorso mutabile invece che al descrittore di file già aperto.

Perché è Sfruttabile

Perché l'attaccante può preparare la redirezione prima che writeToFile venga eseguito.

Nessuna race probabilistica è richiesta per l'attacco di base.

La sequenza è semplice:

  • l'operatore configura una destinazione sotto una root prevista
  • l'attaccante ottiene abbastanza accesso locale per creare o sostituire un componente linkato sotto quella posizione di scrittura
  • la stringa del percorso sembra ancora rimanere sotto la root prevista
  • writeToFile la apre direttamente
  • il sistema operativo segue il link o la junction
  • l'output renderizzato finisce nella destinazione risolta
  • se quella destinazione esiste già, la normale modalità di creazione la tronca e la sovrascrive

Questa è l'intera vulnerabilità.


Cosa Rende Questo un Problema di Sicurezza, Non Solo un Comportamento Normale dei Symlink

È vero che i sistemi operativi normalmente seguono i symlink durante le aperture di file basate sul percorso.

Questo non rende questo un comportamento applicativo sicuro.

La domanda di sicurezza non è:

"Go si è comportato come documentato?"

La vera domanda è:

Un helper che scrive dati sensibili renderizzati ha verificato che la destinazione risolta corrispondesse alla posizione prevista dall'operatore?

Nelle versioni vulnerabili, non lo ha fatto.

Questa distinzione è importante perché Consul Template può essere eseguito:

  • come servizio a lunga durata
  • con accesso a segreti derivati da Vault
  • con un account elevato
  • con diritti di scrittura che l'attaccante locale non ha direttamente

Seguire una redirezione del filesystem posizionata dall'attaccante in quel contesto crea un reale problema di privilegi e di confine di fiducia.


Prova di Concetto

Ho costruito un riproduttore standalone attorno all'esatto comportamento di writeToFile al commit testato.

La configurazione controllata usava:

  • una root di output prevista
  • una directory esterna al di fuori di quella root
  • un componente padre linkato sotto la root prevista
  • un file di destinazione preesistente nella directory reindirizzata
  • contenuto segreto controllato passato a writeToFile

Il flusso di riproduzione era:

  1. Creare la root di output prevista.
  2. Creare una directory di destinazione esterna separata.
  3. Posizionare un file di destinazione preesistente nella directory esterna.
  4. Creare una directory padre linkata sotto la root prevista che si risolva nella directory esterna.
  5. Costruire il percorso di destinazione finale usando la directory padre linkata mantenendo la stringa del percorso sotto la root prevista.
  6. Invocare il percorso di scrittura vulnerabile con contenuto segreto controllato.
  7. Risolvere e ispezionare la destinazione effettiva.
  8. Confrontare i byte del file finale e lo SHA-256 con l'input segreto.

Il comportamento osservato era:

  • la stringa di destinazione prevista rimaneva sotto la root prevista
  • la directory padre linkata reindirizzava la scrittura effettiva al di fuori di quella root
  • writeToFile seguiva la redirezione
  • il target esterno preesistente veniva sovrascritto
  • il file esterno finale corrispondeva esattamente all'input segreto tramite SHA-256

Questo stabiliva entrambe le parti dell'affermazione:

  • l'output poteva fuoriuscire dall'albero di directory previsto
  • un file esistente nella destinazione risolta poteva essere sovrascritto

Perché la PoC È Stata Scelta in Questo Modo

Un symlink sul componente finale dimostrerebbe già un follow di link non sicuro.

Ma un componente padre linkato dimostra un punto operativo più forte:

  • il nome file configurato può apparire completamente normale
  • il percorso può rimanere lessicalmente sotto la root prevista
  • la redirezione può avvenire più in alto nel percorso
  • la scrittura finale può comunque finire altrove

Anche il target preesistente era importante.

Senza di esso, la PoC mostrerebbe solo una creazione di file inattesa.

Partendo da un file esistente e verificando la sua hash finale, la riproduzione ha dimostrato direttamente il comportamento di sovrascrittura.

Questo ha reso il risultato più concreto di una semplice affermazione basata sul codice sorgente.


Requisiti di Sfruttamento e Ambito

Questo problema richiede influenza locale sul filesystem.

Un attaccante ha bisogno di accesso sufficiente per creare o modificare un symlink, una junction di directory o una equivalente redirezione nella o sotto la posizione di scrittura prevista.

Il processo Consul Template deve poi scrivere attraverso quel percorso.

L'impatto dipende fortemente dai privilegi del processo e dal contenuto renderizzato.

I risultati pratici includono:

  • reindirizzare l'output del template al di fuori della directory prevista dall'operatore
  • posizionare dati sensibili renderizzati in una posizione leggibile dall'attaccante
  • sovrascrivere un file preesistente nella destinazione risolta
  • aumentare l'impatto quando il processo viene eseguito con privilegi elevati
  • aumentare il rischio di riservatezza quando il contenuto contiene chiavi, certificati o segreti

Non si trattava di una scrittura arbitraria remota non autenticata da un'installazione predefinita.

Ma era un chiaro guasto del confine di fiducia locale con impatto significativo in deployment privilegiati o con filesystem condivisi.


Gravità e Classificazione

HashiCorp ha classificato il problema come:

  • CWE-59: Risoluzione impropria dei link prima dell'accesso al file
  • CVSS 3.1:
root@kitploit:~
CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:N/A:N

Il punteggio base pubblicato è:

root@kitploit:~
4.7 / Medium

Questo vettore riflette:

  • accesso locale dell'attaccante
  • bassi privilegi necessari per influenzare il percorso
  • alta complessità di attacco
  • nessuna interazione dell'utente
  • potenziale alto impatto sulla riservatezza quando l'output sensibile renderizzato viene reindirizzato

I bollettini ufficiali documentano anche esplicitamente che la scrittura reindirizzata può sovrascrivere un file preesistente.

Il punteggio è moderato perché lo sfruttamento dipende da condizioni locali di controllo del percorso, non perché l'effetto sul filesystem sia teorico.


Versioni Interessate

Il bollettino HashiCorp elenca:

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

La correzione è stata distribuita nella release 0.42.1 dell'8 luglio 2026.


Analisi della Correzione

La patch 0.42.1 ha indurito il percorso di scrittura su più livelli.

1. Rifiuto dei componenti di destinazione linkati

L'helper corretto usa os.Lstat() per ispezionare:

  • la directory padre immediata
  • il componente di destinazione finale

e rifiuta quei componenti quando sono link.

Questo chiude i casi di redirezione diretta del padre e di symlink sul file finale coperti dal report e dai test di regressione.

2. Uso di O_NOFOLLOW per l'apertura finale dove supportato

Sulle piattaforme Unix supportate, la destinazione viene aperta con O_NOFOLLOW.

Questo fa fallire l'apertura stessa se il componente finale diventa un symlink tra il pre-controllo e l'apertura.

Questo è importante perché un semplice pre-controllo da solo può creare un'altra finestra TOCTOU.

L'implementazione specifica per piattaforma è un no-op su Windows, dove O_NOFOLLOW non è disponibile attraverso lo stesso meccanismo.

3. Applicazione dei metadati tramite il descrittore aperto

La patch ha sostituito le operazioni di proprietà e modalità basate sul percorso con operazioni basate sul descrittore:

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

Questo vincola le modifiche ai metadati al file che è stato effettivamente aperto invece di risolvere nuovamente il percorso in seguito.

4. Fail closed su errori di stat inattesi

L'helper ora crea la directory padre solo quando il fallimento dello stat è genuinamente os.IsNotExist.

Altri errori, come i fallimenti di permessi, vengono restituiti invece di continuare nel percorso di scrittura.

Copertura di regressione

La patch ha aggiunto test mirati per:

  • rifiuto di symlink sul componente finale
  • rifiuto di directory padre linkata
  • successo del percorso normale
  • rifiuto di symlink finale in modalità append
  • verifica byte per byte che il target sensibile rimanga invariato

Un Confine Importante della Correzione

La discussione pubblica sulla patch documenta chiaramente una limitazione importante.

La nuova validazione controlla:

  • la directory padre immediata
  • il componente di percorso finale

Non attraversa e rifiuta ogni componente antenato più in alto.

I maintainer hanno scelto questo confine perché writeToFile non ha una root sandbox configurata a cui ancorare un controllo completo di contenimento, e i sistemi operativi comuni possono includere link gestiti legittimi nei prefissi di percorso, come /var -> /private/var su macOS.

O_NOFOLLOW protegge anche solo il componente finale, non ogni directory antenata.

Questo non cambia lo stato della vulnerabilità riportata o della versione ufficiale corretta.

Chiarisce però l'esatta proprietà di sicurezza fornita dalla patch:

  • i percorsi di redirezione riportati del padre immediato e del componente finale vengono rifiutati
  • le operazioni sui metadati sono vincolate al descrittore aperto
  • l'helper non pretende di fornire una sandbox generica del filesystem per ogni percorso antenato

Questa distinzione vale la pena di essere preservata in un'analisi tecnica.


Divulgazione

Ho segnalato questo problema privatamente al team di sicurezza di HashiCorp il 21 marzo 2026 come seconda scoperta indipendente su Consul Template.

Il report includeva:

  • analisi della causa radice a livello di codice sorgente
  • una proof of concept standalone
  • output di runtime
  • prove del percorso previsto e di quello risolto
  • comportamento del file prima/dopo
  • conferma SHA-256 che il target reindirizzato corrispondeva all'input segreto
  • dettagli della revisione interessata

L'email di follow-up originale non era presente nella coda dei report del team di sicurezza, probabilmente perché è stata intercettata da un filtro antispam della mailing list.

Dopo che ho re-inoltrato il report completo, HashiCorp ha contattato il team di ingegneria e lo ha investigato separatamente dal primo problema su Consul Template.

HashiCorp ha corretto la vulnerabilità in 0.42.1 e ha pubblicato HCSEC-2026-20 l'8 luglio 2026.

IBM ha pubblicato un bollettino di sicurezza corrispondente per la stessa CVE.

Entrambi i bollettini ufficiali hanno riconosciuto il report come:

Mohamed Abdelaal (0xmrma)


Cosa Insegna Davvero Questo Bug

La lezione chiave è semplice:

una stringa di percorso non è la stessa cosa dell'oggetto del filesystem che nomina

Questa distinzione è importante ogni volta che codice privilegiato scrive percorsi influenzati dall'attaccante.

Controllare che una stringa inizi con una directory prevista non basta.

Anche un percorso pulito senza sequenze di traversal può risolversi altrove attraverso:

  • collegamenti simbolici
  • junction di directory
  • redirezioni di mount
  • componenti di percorso mutabili

L'operazione sensibile deve essere legata a una destinazione la cui identità sia stata validata al confine giusto.

Questo problema rafforza anche una regola più ampia:

quando hai già un descrittore di file aperto, applica le operazioni sensibili alla sicurezza attraverso quel descrittore invece di risolvere di nuovo il percorso

Questo è esattamente il motivo per cui le modifiche a Chown e Chmod basate sul descrittore contano.


Punti Chiave

  • writeToFile è documentato per materiale sensibile come certificati e chiavi private
  • le versioni vulnerabili aprivano la destinazione direttamente con os.Create o os.OpenFile
  • componenti padre e finali linkati potevano reindirizzare la scrittura effettiva
  • il percorso configurato poteva rimanere sotto la root prevista mentre il target risolto era al di fuori di essa
  • la normale modalità di creazione poteva troncare e sovrascrivere un target preesistente
  • Chown e Chmod basati sul percorso introducevano ulteriore fiducia in un percorso mutabile
  • la PoC ha dimostrato redirezione e sovrascrittura con confronto SHA-256 esatto byte per byte
  • la versione 0.42.1 ha aggiunto controlli sui link, O_NOFOLLOW dove supportato, operazioni sui metadati basate sul descrittore e test di regressione

Considerazioni Finali

Questa vulnerabilità non riguardava la traversal ../.

La stringa del percorso sembrava corretta.

La destinazione del filesystem non lo era.

Consul Template ha accettato il percorso previsto dall'operatore, ha seguito una redirezione posizionata dall'attaccante e ha scritto il contenuto renderizzato in un file diverso.

Questo è il motivo per cui è diventata CVE-2026-14361.

Corretta in consul-template 0.42.1.

Scarica lo strumento