GNU/Linux >> Znalost Linux >  >> Linux

Může eBPF upravit návratovou hodnotu nebo parametry syscall?

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 :Vynutit errno hodnotu
  • SECCOMP_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


Linux
  1. Maximální hodnota ID procesu?

  2. Jak mohu nastavit 'backend' v matplotlib v Pythonu?

  3. může xargs oddělit parametry?

  1. Návratová hodnota x =os.system(..)

  2. PyODBC:nelze otevřít ovladač, i když existuje

  3. Vrácená hodnota funkce časového limitu

  1. Jak mohu sledovat délku fronty přijetí?

  2. Mohu změnit SID databáze Oracle?

  3. Nemůžete najít .so ve stejném adresáři jako spustitelný soubor?