1

私は、動的ライブラリ ( .so) が実行時にターゲット プログラムに挿入されるプロジェクト (動的インストルメンテーション) に取り組んでいます。ライブラリは、 を使用して独自のメモリを処理しmmap/munmapます。セキュリティ上の理由から、ライブラリ内の一部のマップされた領域は、ライブラリから公開された API を介してのみ書き込み可能にする必要があります。

私たちが行ったことは、ライブラリ関数のプロローグ/エピローグを使用してメモリ領域の書き込みフラグを切り替えることです。mprotectPROT_WRITE

void foo(void) {
  mprotect(addr, PAGE_SIZE, PROT_READ | PROT_WRITE);
  ...
  ...
  mprotect(addr, PAGE_SIZE, PROT_READ);
}

これは、シングル スレッド アプリケーションでは問題なく機能します。マルチスレッド アプリケーションの場合、(メモリが書き込み可能になるように) が設定された後に(同じプロセス内の別のタスクへの) コンテキスト スイッチが行われると、同じプロセス内の他のタスクがマップされたライブラリ領域に書き込むことができる場合があります。クリア前です。PROT_WRITE

foo質問は次のとおりです。返されるまでプロセス内の他のタスクを無効にすることは可能ですか? そうでない場合、これをどのように回避することをお勧めしますか?

4

1 に答える 1

1

セキュリティ モデルが無効です。ライブラリコードがmprotectこれらの領域を書き込み可能にできる場合、プログラムの他の部分も書き込み可能になります。これを内省的に防ぐことはできません。このようなセキュリティ プロパティは、カーネルによって直接、またはトレース プロセス (たとえば、従来の ptrace または seccomp トレースを使用) によって、ある種の外部監視によってのみ実現できます。

実際にはセキュリティプロパティは必要なく、信頼できるコードによる書き込みの確実なトラップが必要な場合は、すべてのスレッドを追跡し、 ですべてのスレッドにシグナルを送信しpthread_kill、シグナル ハンドラをシグナリング スレッドは、それらが続行できるようにします。

于 2015-08-04T04:45:14.840 に答える