本格的なソフトウェア開発者の間で長年懸念されていたメモリの安全性が、ついに主流の地位を獲得しました。
製品テストに特化した87年の歴史を持つ非営利団体「コンシューマー・レポート」は、今週、メモリの安全性に関するレポートを発表しました。同誌は、このトピックを予想外に取り上げたことについて、消費者向けオンラインセキュリティガイドの限界について社内で議論した後、この高度な技術に関する懸念を調査するに至った経緯を説明しました。
この話題は水曜日に開催されたUSENIX Enigma 2023カンファレンスで取り上げられ、パネリストのYael Grauer氏(コンシューマー・レポート・デジタル・ラボ、副コンテンツ編集者)、Amira Dhalla氏(コンシューマー・レポート、モビライゼーション、コミュニティエンゲージメント、オペレーション担当副ディレクター)、Alex Gaynor氏(ソフトウェアセキュリティエンジニア、Fish in a Barrel創設者)、Josh Aas氏(非営利インターネットセキュリティリサーチグループの共同創設者兼エグゼクティブディレクター)が、メモリの安全性の脆弱性を減らすために何ができるかについて話し合いました。
メモリ エラーは、コンピュータ コードが未定義のメモリ領域にアクセスしようとしたときに発生します。未定義のメモリ領域とは、ヒープ、スタック、または宣言されたデータの一部として具体的に割り当てられていない、または確保されていないメモリ領域です。
メモリの安全性は複雑なテーマであり、研究論文[PDF]で考察され、技術系の人々の間で議論されています。しかし、電子機器で動作するソフトウェアやファームウェアのバグを通じて、デジタル技術を扱うすべての人に影響を及ぼす可能性があります。セキュリティ脆弱性の少なくとも65%はメモリエラーに起因すると推定されています。
メモリの安全性は、C/C++のように手動でメモリ管理を行うプログラミング言語において主に問題となります。メモリ管理が不適切だと、境界外の読み取りや書き込み、解放後使用エラーが発生する可能性があります。こうした脆弱性が悪用されると、攻撃者は影響を受けるデバイスを制御したり、データを盗んだりできる可能性があります。これは米国国家安全保障局(NSA)が懸念するほど深刻な問題であり、NSAは昨年11月にメモリの安全性に関する論文[PDF]を発表しました。
Java、Python、JavaScript、Go など、メモリを管理するためにガベージ コレクションを組み込んだ最新のプログラミング言語は、プログラマーがメモリ関連の欠陥を回避するのに役立ちます。
次に、比較的最近のプログラミング言語である Rust があります。これは所有権の概念に依存して、自動ガベージ コレクションのパフォーマンス コストを回避しながらメモリの安全性を保証します。
メモリ安全かつ高速なコードを書ける可能性から、Rustは一部の人々の間で注目を集めています。昨年9月、Microsoft AzureのCTOであるマーク・ルシノビッチ氏は、C/C++で開始された新しいソフトウェアプロジェクトにはRustの使用を推奨しました。
セキュリティ企業 Chainguard は水曜日、ルシノビッチ氏の指示を支持し、安全なコンテナイメージを作成するために設計されたメモリセーフな Linux「ディストリビューション」である Wolfi が、メモリセーフな Rustls TLS ライブラリと、Rust ベースの Hyper ライブラリ経由の HTTP を curl ネットワークリクエストツールに組み込んだと発表した。
Let's Encrypt の開発で最もよく知られている Internet Security Research Group (ISRG) は、重要なオープン ソース コード (NTP、DNS、TLS など) をメモリ安全に書き換えることに重点を置いた Prossimo というプロジェクトを通じて、Wolfi にメモリ安全な TLS と HTTP をもたらすことに協力しました。
ISRG の Josh Aas 氏はThe Registerとの電話インタビューで、メモリの安全性に関する議論は一連の出来事の合流から生まれたものだと考えている、と語った。
- Microsoft が Azure Sphere IoT プラットフォームに Rust を適用
- GoogleはRustレイヤーでChromiumコードを洗練させた
- プログラミング人気コンテストでC++がJavaを追い抜く
- Linuxカーネル6.1:Rustyリリースはゲームチェンジャーとなる可能性
「セキュリティへの注目はかつてないほど高まっており、メモリの安全性が最大の課題の一つであるという認識も高まっていると思います」と彼は述べた。「また、メモリの安全性に対処するのに役立つツールも近年成熟してきました。現在利用可能なツールは、5年前、いや10年前、20年前のツールよりもはるかに優れています。」
「消費者レポート[のトピックの調査]に関して言えば…メモリの安全性はソフトウェア エンジニアリングのやや難解な側面かもしれませんが、メモリの安全性の欠如によって引き起こされる問題は非常に深刻であり、実際の消費者レベルの問題です。」
Aas 氏は、Rust だけがメモリ安全性の解決策であるとは考えていないことを明確にしました。
「この会話でRustがよく話題になるのは、RustがC言語と同等かそれ以上のパフォーマンスでメモリ安全性を実現できるからです」と彼は述べた。「しかし、Rustが解決するようなパフォーマンスへのこだわりがそれほど強くないのであれば、他にも選択肢はたくさんあります。」
C++ の作者である Bjarne Stroustrup 氏は、ISO 標準の C++ は静的解析によるルールを適用すればメモリ安全になると主張しているが、それについて尋ねられると、Aas 氏は懐疑的な見解を示した。
「現実世界の実用性を無視した非常に理論的な意味では、それは真実かもしれません」と彼は言った。「理論上は、メモリセーフなC++を書くことは現実的に可能かもしれません。しかし、私たちの世界ではそうはいきません。もっと良い方法があるのです。C++は最初からメモリセーフを実現するために設計されたわけではありません。」
Rust を信頼する: Microsoft Azure CTO が C と C++ を敬遠
続きを読む
The Registerでプレビューされた、木曜日に予定されていた ISRG ブログ投稿で、Aas 氏は、メモリセーフ コードへの移行を検討しているソフトウェア開発者やオープン ソース メンテナーにいくつかのアドバイスを提供しました。
まず、開発者は、メモリが安全でない言語で新しいプロジェクトを書いて、安全でないコードをさらに作成するのをやめるべきだとアドバイスしている。これはマイクロソフトの Russinovich 氏の発言と同じである。
第二に、すべてを一度に書き直す必要はないと彼は言います。まずはセキュリティ上重要なモジュールに重点を置きましょう。
3 番目に、多くの Rust ベースのモジュールには C API が付属しているため、オープンソースのメンテナーはメモリ安全性の移行を支援するために必ずしも Rust を学ぶ必要はない、と彼は言います。
最後に、彼はオープンソース コミュニティは、現在の現状、つまりメモリ エラーの終わりのない連続を継続する必要はないことを理解すべきだと主張しています。
「3年前は、『これをすべきか』という議論が中心でした」とアース氏は述べた。「そして今、私たちは『すべきか』という段階を過ぎ、『どのように』という段階にいると思います。」®