Meltdownの脆弱性に関する多くのニュースは、ユーザーが立ち入り禁止のメモリをプログラムが読み取れるようにすることを強調しています。私はこれが起こらないことを理解していますが、カーネルメモリへのアクセスがどのように危険であるかを正確に説明しているソースはほとんどありません。
カーネルメモリにはどのような情報が格納されていますか?攻撃者がカーネルメモリにアクセスできるが、変更はできないとしたら、何ができるでしょうか?
メルトダウンの脅威を理解するには、最新のコンピューターでメモリがどのように構成されているかを理解する必要があります。
メモリの素朴な見方は、各メモリアドレスはRAM内の特定のセルセットに対応するということです。これは「物理アドレス指定」と呼ばれ、1990年代初頭までは、コンピュータのメモリを処理する最も一般的な方法でした。物理アドレス指定では、プログラムがアドレス17からバイトを読み取る場合、毎回同じ8つのメモリセルのセットから読み取っています。結局のところ、メモリをアドレス指定する「物理のみ」の方法では、特に一度に複数のプログラムを実行することに関して、実行できることが制限されます。
「仮想アドレス」を入力します。これで、プログラムの「メモリアドレス17」は、物理メモリの特定の部分に対応しなくなりました。代わりに、CPUがそのアドレスからのデータを必要とする場合、「メモリ管理ユニット」(MMU)と呼ばれるコンポーネントに問い合わせ、オペレーティングシステムと連携して、その要求をどのように満たすかを判断します。
これにより、多くの効率と機能が向上します。最もよく知られているのはおそらく「スワップ」で、一般的には「仮想メモリ」として知られています。アドレス17は一時的にディスクに保存され、OSが物理メモリの一部の内容をディスクに保存している間、プログラムのリクエストは保留されます。プログラムが「アドレス17」と見なしている部分をロードします。利用可能な仮想アドレスの範囲は通常、物理メモリの量よりもはるかに大きいため、これにより、OSは、実際よりもはるかに多くのRAM.
ただし、仮想アドレス指定の最大のメリットは、一般的なユーザーからも完全に隠されています。OSが各プログラムに、コンピューターで実行されている唯一のプログラムであるかのような錯覚を与えることができます。プログラムの「アドレス17」は、他のプログラムの「アドレス17」と同じメモリではありません。これは、プログラムが互いに秘密を隠すことを心配する必要がないことを意味します。たとえば、Webブラウザーで実行されているJavascriptは、パスワードマネージャーのメモリの内容を読み取ることができません。
効率上の理由から、Linuxカーネルは各プログラムのメモリビューで使用可能な仮想アドレスの半分を自分自身に割り当て、すべての物理メモリをそのアドレス範囲の一部として割り当てます(詳細は異なりますが、Windowsカーネルでも同様のことが行われます)。これにより、MMUを調整しなくても、カーネルが必要なものにアクセスできるようになります。カーネルはそのアドレス空間を保護し、メモリを読み取ろうとする通常のプログラムがクラッシュするようにします。
メルトダウンに入る:プログラムがクラッシュすることなく、カーネルメモリを間接的に読み取ることができます。直接読み取りよりもはるかに低速ですが(通常、1秒あたりギガバイト単位で測定される約150キロバイト/秒)、保護をバイパスします。すべての物理メモリがカーネルのアドレス空間にマッピングされるため、Meltdownを使用する攻撃者は「私は唯一のプログラム」という幻想を打ち破ることができます。
通常のデスクトップユーザーは、互いに秘密を保持する必要のあるプログラムが多くなく、信頼できないコードをあまり実行しません-Meltdownからの唯一の大きな脅威は、パスワードマネージャーの内容を読み取る悪意のあるJavascriptと、 Meltdownの仕組みにより、JavaScriptからの使用が困難になります。
Meltdownの大きな脅威は、クラウドと共有ホスティングプロバイダーへの脅威です。これらのコンピューターは、信頼できないユーザーからのプログラムを定期的に実行し、「私は唯一のユーザーです」という錯覚に基づいて物事を安全に保ちます。 Meltdownを使用すると、アカウントを持つ攻撃者がこの錯覚を破り、他のユーザーのSSL秘密キー、ユーザー名とパスワード、支払い処理の資格情報、その他の機密情報を盗むことができます。