GNU/Linux >> Linux Esercitazione >  >> Linux

eBPF può modificare il valore restituito o i parametri di una chiamata di sistema?

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 con SIGSYS
  • SECCOMP_RET_TRAP :Invia un SIGSYS catturabile , dando la possibilità di emulare la chiamata di sistema
  • SECCOMP_RET_ERRNO :Forza errno valore
  • SECCOMP_RET_TRACE :Rendi la decisione a ptracer o imposta errno 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


Linux
  1. Java Impossibile connettersi al server finestra X11 utilizzando 'localhost:10.0' come valore della variabile DISPLAY

  2. Valore di ritorno di x =os.system(..)

  3. PyODBC:impossibile aprire il driver anche se esiste

  4. Perché non riesco a scorrere nel terminale?

  5. Valore restituito dalla funzione di timeout

Come modificare i repository Proxmox

Risolto l'errore, impossibile trovare il comando hwmatch su Grub

Quale priorità in tempo reale è la priorità più alta in Linux

Posso cambiare il SID di un database Oracle?

Non riesci a trovare .so nella stessa directory dell'eseguibile?

La variabile 'general_log_file' non può essere impostata sul valore di '/var/lib/msyql/ubuntu.log'