LavaMoatは、サプライチェーンセキュリティを懸念するJavaScript開発チームであれば誰でも無料で利用できるオープンソースツールです。MetaMaskの共同創設者であるKumavisが生み出したこのツールは、Web3におけるセキュリティ上の懸念と、オープンソースエコシステムに長年存在する構造的なセキュリティ上の懸念を同時に解決します。
JavaScriptを使って開発を行うなら、JavaScriptとその依存関係に関するセキュリティの現状を理解しておく必要があります。JSエンジニアがアプリをゼロから構築することはほとんどなく、一般的には「依存関係(dependencies)」と呼ばれる既存のコードをプロジェクトにインポートし、ビルディングブロックとして活用します。これはコラボレーションや開発スピードの面では非常に優れていますが、もしそれらの依存関係の中に悪意のあるコードが含まれていたらどうなるでしょうか?
ソフトウェアサプライチェーンセキュリティとは、アプリケーションに関わるすべてのもの(依存関係など)や、その開発に関与するもの(ビルドツールやCIシステムなど)を包括的に扱う概念です。JavaScriptは開発者に最も人気のある言語であると同時に、サプライチェーン攻撃にも非常に脆弱です。2017年のこの脆弱性タイムラインを見ると、攻撃の約半数がオープンソースJSパッケージの人気ソースであるnpmを起点としていることがわかります:
出典:SonaType
JavaScriptが標的にされる理由は以下の通りです:
人気の高さ: フロントエンドとバックエンドの両方で使用されている
アンビエントオーソリティ(ambient authority): JavaScriptを実行している環境では、ネットワークアクセスなど多くの権限にアクセスできる
可変性: デフォルトですべてが変更可能である
2018年のCopayウォレットハックがKumavisをこの問題の解決へと駆り立て、LavaMoatの設計における主要なケーススタディとなっています。CopayはBitPayが提供するセルフカストディ型のBitcoinウォレットで、サプライチェーンハックの標的となり、ユーザーの資金が盗まれる被害が発生しました。ウォレットが使用していたnpmの依存関係が攻撃者によって制御され、攻撃が実行されたのです。
では、解決策は何でしょうか?この問題を解決するためにいくつかの方法が提案されています。
依存関係を一切使わない?それは現実的ではありません。
確かに安全性は高まるかもしれませんが、私たちが共に築いてきた基盤となるオープンソース——共有の財産——を手放すつもりですか?共有やコラボレーションを諦めるつもりですか?複雑なものを構築しようとしているなら、車輪の再発明に時間を費やしたいと思いますか?
私たちもそうは思いません。
すべての依存関係を常に監査する?それも現実的ではありません。
良いアイデアではありますが、あなたの依存関係はいくつありますか?数百?数千?数万?現実的ではありません——ただし、手動監査を行いたい場合、LavaMoatは最も危険なものを優先的に特定する手助けをしてくれます(詳細は後述)。
そして、パッケージの差分を実際に確認する時間があったとしても、セキュリティの脆弱性を見つけることができるでしょうか?
それに賭けるのは難しいことです。では、別の解決策を探ってみましょう:
LavaMoat?これが答えです。
依存関係を一切使わないか、常にすべての依存関係を監査するかという二択ではなく、LavaMoatのセキュリティカーネルを見てみましょう。このカーネルはパッケージをコンパートメントでラップし、必要なものにのみアクセスを許可します。
なぜなら、悪意のあるコードがシステムを攻撃するためには、そのための権限が必要だからです。LavaMoatのカーネルは、プロジェクトに取り込んでいるサードパーティのコードを精査し、依存関係の実行に必要なものを判断して、それらの依存関係に必要なものだけを付与します。
LavaMoatは現在、MetaMaskで数千万人のユーザーを保護しており、各開発プロセスの3つの異なるタイミングで機能します:依存関係のインストール、ビルド、そしてランタイムです。
全体像を把握するために、この依存関係グラフの可視化ダッシュボードをご覧ください:
左側に依存関係のリストが表示され、右側にはニューラルネットワークのようなグラフが描かれています。色は危険度のヒューリスティックに基づいており、例えば緑色のものは強力なプラットフォームAPIをインポートしていません。
ここでの目的は、依存関係の監査を優先順位付けする手助けをすることです。
では、どのように実装するのでしょうか?
3つの開発フェーズを考慮すると:
インストール:@lavamoat/allow-scripts
ビルド:lavamoat-node
ランタイム:バンドラー用lavamoat-xプラグイン
これらが悪意のあるコードに対する防壁として機能します。
大規模なソフトウェア開発
私たちへの貢献に興味がある方へ——LavaMoatはオープンソースです!できるだけ多くのバンドラー向けプラグインの開発を進めており、ポリシーのレビューをより簡単にし、パッケージへのネットワークアクセス付与時に厳格なロックダウンを適用できるようにしたいと考えています。こちらからコントリビュートできます。
最新情報は開発者向けニュースレターにサインアップしてご確認ください!ぜひ一緒に構築しましょう。