Kada programi koji rade na Linuxu žele koristiti resurse kojima upravlja operativni sustav (čitanje datoteka, kreiranje procesa itd.), oni upućuju pozive sustava OS-u. Pozivi sustava rade na razini kernela i izvode potrebne operacije, ostavljajući kontrolu natrag pozivajućem programu. Alat strace pruža mogućnost praćenja ovih poziva sustava na Linuxu.

Tipična upotreba naredbe strace

Za praćenje sistemskih poziva za aplikaciju, samo pozovite naredbu s strace u sljedećem formatu:

strace ls /tmp

Međutim, često postoje procesi koji počinju mnogo ranije i nastavljaju raditi u pozadini. Zbog bilo kakvih problema, možda ćete htjeti prikupiti dodatne informacije povezane s takvim procesima. Možete priložiti strace bilo kojoj pokrenutoj aplikaciji dajući ID procesa procesa -str parametar:

strace -p 2759

Izlaz:

Pratite niti i račve aplikacije

Uz strace, možete provjeriti sve niti i druge podređene procese koji su vilica aplikacije pomoću -f zastava.

strace -f -p 2759

Izlaz:

Provjerite određene pozive sustava sa strace

instagram viewer

Zadani strace izlaz ponekad može biti prilično natrpan za praćenje. Ako želite pratiti samo određene pozive sustava, to možete učiniti pomoću -e parametar:

strace -f -e trag=otvoriti, napisati, zatvoriti, povezati,Izaberi -str 19770

Za praćenje samo sistemskih poziva koji se odnose na operacije datoteka, koristite -e trag=datoteka:

strace -e trag=datoteka -p 19770

Za filtriranje samo sistemskih poziva povezanih s mrežom, navedite -e trag=mreža u naredbi:

strace -e trag=mreža -p 19770

Dobijte informacije o vremenu u sekundama

Kada šaljete pozive sustava, možete koristiti -t parametar za dobivanje informacija o vremenu s preciznošću u sekundama. Većinu vremena preciznost neće biti dovoljna za vaše potrebe. U takvim situacijama možete koristiti -tt parametar za dobivanje informacija o vremenu s mikrosekundnom preciznošću:

strace -tt ls /tmp

Prikupljajte statistiku o pozivima sustava

Uz -c parametar, možete prikupljati statistiku o pozivima sustava koliko god dugo želite:

strace -f -c -p 19770

Spremi zapisnike u datoteku

Ako dugo pokrećete strace i kasnije želite detaljnije ispitati rezultirajuće zapise, morat ćete spremiti zapisnike. Uz -o parametar možete odrediti datoteku u koju strace treba spremiti zapisnike:

strace -f -o /tmp/strace.log -e trag=datoteka ls /tmp

ptrace proces blokiranja

Koristeći sistemski poziv prctl, bilo koja aplikacija pod Linuxom može spriječiti da je kontroliraju nekorijenski korisnici koristeći ptrace. Ako aplikacija izbriše PR_SET_DUMPABLE zastavicu za sebe putem prctl-a, korisnici koji nisu root neće moći kontrolirati ovu aplikaciju pomoću ptracea, čak i ako imaju pravo signalizirati aplikaciju.

Jedna od najtipičnijih upotreba ove značajke vidi se u softveru agenta za provjeru autentičnosti OpenSSH. Dakle, kontrola aplikacije od strane druge aplikacije s ptrace je spriječen prilikom provjere autentičnosti korisnika.

ptrace i sigurnost

Zbog mogućnosti ptrace postavljene u tradicionalnom modelu procesa Linuxa, svaki softver koji pokrenete na svom sustavu sa svojim korisnikom ima ovlaštenje za umetanje zlonamjernog koda u njega. Od najjednostavnijeg alata xterm do napredne aplikacije web preglednika, takav zlonamjerni softver može preuzeti kontrolu nad svim vašim drugim pokrenutim aplikacijama – zahvaljujući pozivu sustava ptrace – i kopirati važne informacije bez da primijetite.

Kao odgovor na ovu situaciju, za koju mnogi korisnici nisu svjesni, razvijen je zaštitni mehanizam sa sigurnosnim modulom pod nazivom Yama u jezgri Linuxa.

Možete kontrolirati odgovor na poziv sustava ptrace putem /proc/sys/kernel/yama/ptrace_scope datoteka. Prema zadanim postavkama, ova datoteka zapisuje vrijednost 0.

Sljedeće vrijednosti su prihvatljive:

Vrijednost Značenje
0 Konvencionalno ponašanje: Sve aplikacije koje imaju pravo na ptrace može se provjeriti.
1 Ograničeni ptrace: Samo izravni roditelj aplikacije ili aplikacije za otklanjanje pogrešaka koje aplikacija dopušta s PR_SET_PTRACER opciju imaju kontrolu. Dakle, upotrebe od gdb naziv_programa i strace naziv_programa nastavit će raditi, ali kasnije nećete moći priložiti pokrenutu aplikaciju.
2 Ptrag do administratora sustava: Samo aplikacije s definiranim CAP_SYS_PTRACE svojstva ili podređeni procesi koji definiraju PTRACE_TRACEME opcija sa prctl može se kontrolirati.
3 Potpuno onemogućen: Ne ptrace dopušteno pod bilo kojim okolnostima. Ako je ovo svojstvo definirano jednom, ne možete ga ponovno promijeniti tijekom izvođenja.

Mnogi programeri ne znaju da aplikacije mogu sami onemogućiti ptrace putem prctl-a, osim za root korisnika. Iako softver vezan za sigurnost kao što je OpenSSH agent izvodi ove operacije, ne bi bilo ispravno očekivati ​​isto ponašanje od svih softvera koji rade na sustavu.

Nedavno, neke Linux distribucije počeli postavljati zadanu vrijednost ptrace_scope datoteku, gore opisanu, za 1. Stoga, s ograničenim operacijama ptrace, osigurava se sigurnije radno okruženje u cijelom sustavu.

Korištenje primjera strace

Registrirajte uzorak prijave ispod s imenom ministrace.c. Zatim ga možete kompajlirati sljedećom naredbom:

gcc-oministraceministrace.c

Kodirati:

#uključiti <sys/ptrace.h>
#uključiti <sys/reg.h>
#uključiti <sys/čekaj.h>
#uključiti <sys/vrste.h>
#uključiti <unistd.h>
#uključiti <stdlib.h>
#uključiti <stdio.h>
#uključiti <errno.h>
#uključiti <niz.h>
intčekaj_za_syscall(pid_t dijete)
{
int status;
dok (1) {
ptrace (PTRACE_SYSCALL, dijete, 0, 0);
čekanje (dijete, &status, 0);
ako (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80)
povratak0;
ako (WIFEXITED(status))
povratak1;
}
}

intdo_dijete(int argc, čar **argv)
{
čar *args [argc+1];
memcpy (args, argv, argc * sizeof(čar*));
args[argc] = NULL;
ptrace (PTRACE_TRACEME);
ubiti(getpid(), SIGSTOP);
povratak execvp (args[0], args);
}

intdo_trace(pid_t dijete)
{
int status, syscall, retval;
čekanje (dijete, &status, 0);
ptrace (PTRACE_SETOPTIONS, dijete, 0, PTRACE_O_TRACESYSGOOD);
dok(1) {
ako (wait_for_syscall (dijete) != 0) pauza;

syscall = ptrace (PTRACE_PEEKUSER, dijete, sizeof(dugo)*ORIG_RAX);
fprintf (stderr, "sistemski poziv (%d) = ", sistemski poziv);

ako (wait_for_syscall (dijete) != 0) pauza;

retval = ptrace (PTRACE_PEEKUSER, dijete, sizeof(dugo)*RAX);
fprintf (stderr, "%d
", retval);
}
povratak0;
}
intglavni(int argc, čar **argv)
{
ako (argc < 2) {
fprintf (stderr, "Upotreba: %s prog args
", argv[0]);
Izlaz(1);
}
pid_t dijete = vilica();
ako (dijete == 0) {
povratak do_dijete (argc-1, argv+1);
} drugo {
povratak do_trace (dijete);
}
}

Nakon sastavljanja aplikacije, možete pokrenuti bilo koju naredbu s ministrace i ispitati izlaz:

Možete koristiti strace za mnoge svrhe

strace može pomoći u pronalaženju grešaka u programima koji nepotrebno koriste resurse sustava. Isto tako, karakteristika koju program pokazuje dok koristi resurse operacijskog sustava također se može otkriti pomoću strace.

Budući da strace izravno sluša pozive sustava, može otkriti dinamiku vremena izvođenja bez obzira na to je li kod programa koji se izvodi otvoren/zatvoren. Moguće je dobiti predodžbu o tome zašto programi izbacuju grešku kada počnu koristiti strace.

Slično, strace vam pomaže razumjeti zašto se program neočekivano prekida. Stoga je poznavanje strace vrlo važno u razvoju jezgre Linuxa i administraciji sustava.

Izradite svoj vlastiti operativni sustav s Linuxom od nule [Linux]

Pročitajte dalje

UdioCvrkutUdioE-mail

Povezane teme

  • Linux
  • Linux naredbe
  • Linux kernel

O autoru

Fatih Küçükkarakurt (Objavljeno 6 članaka)

Inženjer i programer koji je ljubitelj matematike i tehnologije. Oduvijek je volio računala, matematiku i fiziku. Razvio je projekte motora za igre, kao i strojno učenje, umjetne neuronske mreže i biblioteke linearne algebre. Štoviše, nastavlja raditi na strojnom učenju i linearnim matricama.

Više od Fatiha Küçükkarakurta

Pretplatite se na naše obavijesti

Pridružite se našem biltenu za tehničke savjete, recenzije, besplatne e-knjige i ekskluzivne ponude!

Kliknite ovdje za pretplatu