Når programmer, der kører på Linux, ønsker at bruge de ressourcer, der styres af operativsystemet (læse filer, oprette processer osv.), foretager de systemkald til OS. Systemkald fungerer på kerneniveau og udfører de nødvendige handlinger, og overlader kontrollen tilbage til det kaldende program. Strace-værktøjet giver mulighed for at spore disse systemkald på Linux.

Typisk brug af strace-kommandoen

For at overvåge systemopkald til en applikation skal du blot påkalde kommandoen med strace i følgende format:

strace ls /tmp

Der er dog ofte processer, der starter meget tidligere og fortsætter med at arbejde i baggrunden. På grund af eventuelle problemer vil du måske indsamle yderligere oplysninger i forbindelse med sådanne processer. Du kan vedhæfte strace til enhver kørende applikation ved at give processens proces-id til -s parameter:

strace -p 2759

Produktion:

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

Med strace kan du tjekke alle tråde og andre underordnede processer, der er en forgrening af applikationen ved hjælp af -f flag.

strace -f -p 2759

Produktion:

Tjek visse systemopkald med strace

Standard-strace-output kan til tider være ret overfyldt at følge. Hvis du kun ønsker at spore bestemte systemopkald, kan du gøre det med -e parameter:

strace -f -e trace=åbn, skriv, luk, forbind,Vælg -s 19770

For kun at spore systemkald relateret til filhandlinger, brug -e trace=fil:

strace -e trace=file -p 19770

Angiv kun for at filtrere netværksrelaterede systemopkald -e trace=netværk i kommandoen:

strace -e trace=netværk -p 19770

Få tidsinformation på få sekunder

Når du udsender systemopkald, kan du bruge -t parameter for at få tidsinformation med præcision i sekunder. Det meste af tiden vil præcisionen ikke være nok til dine behov. I sådanne situationer kan du bruge -tt parameter for at få tidsinformation med mikrosekunds præcision:

strace -tt ls /tmp

Indsaml statistik om systemopkald

Med -c parameter, kan du indsamle statistik om systemopkald, så længe du vil:

strace -f -c -p 19770

Gem logfiler til en fil

Hvis du kører strace i lang tid og ønsker at undersøge de resulterende logfiler mere detaljeret senere, bliver du nødt til at gemme logfilerne. Med -o parameter kan du angive filen, hvori strace skal gemme logfilerne:

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

ptrace blokeringsproces

Ved at bruge prctl-systemkaldet kan enhver applikation under Linux forhindre sig i at blive kontrolleret af ikke-rootbrugere, der bruger ptrace. Hvis applikationen rydder PR_SET_DUMPABLE flag for sig selv via prctl, vil andre brugere end root ikke være i stand til at kontrollere denne applikation med ptrace, selvom de har ret til at signalere applikationen.

En af de mest typiske anvendelser af denne funktion ses i OpenSSH-godkendelsesagentsoftwaren. Således kontrollen af ​​applikationen af ​​en anden applikation med ptrace forhindres ved brugergodkendelse.

ptrace og sikkerhed

På grund af ptrace-faciliteten indstillet i den traditionelle Linux-procesmodel, har enhver software, du kører på dit system med din bruger, bemyndigelse til at indsætte ondsindet kode i den. Fra det enkleste xterm-værktøj til avancerede webbrowserapplikationer, kan sådan malware tage kontrol over alle dine andre kørende applikationer – takket være ptrace-systemkaldet – og kopiere vigtig information, uden at du bemærker det.

Som reaktion på denne situation, som mange brugere ikke er klar over, er der udviklet en beskyttelsesmekanisme med sikkerhedsmodulet kaldet Yama i Linux-kernen.

Du kan styre svaret på ptrace-systemkaldet via /proc/sys/kernel/yama/ptrace_scope fil. Som standard skriver denne fil en værdi på 0.

Følgende værdier er acceptable:

Værdi Betyder
0 Konventionel adfærd: Alle ansøgninger, der har ret til ptrace kan kontrolleres.
1 Begrænset ptrace: Kun den direkte overordnede af applikationen eller debug-applikationer, der er tilladt af applikationen med PR_SET_PTRACER mulighed har kontrol. Således er anvendelserne af gdb programnavn og strace program_name vil fortsætte med at fungere, men du vil ikke være i stand til at vedhæfte en kørende applikation bagefter.
2 Ptrace til systemadministratoren: Kun applikationer med defineret CAP_SYS_PTRACE ejendoms- eller underordnede processer, der definerer PTRACE_TRACEME mulighed med prctl kan styres.
3 Fuldstændig deaktiveret: Nej ptrace er tilladt under alle omstændigheder. Hvis denne egenskab er defineret én gang, kan du ikke ændre den igen under kørsel.

Mange udviklere ved ikke, at applikationer kan deaktivere ptrace sig selv via prctl, undtagen for root-brugeren. Selvom sikkerhedsrelateret software som OpenSSH-agenten udfører disse operationer, ville det ikke være rigtigt at forvente den samme adfærd fra al software, der kører på systemet.

For nylig, nogle Linux-distributioner er begyndt at indstille standardværdien for ptrace_scope fil, beskrevet ovenfor, til 1. Med begrænsede ptrace-operationer opnås et sikrere arbejdsmiljø i hele systemet.

Ved hjælp af et eksempel-spor

Registrer prøveansøgningen nedenfor med navnet ministrace.c. Så kan du kompilere det med følgende kommando:

gcc-oministeriumministerium.c

Kode:

#omfatte <sys/ptrace.h>
#omfatte <sys/reg.h>
#omfatte <sys/wait.h>
#omfatte <sys/types.h>
#omfatte <unistd.h>
#omfatte <stdlib.h>
#omfatte <stdio.h>
#omfatte <errno.h>
#omfatte <streng.h>
intvente_på_syscall(pid_t barn)
{
int status;
mens (1) {
ptrace (PTRACE_SYSCALL, barn, 0, 0);
waitpid (barn, &status, 0);
if (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80)
Vend tilbage0;
if (WIFEXITED(status))
Vend tilbage1;
}
}

intgør_barn(int argc, char **argv)
{
char *args [argc+1];
memcpy (args, argv, argc * sizeof(char*));
args[argc] = NUL;
ptrace (PTRACE_TRACEME);
dræbe(getpid(), SIGSTOP);
Vend tilbage execvp (args[0], args);
}

intdo_trace(pid_t barn)
{
int status, syscall, retval;
waitpid (barn, &status, 0);
ptrace (PTRACE_SETOPTIONS, underordnet, 0, PTRACE_O_TRACESYSGOOD);
mens(1) {
hvis (wait_for_syscall (barn) != 0) pause;

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

hvis (wait_for_syscall (barn) != 0) pause;

retval = ptrace (PTRACE_PEEKUSER, underordnet, størrelse på(lang)*RAX);
fprintf (stderr, "%d
", retval);
}
Vend tilbage0;
}
intvigtigste(int argc, char **argv)
{
hvis (argc < 2) {
fprintf (stderr, "Anvendelse: %s prog args
", argv[0]);
Afslut(1);
}
pid_t barn = gaffel();
if (barn == 0) {
Vend tilbage do_child (argc-1, argv+1);
} andet {
Vend tilbage do_trace (barn);
}
}

Efter kompilering af applikationen kan du køre enhver kommando med ministerium og undersøge outputtet:

Du kan bruge strace til mange formål

strace kan hjælpe med at finde fejl i programmer, der unødigt bruger systemressourcer. Ligeledes kan den egenskab, som et program udviser, mens du bruger operativsystemressourcer, også afsløres med strace.

Da strace lytter direkte til systemopkald, kan den afsløre runtime dynamik, uanset om koden for det program, der køres, er åben/lukket. Det er muligt at få en idé om, hvorfor programmerne giver en fejl, når de begynder at bruge strace.

På samme måde hjælper strace dig med at forstå, hvorfor et program afsluttes uventet. Derfor er det meget vigtigt at være fortrolig med strace i Linux-kerneudvikling og systemadministration.

Opret dit helt eget operativsystem med Linux fra bunden [Linux]

Læs Næste

DelTweetDelE-mail

Relaterede emner

  • Linux
  • Linux kommandoer
  • Linux-kerne

Om forfatteren

Fatih Küçükkarakurt (6 artikler udgivet)

En ingeniør og softwareudvikler, der er fan af matematik og teknologi. Han har altid godt kunne lide computere, matematik og fysik. Han har udviklet spilmotorprojekter samt maskinlæring, kunstige neurale netværk og lineære algebrabiblioteker. Arbejder desuden med maskinlæring og lineære matricer.

Mere fra Fatih Küçükkarakurt

Abonner på vores nyhedsbrev

Tilmeld dig vores nyhedsbrev for tekniske tips, anmeldelser, gratis e-bøger og eksklusive tilbud!

Klik her for at abonnere