Amikor a Linuxon futó programok az operációs rendszer által kezelt erőforrásokat akarják használni (fájlok olvasása, folyamatok létrehozása stb.), rendszerhívásokat indítanak az operációs rendszer felé. A rendszerhívások kernel szinten működnek, és végrehajtják a szükséges műveleteket, visszahagyva az irányítást a hívó programra. A strace eszköz lehetővé teszi ezen rendszerhívások nyomon követését Linuxon.
A strace parancs tipikus használata
Egy alkalmazás rendszerhívásainak figyeléséhez csak hívja meg a parancsot a következővel: strace a következő formátumban:
strace ls /tmp
Azonban gyakran vannak olyan folyamatok, amelyek sokkal korábban indulnak, és a háttérben működnek tovább. Bármilyen probléma miatt érdemes lehet további információkat gyűjteni az ilyen folyamatokhoz kapcsolódóan. Csatolhatod strace bármely futó alkalmazáshoz úgy, hogy megadja a folyamat folyamatazonosítóját a -o paraméter:
strace -p 2759
Kimenet:
Kövesse nyomon egy alkalmazás szálait és elágazásait
A strace segítségével ellenőrizheti az összes szálat és egyéb gyermekfolyamatot, amely az alkalmazás elágazása a
-f zászló.strace -f -p 2759
Kimenet:
Ellenőrizze bizonyos rendszerhívásokat a strace segítségével
Az alapértelmezett strace kimenet időnként meglehetősen zsúfolt lehet. Ha csak bizonyos rendszerhívásokat szeretne nyomon követni, ezt megteheti a -e paraméter:
strace -f -e trace=megnyitás, írás, bezárás, csatlakozás,válassza ki -o 19770
Ha csak a fájlműveletekkel kapcsolatos rendszerhívásokat szeretné nyomon követni, használja a -e nyom=fájl:
strace -e trace=file -p 19770
Csak a hálózattal kapcsolatos rendszerhívások szűréséhez adja meg -e trace=hálózat a parancsban:
strace -e trace=network -p 19770
Időinformációkat kaphat másodpercek alatt
A rendszerhívások kimenetekor használhatja a -t paraméter, hogy másodpercben pontos időinformációt kapjon. A pontosság legtöbbször nem lesz elég az Ön igényeinek. Ilyen helyzetekben használhatja a -tt paraméter az időinformációk mikromásodperces pontosságú lekéréséhez:
strace -tt ls /tmp
Statisztikák gyűjtése a rendszerhívásokról
A... val -c paraméterrel gyűjthet statisztikákat a rendszerhívásokról, ameddig csak akar:
strace -f -c -p 19770
Naplók mentése fájlba
Ha sokáig futtatja a strace-t, és később részletesebben szeretné megvizsgálni a kapott naplókat, el kell mentenie a naplókat. A... val -o paraméterrel megadhatja azt a fájlt, amelybe a strace mentse a naplókat:
strace -f -o /tmp/strace.log -e trace=file ls /tmp
ptrace blokkolási folyamat
A prctl rendszerhívás használatával bármely Linux alatti alkalmazás megakadályozhatja, hogy a nem root felhasználók a ptrace használatával vezéreljék magukat. Ha az alkalmazás törli a PR_SET_DUMPABLE jelölje meg magának a prctl-n keresztül, a root-on kívüli felhasználók nem fogják tudni vezérelni ezt az alkalmazást a ptrace segítségével, még akkor sem, ha jogosultak jelezni az alkalmazást.
Ennek a szolgáltatásnak az egyik legjellemzőbb felhasználási módja az OpenSSH hitelesítési ügynök szoftverében található. Így az alkalmazás ellenőrzése egy másik alkalmazás által ptrace a felhasználó hitelesítéskor le van tiltva.
ptrace és Biztonság
A hagyományos Linux folyamatmodellben beállított ptrace szolgáltatásnak köszönhetően a rendszerén a felhasználóval együtt futtatott szoftverek jogosultak rosszindulatú kódot beszúrni abba. A legegyszerűbb xterm eszköztől a fejlett webböngésző alkalmazások, az ilyen kártevők átvehetik az irányítást az összes többi futó alkalmazás felett – a ptrace rendszerhívásnak köszönhetően –, és anélkül másolhatják át a fontos információkat, hogy Ön észrevenné.
Erre a helyzetre válaszul, amelyről sok felhasználó nem tud, egy védelmi mechanizmust fejlesztettek ki az úgynevezett biztonsági modullal Yama a Linux kernelben.
A ptrace rendszerhívásra adott választ a következőn keresztül szabályozhatja /proc/sys/kernel/yama/ptrace_scope fájlt. Alapértelmezés szerint ez a fájl 0 értéket ír.
A következő értékek elfogadhatók:
Érték | Jelentése |
0 | Hagyományos viselkedés: Minden olyan alkalmazás, amely jogosult ptrace ellenőrizhető. |
1 | Korlátozott ptrace: Csak az alkalmazás vagy a hibakereső alkalmazások közvetlen szülője, amelyet az alkalmazás engedélyez a következővel: PR_SET_PTRACER opció rendelkezik a vezérléssel. Így a felhasználások gdb program_neve és strace program_neve tovább fog működni, de utána nem tud majd futó alkalmazást csatolni. |
2 | Ptrace a rendszergazdához: Csak definiált alkalmazások CAP_SYS_PTRACE tulajdonság vagy gyermekfolyamatok, amelyek meghatározzák a PTRACE_TRACEME opcióval prctl lehet irányítani. |
3 | Teljesen letiltva: Nem ptrace minden körülmények között megengedett. Ha ez a tulajdonság egyszer meg van adva, akkor futás közben nem módosíthatja újra. |
Sok fejlesztő nem tudja, hogy az alkalmazások saját maguk is letilthatják a ptrace-t a prctl-n keresztül, kivéve a root felhasználót. Bár a biztonsággal kapcsolatos szoftverek, például az OpenSSH-ügynök végrehajtják ezeket a műveleteket, nem lenne helyes elvárni, hogy a rendszeren futó összes szoftvertől ugyanez a viselkedés.
Mostanában, néhány Linux disztribúció elkezdték beállítani az alapértelmezett értékét ptrace_scope a fent leírt fájlhoz 1. Így a nyomkövetési műveletek korlátozásával biztonságosabb munkakörnyezet biztosított az egész rendszerben.
Példasor használata
Regisztrálja az alábbi mintát a névvel ministrace.c. Ezután a következő paranccsal fordíthatja le:
gcc-ominisztériumminisztérium.c
Kód:
#beleértve <sys/ptrace.h>
#beleértve <sys/reg.h>
#beleértve <sys/wait.h>
#beleértve <sys/types.h>
#beleértve <unistd.h>
#beleértve <stdlib.h>
#beleértve <stdio.h>
#beleértve <errno.h>
#beleértve <húr.h>
intsyscall_várása(pid_t gyerek)
{
int állapot;
míg (1) {
ptrace (PTRACE_SYSCALL, gyermek, 0, 0);
várj (gyerek, &állapot, 0);
ha (WIFSTOPPED(állapot) && WSTOPSIG(állapot) & 0x80)
Visszatérés0;
ha (WIFEXITED(állapot))
Visszatérés1;
}
}intdo_child(int argc, char **argv)
{
char *args [argc+1];
memcpy (args, argv, argc * sizeof(char*));
args[argc] = NULLA;
ptrace (PTRACE_TRACEME);
megöl(getpid(), SIGSTOP);
Visszatérés execvp (args[0], args);
}intdo_trace(pid_t gyerek)
{
int állapot, syscall, retval;
várj (gyerek, &állapot, 0);
ptrace (PTRACE_SETOPTIONS, gyermek, 0, PTRACE_O_TRACESYSGOOD);
míg(1) {
ha (wait_for_syscall (gyermek) != 0) szünet;syscall = ptrace (PTRACE_PEEKUSER, gyermek, sizeof(hosszú)*ORIG_RAX);
fprintf (stderr, "syscall(%d) = ", syscall);ha (wait_for_syscall (gyermek) != 0) szünet;
retval = ptrace (PTRACE_PEEKUSER, gyermek, sizeof(hosszú)*RAX);
fprintf (stderr, "%d
", retval);
}
Visszatérés0;
}
intfő-(int argc, char **argv)
{
if (argc < 2) {
fprintf (stderr, "Használat: %s prog args
", argv[0]);
kijárat(1);
}
pid_t gyermek = villa();
if (gyermek == 0) {
Visszatérés do_child (argc-1, argv+1);
} más {
Visszatérés do_trace (gyermek);
}
}
Az alkalmazás lefordítása után bármilyen parancsot futtathat minisztérium és vizsgálja meg a kimenetet:
A strace-t számos célra használhatja
A strace segíthet megtalálni a hibákat a rendszererőforrásokat szükségtelenül használó programokban. Hasonlóképpen, a strace segítségével feltárható az a jellemző, amelyet egy program az operációs rendszer erőforrásainak használata közben mutat.
Mivel a strace közvetlenül figyeli a rendszerhívásokat, felfedheti a futásidejű dinamikát, függetlenül attól, hogy a futó program kódja nyitott/zárt. Képet kaphatunk arról, hogy a programok miért adnak ki hibát a strace használatának megkezdésekor.
Hasonlóképpen, a strace segít megérteni, hogy egy program miért fejeződik be váratlanul. Ezért a strace ismerete nagyon fontos a Linux kernelfejlesztésben és a rendszeradminisztrációban.
Készítse el saját operációs rendszerét Linux segítségével a semmiből [Linux]
Olvassa el a következőt
Kapcsolódó témák
- Linux
- Linux parancsok
- Linux kernel
A szerzőről
Mérnök és szoftverfejlesztő, aki a matematika és a technológia rajongója. Mindig is szerette a számítógépeket, a matematikát és a fizikát. Játékmotor-projekteket, valamint gépi tanulást, mesterséges neurális hálózatokat és lineáris algebra-könyvtárakat fejlesztett ki. Továbbá továbbra is dolgozik a gépi tanuláson és a lineáris mátrixokon.
Iratkozzon fel hírlevelünkre
Csatlakozzon hírlevelünkhöz műszaki tippekért, ismertetőkért, ingyenes e-könyvekért és exkluzív ajánlatokért!
Kattintson ide az előfizetéshez