プログラミング言語Rustの開発チームのセキュリティ対応ワーキンググループは、Rustのビルドシステムでありパッケージマネージャでもある「Cargo」が、代替レジストリからダウンロードされた一部の不正な形式のパッケージの抽出を防止しない不具合があることを、9月14日(現地時間)に報告した。
この不具合を悪用することで、攻撃者がパッケージを代替レジストリにアップロードできる状況では、Cargoがパッケージをダウンロードした際にファイルシステムをいっぱいにするか、任意のファイルを破損させられる可能性がある。
これらの不具合は脆弱性として、CVE-2022-36113およびCVE-2022-36114が割り当てられている。代替レジストリのユーザーにとっての脆弱性の重大度は「低」で、crates.ioに依存しているユーザーはこの脆弱性の影響を受けない。
Cargoでは、パッケージがダウンロードされると、そのソースコードをディスク上の~/.cargoフォルダに抽出し、ビルドするRustプロジェクトで利用できるようにする。抽出が成功したことを記録するために、Cargo はすべてのファイルを抽出すると、抽出されたソースコードのルートにある.cargo-okファイルに「ok」を書き込む。
今回明らかになった、任意のファイル破損(CVE-2022-36113)の脆弱性では、Cargoが抽出時に.cargo-okへのシンボリックリンクを含むパッケージを許可してしまっているため、「ok」を.cargo-okファイルに書き込もうとすると、実際にはシンボリックリンクが示すファイルの最初の2バイトが置き換えられてしまう。この脆弱性によって、攻撃者はCargoを使用してパッケージを抽出するマシン上のファイルを破損させることができるようになる。
ディスク容量の枯渇(CVE-2022-36114)は、Cargoが圧縮されたアーカイブから抽出されるデータの量を制限していないという脆弱性であり、攻撃者はそのサイズよりもはるかに多くのデータを抽出するよう細工されたパッケージ(「zip爆弾」などと呼ばれる)を代替レジストリにアップロードし、Cargoでパッケージをダウンロードするマシンのディスク領域を使い果たしてしまう可能性がある。
これらの脆弱性は、Cargoのすべてのバージョンに存在しており、9月22日(現地時間)にリリースが予定されている「Rust 1.64」において修正される。また、これらの脆弱性は悪意のあるビルドスクリプトまたは手続き型マクロを実行可能ではあるが、限定的な方法であることからセキュリティ修正をバックポートするポイントリリースは公開されず、独自のツールチェーンを構築しているユーザーに対して、「Rust 1.63.0」のパッチをwg-security-responseリポジトリにて提供する。
セキュリティ対応ワーキンググループは、代替レジストリのユーザーに対して信頼できる依存関係のみをプロジェクトに含めることで、ダウンロードするパッケージに注意を払うよう求めている。これらの脆弱性が修正されたとしても、Cargoは設計上ビルドスクリプトと手続き型マクロによって、ビルド時に任意のコードを実行可能であり、悪意のある依存関係はこれらの脆弱性に関係なく損害を引き起こす可能性があるという。
なお、crates.ioは数年前にこの種のパッケージを拒否するサーバ側チェックを実装しており、これらの脆弱性を悪用するパッケージは存在しない。ただし、ビルドスクリプトと手続き型マクロに関する懸念がこちらにも当てはまることから、crates.ioユーザーに対しても依存関係を選択する際には注意を払うよう求めている。
- 関連リンク
この記事は参考になりましたか?
- この記事の著者
-
CodeZine編集部(コードジンヘンシュウブ)
CodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です