npmは、JavaScriptの実行環境Node.jsで使う部品(パッケージ)の配布先です。ここで公開されている「imgdecode」に、Windowsの端末で読み込まれると、外からプログラムを取ってきて動かす仕掛けがあると、部品の安全を調べる会社のSafeDepが10月13日に報告しました。
編集部が10月19日6時49分(日本時間)にnpmのレジストリを確かめたところ、imgdecodeはまだ公開されたままでした。GitHubの脆弱性のデータベースにも、告知は出ていません。
imgdecodeとは何か
imgdecodeは「Node.jsのビルドの仕組みで使う画像の読み取りの部品」とうたうパッケージです。版は1.0.0〜1.0.3の4つで、最初の版は10月1日(日本時間)に出ました。公開したのはmalfexteste8というアカウントです。
SafeDepは、これをMALFEXと呼ばれる攻撃の一部としています。MALFEXは、Windowsで開発する人を狙ってnpmに不正なパッケージを出す攻撃で、Checkmarxが10月5日に分析を公表しました。その報告にimgdecodeの名前はありませんが、SafeDepはデータの置き場などが同じことから、つながりの「確度が高い」としています。
SafeDepのimgdecodeの報告。読み込むとDLLが外からデータを取って動かすと書く出典: SafeDep(引用)
読み込んだだけで動く仕組み
SafeDepの報告によると、imgdecodeはWindowsの64ビット向けのDLL(プログラムの部品のファイル)を同梱しています。アプリが require('imgdecode') で読み込むと、このDLLも読み込まれます。
1.0.1以降は、その時点でGitHubから暗号化したデータを取ってきて元に戻し、Windowsの正規のプログラム(dllhost.exe)の中に流し込んで動かします。
インストールのときに動く仕掛け(install script)を使わないため、npmの --ignore-scripts(その仕掛けを止める設定)だけでは止まりません。Checkmarxも、この設定だけに頼らないよう書いています。
一方で、画面(コンソール)に出力しているときだけ動きます。出力をファイルなどに流すCI(自動でビルドする仕組み)では動かず、開発者が自分の端末で動かしたときを狙った作り、というのがSafeDepの見立てです。
最後に何が動くかは確かめきれていない
imgdecodeが取ってくるファイルそのものは、SafeDepも手に入れられていません。同じ置き場の別のファイルをたどると、情報を盗み、遠隔で操る不正なプログラムに行き着きました。imgdecodeも同じものを動かすというのは、SafeDepの推定です。このプログラムは、ブラウザーのパスワードとクッキー、Discordのトークン、.envや.pemなどのファイルを狙う作りと読み取られています。
削除されたか(10月19日朝の状態)
| 項目 |
10月19日6時49分の状態 |
| npmのimgdecode |
公開中。1.0.0〜1.0.3が残り、最新は1.0.3 |
| GitHub Advisory Database |
imgdecodeのmalwareの告知なし |
| OSV(脆弱性のデータベース) |
imgdecodeの記録なし |
| 関係するimgbundleなど4つ |
npmが中身のない版(security holding)に置き換え済み |
MALFEXでは、npmが不正なパッケージを消すと、同じ役目の別のパッケージがすぐに出てきました。imgdecodeもその1つで、10月12日の1.0.3はほかの部品なしで動きます(SafeDep)。
MALFEXのnpmパッケージの年表と、imgdecodeの版・動く条件・10月19日の状態作成: 編集部 / もとの資料: SafeDep・npm・GitHub・OSV
告知が無いため、告知の一覧と照らして知らせる道具(Dependabotなど)では見つかりません。Checkmarxも、告知だけに頼る道具はMALFEXの一部を見落とすと書いています。
npmの集計では、9月30日から10月18日に1,088回ダウンロードされています(日は協定世界時)。SafeDepは、レジストリの写し(ミラー)や検査の道具の取得も含まれうるとしています。
公表された痕跡(IoC)
SafeDepの報告に載った痕跡のうち、社内で探すのに使うものです。URLなどは、誤って開かないよう一部を書き換えています。
| 種類 |
値 |
| パッケージ |
imgdecode 1.0.0〜1.0.3、imgbundle 1.0.0〜1.0.2、runhelper 1.0.0 |
| 公開したアカウント |
malfexteste8 |
| 取ってくる先 |
hxxps://raw.githubusercontent[.]com/cavecrew/proj/main/banner.jpg |
| 次の段の配布元 |
hxxp://104.234.65[.]75:700/setup.exe |
| 送り先・遠隔操作 |
104.234.65[.]75 の7007番 |
| 端末に残る跡 |
%TEMP%\svc_update.exe、%APPDATA%\Microsoft\EdgeUpdate\MicrosoftEdgeUpdate.exe、タスクと自動起動の値 MicrosoftEdgeUpdateService |
同梱のDLL(imgdecode.node)のSHA-256は次の3つです。
- 1.0.0:
d7b2f6d7da81301e7f76d6812d78f4a453439141d419831522ebf7cf5bf1c714
- 1.0.1:
54d995c5be97408e96db72ecc27af1dd65716f96371df085c4ce681dca623d85
- 1.0.2と1.0.3:
a53946269ffcd25c7fe1fad358c189f144dcca4d736f2b5a8ebc517a8d929dd1
端末に残る跡は、SafeDepが盗むプログラムの中の文字から読み取ったものです。raw.githubusercontent.comはふつうの開発でも使うため、Checkmarxはドメインごと止めず、決まったURLだけを止めるよう勧めています。
使っていたかの確かめ方
- ソースのリポジトリで、ロックファイルを名前で探します。
grep -rnE "imgdecode|imgbundle|runhelper" --include=package-lock.json --include=npm-shrinkwrap.json --include=pnpm-lock.yaml --include=yarn.lock .
- 各プロジェクトで
npm ls imgdecode --all を動かします。端末全体に入れたものは npm ls -g imgdecode で見ます。--allを付けると、ほかの部品を通して入ったものまで出ます。
- 社内のnpmの写し(Nexus、Artifactory、Verdaccioなど)に、取り込まれていないかを見ます。
npmから消えても、ロックファイルに書いた版は残ります(Checkmarx)。node_modulesを消していても、一度読み込んだ端末は調べます。
入れていたときにやること
SafeDepは、imgdecodeを読み込んだWindowsの端末を「侵害されたかもしれない」と扱うよう勧めています。
- 端末をネットワークから切り離します。不正な処理はメモリーの上で動くため、再起動の前にメモリーを保全します(SafeDep)。
- 別のきれいな端末から、その端末に保存した、または使った認証情報を替えます。ブラウザーのパスワードとクッキー、クラウドのキー、SSHの鍵、npmとGitHubのトークンなどです(SafeDep・Checkmarx)。
- SafeDepは、盗むプログラムにイベントログを書き換える働きがあると見ています。端末の中のログだけでなく、外に集めたログと照らします。
- 社内のnpmの写しやキャッシュから消し、取り込みを止めます。npmで消されても、社内に取り込んだ写しは残ります(Checkmarx)。
影響する会社・しない会社
- 影響する: 開発部門や委託先が、Windowsの端末でimgdecodeを入れて動かした会社。とくに、開発者がコマンドの画面から動かした場合です
- 影響する: imgdecodeを社内のnpmの写しに取り込んだ会社。消さないかぎり、ほかの開発者も入れられます
- 確認が要る: Node.jsの開発を委託している会社。委託先の端末とロックファイルも、名前で探してもらいます
- 確認が要る: MacやLinux、出力を流すCIだけで入れた会社。動かない条件ですが、不正なパッケージなので外します
- 影響しない: ロックファイルにも社内の写しにも、imgdecode・imgbundle・runhelperの名前が無い会社
情シスが今日やること
- 開発部門と委託先に、名前で探すよう頼みます。 通知を待たずに上の方法で探してもらい、今日中に結果をもらいます。
- 社内のnpmの写しで、imgdecodeを止めます。 取り込み済みなら消します。
- EDR(端末を見張る道具)で、node.exeがdllhost.exeを起動した記録を探します。 上の跡のファイルとタスクも探します。
- 見つかった端末は切り離し、別の端末から認証情報を替えます。 npmとGitHubのトークン、クラウドのキーから先に替えます。
- 新しい部品を入れる前の決まりを見直します。 公開から日が浅く、使う人がほとんどいない部品を入れるときに、誰が確かめるかを決めておきます(編集部の補足)。
開発用の端末の権限は、開発者に管理者権限を渡す?開発部門と情シスが折り合う決め方で扱っています。