カーネルが4.6より小さい場合は、fork、clone、execなどの重要なシステムコールのフックを強くするためにアセンブリスタブを使用します。特に、execveの場合、Kernel-4.5のスニペットは、execve:Linuxカーネル4.6以上でsys_execveをフックする
ENTRY(stub_execve)
call sys_execve
return_from_execve:
...
END(stub_execve)
システムcall tableは、このスタブのアドレスが含まれており、さらにこのスタブは、元はexecveを呼び出します。ですから、この環境でexecveにフックするには、フックルーチンでスタブにcall sys_execve
を貼り付け、必要な作業を行った後に元のexecveを呼び出します。これはすべて、Linux用のプロセス実行監視ユーティリティであるexecmonで確認できます。私はexecmonがUbuntu 16.04でカーネル4.4で正常に動作することをテストしました。
カーネル4.6以降、クリティカルコール保護の上位スキームが変更されました。
\func
はexecveの呼び出しのため
sys_execve
に拡大していきます
ENTRY(ptregs_\func)
leaq \func(%rip), %rax
jmp stub_ptregs_64
END(ptregs_\func)
:今スタブは次のようになります。ここでも、システムcall tableにはこのスタブが含まれています。このスタブは元の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)
このスタブにコメントや他の参照先のラベルを見てthis上で見てください。
私は、この保護を克服し、フック機能で元の呼び出しにパッチを当てるためにいくつかのロジックを思いついたが、まだ成功しなかった。 誰かが私に加わり、そこから抜け出すのを助けたいですか?