Ko programi, ki se izvajajo v Linuxu, želijo uporabiti vire, ki jih upravlja operacijski sistem (branje datotek, ustvarjanje procesov itd.), vzpostavijo sistemske klice v OS. Sistemski klici delujejo na ravni jedra in izvajajo potrebne operacije, pri čemer nadzor prepustijo klicnemu programu. Orodje strace omogoča sledenje tem sistemskim klicem v Linuxu.
Tipična uporaba ukaza strace
Če želite spremljati sistemske klice za aplikacijo, samo pokličite ukaz s strace v naslednji obliki:
strace ls /tmp
Vendar pa pogosto obstajajo procesi, ki se začnejo veliko prej in še naprej delujejo v ozadju. Zaradi kakršnih koli težav boste morda želeli zbrati dodatne informacije, povezane s takšnimi procesi. Lahko priložite strace kateri koli delujoči aplikaciji tako, da daste ID procesa v -str parameter:
strace -p 2759
Izhod:
Spremljajte niti in razcepe aplikacije
S strace lahko preverite vse niti in druge podrejene procese, ki so razcep aplikacije, z uporabo -f zastavo.
strace -f -p 2759
Izhod:
Preverite določene sistemske klice s strace
Privzeti izhod strace je lahko včasih precej natrpan. Če želite slediti samo določenim sistemskim klicem, lahko to storite z -e parameter:
strace -f -e sled=odpri, piši, zapri, poveži,izberite -str 19770
Če želite slediti samo sistemskim klicem, povezanim z datotečnimi operacijami, uporabite -e sled=datoteka:
strace -e sled=datoteka -p 19770
Če želite filtrirati samo sistemske klice, povezane z omrežjem, podajte -e sled=omrežje v ukazu:
strace -e sled=omrežje -p 19770
Pridobite informacije o času v sekundah
Pri izpisovanju sistemskih klicev lahko uporabite -t parameter za pridobivanje informacij o času z natančnostjo v sekundah. Večino časa natančnost ne bo dovolj za vaše potrebe. V takih situacijah lahko uporabite -tt parameter za pridobivanje informacij o času z mikrosekundno natančnostjo:
strace -tt ls /tmp
Zbirajte statistiko o sistemskih klicih
Z -c parameter, lahko zbirate statistiko o sistemskih klicih tako dolgo, kot želite:
strace -f -c -p 19770
Shranite dnevnike v datoteko
Če strace izvajate dlje časa in želite pozneje podrobneje pregledati nastale dnevnike, boste morali dnevnike shraniti. Z -o parameter lahko določite datoteko, v katero naj strace shrani dnevnike:
strace -f -o /tmp/strace.log -e sled=datoteka ls /tmp
Postopek blokiranja ptrace
Z uporabo sistemskega klica prctl lahko katera koli aplikacija pod Linuxom prepreči, da bi jo nadzirali nekorenski uporabniki z uporabo ptrace. Če aplikacija počisti PR_SET_DUMPABLE zastavico zase prek prctl, uporabniki, ki niso root, ne bodo mogli nadzorovati te aplikacije s ptrace, tudi če imajo pravico signalizirati aplikacijo.
Ena najpogostejših uporab te funkcije je vidna v programski opremi za agent za preverjanje pristnosti OpenSSH. Tako nadzor aplikacije s strani druge aplikacije z ptrace je onemogočen pri preverjanju pristnosti uporabnika.
ptrace in varnost
Zaradi zmožnosti ptrace, ki je nastavljena v tradicionalnem modelu procesa Linux, ima vsaka programska oprema, ki jo izvajate v vašem sistemu z vašim uporabnikom, pooblastilo za vstavljanje zlonamerne kode vanj. Od najpreprostejšega orodja xterm do napredne aplikacije spletnega brskalnika, lahko taka zlonamerna programska oprema prevzame nadzor nad vsemi vašimi drugimi zagnanimi aplikacijami – zahvaljujoč sistemskemu klicu ptrace – in kopira pomembne informacije, ne da bi opazili.
V odgovor na to situacijo, ki se je mnogi uporabniki ne zavedajo, je bil razvit zaščitni mehanizem z imenovanim varnostnim modulom Yama v jedru Linuxa.
Odziv na sistemski klic ptrace lahko nadzorujete prek /proc/sys/kernel/yama/ptrace_scope mapa. Ta datoteka privzeto zapiše vrednost 0.
Sprejemljive so naslednje vrednosti:
vrednost | Pomen |
0 | Konvencionalno vedenje: Vse aplikacije, ki imajo pravico do ptrace je mogoče preveriti. |
1 | Omejena sled: Samo neposredni nadrejeni program ali aplikacije za odpravljanje napak, ki jih dovoljuje aplikacija z PR_SET_PTRACER možnost imajo nadzor. Tako so uporabe gdb ime_programa in strace ime_programa bo še naprej deloval, vendar pozneje ne boste mogli priložiti delujoče aplikacije. |
2 | Pojdite do skrbnika sistema: Samo aplikacije z definiranim CAP_SYS_PTRACE lastnost ali podrejeni procesi, ki definirajo PTRACE_TRACEME možnost z prctl je mogoče nadzorovati. |
3 | Popolnoma onemogočen: ne ptrace je dovoljeno v vseh okoliščinah. Če je ta lastnost enkrat definirana, je med izvajanjem ne morete znova spremeniti. |
Mnogi razvijalci ne vedo, da lahko aplikacije onemogočijo ptrace prek prctl, razen za uporabnika root. Čeprav programska oprema, povezana z varnostjo, kot je agent OpenSSH, izvaja te operacije, ne bi bilo prav pričakovati enakega vedenja od vse programske opreme, ki se izvaja v sistemu.
pred kratkim, nekatere distribucije Linuxa začeli nastavljati privzeto vrednost ptrace_scope datoteko, opisano zgoraj, do 1. Tako je z omejenimi operacijami ptrace zagotovljeno varnejše delovno okolje v celotnem sistemu.
Uporaba primera strace
Registrirajte spodnji vzorec prijave z imenom ministrace.c. Nato ga lahko prevedete z naslednjim ukazom:
gcc-oministriceministrice.c
Koda:
#vključi <sys/ptrace.h>
#vključi <sys/reg.h>
#vključi <sys/čakajte.h>
#vključi <sys/vrste.h>
#vključi <unistd.h>
#vključi <stdlib.h>
#vključi <stdio.h>
#vključi <errno.h>
#vključi <niz.h>
intpočakaj_za_syscall(pid_t otrok)
{
int stanje;
medtem (1) {
ptrace (PTRACE_SYSCALL, otrok, 0, 0);
čakajoči (otrok, &status, 0);
če (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80)
vrnitev0;
če (WIFEXITED(status))
vrnitev1;
}
}intdo_child(int argc, char **argv)
{
char *args [argc+1];
memcpy (args, argv, argc * sizeof(char*));
args[argc] = NIČ;
ptrace (PTRACE_TRACEME);
ubiti(getpid(), SIGSTOP);
vrnitev execvp (args[0], argumenti);
}intdo_sled(pid_t otrok)
{
int status, syscall, retval;
čakajoči (otrok, &status, 0);
ptrace (PTRACE_SETOPTIONS, otrok, 0, PTRACE_O_TRACESYSGOOD);
medtem(1) {
če (čakajte_za_syscall (otrok) != 0) zlomiti;syscall = ptrace (PTRACE_PEEKUSER, otrok, sizeof(dolga)*ORIG_RAX);
fprintf (stderr, "sistemski klic (%d) = ", sistemski klic);če (čakajte_za_syscall (otrok) != 0) zlomiti;
retval = ptrace (PTRACE_PEEKUSER, otrok, sizeof(dolga)*RAX);
fprintf (stderr, "%d
", retval);
}
vrnitev0;
}
intglavni(int argc, char **argv)
{
če (argc < 2) {
fprintf (stderr, "Uporaba: %s prog args
", argv[0]);
izhod(1);
}
pid_t otrok = vilice ();
če (otrok == 0) {
vrnitev do_child (argc-1, argv+1);
} drugo {
vrnitev do_sled (otrok);
}
}
Po prevajanju aplikacije lahko zaženete kateri koli ukaz z ministrice in preuči izhod:
strace lahko uporabite za številne namene
strace lahko pomaga najti napake v programih, ki po nepotrebnem uporabljajo sistemska sredstva. Podobno lahko s strace razkrijemo tudi lastnost, ki jo program izkazuje med uporabo virov operacijskega sistema.
Ker strace neposredno posluša sistemske klice, lahko razkrije dinamiko izvajanja ne glede na to, ali je koda programa, ki se izvaja, odprta/zaprta. Možno je dobiti predstavo o tem, zakaj programi odvrnejo napako, ko začnejo uporabljati strace.
Podobno vam strace pomaga razumeti, zakaj se program nepričakovano konča. Zato je poznavanje strace zelo pomembno pri razvoju jedra Linuxa in administraciji sistema.
Ustvarite svoj lasten operacijski sistem z Linuxom iz nič [Linux]
Preberite Naprej
Povezane teme
- Linux
- Ukazi za Linux
- Jedro Linuxa
O avtorju
Inženir in razvijalec programske opreme, ki je ljubitelj matematike in tehnologije. Od nekdaj je imel rad računalništvo, matematiko in fiziko. Razvil je projekte motorjev za igre, pa tudi strojno učenje, umetne nevronske mreže in knjižnice linearne algebre. Poleg tega še naprej dela na strojnem učenju in linearnih matrikah.
Naročite se na naše novice
Pridružite se našemu glasilu za tehnične nasvete, ocene, brezplačne e-knjige in ekskluzivne ponudbe!
Kliknite tukaj, da se naročite