Quando i programmi in esecuzione su Linux desiderano utilizzare le risorse gestite dal sistema operativo (lettura di file, creazione di processi, ecc.), effettuano chiamate di sistema al sistema operativo. Le chiamate di sistema funzionano a livello di kernel ed eseguono le operazioni necessarie, lasciando il controllo al programma chiamante. Lo strumento strace offre la possibilità di tracciare queste chiamate di sistema su Linux.

Uso tipico del comando strace

Per monitorare le chiamate di sistema per un'applicazione, basta invocare il comando con straccio nel seguente formato:

strace ls /tmp

Tuttavia, ci sono spesso processi che iniziano molto prima e continuano a funzionare in background. A causa di eventuali problemi, potresti voler raccogliere informazioni aggiuntive associate a tali processi. Puoi allegare straccio a qualsiasi applicazione in esecuzione fornendo l'ID del processo al -p parametro:

strace -p 2759

Produzione:

Tieni traccia di thread e fork di un'app

Con strace, puoi controllare tutti i thread e altri processi figlio che sono un fork dell'applicazione usando il file

instagram viewer
-f bandiera.

strace -f -p 2759

Produzione:

Controlla alcune chiamate di sistema con strace

L'output di strace predefinito può essere piuttosto affollato da seguire a volte. Se desideri monitorare solo determinate chiamate di sistema, puoi farlo con il -e parametro:

strace -f -e trace=apri, scrivi, chiudi, connetti,Selezionare -p 19770

Per tracciare solo le chiamate di sistema relative alle operazioni sui file, utilizzare -e traccia=file:

strace -e trace=file -p 19770

Per filtrare solo le chiamate di sistema relative alla rete, specificare -e traccia=rete nel comando:

strace -e trace=network -p 19770

Ottieni informazioni sull'ora in pochi secondi

Quando si emettono chiamate di sistema, è possibile utilizzare il file -t parametro per ottenere informazioni sull'ora con precisione in secondi. Il più delle volte la precisione non sarà sufficiente per le tue esigenze. In tali situazioni, è possibile utilizzare il -tt parametro per ottenere informazioni sull'ora con precisione al microsecondo:

strace -tt ls /tmp

Raccogli le statistiche sulle chiamate di sistema

Con il -c parametro, puoi raccogliere statistiche sulle chiamate di sistema per tutto il tempo che desideri:

strace -f -c -p 19770

Salva i registri in un file

Se esegui strace per molto tempo e desideri esaminare i log risultanti in modo più dettagliato in seguito, dovrai salvare i log. Con il -o parametro è possibile specificare il file in cui strace deve salvare i log:

strace -f -o /tmp/strace.log -e trace=file ls /tmp

Processo di blocco di ptrace

Usando la chiamata di sistema prctl, qualsiasi applicazione sotto Linux può impedire a se stessa di essere controllata da utenti non root che usano ptrace. Se l'applicazione cancella il PR_SET_DUMPABLE flag per sé tramite prctl, gli utenti diversi da root non potranno controllare questa applicazione con ptrace, anche se hanno il diritto di segnalare l'applicazione.

Uno degli usi più tipici di questa funzione è rappresentato dal software dell'agente di autenticazione OpenSSH. Pertanto, il controllo dell'applicazione da parte di un'altra applicazione con posto viene impedito all'autenticazione dell'utente.

posto e sicurezza

A causa della funzione ptrace impostata nel modello di processo Linux tradizionale, qualsiasi software eseguito sul sistema con l'utente ha l'autorità per inserirvi codice dannoso. Dal più semplice strumento xterm a applicazioni browser web avanzate, questo malware può assumere il controllo di tutte le altre applicazioni in esecuzione, grazie alla chiamata di sistema ptrace, e copiare informazioni importanti senza che tu te ne accorga.

In risposta a questa situazione, di cui molti utenti non sono a conoscenza, è stato sviluppato un meccanismo di protezione con il modulo di sicurezza chiamato Yama nel kernel Linux.

È possibile controllare la risposta alla chiamata di sistema ptrace tramite il /proc/sys/kernel/yama/ptrace_scope file. Per impostazione predefinita, questo file scrive un valore di 0.

Sono accettabili i seguenti valori:

Valore Significato
0 Comportamento convenzionale: tutte le applicazioni che ne hanno il diritto posto può essere verificato.
1 Posto ristretto: solo il genitore diretto dell'applicazione o le applicazioni di debug consentite dall'applicazione con PR_SET_PTRACER opzione avere il controllo. Pertanto, gli usi di gdb nome_programma e strace nome_programma continuerà a funzionare, ma in seguito non potrai allegare un'applicazione in esecuzione.
2 Ptrace all'amministratore di sistema: Solo applicazioni con definito CAP_SYS_PTRACE proprietà o processi figlio che definiscono il PTRACE_TRACEME opzione con prctl può essere controllato.
3 Completamente disabilitato: No posto è consentito in ogni caso. Se questa proprietà viene definita una volta, non è possibile modificarla nuovamente in fase di esecuzione.

Molti sviluppatori non sanno che le applicazioni possono disabilitare ptrace stesse tramite prctl, ad eccezione dell'utente root. Sebbene il software relativo alla sicurezza come l'agente OpenSSH esegua queste operazioni, non sarebbe corretto aspettarsi lo stesso comportamento da tutto il software in esecuzione sul sistema.

Recentemente, alcune distribuzioni Linux hanno iniziato a impostare il valore predefinito di ptrace_scope file, descritto sopra, a 1. Pertanto, con le operazioni di tracciamento limitate, viene fornito un ambiente di lavoro più sicuro in tutto il sistema.

Utilizzo di una traccia di esempio

Registra l'applicazione di esempio di seguito con il nome ministero.c. Quindi puoi compilarlo con il seguente comando:

gcc-oministranteministrante.c

Codice:

#includere <sys/ptrace.h>
#includere <sys/reg.h>
#includere <sys/wait.h>
#includere <sys/tipi.h>
#includere <unistd.h>
#includere <stdlib.h>
#includere <stdio.h>
#includere <errno.h>
#includere <stringa.h>
intwait_for_syscall(pid_t bambino)
{
int stato;
mentre (1) {
ptrace (PTRACE_SYSCALL, figlio, 0, 0);
waitpid (bambino, &stato, 0);
se (WIFSTOPPED(stato) && WSTOPSIG(stato) & 0x80)
Restituzione0;
se (WIFEXITED(stato))
Restituzione1;
}
}

intdo_bambino(int argc, car **argv)
{
car *args [argc+1];
memcpy (args, argv, argc * sizeof(car*));
args[argc] = NULLO;
traccia (PTRACE_TRACEME);
uccisione(getpid(), SIGSTOP);
Restituzione execvp (args[0], argomenti);
}

intfare_tracciare(pid_t bambino)
{
int stato, syscall, retval;
waitpid (bambino, &stato, 0);
ptrace (PTRACE_SETOPTIONS, figlio, 0, PTRACE_O_TRACESYSGOOD);
mentre(1) {
Se (wait_for_syscall (figlio) != 0) rompere;

syscall = ptrace (PTRACE_PEEKUSER, figlio, sizeof(lungo)*ORIG_RAX);
fprintf (stderr, "syscall(%d) = ", chiamata di sistema);

Se (wait_for_syscall (figlio) != 0) rompere;

retval = ptrace (PTRACE_PEEKUSER, figlio, sizeof(lungo)*RAX);
fprintf (stderr, "%d
", recupero);
}
Restituzione0;
}
intprincipale(int argc, car **argv)
{
se (arg < 2) {
fprintf (stderr, "Utilizzo: %s prog args
", argv[0]);
Uscita(1);
}
pid_t figlio = fork();
se (figlio == 0) {
Restituzione do_child (arg-1, argv+1);
} altro {
Restituzione do_trace (figlio);
}
}

Dopo aver compilato l'applicazione, puoi eseguire qualsiasi comando con ministrante ed esaminare l'output:

Puoi usare strace per molti scopi

strace può aiutare a trovare bug nei programmi che utilizzano inutilmente le risorse di sistema. Allo stesso modo, la caratteristica che mostra un programma durante l'utilizzo delle risorse del sistema operativo può anche essere rivelata con strace.

Poiché strace ascolta direttamente le chiamate di sistema, può rivelare le dinamiche di runtime indipendentemente dal fatto che il codice del programma in esecuzione sia aperto/chiuso. È possibile avere un'idea del motivo per cui i programmi generano un errore quando vengono avviati utilizzando strace.

Allo stesso modo, strace ti aiuta a capire perché un programma si interrompe in modo imprevisto. Pertanto, avere familiarità con strace è molto importante nello sviluppo del kernel Linux e nell'amministrazione del sistema.

Crea il tuo sistema operativo personale con Linux da zero [Linux]

Leggi Avanti

CondividereTwittaCondividereE-mail

Argomenti correlati

  • Linux
  • Comandi Linux
  • kernel Linux

Circa l'autore

Fatih Kuçükkarakurt (6 articoli pubblicati)

Un ingegnere e sviluppatore di software che è un fan della matematica e della tecnologia. Gli sono sempre piaciuti i computer, la matematica e la fisica. Ha sviluppato progetti di motori di gioco, machine learning, reti neurali artificiali e librerie di algebra lineare. Inoltre continua a lavorare su machine learning e matrici lineari.

Altro da Fatih Küçükkarakurt

Iscriviti alla nostra Newsletter

Iscriviti alla nostra newsletter per suggerimenti tecnici, recensioni, ebook gratuiti e offerte esclusive!

Clicca qui per iscriverti