Keď programy bežiace na Linuxe chcú použiť prostriedky spravované operačným systémom (čítanie súborov, vytváranie procesov atď.), vykonajú systémové volania operačného systému. Systémové volania fungujú na úrovni jadra a vykonávajú potrebné operácie, pričom kontrolu prenechávajú volajúcemu programu. Nástroj sledovania poskytuje možnosť sledovať tieto systémové volania v systéme Linux.

Typické použitie príkazu strace

Ak chcete monitorovať systémové volania aplikácie, stačí vyvolať príkaz s strace v nasledujúcom formáte:

strace ls /tmp

Často však existujú procesy, ktoré začínajú oveľa skôr a pokračujú v práci na pozadí. Kvôli akýmkoľvek problémom možno budete chcieť zhromaždiť ďalšie informácie súvisiace s takýmito procesmi. Môžete priložiť strace akejkoľvek spustenej aplikácii zadaním ID procesu procesu -p parameter:

strace -p 2759

Výkon:

Sledujte vlákna a rozvetvenia aplikácie

Pomocou strace môžete skontrolovať všetky vlákna a ďalšie podriadené procesy, ktoré sú rozvetvením aplikácie pomocou -f vlajka.

instagram viewer
strace -f -p 2759

Výkon:

Skontrolujte určité systémové volania pomocou strace

Predvolený výstup sledovania môže byť občas dosť preplnený. Ak chcete sledovať iba určité systémové volania, môžete tak urobiť pomocou -e parameter:

strace -f -e trace=otvoriť, zapísať, zavrieť, pripojiť,vybrať -p 19770

Ak chcete sledovať iba systémové volania súvisiace so súbormi, použite -e stopa=súbor:

strace -e stopa=súbor -p 19770

Ak chcete filtrovať iba systémové volania súvisiace so sieťou, zadajte -e sledovanie=sieť v príkaze:

strace -e trace=sieť -p 19770

Získajte informácie o čase v priebehu niekoľkých sekúnd

Pri výstupe systémových volaní môžete použiť -t parameter na získanie časových informácií s presnosťou v sekundách. Väčšinu času nebude presnosť pre vaše potreby dostatočná. V takýchto situáciách môžete použiť -tt parameter na získanie časových informácií s presnosťou na mikrosekundy:

strace -tt ls /tmp

Zbierajte štatistiky o systémových hovoroch

S -c parameter, môžete zbierať štatistiky o systémových volaniach tak dlho, ako chcete:

strace -f -c -p 19770

Uložiť protokoly do súboru

Ak spúšťate strace dlhší čas a chcete neskôr podrobnejšie preskúmať výsledné protokoly, budete musieť protokoly uložiť. S -o parametrom môžete zadať súbor, do ktorého má strace uložiť protokoly:

strace -f -o /tmp/strace.log -e sledovanie=súbor ls /tmp

Proces blokovania ptrace

Pomocou systémového volania prctl môže každá aplikácia pod Linuxom zabrániť tomu, aby bola ovládaná používateľmi bez oprávnenia root pomocou ptrace. Ak aplikácia vymaže PR_SET_DUMPABLE flag pre seba cez prctl, iní používatelia ako root nebudú môcť ovládať túto aplikáciu pomocou ptrace, aj keď majú právo signalizovať aplikácii.

Jedno z najtypickejších použití tejto funkcie možno vidieť v softvéri autentifikačného agenta OpenSSH. Teda ovládanie aplikácie inou aplikáciou s ptrace je zabránené pri overovaní používateľa.

ptrace a bezpečnosť

Vďaka funkcii ptrace nastavenej v tradičnom modeli procesu Linux má každý softvér, ktorý na svojom systéme spustíte s vaším používateľom, oprávnenie vložiť doň škodlivý kód. Od najjednoduchšieho nástroja xterm až po pokročilé aplikácie webového prehliadača, môže takýto malvér prevziať kontrolu nad všetkými vašimi ostatnými spustenými aplikáciami – vďaka systémovému volaniu ptrace – a skopírovať dôležité informácie bez toho, aby ste si to všimli.

V reakcii na túto situáciu, ktorú si mnohí používatelia neuvedomujú, bol vyvinutý ochranný mechanizmus s bezpečnostným modulom tzv Yama v jadre Linuxu.

Odpoveď na systémové volanie ptrace môžete ovládať pomocou /proc/sys/kernel/yama/ptrace_scope súbor. Štandardne tento súbor zapisuje hodnotu 0.

Nasledujúce hodnoty sú prijateľné:

Hodnota Význam
0 Konvenčné správanie: Všetky aplikácie, ktoré majú právo ptrace možno skontrolovať.
1 Obmedzená ptrace: Iba priamy rodič aplikácie alebo ladiace aplikácie povolené aplikáciou s príponou PR_SET_PTRACER možnosť mať kontrolu. Teda použitia gdb názov_programu a sledovací názov_programu bude naďalej fungovať, ale potom už nebudete môcť pripojiť spustenú aplikáciu.
2 Ptrace správcovi systému: Iba aplikácie s definovaným CAP_SYS_PTRACE vlastnosti alebo podriadené procesy, ktoré definujú PTRACE_TRACEME možnosť s prctl možno ovládať.
3 Úplne zakázané: Nie ptrace je povolené za každých okolností. Ak je táto vlastnosť definovaná raz, nemôžete ju počas spustenia znova zmeniť.

Mnoho vývojárov nevie, že aplikácie môžu samy zakázať ptrace cez prctl, s výnimkou používateľa root. Hoci softvér súvisiaci so zabezpečením, ako je napríklad agent OpenSSH, vykonáva tieto operácie, nebolo by správne očakávať rovnaké správanie od všetkého softvéru spusteného v systéme.

nedávno niektoré distribúcie Linuxu začali nastavovať predvolenú hodnotu ptrace_scope súbor, popísaný vyššie, na 1. S obmedzením operácií ptrace je teda v celom systéme zabezpečené bezpečnejšie pracovné prostredie.

Použitie vzorovej čiary

Zaregistrujte vzorovú aplikáciu nižšie s názvom ministrace.c. Potom ho môžete skompilovať pomocou nasledujúceho príkazu:

gcc-ominištrovanieminištrovanie.c

kód:

#include <sys/ptrace.h>
#include <sys/reg.h>
#include <sys/wait.h>
#include <sys/typy.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <reťazec.h>
intwait_for_syscall(pid_t dieťa)
{
int postavenie;
zatiaľ čo (1) {
ptrace (PTRACE_SYSCALL, dieťa, 0, 0);
waitpid (dieťa, &stav, 0);
if (WIFSTOPPED(stav) && WSTOPSIG(stav) & 0x80)
vrátiť0;
if (WIFEXITED(stav))
vrátiť1;
}
}

inturobiť_dieťa(int argc, char **argv)
{
char *args [argc+1];
memcpy (args, argv, argc * sizeof(char*));
args[argc] = NULOVÝ;
ptrace (PTRACE_TRACEME);
zabiť(getpid(), SIGSTOP);
vrátiť execvp (args[0], args);
}

intdo_trace(pid_t dieťa)
{
int status, syscall, retval;
waitpid (dieťa, &stav, 0);
ptrace (PTRACE_SETOPTIONS, dieťa, 0, PTRACE_O_TRACESYSGOOD);
zatiaľ čo(1) {
ak (wait_for_syscall (dieťa) != 0) prestávka;

syscall = ptrace (PTRACE_PEEKUSER, dieťa, sizeof(dlhý)*ORIG_RAX);
fprintf (stderr, "syscall(%d) = ", systémové volanie);

ak (wait_for_syscall (dieťa) != 0) prestávka;

retval = ptrace (PTRACE_PEEKUSER, dieťa, sizeof(dlhý)*RAX);
fprintf (stderr, "%d
", retval);
}
vrátiť0;
}
intHlavná(int argc, char **argv)
{
ak (argc < 2) {
fprintf (stderr, "Použitie: %s prog args
", argv[0]);
VÝCHOD(1);
}
pid_t dieťa = fork();
if (dieťa == 0) {
vrátiť do_child (argc-1, argv+1);
} inak {
vrátiť do_trace (dieťa);
}
}

Po skompilovaní aplikácie môžete spustiť ľubovoľný príkaz pomocou miništrovanie a skontrolujte výstup:

Strace môžete použiť na mnohé účely

strace môže pomôcť nájsť chyby v programoch, ktoré zbytočne využívajú systémové prostriedky. Podobne charakteristiku, ktorú program vykazuje pri používaní prostriedkov operačného systému, možno odhaliť aj pomocou strace.

Keďže strace priamo počúva systémové volania, môže odhaliť dynamiku behu bez ohľadu na to, či je kód spusteného programu otvorený/zatvorený. Je možné získať predstavu o tom, prečo programy pri spustení používania strace vyhodia chybu.

Podobne vám strace pomáha pochopiť, prečo sa program neočakávane ukončí. Preto je znalosť strace veľmi dôležitá pri vývoji jadra Linuxu a správe systému.

Vytvorte si svoj vlastný operačný systém s Linuxom od nuly [Linux]

Prečítajte si ďalej

zdieľamTweetujtezdieľamEmail

Súvisiace témy

  • Linux
  • Linuxové príkazy
  • Linuxové jadro

O autorovi

Fatih Küçükkarakurt (6 publikovaných článkov)

Inžinier a vývojár softvéru, ktorý je fanúšikom matematiky a technológií. Vždy mal rád počítače, matematiku a fyziku. Vyvinul projekty herných motorov, ako aj strojové učenie, umelé neurónové siete a knižnice lineárnej algebry. Okrem toho pokračuje v práci na strojovom učení a lineárnych matriciach.

Viac od Fatiha Küçükkarakurta

prihlásiť sa ku odberu noviniek

Pripojte sa k nášmu bulletinu a získajte technické tipy, recenzie, bezplatné e-knihy a exkluzívne ponuky!

Kliknutím sem sa prihlásite na odber