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:
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:
gcc-Óministraceministrace.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ší
Související témata
- Linux
- Linuxové příkazy
- Linuxové jádro
O autorovi
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.
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