Věřím, že připojení eBPF ke kprobes/kretprobes vám poskytuje přístup pro čtení k argumentům funkcí a návratovým hodnotám, ale nemůžete s nimi manipulovat. NEJSEM si 100% jistý; dobrými místy, kde můžete požádat o potvrzení, je mailing list projektu IO Visor nebo IRC kanál (#iovisor na irc.oftc.net).
Jako alternativní řešení vím, že můžete alespoň změnit návratovou hodnotu syscall pomocí strace pomocí -e
volba. Cituji manuálovou stránku:
-e inject=set[:error=errno|:retval=value][:signal=sig][:when=expr] Perform syscall tampering for the specified set of syscalls.
Také byla na Fosdem 2017 prezentace o tomto a poruchovém vstřikování, pokud vás to zajímá. Zde je jeden příklad příkazu ze snímků:
strace -P precious.txt -efault=unlink:retval=0 unlink precious.txt
Upravit: Jak uvedl Ben, eBPF na kprobes a sledovacích bodech je definitivně pouze pro čtení, pro účely sledování a monitorování. Také jsem o tom dostal potvrzení na IRC.
V rámci sond jádra (kprobes) má virtuální stroj eBPF přístup pouze pro čtení k parametrům syscall a návratové hodnotě.
Program eBPF však bude mít svůj vlastní návratový kód. Je možné použít profil seccomp, který zachytí návratové kódy BPF (NE eBPF; díky @qeole) a přeruší systémové volání během provádění.
Povolené úpravy běhového prostředí jsou:
SECCOMP_RET_KILL
:Okamžité ukončení pomocíSIGSYS
SECCOMP_RET_TRAP
:Odeslat zachytitelnýSIGSYS
, což dává šanci emulovat systémové voláníSECCOMP_RET_ERRNO
:Vynutiterrno
hodnotuSECCOMP_RET_TRACE
:Rozhodnutí o výnosu ptraceru nebo nastaveníerrno
na-ENOSYS
SECCOMP_RET_ALLOW
:Povolit
https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt
SECCOMP_RET_TRACE
metoda umožňuje upravit provedené systémové volání, argumenty nebo návratovou hodnotu. To je závislé na architektuře a úprava povinných externích referencí může způsobit chybu ENOSYS.
Dělá to tak, že předá spuštění čekajícímu uživatelskému prostoru ptrace, který má schopnost upravit paměť trasovaného procesu, registry a deskriptory souborů.
Tracer potřebuje zavolat ptrace a pak waitpid. Příklad:
ptrace(PTRACE_SETOPTIONS, tracee_pid, 0, PTRACE_O_TRACESECCOMP);
waitpid(tracee_pid, &status, 0);
http://man7.org/linux/man-pages/man2/ptrace.2.html
Když waitpid
vrátí v závislosti na obsahu status
, lze získat návratovou hodnotu seccomp pomocí PTRACE_GETEVENTMSG
operace ptrace. Tím se načte seccomp SECCOMP_RET_DATA
hodnotu, což je 16bitové pole nastavené programem BPF. Příklad:
ptrace(PTRACE_GETEVENTMSG, tracee_pid, 0, &data);
Argumenty syscall lze upravit v paměti před pokračováním operace. Pomocí PTRACE_SYSCALL
můžete provést jeden vstup nebo ukončení systémového volání krok. Návratové hodnoty syscall lze upravit v uživatelském prostoru před obnovením provádění; základní program nebude schopen vidět, že návratové hodnoty syscall byly změněny.
Příklad implementace:Filtrovat a upravit systémová volání pomocí seccomp a ptrace