Når programmer som kjører på Linux ønsker å bruke ressursene som administreres av operativsystemet (lese filer, lage prosesser osv.), foretar de systemanrop til operativsystemet. Systemanrop fungerer på kjernenivå og utfører de nødvendige operasjonene, og overlater kontrollen tilbake til anropsprogrammet. Strace-verktøyet gir muligheten til å spore disse systemanropene på Linux.

Typisk bruk av strace-kommandoen

For å overvåke systemanrop for en applikasjon, bare påkalle kommandoen med strace i følgende format:

strace ls /tmp

Imidlertid er det ofte prosesser som starter mye tidligere og fortsetter å fungere i bakgrunnen. På grunn av problemer kan det være lurt å samle inn tilleggsinformasjon knyttet til slike prosesser. Du kan legge ved strace til enhver applikasjon som kjører ved å gi prosess-IDen til prosessen til -s parameter:

strace -p 2759

Produksjon:

Hold styr på tråder og gafler i en app

Med strace kan du sjekke alle tråder og andre underordnede prosesser som er en del av applikasjonen ved å bruke -f flagg.

strace -f -p 2759

Produksjon:

Sjekk enkelte systemanrop med strace

Standard strace-utgang kan være ganske overfylt å følge til tider. Hvis du bare vil spore visse systemanrop, kan du gjøre det med -e parameter:

strace -f -e trace=åpne, skriv, lukk, koble til,plukke ut -s 19770

For å spore kun systemanrop relatert til filoperasjoner, bruk -e trace=fil:

strace -e trace=file -p 19770

For å filtrere bare nettverksrelaterte systemanrop, spesifiser -e trace=nettverk i kommandoen:

strace -e trace=nettverk -p 19770

Få tidsinformasjon på sekunder

Når du sender ut systemanrop, kan du bruke -t parameter for å få tidsinformasjon med presisjon i sekunder. Mesteparten av tiden vil ikke presisjonen være nok for dine behov. I slike situasjoner kan du bruke -tt parameter for å få tidsinformasjon med mikrosekunders presisjon:

strace -tt ls /tmp

Samle statistikk om systemanrop

Med -c parameter, kan du samle inn statistikk om systemanrop så lenge du vil:

strace -f -c -p 19770

Lagre logger til en fil

Hvis du kjører strace i lang tid og ønsker å undersøke de resulterende loggene mer detaljert senere, må du lagre loggene. Med -o parameter kan du spesifisere filen som strace skal lagre loggene i:

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

ptrace blokkeringsprosess

Ved å bruke prctl-systemkallet kan enhver applikasjon under Linux forhindre seg i å bli kontrollert av ikke-rootbrukere som bruker ptrace. Hvis applikasjonen sletter PR_SET_DUMPABLE flagg for seg selv via prctl, andre brukere enn root vil ikke kunne kontrollere denne applikasjonen med ptrace, selv om de har rett til å signalisere applikasjonen.

En av de mest typiske bruksområdene for denne funksjonen sees i OpenSSH-autentiseringsagentprogramvaren. Dermed kontrollen av applikasjonen av en annen applikasjon med ptrace er forhindret ved brukerautentisering.

ptrace og sikkerhet

På grunn av ptrace-funksjonen som er satt i den tradisjonelle Linux-prosessmodellen, har all programvare du kjører på systemet med brukeren din autoritet til å sette inn ondsinnet kode i den. Fra det enkleste xterm-verktøyet til avanserte nettleserapplikasjoner, kan slik skadevare ta kontroll over alle de andre kjørende applikasjonene dine – takket være ptrace-systemanropet – og kopiere viktig informasjon uten at du merker det.

Som svar på denne situasjonen, som mange brukere ikke er klar over, er det utviklet en beskyttelsesmekanisme med sikkerhetsmodulen kalt Yama i Linux-kjernen.

Du kan kontrollere responsen på ptrace-systemanropet via /proc/sys/kernel/yama/ptrace_scope fil. Som standard skriver denne filen en verdi på 0.

Følgende verdier er akseptable:

Verdi Betydning
0 Konvensjonell oppførsel: Alle søknader som har rett til ptrace kan sjekkes.
1 Begrenset ptrace: Bare den direkte overordnede av applikasjonen eller feilsøkingsapplikasjoner tillatt av applikasjonen med PR_SET_PTRACER alternativet har kontrollen. Dermed er bruken av gdb programnavn og spore programnavn vil fortsette å fungere, men du vil ikke kunne legge ved et program som kjører etterpå.
2 Ptrace til systemadministrator: Kun applikasjoner med definert CAP_SYS_PTRACE eiendoms- eller underordnede prosesser som definerer PTRACE_TRACEME alternativ med prctl kan kontrolleres.
3 Helt deaktivert: Nei ptrace er tillatt under alle omstendigheter. Hvis denne egenskapen er definert én gang, kan du ikke endre den igjen under kjøring.

Mange utviklere vet ikke at applikasjoner kan deaktivere ptrace seg selv via prctl, bortsett fra rotbrukeren. Selv om sikkerhetsrelatert programvare som OpenSSH-agenten utfører disse operasjonene, ville det ikke være riktig å forvente samme oppførsel fra all programvare som kjører på systemet.

Nylig, noen Linux-distribusjoner har begynt å angi standardverdien for ptrace_scope fil, beskrevet ovenfor, til 1. Dermed, med begrensede ptrace-operasjoner, gis et sikrere arbeidsmiljø i hele systemet.

Ved hjelp av et eksempel-spor

Registrer eksempelsøknaden nedenfor med navnet ministrace.c. Deretter kan du kompilere den med følgende kommando:

gcc-oministeriumministerium.c

Kode:

#inkludere <sys/ptrace.h>
#inkludere <sys/reg.h>
#inkludere <sys/wait.h>
#inkludere <sys/types.h>
#inkludere <unistd.h>
#inkludere <stdlib.h>
#inkludere <stdio.h>
#inkludere <errno.h>
#inkludere <streng.h>
intwait_for_syscall(pid_t barn)
{
int status;
samtidig som (1) {
ptrace (PTRACE_SYSCALL, barn, 0, 0);
waitpid (barn, &status, 0);
if (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80)
komme tilbake0;
if (WIFEXITED(status))
komme tilbake1;
}
}

intgjøre_barn(int argc, røye **argv)
{
røye *args [argc+1];
memcpy (args, argv, argc * sizeof(røye*));
args[argc] = NULL;
ptrace (PTRACE_TRACEME);
drepe(getpid(), SIGSTOPP);
komme tilbake execvp (args[0], args);
}

intdo_trace(pid_t barn)
{
int status, syscall, retval;
waitpid (barn, &status, 0);
ptrace (PTRACE_SETOPTIONS, barn, 0, PTRACE_O_TRACESYSGOOD);
samtidig som(1) {
hvis (wait_for_syscall (barn) != 0) gå i stykker;

syscall = ptrace (PTRACE_PEEKUSER, barn, størrelse på(lang)*ORIG_RAX);
fprintf (stderr, "syscall(%d) = ", syscall);

hvis (wait_for_syscall (barn) != 0) gå i stykker;

retval = ptrace (PTRACE_PEEKUSER, barn, størrelse på(lang)*RAX);
fprintf (stderr, "%d
", retval);
}
komme tilbake0;
}
inthoved-(int argc, røye **argv)
{
hvis (argc < 2) {
fprintf (stderr, "Bruk: %s prog args
", argv[0]);
exit(1);
}
pid_t barn = gaffel();
if (barn == 0) {
komme tilbake do_child (argc-1, argv+1);
} ellers {
komme tilbake do_trace (barn);
}
}

Etter kompilering av applikasjonen kan du kjøre hvilken som helst kommando med ministerium og undersøk resultatet:

Du kan bruke strace til mange formål

strace kan hjelpe med å finne feil i programmer som unødvendig bruker systemressurser. På samme måte kan egenskapen som et program viser mens du bruker operativsystemressurser også avsløres med strace.

Siden strace lytter direkte til systemanrop, kan den avsløre kjøretidsdynamikk uavhengig av om koden til programmet som kjøres er åpen/lukket. Det er mulig å få en idé om hvorfor programmene gir en feil når de begynner å bruke strace.

På samme måte hjelper strace deg med å forstå hvorfor et program avsluttes uventet. Derfor er det veldig viktig å være kjent med strace i Linux-kjerneutvikling og systemadministrasjon.

Lag ditt helt eget operativsystem med Linux fra bunnen av [Linux]

Les Neste

DelekvitringDeleE-post

Relaterte temaer

  • Linux
  • Linux-kommandoer
  • Linux-kjernen

Om forfatteren

Fatih Küçükkarakurt (6 artikler publisert)

En ingeniør og programvareutvikler som er en fan av matematikk og teknologi. Han har alltid likt datamaskiner, matematikk og fysikk. Han har utviklet spillmotorprosjekter samt maskinlæring, kunstige nevrale nettverk og lineære algebrabiblioteker. Videre fortsetter arbeidet med maskinlæring og lineære matriser.

Mer fra Fatih Küçükkarakurt

Abonner på vårt nyhetsbrev

Bli med i vårt nyhetsbrev for tekniske tips, anmeldelser, gratis e-bøker og eksklusive tilbud!

Klikk her for å abonnere