Linuxカーネル4.6以降でsys_execveフック

Linuxカーネル4.6以降でsys_execveフック

4.6より前のカーネルはアセンブリスタブを使用して、重要なシステムコール(フォーク、レプリケーション、実行など)のフックを強制します。特にexecveの場合、次のコードスニペットはカーネル 4.5execveのエントリスタブを表示:

ENTRY(stub_execve)
    call    sys_execve
return_from_execve:
 ... 
END(stub_execve)

システム通貨テーブルこのスタブのアドレスを含み、このスタブは元のexecveをさらに呼び出します。したがって、この環境でexecveをフックするには、フックcall sys_execveルーチンでスタブをパッチし、必要な操作を完了した後に元のexecveを呼び出す必要があります。みんなアクションで見ることができますプログラムの実行、Linux用のプロセス実行監視ユーティリティ。カーネル4.4を使用して、Ubuntu 16.04でexecmonが正常に実行されることをテストしました。

カーネル 4.6 以降、重要な通貨保護の上位システムが変更されました。今スタブは次のようになります。

ENTRY(ptregs_\func)
    leaq    \func(%rip), %rax
    jmp     stub_ptregs_64
END(ptregs_\func)

execve呼び出し\funcに展開される場所。sys_execveシステムについて話しましょう通貨テーブルこのスタブは含まれており、このスタブは元のexecveを呼び出しますが、これを実行するのではなく、より安全な方法で、call sys_execveこの最新のスタブは呼び出された関数のアドレスをRAXレジスタに保存し、以下のように別のスタブにジャンプします(説明を削除)。

 ENTRY(stub_ptregs_64)
     cmpq   $.Lentry_SYSCALL_64_after_fastpath_call, (%rsp)
     jne    1f

     DISABLE_INTERRUPTS(CLBR_NONE)
     TRACE_IRQS_OFF
     popq   %rax
     jmp    entry_SYSCALL64_slow_path

 1:
     jmp    *%rax        /* called from C */
 END(stub_ptregs_64)

これを見てくださいこれこのスタブのコメントやその他の参照タグを確認してください。

私はこの保護を克服し、元の呼び出しをフック機能にパッチするためにいくつかのロジックを思い出すために一生懸命働きましたが、まだ成功していません。私と一緒に助けてくれる人ですか?

関連情報