システム上のすべての空きスペースを割り当てることにより、別のプログラムからメモリを読み取ることは可能ですか?


26

理論的には、システム上のすべての未使用メモリを割り当て、他のアプリケーションが不要になったメモリを解放するにつれてますます多くのメモリを要求し続けるプログラムをビルドすると、最近リリースされたメモリを別のアプリケーションから読み取ることができるでしょうか? ?または、これは何らかの形で最新のオペレーティングシステムによって保護されていますか?

これには実用的なアプリケーションはありません。ただ興味があります。実生活で「利用可能なすべてのメモリ」を割り当てることには、いくつかの問題があることを理解しています。

編集:明確にするために、私は特に「解放された」メモリについて尋ねています。現在別のアプリケーションによって割り当てられているメモリにはアクセスしていません。

回答:


23

いいえ。優れたカーネルは、メモリの内容をプロセスに発行する前にメモリの内容を消去して、提案する攻撃の種類から正確に保護するためです。

Unixyシステムでは、プロセスが使用できる仮想アドレス可能領域の制限であるプログラムブレイクと呼ばれるものを拡張することにより、メモリがプロセスに割り当てられます。プロセスは、カーネルにアドレス可能なスペースを拡張することを指示し、カーネルは、メモリが利用可能であればそれを許可し、そうでなければ呼び出しは失敗します。(brk()システムコールの名前はこの概念に由来します。)

実際には、解放されたメモリの大きなブロックがプログラムブレークに追いつくことはあまりありません。これは、プロセスがプログラムブレークを縮小してカーネルにメモリを返すために必要なことです。もちろん、これはシステムのmalloc()and の実装にすべて依存していますfree()。利用可能なソースがある場合、メモリが返されるかどうかが通知されます。

malloc()メモリ経由で取得したものbrk()はすべてスクラブされ、以前にfree()dが同じプロセスで書き込まれるため、メモリを初期化しないことによるセキュリティへの影響はありません。


19

はい、理論的には、別のプロセスの解放されたメモリを読み取ることができます。それは、当時の多くの特権エスカレーション攻撃の原因でした。そのため、最近ではオペレーティングシステムが以前に別のプロセスによって割り当てられていた場合、メモリが事実上ゼロになります。メモリが常にゼロになっているとは限らない理由は、同じプロセスによって以前に割り当てられたメモリをゼロにしない方が効率的だからです。OSは、可能であれば同じプロセスにメモリページを返そうとします。


1
「はい、いいえ」は「いいえ」です。@Blrflが正しい。
ロスパターソン

4
@RossPatterson:理論的には、カールは私よりも実際に正しいです。実際の現実は、主流のOSが数年前にその穴を閉じたということです。
Blrfl

@Blrflわかりました。しかし、「数年前」は、ページングシステムと仮想メモリが最初に導入された1960年代後半でした。確かに、Multics、VM / 370、OS / VSの頃には。バグがなければ、これはほとんどのプログラマーの記憶では不可能でした。
ロスパターソン

The reason you don't always see zeroed out memory is because it is more efficient not to zero out the memory if it was previously allocated by the same process ここでいくつかの矛盾が見られます。「同じ実行可能ファイル」という意味ですか?ディスクパスによってゼロにしないかどうかはどのようにチェックされますか?
jakub.g

1
私は何かが欠けていると思います。たとえば、初期化されていない整数でC ++プログラムをコンパイルして実行すると、それらの変数を読み取ったときに0に等しくないのはなぜですか?
jakub.g

2

ここには、答えに影響するいくつかの層が含まれています。

最新の仮想メモリオペレーティングシステムを想定している場合、割り当てたページに別のプロセスデータの残りを表示することはできません。

プロセスが最初にロードされると、ページテーブルがロードされ、潜在的に実メモリのフレームがそれらのページに割り当てられます。少なくとも、ページテーブルまたはその補足テーブルには、プロセスが割り当てることができるすべてのメモリのマップが含まれます。これは、上記の最初のプロセスブレークが設定される場所でもあります。

プロセスが許可されている場合、malloc()はプロセスブレークを変更し、プロセスページ(補足ページ)テーブルにさらにページを追加して要求を満たすことができます。下位の実メモリ層。

これらのシナリオの両方で、デマンドページングまたは遅延割り当てを使用する最新のオペレーティングシステムは、物理メモリ(フレーム)をまだ割り当てていません。オペレーティングシステムは、そのプロセスのどの仮想メモリが有効と見なされるかについて「メモを作成する」だけです。実際のメモリは、必要な場合にのみ割り当てられます。

仮想ページが実現され、プロセスページテーブルにマッピングされると、物理メモリまたはフレームがプロセスに割り当てられます。これは、データが露出する可能性がある場所です。これは、ページフォールト中に発生します。これは、前のプロセスが同じフレームを使用しており、現在の物理メモリ要求のためのスペースを確保するために、そのデータが破棄またはスワップアウトされたためです。オペレーティングシステムは、プロセスを再開する前に、要求しているプロセスデータが適切にスワップインされるか、フレームがクリア(ゼロ)されるように注意する必要があります。これは、上記の「古いが解決済み」の問題としても言及されています。

これにより、他のプロセスのメモリが「解放」されているかどうかに関係なく、多少無関係になります。別のプロセスが「解放」したメモリは、そのプロセスに割り当てられたページにまだ存在し、メモリが少なくなった場合やスワップされた場合にプロセスが終了するまで通常はマップ解除されません。malloc()およびfree()は、(ユーザー)レベルでプロセスに割り当てられた仮想メモリを管理します。

あなたの質問であるあなたのプロセスは、理論的にはより多くのメモリを要求し続け、他のすべてのプロセスをメモリから追い出します。実際には、グローバルおよびローカルのフレーム割り当て戦略がありますが、これも答えに影響する可能性があります。プロセスがオペレーティングシステムやその他すべてのプロセスのオーバーランを許可する前に、プロセスが自身のページをメモリから強制的に削除する可能性があります。これは最初の質問を超えていますが。

これはすべて、MS-DOSのようなシステムでは意味がありません。MS-DOS(および他のよりシンプルなシステム)は仮想メモリを(それ自体で)使用せず、別の「プロセス」データを簡単に突いて突くことができます。

Linuxのソースコードよりも理解しやすいいくつかの優れたリファレンスは、優れたオペレーティングシステムのテキストブック、Silberscatz、Gavin、およびGangeによるOperating Systems Concepts、またはAndrew TanenbaumによるOperating Systems Designです。また、バークレーのナチョスやスタンフォードのピントスのようなものは、学習用に構築された小さなオペレーティングシステムであり、それらに同じアイデアがあります。


0

16.04か月前にUbuntuでこれを試しました。0xACEが言ったように、最新のOSは、malloc()を呼び出すと、すべてゼロの仮想ページを割り当てます。ただし、割り当てられたバッファに何も書き込まない場合、物理メモリにマップされないため(つまり、コピーオンライト方式)、「初期化されていない」ブロックから常にゼロを読み取ります。パフォーマンスを向上させるために「CONFIG_MMAP_ALLOW_UNITIALIZED」オプションを使用してコンパイルされた組み込みOSが存在する場合があります。この場合、目的を達成できます。


-1

いいえ、ページングの魔法のおかげで、他のプログラムが他のプログラムのメモリを読み取ることはできません。このように、メモリの一部をハードドライブにオフロードすることにより、総メモリ使用量が物理RAMを超える可能性があります。

また、プロセスが割り当てることができる最大メモリは、OSによって任意に制限されます(32ビットアーキテクチャの場合、最大4ギガ)。その後、次のalloc呼び出しでメモリ不足エラーが返されます。


これを回避できるプラットフォーム固有のAPIはありませんか?正直なところわかりませんが、驚かないでしょう(たとえば、LinuxではOSがを介して物理メモリからページを移動するのを防ぐことができますmlock)。

4 GBのRAMがあり、ページングが8 GBに制限されている場合、アプリケーションが(x64で)12 GBを要求するとどうなりますか?
アルセニムルゼンコ

あまりにも少し空きメモリが任意の左がない場合や、コンピュータが単に停止する挽くすることを、残るとき、システムコールは...エラーを返す必要があります
ラチェットフリーク

4
彼は他人の記憶を読むことではなく、解放された記憶を読むことを求めている。ramのそのセクションは現在無料です。....私はそうは思いません...ページングスキームが解放された後、メモリをゼロにするとは思いません。そのため、プログラムはメモリのブロックを割り当て、すでに存在する初期化されていないデータを分析します。
フィリップ

@philip正しい、リリースされたメモリについて具体的に尋ねています。
ConditionRacer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.