Credo che allegare eBPF a kprobes/kretprobes ti dia accesso in lettura agli argomenti delle funzioni e ai valori restituiti, ma che non puoi manometterli. NON sono sicuro al 100%; buoni posti per chiedere conferma sarebbero la mailing list del progetto IO Visor o il canale IRC (#iovisor su irc.oftc.net).
Come soluzione alternativa, so che puoi almeno modificare il valore di ritorno di una chiamata di sistema con strace, con -e
opzione. Citando la pagina di manuale:
-e inject=set[:error=errno|:retval=value][:signal=sig][:when=expr] Perform syscall tampering for the specified set of syscalls.
Inoltre, c'è stata una presentazione su questo, e l'iniezione di guasti, al Fosdem 2017, se ti interessa. Ecco un comando di esempio dalle diapositive:
strace -P precious.txt -efault=unlink:retval=0 unlink precious.txt
Modifica: Come affermato da Ben, eBPF su kprobes e tracepoint è definitivamente di sola lettura, per tracciare e monitorare i casi d'uso. Ne ho avuto conferma anche su IRC.
All'interno dei probe del kernel (kprobes), la macchina virtuale eBPF ha accesso in sola lettura ai parametri delle chiamate di sistema e al valore restituito.
Tuttavia il programma eBPF avrà un proprio codice di ritorno. È possibile applicare un profilo seccomp che intercetta i codici di ritorno BPF (NON eBPF; grazie @qeole) e interrompe la chiamata di sistema durante l'esecuzione.
Le modifiche di runtime consentite sono:
SECCOMP_RET_KILL
:uccisione immediata conSIGSYS
SECCOMP_RET_TRAP
:Invia unSIGSYS
catturabile , dando la possibilità di emulare la chiamata di sistemaSECCOMP_RET_ERRNO
:Forzaerrno
valoreSECCOMP_RET_TRACE
:Rendi la decisione a ptracer o impostaerrno
a-ENOSYS
SECCOMP_RET_ALLOW
:Consenti
https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt
Il SECCOMP_RET_TRACE
Il metodo consente di modificare la chiamata di sistema eseguita, gli argomenti o il valore restituito. Ciò dipende dall'architettura e la modifica dei riferimenti esterni obbligatori può causare un errore ENOSYS.
Lo fa passando l'esecuzione fino a un ptrace in spazio utente in attesa, che ha la capacità di modificare la memoria, i registri e i descrittori di file del processo tracciato.
Il tracciante deve chiamare ptrace e poi waitpid. Un esempio:
ptrace(PTRACE_SETOPTIONS, tracee_pid, 0, PTRACE_O_TRACESECCOMP);
waitpid(tracee_pid, &status, 0);
http://man7.org/linux/man-pages/man2/ptrace.2.html
Quando waitpid
restituisce, a seconda del contenuto di status
, è possibile recuperare il valore di ritorno seccomp utilizzando PTRACE_GETEVENTMSG
operazione ptrace. Questo recupererà il seccomp SECCOMP_RET_DATA
value, che è un campo a 16 bit impostato dal programma BPF. Esempio:
ptrace(PTRACE_GETEVENTMSG, tracee_pid, 0, &data);
Gli argomenti Syscall possono essere modificati in memoria prima di continuare l'operazione. Puoi eseguire una singola entrata o uscita di una chiamata di sistema con PTRACE_SYSCALL
fare un passo. I valori di ritorno di Syscall possono essere modificati nello spazio utente prima di riprendere l'esecuzione; il programma sottostante non sarà in grado di vedere che i valori restituiti dalla chiamata di sistema sono stati modificati.
Un esempio di implementazione:filtrare e modificare le chiamate di sistema con seccomp e ptrace