15

いくつかの動作をシミュレートするために、プローブをシステムコールにアタッチし、特定のパラメーターが渡されたときに戻り値を変更したいと考えています。または、関数のパラメーターをプロセスにする前に変更するだけでも十分です。

これはBPFで可能ですか?

4

4 に答える 4

13

カーネル プローブ (kprobes) 内では、eBPF 仮想マシンは syscall パラメーターと戻り値に読み取り専用でアクセスできます。

ただし、eBPF プログラムには独自のリターン コードがあります。BPF (eBPF ではありません。@qeole に感謝します) リターン コードをトラップする seccomp プロファイルを適用し、実行中にシステム コールを中断することができます。

許可されているランタイムの変更は次のとおりです。

  • SECCOMP_RET_KILL: で即死SIGSYS
  • SECCOMP_RET_TRAP: catchable を送信しSIGSYS、システムコールをエミュレートする機会を与えます
  • SECCOMP_RET_ERRNO:力のerrno
  • SECCOMP_RET_TRACE: ptracer に決定を渡すか、に設定errnoします。-ENOSYS
  • SECCOMP_RET_ALLOW: 許可する

https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt

このSECCOMP_RET_TRACEメソッドにより、実行されるシステム コール、引数、または戻り値を変更できます。これはアーキテクチャに依存し、必須の外部参照を変更すると ENOSYS エラーが発生する場合があります。

これは、トレースされたプロセスのメモリ、レジスタ、およびファイル記述子を変更する機能を持つ、待機中のユーザー空間 ptrace に実行を渡すことによって行われます。

トレーサーは、ptrace を呼び出してから、waitpid を呼び出す必要があります。例:

ptrace(PTRACE_SETOPTIONS, tracee_pid, 0, PTRACE_O_TRACESECCOMP);
waitpid(tracee_pid, &status, 0);

http://man7.org/linux/man-pages/man2/ptrace.2.html

が戻るときwaitpid、 の内容に応じて、 ptrace 操作statusを使用して seccomp の戻り値を取得できます。これにより、BPF プログラムによって設定された 16 ビット フィールドであるPTRACE_GETEVENTMSGseccomp 値が取得されます。SECCOMP_RET_DATA例:

ptrace(PTRACE_GETEVENTMSG, tracee_pid, 0, &data);

syscall 引数は、操作を続行する前にメモリ内で変更できます。このステップで、単一の syscall エントリまたは終了を実行できますPTRACE_SYSCALL。syscall の戻り値は、実行を再開する前にユーザー空間で変更できます。基になるプログラムは、syscall の戻り値が変更されたことを確認できません。

実装例: seccomp と ptrace を使用したシステム コールのフィルター処理と変更

于 2017-04-07T01:59:12.283 に答える