1

信頼できないメモリアドレスが与えられた場合、それが有効でアクセス可能なメモリを指しているかどうかをLinuxでテストする方法はありますか?

たとえば、マッハでは、vm_read_overwrite()を使用して、指定された場所からデータをコピーしようとすることができます。アドレスが無効またはアクセスできない場合、プロセスをクラッシュさせるのではなく、エラーコードを返します。

4

3 に答える 3

2

writeそのメモリから(/dev/nullたとえば(編集:/dev/null期待どおりに機能しない可能性があるため、パイプを使用))、EFAULTアドレスにアクセスできない場合はエラーが発生します。

書き込み可能である場合、コンテンツを破棄せずに書き込み可能メモリをテストする方法がわかりません。

于 2013-01-24T17:50:45.680 に答える
1

これはTOCTOUの典型的なケースです。ある時点でメモリが書き込み可能であることを確認し、後で書き込みを試みます。何らかの理由で(たとえば、アプリケーションがメモリの割り当てを解除したため)、メモリにアクセスできなくなります。

これを実際に行うための有効な方法は1つだけです。つまり、実際に使用する必要があるときに、書き込みによって発生する障害をトラップします。

もちろん、トリックを使用してメモリが「書き込み可能」かどうかを判断することはできますが、実際に書き込み可能であることを確認する方法はありません。

実際に何をしようとしているのかをもう少し詳しく説明したいと思うかもしれません。もっと具体的にすれば、もっと良いアイデアが得られるかもしれません。

于 2013-01-24T19:00:43.483 に答える
1

msyncを試すことができます:

int page_size = getpagesize();                                                            
void *aligned = (void *)((uintptr_t)p & ~(page_size - 1));                           
if (msync(aligned, page_size, MS_ASYNC) == -1 && errno == ENOMEM) {
    // Non-accessibe
}

ただし、この関数は低速である可能性があるため、パフォーマンスが重要な状況では使用しないでください。

于 2017-01-05T03:42:02.933 に答える