ホワイトハウスはメモリセーフプログラミングを求めていますが、それは何ですか?

要約

  • ホワイトハウスは、コード内のセキュリティの脆弱性を減らすために Rust などのメモリセーフ言語の使用を推奨しています。
  • C などの古い低レベル言語は、バグのあるコードがセキュリティインシデントにつながるリスクがあります。
  • Rust などのメモリセーフ言語は、自動メモリ管理とエラー防止機能を提供します。

米国の政府機関は、プログラマーは Rust や Java などのメモリセーフ言語を優先するべきだと宣言しました。しかし、なぜそれらは優れているのでしょうか? そして、それは本当に重要なのでしょうか?

ホワイトハウスは何と言っているのでしょうか?

2 月 26 日の声明で、ホワイトハウス国家サイバーディレクターオフィス (ONCD) は、ソフトウェア開発者に Rust などのメモリセーフプログラミング言語を採用するよう強く求めました。

ONCD は次のように述べています:

国家として、私たちはサイバー空間における攻撃対象を減らし、あらゆる種類のセキュリティバグがデジタルエコシステムに侵入するのを防ぐ能力と責任を負っています。しかし、そのためには、メモリセーフプログラミング言語に移行するという難しい問題に取り組む必要があります。

なぜ重要なのでしょうか?

2021 年に設立された ONCD は大統領に直接報告し、サイバーセキュリティや関連する問題について助言を行います。米国の政策は、テクノロジーの世界に波及効果をもたらす可能性があります。

これまでで最悪のセキュリティ脆弱性の多くは、メモリセーフティの問題が根本原因でした。古い低レベル言語はプログラマーに多くの権限を与えますが、これにより深刻な影響を与えるバグのあるコードが発生するリスクが高まります。

それにもかかわらず、Rust、Python、JavaScript などのメモリセーフ言語の使用は長い間増加しています。ONCD は、C などの安全性の低い言語が非常に長い間存在してきたため、そのレガシーコードがインフラストラクチャや私たちが毎日使用するソフトウェアの多くに組み込まれているため、この発表を行った可能性があります。

安全でない言語とはどのようなものですか?

安全でないコードは、必ずしも恐ろしく見えたり、複雑だったりするわけではありません。簡単な C プログラムのこの例を見てみましょう:

#include <stdio.h>
int main (void) {
int arr[3] = { 0, 0, 0 };
printf("%d\n", arr[3]);
return 0;
}

これは、バッファオーバーフロー攻撃につながる可能性のあるバグの典型的な例です。プログラマーは、C (および他のほとんどの言語) の配列はゼロからインデックス付けされていることを忘れており、最初の要素はarr[0]にあることを意味します。したがって、arr[3]にアクセスしようとするのは間違いですが、C はそれを許可します:

arr[3]の値は他のアドレスと同様に有効なメモリアドレスですが、配列には属しません。そこには任意の値を格納でき、アクセスしたり書き込んだりすると、プログラムのクラッシュから壊滅的なセキュリティインシデントまでさまざまな結果が発生する可能性があります。歴史上、多くのハッカーがそのようなバグを悪用してきました。

C コンパイラは引き続き警告を出しますが、実行可能ファイルも生成します。プログラマーは警告を無視したり、コンパイラフラグを使用して非表示にしたりすることもできます。C は依然として足を撃つことができますが、Rust などの言語では銃を提供しません。

メモリセーフコードとはどのようなものですか?

Rust などのメモリセーフ言語では、同じ問題は単純に存在しません。Rust で同じプログラムを以下に示します:

fn main() {
let arr: [u32; 5] = [0;3];
println!("{}", arr[3]);
}

このコードは構文的に有効ですが、Rust はコンパイルに失敗します:

コンパイラは問題を説明し、実行可能ファイルを生成することを拒否します。Rust は単にこのコードを実行させません。

Rust には他にも多くの機能があり、保護に役立ちます。メモリ管理を自動的に処理し、ヌルポインタの逆参照を防ぐスマートポインタなどの機能が含まれます。

言語を切り替えるべきですか?

すべてのプログラミング言語には目的があるので、たとえ大統領からのものであっても、絶対に避けるべきだというアドバイスには注意する必要があります。特定の言語に特化することを選択できますが、オプションを広げるためにさまざまな言語を学ぶことは常に役立ちます。

メモリセーフティは非常に多くの最新の言語の機能であるため、少なくとも 1 つは使い慣れている必要があります。C には用途がありますが、より安全で事故の少ないオプションがあります。特に、優れた安全ネットを備えた効率的な言語を探している場合は、Rust が必須です。