När program som körs på Linux vill använda de resurser som hanteras av operativsystemet (läsa filer, skapa processer etc.) gör de systemanrop till operativsystemet. Systemanrop fungerar på kärnnivå och utför nödvändiga operationer, vilket lämnar kontrollen tillbaka till det anropande programmet. Strace-verktyget ger möjlighet att spåra dessa systemanrop på Linux.

Typisk användning av strace-kommandot

För att övervaka systemanrop för en applikation, anropa bara kommandot med strace i följande format:

strace ls /tmp

Det finns dock ofta processer som startar mycket tidigare och fortsätter att fungera i bakgrunden. På grund av eventuella problem kanske du vill samla in ytterligare information kopplad till sådana processer. Du kan bifoga strace till alla program som körs genom att ge processens process-ID till -s parameter:

strace -p 2759

Produktion:

Håll reda på trådar och gafflar i en app

Med strace kan du kontrollera alla trådar och andra underordnade processer som är en del av applikationen med hjälp av -f flagga.

instagram viewer
strace -f -p 2759

Produktion:

Kontrollera vissa systemsamtal med strace

Den förinställda strace-utgången kan vara ganska trång att följa ibland. Om du bara vill spåra vissa systemsamtal kan du göra det med -e parameter:

strace -f -e trace=öppna, skriv, stäng, anslut,Välj -s 19770

För att spåra endast systemanrop relaterade till filoperationer, använd -e trace=fil:

strace -e trace=file -p 19770

För att filtrera endast nätverksrelaterade systemanrop, specificera -e trace=nätverk i kommandot:

strace -e trace=nätverk -p 19770

Få tidsinformation på sekunder

När du skickar systemsamtal kan du använda -t parameter för att få tidsinformation med precision i sekunder. För det mesta kommer precisionen inte att räcka till för dina behov. I sådana situationer kan du använda -tt parameter för att få tidsinformation med mikrosekundsprecision:

strace -tt ls /tmp

Samla in statistik om systemsamtal

Med -c parameter kan du samla in statistik om systemanrop så länge du vill:

strace -f -c -p 19770

Spara loggar till en fil

Om du kör strace under en längre tid och vill undersöka de resulterande loggarna mer i detalj senare, måste du spara loggarna. Med -o parameter kan du ange filen i vilken strace ska spara loggarna:

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

ptrace blockeringsprocess

Genom att använda prctl-systemanropet kan alla program under Linux hindra sig från att kontrolleras av icke-rootanvändare som använder ptrace. Om applikationen rensar PR_SET_DUMPABLE flagga för sig själv via prctl, andra användare än root kommer inte att kunna styra denna applikation med ptrace, även om de har rätt att signalera applikationen.

En av de mest typiska användningarna av denna funktion ses i OpenSSH-programvaran för autentiseringsagent. Således styrs applikationen av en annan applikation med ptrace förhindras vid användarautentisering.

ptrace och säkerhet

På grund av ptrace-funktionen som är inställd i den traditionella Linux-processmodellen, har all programvara du kör på ditt system med din användare behörighet att infoga skadlig kod i den. Från det enklaste xterm-verktyget till avancerade webbläsarapplikationer, kan sådan skadlig programvara ta kontroll över alla dina andra program som körs – tack vare ptrace-systemanropet – och kopiera viktig information utan att du märker det.

Som svar på denna situation, som många användare inte är medvetna om, har en skyddsmekanism utvecklats med säkerhetsmodulen som kallas Yama i Linux-kärnan.

Du kan styra svaret på ptrace-systemanropet via /proc/sys/kernel/yama/ptrace_scope fil. Som standard skriver den här filen värdet 0.

Följande värden är acceptabla:

Värde Menande
0 Konventionellt beteende: Alla ansökningar som har rätt till ptrace kan kontrolleras.
1 Begränsad ptrace: Endast den direkta föräldern till applikationen eller felsökningsprogram som tillåts av applikationen med PR_SET_PTRACER alternativet har kontrollen. Således är användningarna av gdb programnamn och spåra programnamn kommer att fortsätta att fungera, men du kommer inte att kunna bifoga ett program som körs efteråt.
2 Ptrace till systemadministratören: Endast applikationer med definierade CAP_SYS_PTRACE egendoms- eller underordnade processer som definierar PTRACE_TRACEME alternativ med prctl kan kontrolleras.
3 Helt inaktiverad: Nej ptrace är tillåtet under alla omständigheter. Om den här egenskapen har definierats en gång kan du inte ändra den igen vid körning.

Många utvecklare vet inte att applikationer kan inaktivera ptrace sig själva via prctl, förutom för rotanvändaren. Även om säkerhetsrelaterad programvara som OpenSSH-agenten utför dessa operationer, skulle det inte vara rätt att förvänta sig samma beteende från all programvara som körs på systemet.

Nyligen, vissa Linux-distributioner har börjat ställa in standardvärdet för ptrace_scope fil, som beskrivs ovan, till 1. Således, med begränsade ptrace-operationer, tillhandahålls en säkrare arbetsmiljö i hela systemet.

Med hjälp av ett exempel

Registrera exempelansökan nedan med namnet ministrace.c. Sedan kan du kompilera den med följande kommando:

gcc-oministeriumministerium.c

Koda:

#omfatta <sys/ptrace.h>
#omfatta <sys/reg.h>
#omfatta <sys/wait.h>
#omfatta <sys/types.h>
#omfatta <unistd.h>
#omfatta <stdlib.h>
#omfatta <stdio.h>
#omfatta <errno.h>
#omfatta <sträng.h>
intwait_for_syscall(pid_t barn)
{
int status;
medan (1) {
ptrace (PTRACE_SYSCALL, barn, 0, 0);
waitpid (barn, &status, 0);
if (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80)
lämna tillbaka0;
if (WIFEXITED(status))
lämna tillbaka1;
}
}

intgör_barn(int argc, röding **argv)
{
röding *args [argc+1];
memcpy (args, argv, argc * sizeof(röding*));
args[argc] = NULL;
ptrace (PTRACE_TRACEME);
döda(getpid(), SIGSTOPP);
lämna tillbaka execvp (args[0], args);
}

intgör_spåra(pid_t barn)
{
int status, syscall, återställning;
waitpid (barn, &status, 0);
ptrace (PTRACE_SETOPTIONS, barn, 0, PTRACE_O_TRACESYSGOOD);
medan(1) {
om (wait_for_syscall (barn) != 0) ha sönder;

syscall = ptrace (PTRACE_PEEKUSER, barn, storlek på(lång)*ORIG_RAX);
fprintf (stderr, "syscall(%d) = ", syscall);

om (wait_for_syscall (barn) != 0) ha sönder;

retval = ptrace (PTRACE_PEEKUSER, barn, storlek på(lång)*RAX);
fprintf (stderr, "%d
", retval);
}
lämna tillbaka0;
}
inthuvud(int argc, röding **argv)
{
om (argc < 2) {
fprintf (stderr, "Användning: %s prog args
", argv[0]);
utgång(1);
}
pid_t barn = gaffel();
if (barn == 0) {
lämna tillbaka do_child (argc-1, argv+1);
} annan {
lämna tillbaka do_trace (barn);
}
}

Efter att ha kompilerat programmet kan du köra vilket kommando som helst med ministerium och undersök resultatet:

Du kan använda strace för många ändamål

strace kan hjälpa till att hitta buggar i program som använder systemresurser i onödan. På samma sätt kan den egenskap som ett program uppvisar när man använder operativsystemresurser också avslöjas med strace.

Eftersom strace direkt lyssnar på systemanrop kan den avslöja körtidsdynamik oavsett om koden för programmet som körs är öppen/stängd. Det är möjligt att få en uppfattning om varför programmen ger ett felmeddelande när de börjar använda strace.

På samma sätt hjälper strace dig att förstå varför ett program avslutas oväntat. Därför är det mycket viktigt att vara bekant med strace i Linux-kärnutveckling och systemadministration.

Skapa ditt alldeles egna operativsystem med Linux från grunden [Linux]

Läs Nästa

Dela med sigTweetDela med sigE-post

Relaterade ämnen

  • Linux
  • Linux-kommandon
  • Linux kärna

Om författaren

Fatih Küçükkarakurt (6 artiklar publicerade)

En ingenjör och mjukvaruutvecklare som är ett fan av matematik och teknik. Han har alltid gillat datorer, matematik och fysik. Han har utvecklat spelmotorprojekt samt maskininlärning, artificiella neurala nätverk och linjära algebrabibliotek. Fortsätter dessutom att arbeta med maskininlärning och linjära matriser.

Mer från Fatih Küçükkarakurt

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e-böcker och exklusiva erbjudanden!

Klicka här för att prenumerera