Když programy běžící na Linuxu chtějí využívat prostředky spravované operačním systémem (čtení souborů, vytváření procesů atd.), provádějí systémová volání operačního systému. Systémová volání fungují na úrovni jádra a provádějí nezbytné operace, přičemž řízení ponechávají zpět na volajícím programu. Nástroj strace poskytuje možnost sledovat tato systémová volání v Linuxu.

Typické použití příkazu strace

Chcete-li monitorovat systémová volání aplikace, stačí vyvolat příkaz s strace v následujícím formátu:

strace ls /tmp

Často však existují procesy, které začínají mnohem dříve a pokračují v práci na pozadí. Kvůli jakýmkoli problémům možná budete chtít shromáždit další informace související s takovými procesy. Můžete připojit strace jakékoli spuštěné aplikaci zadáním ID procesu procesu -p parametr:

strace -p 2759

Výstup:

Sledujte vlákna a větve aplikace

Pomocí strace můžete zkontrolovat všechna vlákna a další podřízené procesy, které jsou rozvětvením aplikace pomocí -F vlajka.

strace -f -p 2759

Výstup:

instagram viewer

Zkontrolujte některá systémová volání pomocí strace

Výchozí výstup sledování může být občas docela přeplněný. Pokud chcete sledovat pouze určitá systémová volání, můžete tak učinit pomocí -E parametr:

strace -f -e trace=otevřít, napsat, zavřít, připojit,vybrat -p 19770

Chcete-li sledovat pouze systémová volání související s operacemi se soubory, použijte -e trasování=soubor:

strace -e trace=soubor -p 19770

Chcete-li filtrovat pouze systémová volání související se sítí, zadejte -e trace=síť v příkazu:

strace -e trace=síť -p 19770

Získejte informace o čase v sekundách

Při výstupu systémových volání můžete použít -t parametr pro získání časových informací s přesností v sekundách. Většinu času nebude přesnost pro vaše potřeby dostatečná. V takových situacích můžete použít -tt parametr pro získání časových informací s mikrosekundovou přesností:

strace -tt ls /tmp

Sbírejte statistiky o systémových voláních

s -C můžete shromažďovat statistiky o systémových voláních tak dlouho, jak chcete:

strace -f -c -p 19770

Uložit protokoly do souboru

Pokud spouštíte strace po dlouhou dobu a chcete výsledné protokoly prozkoumat podrobněji později, budete muset protokoly uložit. s parametr můžete zadat soubor, do kterého má strace ukládat protokoly:

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

Proces blokování ptrace

Pomocí systémového volání prctl může jakákoli aplikace pod Linuxem zabránit tomu, aby byla ovládána uživateli bez oprávnění root pomocí ptrace. Pokud aplikace vymaže PR_SET_DUMPABLE flag pro sebe přes prctl, jiní uživatelé než root nebudou moci ovládat tuto aplikaci pomocí ptrace, i když mají právo signalizovat aplikaci.

Jedno z nejtypičtějších použití této funkce je vidět v softwaru autentizačního agenta OpenSSH. Tedy ovládání aplikace jinou aplikací s ptrace je zabráněno při ověřování uživatele.

ptrace a zabezpečení

Díky funkci ptrace nastavené v tradičním linuxovém procesním modelu má každý software, který na svém systému spustíte s vaším uživatelem, oprávnění vložit do něj škodlivý kód. Od nejjednoduššího nástroje xterm až po pokročilé aplikace webového prohlížeče, může takový malware převzít kontrolu nad všemi ostatními spuštěnými aplikacemi – díky systémovému volání ptrace – a kopírovat důležité informace, aniž byste si toho všimli.

V reakci na tuto situaci, kterou si mnoho uživatelů neuvědomuje, byl vyvinut ochranný mechanismus s tzv. bezpečnostním modulem Yama v linuxovém jádře.

Odezvu na systémové volání ptrace můžete ovládat pomocí /proc/sys/kernel/yama/ptrace_scope soubor. Ve výchozím nastavení tento soubor zapisuje hodnotu 0.

Přijatelné jsou následující hodnoty:

Hodnota Význam
0 Konvenční chování: Všechny aplikace, které mají právo ptrace lze zkontrolovat.
1 Omezený ptrace: Pouze přímý rodič aplikace nebo ladění aplikací povolených aplikací s příponou PR_SET_PTRACER možnost mít kontrolu. Tedy použití gdb název_programu a strace název_programu bude nadále fungovat, ale poté již nebudete moci připojit spuštěnou aplikaci.
2 Ptrace správci systému: Pouze aplikace s definovaným CAP_SYS_PTRACE vlastnost nebo podřízené procesy, které definují PTRACE_TRACEME možnost s prctl lze ovládat.
3 Zcela zakázáno: Ne ptrace je povoleno za všech okolností. Pokud je tato vlastnost definována jednou, nelze ji za běhu znovu změnit.

Mnoho vývojářů neví, že aplikace mohou samy zakázat ptrace přes prctl, kromě uživatele root. Přestože software související se zabezpečením, jako je agent OpenSSH, provádí tyto operace, nebylo by správné očekávat stejné chování od veškerého softwaru spuštěného v systému.

Nedávno, některé linuxové distribuce začali nastavovat výchozí hodnotu ptrace_scope soubor, popsaný výše, do 1. S omezenými operacemi ptrace je tedy v celém systému zajištěno bezpečnější pracovní prostředí.

Použití příkladu čáry

Zaregistrujte níže ukázkovou aplikaci s názvem ministrace.c. Poté jej můžete zkompilovat pomocí následujícího příkazu:

gccministraceministrace.C

Kód:

#zahrnout <sys/ptrace.h>
#zahrnout <sys/reg.h>
#zahrnout <sys/wait.h>
#zahrnout <sys/types.h>
#zahrnout <unistd.h>
#zahrnout <stdlib.h>
#zahrnout <stdio.h>
#zahrnout <errno.h>
#zahrnout <řetězec.h>
intwait_for_syscall(pid_t dítě)
{
int postavení;
zatímco (1) {
ptrace (PTRACE_SYSCALL, potomek, 0, 0);
waitpid (dítě, &stav, 0);
if (WIFSTOPPED(stav) && WSTOPSIG (stav) & 0x80)
vrátit se0;
if (WIFEXITED(stav))
vrátit se1;
}
}

intudělat_dítě(int argc, char **argv)
{
char *args [argc+1];
memcpy (args, argv, argc * sizeof(char*));
args[argc] = NULA;
ptrace (PTRACE_TRACEME);
zabít(getpid(), SIGSTOP);
vrátit se execvp (args[0], args);
}

intdo_trace(pid_t dítě)
{
int stav, syscall, retval;
waitpid (dítě, &stav, 0);
ptrace (PTRACE_SETOPTIONS, potomek, 0, PTRACE_O_TRACESYSGOOD);
zatímco(1) {
-li (wait_for_syscall (dítě) != 0) přestávka;

syscall = ptrace (PTRACE_PEEKUSER, potomek, sizeof(dlouho)*ORIG_RAX);
fprintf (stderr, "syscall(%d) = ", systémové volání);

-li (wait_for_syscall (dítě) != 0) přestávka;

retval = ptrace (PTRACE_PEEKUSER, potomek, sizeof(dlouho)*RAX);
fprintf (stderr, "%d
", retval);
}
vrátit se0;
}
inthlavní(int argc, char **argv)
{
pokud (argc < 2) {
fprintf (stderr, "Použití: %s prog args
", argv[0]);
výstup(1);
}
pid_t child = fork();
if (dítě == 0) {
vrátit se do_child (argc-1, argv+1);
} jiný {
vrátit se do_trace (dítě);
}
}

Po zkompilování aplikace můžete spustit libovolný příkaz pomocí ministrace a prozkoumejte výstup:

Strace můžete použít pro mnoho účelů

strace může pomoci najít chyby v programech, které zbytečně využívají systémové prostředky. Podobně vlastnost, kterou program vykazuje při používání prostředků operačního systému, lze také odhalit pomocí strace.

Protože strace přímo naslouchá systémovým voláním, může odhalit dynamiku běhu bez ohledu na to, zda je kód spouštěného programu otevřený/zavřený. Je možné získat představu o tom, proč programy při spuštění strace vyhodí chybu.

Podobně vám strace pomáhá pochopit, proč se program neočekávaně ukončí. Proto je znalost strace velmi důležitá při vývoji linuxového jádra a správě systému.

Vytvořte si svůj vlastní operační systém s Linuxem od nuly [Linux]

Přečtěte si další

PodíltweetPodílE-mailem

Související témata

  • Linux
  • Linuxové příkazy
  • Linuxové jádro

O autorovi

Fatih Küçükkarakurt (Zveřejněno 6 článků)

Inženýr a vývojář softwaru, který je fanouškem matematiky a technologií. Vždy měl rád počítače, matematiku a fyziku. Vyvinul projekty herních enginů a také strojové učení, umělé neuronové sítě a knihovny lineární algebry. Navíc pokračuje v práci na strojovém učení a lineárních maticích.

Více od Fatiha Küçükkarakurta

Přihlaste se k odběru našeho newsletteru

Připojte se k našemu zpravodaji a získejte technické tipy, recenze, bezplatné e-knihy a exkluzivní nabídky!

Chcete-li se přihlásit k odběru, klikněte sem