GNU/Linux >> Belajar Linux >  >> Linux

Bisakah eBPF mengubah nilai pengembalian atau parameter syscall?

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 dengan SIGSYS
  • SECCOMP_RET_TRAP :Mengirim SIGSYS yang dapat ditangkap , memberikan kesempatan untuk meniru syscall
  • SECCOMP_RET_ERRNO :Paksa errno nilai
  • SECCOMP_RET_TRACE :Hasil keputusan untuk ptracer atau setel errno 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


Linux
  1. Nilai Maksimum Id Proses?

  2. Bagaimana saya bisa mengatur 'backend' di matplotlib dengan Python?

  3. dapatkah xargs memisahkan parameter?

  1. Mengembalikan nilai x =os.system(..)

  2. PyODBC :tidak dapat membuka driver meskipun itu ada

  3. Nilai pengembalian fungsi batas waktu

  1. Bagaimana saya bisa memantau panjang antrian penerimaan?

  2. Bisakah saya mengubah SID dari database Oracle?

  3. Tidak dapat menemukan .so di direktori yang sama dengan executable?