ここ数日の驚くべき出来事が、オープンソースソフトウェアへの広範な依存に伴うリスクを浮き彫りにした。さらに、企業がオープンソースソフトウェアを利用することで享受している無償の労働にも光を当てている。
オープンソースのコーダー兼メンテナーであるMarak Squires氏は、無償労働への抗議と、faker.jsおよびcolor.jsという、非常に幅広い他のパッケージやプロジェクトで使われている主要なNPMパッケージの収益化に失敗したことを理由に、自身のリポジトリを妨害した。
ソフトウェア業界は、相互依存するさまざまなエコシステムとリソースに依存している。今回の出来事は、ソフトウェアサプライチェーンにおける周知の未解決問題、「依存関係地獄」を示している。これは特にNode.jsとJavaScriptの世界で顕著だが、オープンソースソフトウェア全般に共通する懸念でもある。
サプライチェーン攻撃では、ハッカーは正規のアプリに感染させ、マルウェアを拡散しようとする。faker.jsとcolor.jsの場合は、最も高い特権アクセス権を悪用する、かなり珍しいタイプだ。
関連記事:オープンソースセキュリティ:大きな問題
作者によって破壊された人気NPMパッケージ
NPMはNode.js向けのパッケージマネージャーだ。世界最大のソフトウェアレジストリであり、数十万のパッケージを抱えている。
無料で利用でき、膨大な数のサードパーティ製スクリプトやライブラリをダウンロードするために、登録やログインすら必要ない。
Colorsは非常に人気のあるパッケージで、数百万回ダウンロードされている。JavaScriptやNode.jsの開発者が、コンソールにカスタムカラーやスタイルを適用するために利用している。GitHubによると、これを利用していたプロジェクトは430万件に上り、その中には他の人気パッケージも多数含まれていた。
その結果、新しいリリースは利用可能になるとすぐに無数のインストール環境へダウンロードされ、このパッケージはサプライチェーンにおいて極めて重要な存在になっている。
そのわずか数日前、Squires氏は16万8,000件のプロジェクトで使われていた、faker.jsという別の有名リポジトリを、明示的なコミットメッセージとともに「終了」させた。そのメッセージはendgameだった。
主要ファイルは消失し、いくつかの設定だけが残っている。
Squires氏は自身のGitHubリポジトリに次のように投稿した:
「colorsのv1.4.44-liberty-2リリースにzalgoバグがあることが判明した。」
コアにマージされたブランチ名は奇妙なもので、関連する「fix bug」という名前のコミットには、無限ループを発生させる悪意のある命令が含まれていた:
for (let i = 666; i < Infinity; i++) {
if (i % 333) {
// console.log('testing'.zalgo.rainbow)
} console.log('testing testing testing testing testing testing testing'.zalgo)
}上記のコードはindex.jsファイルにあり、ライブラリの利用時に自動的に実行される。Zalgoテキストとは、特殊な非ASCII文字によって予期した通りに表示されず、UIの不具合を引き起こすものを指す。
実行すると、コードは停止しない。これは「無限ループ」と呼ばれるロジック上の問題だ。ループの初期化に使われた整数(666)から、作者が設定した上限(Infinity)に至るまで、すべてが意図的なものだったことを示唆している。
一見すると、JavaScriptで遊んだことのある人なら誰でも面白がるような冗談に見える。しかし、この有名なライブラリに依存するプロジェクトには影響が及び、多くのCI/CDパイプラインやターミナルプロンプトが機能しなくなった:

Squires氏はこのリポジトリの唯一のメンテナーではないが、他のメンテナーが自分の行為を元に戻せないよう、アクセス権を取り消した。その後投稿したTwitter上のメッセージはオープンソースモデルをめぐる大きな議論を巻き起こし、同氏に同情する人がいる一方で、オープンソースに関する合意は最初から明確だったと指摘する人もいた。
ユーザーはソフトウェアを以前のバージョンに戻せる可能性があり、colorsの場合はそれが容易だと思われる。faker.jsのページは完全に消去されたようだが、解決策としてarchive.orgを利用できる可能性はある。ただし、こうした修正は一時的なものにとどめるべきだ。これらのリポジトリはもはや信頼できないからだ。代替パッケージは存在し、fakerの場合も代替パッケージがすでに登場している。
Githubはcolorsについて勧告を発行した。
関連記事:コードデバッグおよびコードセキュリティの主要ツール
オープンソースの現状
開発者は自身のブログで、faker.jsとcolor.jsを金銭的に支援した企業はないと述べた。GitHub Sponsorsを通じて少額の寄付を受け取っただけで、寄付者はいずれも同業の開発者だった。
同氏は月額サブスクリプションプランを提供するクラウドサービスを立ち上げ、自分のコードを収益化しようとしたが、十分なユーザーを獲得できなかった。本人によると、GitHubのスポンサーの1人(登録サブスクライバーでもあったようだ)がそのアイデアを流用し、同じサービスを開始したという。
オープンソースの行き止まりは決して珍しいものではなく、最悪のシナリオでは、Squires氏が自身のリポジトリで行ったような極端な反応につながる可能性がある。
誰も持続可能な経済モデルを見いだせなければ、特に多くの民間企業や営利組織が公開リソースを利用またはフォークしている状況では、同様の行動が他のオープンソースメンテナーを触発し、トレンドになる可能性さえある。
GitHubとNPMが迅速に対応し、パッケージを削除して作者のアカウントを一時停止したとしても、被害はすでに発生している。
開発者は、依存関係管理を改善してこうした事態に備えるべきだ。
依存関係インシデントを軽減する方法
このような過激な行動を予測することはできなくても、備えを改善することはできるだろう。インシデントを軽減するために、次のようなオープンソースセキュリティのベストプラクティスを適用できる:
- テストを、リモート環境に何かをデプロイする前に実施する
- バージョンを固定する:パッケージを一覧化するpackage.jsonファイルでは、依存関係に「^」や「~」などの記号を使わない。これらはより寛容な指定となり、npm updateの実行時にマイナーアップデート(またはそれ以上の更新)が自動的に適用されるためだ
- 特に警戒するスペルミスのあるパッケージに対して、タイポスクワッティング攻撃を防ぐ
関連記事:脆弱性管理の主要ツール





