Saya percaya bahwa melampirkan eBPF ke kprobes/kretprobes memberi Anda akses baca ke argumen fungsi dan mengembalikan nilai, tetapi Anda tidak dapat mengutak-atiknya. Saya TIDAK 100% yakin; tempat yang baik untuk meminta konfirmasi adalah milis proyek IO Visor atau saluran IRC (#iovisor di irc.oftc.net).
Sebagai solusi alternatif, saya tahu Anda setidaknya dapat mengubah nilai pengembalian syscall dengan strace, dengan -e
pilihan. Mengutip halaman manual:
-e inject=set[:error=errno|:retval=value][:signal=sig][:when=expr] Perform syscall tampering for the specified set of syscalls.
Juga, ada presentasi tentang ini, dan injeksi kesalahan, di Fosdem 2017, jika menarik bagi Anda. Berikut adalah salah satu contoh perintah dari slide:
strace -P precious.txt -efault=unlink:retval=0 unlink precious.txt
Edit: Seperti yang dinyatakan oleh Ben, eBPF pada kprobes dan tracepoints secara definitif hanya dapat dibaca, untuk melacak dan memantau kasus penggunaan. Saya juga mendapat konfirmasi tentang ini di IRC.
Di dalam probe kernel (kprobes), mesin virtual eBPF memiliki akses hanya baca ke parameter syscall dan mengembalikan nilai.
Namun program eBPF akan memiliki kode pengembaliannya sendiri. Dimungkinkan untuk menerapkan profil seccomp yang menjebak kode pengembalian BPF (BUKAN eBPF; terima kasih @qeole) dan mengganggu panggilan sistem selama eksekusi.
Modifikasi runtime yang diizinkan adalah:
SECCOMP_RET_KILL
:Segera bunuh denganSIGSYS
SECCOMP_RET_TRAP
:MengirimSIGSYS
yang dapat ditangkap , memberikan kesempatan untuk meniru syscallSECCOMP_RET_ERRNO
:Paksaerrno
nilaiSECCOMP_RET_TRACE
:Hasil keputusan untuk ptracer atau setelerrno
ke-ENOSYS
SECCOMP_RET_ALLOW
:Izinkan
https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt
SECCOMP_RET_TRACE
metode memungkinkan memodifikasi panggilan sistem yang dilakukan, argumen, atau mengembalikan nilai. Ini tergantung arsitektur dan modifikasi referensi eksternal wajib dapat menyebabkan kesalahan ENOSYS.
Ia melakukannya dengan meneruskan eksekusi ke ptrace ruang pengguna yang menunggu, yang memiliki kemampuan untuk mengubah memori proses yang dilacak, register, dan deskriptor file.
Pelacak perlu memanggil ptrace dan kemudian waitpid. Contoh:
ptrace(PTRACE_SETOPTIONS, tracee_pid, 0, PTRACE_O_TRACESECCOMP);
waitpid(tracee_pid, &status, 0);
http://man7.org/linux/man-pages/man2/ptrace.2.html
Ketika waitpid
kembali, bergantung pada konten status
, seseorang dapat mengambil nilai kembalian seccomp menggunakan PTRACE_GETEVENTMSG
operasi ptrace. Ini akan mengambil seccomp SECCOMP_RET_DATA
nilai, yang merupakan bidang 16-bit yang diatur oleh program BPF. Contoh:
ptrace(PTRACE_GETEVENTMSG, tracee_pid, 0, &data);
Argumen syscall dapat dimodifikasi di memori sebelum melanjutkan operasi. Anda dapat melakukan entri atau keluar syscall tunggal dengan PTRACE_SYSCALL
melangkah. Nilai pengembalian Syscall dapat dimodifikasi di ruang pengguna sebelum melanjutkan eksekusi; program yang mendasarinya tidak akan dapat melihat bahwa nilai kembalian syscall telah dimodifikasi.
Contoh penerapan:Filter dan Modifikasi Panggilan Sistem dengan seccomp dan ptrace