アメリカ国家安全保障局(NSA:National Security Agency)は、ソフトウェアのメモリ安全性に関するガイダンス「Software Memory Safety」を、11月10日(現地時間)にリリースした。
同ガイダンスは、近年のサイバーセキュリティ脅威の多くに利用されている、ソフトウェアのメモリ安全性の悪用を防ぐことを目的としており、組織におけるソフトウェアの開発にあたっては、可能な限りメモリ安全なプログラミング言語を使用するとともに、コンパイラのオプション、ツールのオプション、OS構成といったコードの安全性を高める対策を施すことで、保護を強化することを推奨している。
メモリ安全でないプログラミング言語としては、一般的に使用されているCやC++を挙げており、これらのプログラミング言語はメモリ管理において高い自由度と柔軟性を提供する一方で、メモリ参照が安全に行われているかどうかのチェックはプログラマに大きく依存していると指摘する。
ソフトウェア解析ツールを使用すれば、ソースコード中のメモリ管理における問題の多くを検出できるほか、OSによっては不正なメモリの利用を防ぐオプションも用意されているものの、メモリ安全なプログラミング言語を使用することで、そういったプログラミング言語が備えている保護機能がメモリ管理の問題を防止または軽減してくれることから、可能な限りメモリ安全なプログラミング言語を使用することを求めている。
同ガイダンスでは、メモリ安全なプログラミング言語の一例として、C#、Go、Java、Ruby、Rust、Swiftなどを挙げる。ただし、メモリ安全なプログラミング言語といっても、メモリ管理が完全に安全というわけではなく、ほとんどのメモリ安全なプログラミング言語ではソフトウェアが特定のタスクを実行するために、安全でないメモリ管理を実行する場合があることから、メモリ安全ではないクラスや関数が用意されており、安全でないメモリ管理が行われてしまう可能性があるという。
このように、メモリ安全なプログラミング言語であっても、安全でないメモリ管理を行うことはできるものの、メモリ管理に問題のある箇所を(非メモリ安全なプログラミング言語よりも)特定しやすい。また、プログラミング言語によっては、プログラマやコードのレビュワーが安全でないことを認識できるよう、メモリ安全でなくなる機能を使用する場合は、それを明示する注釈を付けるよう求めるものもある。
なお、非メモリ安全なプログラミング言語で、安全なメモリ管理を実現するための手段の1つとして、静的/動的アプリケーションセキュリティテスト(SAST/DAST)を用いたソフトウェア分析が存在する。ただし、SAST/DASTどちらも安全なメモリ管理が行われていないコードを完全にメモリ安全にすることは難しく、ツールごとによる検出性能の差異もあることから、SAST/DASTツールを使用する場合は、複数のSAST/DASTツールの実行を推奨している。
そのほか、プログラムのコンパイル時および実行時に、メモリ管理における問題の悪用をより困難にする手段として、コードの実行場所を制限可能なコントロールフローガード(CFG)や、メモリ内のアイテムが配置される場所に予測不可能性を追加し、データがコードとして実行されることを防ぐASLR(Address Space Layout Randomization)やDEP(Data Execution Prevention)といった機能が利用できる場合もある。
同ガイダンスでは、このように非メモリ安全なプログラミング言語でも、より安全なメモリ管理を可能にするための手法を紹介する一方で、組織に対してメモリ安全なプログラミング言語への移行を繰り返し求めている。
この記事は参考になりましたか?
- この記事の著者
-
CodeZine編集部(コードジンヘンシュウブ)
CodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です