開発者のほとんどは、何かしらのサードパーティ製ライブラリを使っています。大勢の開発者が制作物を世界と分かち合ってくれているおかげで、私たちは既存のモジュールを活用して、課題を解決し、時間を賢く使うことができるのです。しかし、他人が書いたコードを使うことは、そのコードの開発者を信用するということにほかなりません。仮想ウォレット「Copay」を開発したBitPayは先日、オープンソースのサードパーティ製ライブラリの使用に絡むトラブルに巻き込まれました。
Copay(英語)はマルチプラットフォーム対応のBitcoin/Bitcoin Cash用仮想通貨ウォレットで、共有ウォレットの作成に利用することができます。CopayはJavaScriptで開発されていて、多数のサードパーティ製オープンソースライブラリに依存しています。
その中の1つに、event-streamというオープンソースのNode.jsモジュールがあります。ある開発者がGitHubでこのモジュールのリポジトリを管理していましたが、このプロジェクトに対する興味を失って久しく、リポジトリを放置していました。あるとき、それまでGitHubでの活動がほとんどない別の開発者が、このリポジトリの保守をしたいから管理者権限をもらえないだろうかと持ちかけ、元の開発者はその人にアクセス権を与えました。
管理者権限をもらったこの開発者は、ただちに作業に取り掛かりました。event-streamライブラリで、自分のGitHubリポジトリにあるflatmap-streamというモジュールの使用を開始した後、このモジュールを改竄して悪意あるコードを追加しました。このアップデートの3日後、今度は悪意あるコードが入っていない別バージョンのflatmap-streamをアップロードしました。おそらく、悪事を隠そうとしたものと思われます。
このようにして、event-streamライブラリのセキュリティが侵害されたのでした。このライブラリはBitPayだけではなく、多数の他企業でも広く使用されています。セキュリティが侵害された状態だったのはわずか3日間だったと考えられていますが、悪意あるペイロードが仕込まれていることに気付いていなかったCopayの開発者が、改竄されたライブラリをプロジェクトに組み込んでしまうには十分な時間でした。アップデートされたCopayはアプリストアに公開され、多数の人がこれをダウンロードしました。
Copayの開発者たちは、おそらく、使用しているライブラリの変更点を調べるのにあまり時間をかけたくなかったのでしょう。今どきはnpmのようなパッケージ管理サービスがあるので、プロジェクトで使用しているライブラリのアップデートを簡単に自動化できます。npmを使えば、プロジェクトで使っているサードパーティ製モジュールを、コマンドを1つですべてアップデートできるのです。
開発者がアップデート後のライブラリを調べたとしても、悪意あるコードを見つけるのは難しかったことでしょう。event-streamがflatmap-streamに依存しているように、プロジェクトで使用されているライブラリは他のライブラリに依存できますし、すべての依存関係を確認するにはかなりの時間がかかります。今回のケースでは、flatmap-streamモジュールが暗号化されていたために、プロセスはさらに複雑になりました。
CCN(英語記事)によると、flatmap-streamライブラリは、event-streamとcopay-dashライブラリの両方に依存するソフトウェアの秘密鍵(基本的には仮想ウォレットのパスワード)を漏洩するように改竄されていました。copay-dashへの攻撃は、Copayの開発元であり、copay-dashの作者であるBitPayを標的にしていたことを示唆しています。このケースでは、これら2つのライブラリが両方とも使用された場合にのみ秘密鍵の漏洩が発生しますが、漏洩が起こるのはCopayのコードをベースにしたソフトウェアの場合だけです。
ArsTechnica(英語記事)によると、犯罪者はこの悪意あるペイロードを使って利用者のウォレットに不正アクセスし、そこから資金を転送可能な状態でした。この不具合はGitHubの利用者によって発見・報告されましたが(英語記事)、悪意あるコードを含む複数バージョンのCopayウォレットが配布されてしまった後でした。BitPayは、セキュリティ侵害について最終的に認め、Copayバージョン5.0.2〜5.1.0を使用している場合は最新バージョンの5.2.0にアップグレードするようにと顧客へ通知しました。今のところ、この影響を受けた利用者の数や損失額についての情報は公になっていません。
これは、ソフトウェア開発者が使用するサードパーティ製ライブラリを犯罪者がセキュリティ侵害するという、典型的なサプライチェーン攻撃です。今回の問題は、誰が管理しているかわからないオープンソースソフトウェアの使用が発端でした。現在のソフトウェアが数バージョン前のものと同じように機能するという保証はありません。オープンソースソフトウェア開発者のせいではありません。彼らは製品を現状のまま提供しているだけで、何も保証してはいませんから。
ややこしいのは、Copayもオープンソースであるという点です。Copayも他の仮想ウォレットの開発者によって広く使われています。したがって、問題がさらに大きくなる可能性もあります。
ソフトウェア(特に巨額の送金に使われるソフトウェア)を提供して利益を得るビジネスでは、ソフトウェアのリリース前に、セキュリティチェックを確実に行わなければなりません。プロジェクトで使用されているサードパーティ製ライブラリすべてについて、新バージョンが出るたびに慎重な分析を行うこともその1つです。
対策としては、リポジトリのステータスを確認すること、他の開発者による評価を考慮に入れること、プロジェクトのアップデート頻度と最終アップデートからの経過時間をチェックすること、バグのログを確認することです。異常な点はすべて詳しく調査して損はありません。別のモジュールへの切り替えも検討に値します。
このようなライブラリで問題が発生した場合、クライアントはそのライブラリを信用して使ったソフトウェアの提供企業をとがめます。とがめられるべきは、そのライブラリの開発者であったとしても。もちろん、オープンソース製品を使うなとは言いませんが、使う場合には、くれぐれも油断せず、十分に注意してください。