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

instagram viewer
-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

Ossza megCsipogOssza megEmail

Kapcsolódó témák

  • Linux
  • Linux parancsok
  • Linux kernel

A szerzőről

Fatih Küçükkarakurt (6 cikk megjelent)

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.

Továbbiak Fatih Küçükkarakurttól

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