Googleは、同社のビルドシステムにプロダクションRustツールチェーンを導入する作業を開始し、年内にChromeのバイナリにRustのコードを含める計画である事を明らかにした。
なぜ、ChromiumにRustを搭載する事にしたのか?これについて、ChromeセキュリティチームのDana Jansens氏は以下のように説明する。
RustをChromiumに取り込む目的は、よりシンプル(IPCなし)で安全(全体的に複雑でないC++、サンドボックスでもメモリ安全性のバグなし)な方法で2の法則を満たし、開発のスピードアップ(書くべきコードの削減、設計ドキュメントの削減、セキュリティレビュー削減)とChromeのセキュリティ向上(メモリ安全性のバグがないコード行数の増加、コードのバグ密度の減少)を実現させることです。そして、この目標に向かって、サードパーティのRustライブラリを利用することができると考えています。
Rustは、”unsafe“と書かれていない場合、Chromiumで確認された深刻なセキュリティバグの70%を占めるメモリ安全性の欠陥を回避することができるという。Rustは、コードの安全性を保証するものではないが、潜在的な欠陥の数を大幅に減らすことができるのだ。
Rustを用いることの有用性について、Googleは以前から認識しており、Rustの採用によってAndroidのメモリ脆弱性の低減にも繋がっているようだ。
Jansens氏は、Rustが成熟し、独自の財団を設立するに値するだけの外部支援を集めるまで、その開発を支援したMozillaに「Mozillaのシステムソフトウェア業界への多大な貢献に感謝します。」と、謝辞を述べている。
Chromiumの基盤であるRustとC++は、cxx、autocxx bindgen、cbindgen、diplomat、crubitといったツールでやり取りできると、Jansens氏は説明する。これらのツールは、RustのコードからC++のコードを呼び出したり、その逆をしたりする安全な方法を提供する。しかし、2つの言語間の相互運用性には、それぞれの設計の違いから限界がある。
「例えば、Rustは、ライフタイム(推論または明示的に記述)と排他的変異性という2つの入力に依存する静的解析によって、時間的メモリ安全性を保証しています。後者は、ChromiumのC++の大半が書かれている方法と互換性がありません。」と、Jansens氏は説明する。
Jansens氏は、RustとC++は異なるルールで動いているため、相互運用性が簡単に損なわれる可能性があると指摘した。だからこそ、Googleは慎重なアプローチを取っているのだ。
C++からRustへの単一方向のみの相互運用をサポートします。ChromiumはC++で書かれており、スタックフレームの大部分は、main()からexit()まで、C++のコードであるため、この方向を選択しました。相互運用を一つの方向に限定することで、依存関係ツリーの形状を制御することができます。RustはC++に依存しないので、依存性注入を除いて、C++の型や関数を知ることはできません。このように、Rustは任意のC++コードに着地することはできず、C++からAPIを介して渡される関数にのみ着地することができます。
そして今のところ、ChromiumがRustに触れるのは、サードパーティのライブラリを通じてのみである。
とはいえ、GoogleのRustへの取り組みが深まることで、Rustパッケージのエコシステムが大幅に充実することが期待できる。同社は、C++とRustの双方向の相互運用性を高めるcrubitなどのツールを開発・保守している。
Googleは、すでにAndroidのエコシステムにRustを導入している。Microsoft AzureのCTOであるMark Russinovich氏は、新規プロジェクトにおいてC++ではなくRustを使用するよう呼びかけている。Linuxカーネルは、Rustのサポートを追加した。そして、自分たちがコントロールできない技術を嫌うAppleでさえも、Rustを使用している。
Source
- Google Security Blog: Supporting the Use of Rust in the Chromium Project
- via The Register: Google polishes Chromium code with a layer of Rust
コメントを残す