私は、動的ライブラリ ( .so
) が実行時にターゲット プログラムに挿入されるプロジェクト (動的インストルメンテーション) に取り組んでいます。ライブラリは、 を使用して独自のメモリを処理しmmap/munmap
ます。セキュリティ上の理由から、ライブラリ内の一部のマップされた領域は、ライブラリから公開された API を介してのみ書き込み可能にする必要があります。
私たちが行ったことは、ライブラリ関数のプロローグ/エピローグを使用してメモリ領域の書き込みフラグを切り替えることです。mprotect
PROT_WRITE
void foo(void) {
mprotect(addr, PAGE_SIZE, PROT_READ | PROT_WRITE);
...
...
mprotect(addr, PAGE_SIZE, PROT_READ);
}
これは、シングル スレッド アプリケーションでは問題なく機能します。マルチスレッド アプリケーションの場合、(メモリが書き込み可能になるように) が設定された後に(同じプロセス内の別のタスクへの) コンテキスト スイッチが行われると、同じプロセス内の他のタスクがマップされたライブラリ領域に書き込むことができる場合があります。クリア前です。PROT_WRITE
foo
質問は次のとおりです。返されるまでプロセス内の他のタスクを無効にすることは可能ですか? そうでない場合、これをどのように回避することをお勧めしますか?