見えない部分のセキュリティは忘れられがち
―メモリ領域の安全を考える―

Share

いまメモリの安全に関して、その重要性がますます注視されています。OSやアプリケーションを動作させるために必要なデータやプログラムは、そのほとんどが一度メモリ領域に展開されているため、メモリ領域が侵害された場合、実行中のソフトウェアから生きた情報が抜き出されてしまいます。にもかかわらず、メモリ領域のセキュリティは忘れられがちです。本記事では、メモリ領域に存在する脆弱性の脅威と、それを保護するためにどのようなセキュリティ対策を講じればよいのかについてご紹介します。


「メモリ」はコンピュータ用語では「記憶装置」や「記憶媒体」のことを指し、「メモリ領域」とは、その記憶媒体に保存されたプログラムを実行するときに、当該プログラムをロードするメモリの記憶領域を指します。つまり、OSやアプリケーションを動作させるために必要なデータやプログラム、プログラムの実行ロジックそのものまで、すべてがメモリ領域に存在しているといえるため、セキュリティ対策を行う上ではメモリ領域の安全を考えることが非常に重要となります。メモリ領域が侵害されると、実行中のソフトウェアから生きたデータを抜き出すことが可能となり、機微情報が悪意ある第三者に漏洩したり、プログラムの処理が改竄されることで不正に実行されたりする危険性があります。

2020年5月、Googleは2015年以降にChromeのコードベースで存在が確認された重要度の高い脆弱性のうち、約70%がメモリの安全性に関する問題であることを明らかにしました。メモリの安全に関する問題については、過去にMicrosoft社も同様に警鐘を鳴らしており、世界全体で毎年登録・公開される脆弱性において、常に20%程度をメモリ関連の脆弱性が占めています。

図1:Chromiumプロジェクトにおけるhigh以上の脆弱性

解放済みメモリに関連する脆弱性
他のメモリ関連の脆弱性
その他
セキュリティ関連のアサート

出典:
https://www.chromium.org/Home/chromium-security/memory-safety
より当社翻訳

普段OSやアプリケーションを使用する際、動作過程においてメモリ領域でどのような処理が実行されているかを深く意識する人は少ないでしょう。プログラムは、メモリ領域にすべてを展開して処理します。プログラムそのものもメモリ領域に存在しており、接続する各種デバイスも連携時にメモリ領域にて処理や制御が行われています。そんなシステムの根幹だからこそ、メモリ領域のセキュリティは万全であるべきですが、残念ながら脆弱性は存在し、攻撃者にとって格好のターゲットとなりえます。

図2:「メモリ領域への展開」の概要

メモリ関連の脆弱性、特にメモリ領域に関連する脆弱性の原因は、主にC/C++のポインタ周りのコーディングミスによるもので、代表的な脆弱性として、バッファオーバーフロー、領域外読み取り、Use-after-free(解放済メモリの再利用)といったものがあげられます。C/C++のメリットの一つにメモリ領域管理での柔軟性があり、それが処理の高速性をもたらす一方で、脆弱性を生み出すという皮肉な結果に結びついているのです。

図3:主要プログラミング言語と現在利用されている代表的分野

メモリ領域を狙った攻撃にはステルス性が高く、一般的な攻撃検知策では検知が困難なケースもあり、また、被害も甚大となる可能性があります。近年ではニュース等で「Spectre」、「Meltdown」といった単語をよく耳にしたことでしょう。これらはCPUの脆弱性を突くものですが、メモリ領域へのアクセスにおいて、CPUを介さずに各種デバイスとメモリ間でデータ転送を直接行うDMA(Direct Memory Access)にもセキュリティ脅威は存在します。DMA攻撃については、Thunderbolt経由でデータへの完全なアクセスを得ることが可能となる「Thunderspy攻撃」が記憶に新しいかもしれません。DMAはメモリへの直接アクセスによりデータ転送の高速化を実現する一方で、その有効性が攻撃者に逆手に取られ、悪用される事態が後を絶ちません。

プログラムの実行順序や構造が、まるでスパゲティが絡まったように複雑に入り組んでおり整然としないプログラムを「スパゲティプログラム」などといいますが、昨今はメモリ領域内でも複数のアプリケーションや制御処理が複雑に連鎖・連携・連動し、似たような状態に陥っていることも珍しくありません。こうしたすべてを把握することは困難であり、将来においてはさらに複雑化していくでしょう。

メモリ領域は「美味み」と「鮮度」を兼ね備えており、攻撃者にとっては非常に魅力的なターゲットといえます。また以前に比べて、現在は標準的なシステムでもメモリ領域は潤沢で、迅速な処理が実行可能となったことや、リソースの利便性が向上したことにより、今後もメモリ領域への依存性が高まることは容易に想定されます。

潤沢となったメモリ利用例
・クラウド環境などの仮想化
・外部媒体とのデータ通信
・AI化およびビックデータの統計処理

以上の点から、メモリ領域を保護するためにセキュリティ対策として、システム自体、あるいは周辺機器に対する物理的な対策を除いた場合、一例として次の3つの観点と対策が考えられます。


実行プログラムに対する脆弱性対策
メモリ関連処理のロジックを正しく制御させ、ソースコード内に脆弱性を作りこまないようにする。

アプリケーションを実行させる環境に対する脆弱性対策
パッチの適用やアップデートなどを徹底し、プラットフォーム環境や関連するデバイス制御などに既知の脆弱性がないことを確認する。

メモリ領域を防御するセキュリティソリューションの導入
アプリケーションメモリファイアウォール等、メモリ領域の保護に特化したソリューションを導入、運用する。


メモリ領域には多種多様なプログラムが存在し、連携・連動しています。そのため、小さなセキュリティホールでも悪用されれば大きな被害を生む恐れがあります。プログラムも所詮、最終的には人間が作るものであり、「人間はもともとミスを起こしやすい動物である」とは人間工学でもいわれていることです。どんなに完璧なコーディングをしたと思っても、複雑化された構造の中にミスやエラーが埋もれてしまっているかもしれません。開発において当然テストはするでしょう。しかし、セキュリティを考慮しないテストでは正常動作の確認が主であり、『アクセス違反』(Access Violation)を見つけることに集中しがちです。

そのため、メモリ領域の脆弱性に関連するセキュリティ向上策の一つとして、セキュリティの観点からテストを行う「ソースコード診断」の実施も有効と言えるでしょう。



Share