Kun Linuxissa toimivat ohjelmat haluavat käyttää käyttöjärjestelmän hallitsemia resursseja (tiedostojen lukeminen, prosessien luominen jne.), ne tekevät järjestelmäkutsuja käyttöjärjestelmälle. Järjestelmäkutsut toimivat ydintasolla ja suorittavat tarvittavat toiminnot jättäen hallinnan takaisin kutsuvalle ohjelmalle. Strace-työkalu tarjoaa mahdollisuuden jäljittää nämä järjestelmäkutsut Linuxissa.
strace-komennon tyypillinen käyttö
Voit seurata sovelluksen järjestelmäkutsuja käynnistämällä komennon strace seuraavassa muodossa:
strace ls /tmp
Usein on kuitenkin prosesseja, jotka alkavat paljon aikaisemmin ja jatkavat toimintaansa taustalla. Mahdollisten ongelmien vuoksi saatat haluta kerätä tällaisiin prosesseihin liittyviä lisätietoja. Voit liittää strace mihin tahansa käynnissä olevaan sovellukseen antamalla prosessin prosessitunnuksen -s parametri:
strace -s 2759
Lähtö:
Pidä kirjaa sovelluksen langoista ja haaroista
Stracen avulla voit tarkistaa kaikki säikeet ja muut aliprosessit, jotka ovat sovelluksen haarukka käyttämällä -f lippu.
strace -f -p 2759
Lähtö:
Tarkista tietyt järjestelmäkutsut stracella
Strace-oletustuloste voi olla toisinaan melko täynnä seuratakseen. Jos haluat seurata vain tiettyjä järjestelmäpuheluita, voit tehdä sen -e parametri:
strace -f -e trace=avaa, kirjoita, sulje, yhdistä,valitse -s 19770
Jos haluat jäljittää vain tiedostotoimintoihin liittyvät järjestelmäkutsut, käytä -e jäljitys=tiedosto:
strace -e trace=file -p 19770
Jos haluat suodattaa vain verkkoon liittyvät järjestelmäkutsut, määritä -e trace=verkko komennossa:
strace -e trace=verkko -p 19770
Hanki aikatiedot sekunneissa
Kun lähetät järjestelmäkutsuja, voit käyttää -t parametri saadaksesi aikatiedot tarkasti sekunneissa. Useimmiten tarkkuus ei riitä tarpeisiisi. Tällaisissa tilanteissa voit käyttää -tt parametri aikatietojen saamiseksi mikrosekunnin tarkkuudella:
strace -tt ls /tmp
Kerää tilastoja järjestelmäpuheluista
Kanssa -c parametrilla voit kerätä tilastoja järjestelmäkutsuista niin kauan kuin haluat:
strace -f -c -p 19770
Tallenna lokit tiedostoon
Jos käytät stracea pitkään ja haluat tarkastella tuloksena olevia lokeja tarkemmin myöhemmin, sinun on tallennettava lokit. Kanssa -o parametrilla voit määrittää tiedoston, johon stracen tulee tallentaa lokit:
strace -f -o /tmp/strace.log -e trace=file ls /tmp
ptrace estoprosessi
Prctl-järjestelmäkutsua käyttämällä mikä tahansa sovellus Linuxissa voi estää itseään ohjaamasta muita kuin root-käyttäjiä ptracen avulla. Jos sovellus tyhjentää PR_SET_DUMPABLE merkitse itselleen prctl: n kautta, muut käyttäjät kuin pääkäyttäjät eivät voi hallita tätä sovellusta ptracen avulla, vaikka heillä olisi oikeus signaloida sovellus.
Yksi tämän ominaisuuden tyypillisistä käyttötavoista näkyy OpenSSH-todennusagenttiohjelmistossa. Siten sovelluksen valvonta toisen sovelluksen avulla ptrace on estetty käyttäjän todennuksen yhteydessä.
ptrace ja turvallisuus
Perinteiseen Linux-prosessimalliin asetetun ptrace-toiminnon ansiosta kaikilla ohjelmistoilla, joita käytät järjestelmässäsi käyttäjän kanssa, on oikeus lisätä haitallista koodia siihen. Yksinkertaisimmasta xterm-työkalusta kehittyneitä selainsovelluksia, tällaiset haittaohjelmat voivat ottaa hallintaansa kaikki muut käynnissä olevat sovelluksesi – ptrace-järjestelmän kutsun ansiosta – ja kopioida tärkeitä tietoja huomaamattasi.
Vastauksena tähän tilanteeseen, josta monet käyttäjät eivät ole tietoisia, on kehitetty suojamekanismi nimeltä suojausmoduuli Yama Linux-ytimessä.
Voit ohjata vastausta ptrace-järjestelmäkutsuun käyttämällä /proc/sys/kernel/yama/ptrace_scope tiedosto. Oletuksena tämä tiedosto kirjoittaa arvon 0.
Seuraavat arvot ovat hyväksyttäviä:
Arvo | Merkitys |
0 | Perinteinen käyttäytyminen: Kaikki sovellukset, joilla on oikeus ptrace voidaan tarkistaa. |
1 | Rajoitettu jäljitys: Vain sovelluksen tai virheenkorjaussovellusten suora yläosa, jonka sovellus sallii PR_SET_PTRACER vaihtoehdolla on hallinta. Näin ollen käyttötarkoitukset gdb-ohjelman_nimi ja strace ohjelman_nimi jatkaa toimintaansa, mutta et voi liittää käynnissä olevaa sovellusta sen jälkeen. |
2 | Ptrace järjestelmänvalvojalle: Vain sovellukset, joissa on määritetty CAP_SYS_PTRACE ominaisuus tai aliprosessit, jotka määrittävät PTRACE_TRACEME vaihtoehto kanssa prctl voidaan hallita. |
3 | Täysin pois käytöstä: Ei ptrace on sallittu kaikissa olosuhteissa. Jos tämä ominaisuus määritetään kerran, et voi muuttaa sitä uudelleen suorituksen aikana. |
Monet kehittäjät eivät tiedä, että sovellukset voivat poistaa ptracen itsensä käytöstä prctl: n kautta, paitsi pääkäyttäjälle. Vaikka turvallisuuteen liittyvät ohjelmistot, kuten OpenSSH-agentti, suorittavat nämä toiminnot, ei olisi oikein odottaa samaa toimintaa kaikilta järjestelmässä olevilta ohjelmistoilta.
Äskettäin, joitakin Linux-jakeluja ovat alkaneet asettaa oletusarvoa ptrace_scope tiedosto, joka on kuvattu yllä 1. Siten, kun ptrace-toimintoja on rajoitettu, koko järjestelmässä on turvallisempi työympäristö.
Esimerkkiviivan käyttäminen
Rekisteröi alla oleva mallihakemus nimellä ministrace.c. Sitten voit kääntää sen seuraavalla komennolla:
gcc-ohoitaahoitaa.c
Koodi:
#sisältää <sys/ptrace.h>
#sisältää <sys/reg.h>
#sisältää <sys/wait.h>
#sisältää <sys/types.h>
#sisältää <unistd.h>
#sisältää <stdlib.h>
#sisältää <stdio.h>
#sisältää <errno.h>
#sisältää <merkkijono.h>
intwait_for_syscall(pid_t lapsi)
{
int Tila;
sillä aikaa (1) {
ptrace (PTRACE_SYSCALL, lapsi, 0, 0);
odota (lapsi, &tila, 0);
jos (WIFSTOPPED(tila) && WSTOPSIG(tila) & 0x80)
palata0;
jos (WIFEXITED(tila))
palata1;
}
}intdo_child(int argc, hiiltyä **argv)
{
hiiltyä *args [argc+1];
memcpy (args, argv, argc * sizeof(hiiltyä*));
args[argc] = TYHJÄ;
ptrace (PTRACE_TRACEME);
tappaa(getpid(), SIGSTOP);
palata execvp (args[0], args);
}intdo_trace(pid_t lapsi)
{
int status, syscall, retval;
odota (lapsi, &tila, 0);
ptrace (PTRACE_SETOPTIONS, lapsi, 0, PTRACE_O_TRACESYSGOOD);
sillä aikaa(1) {
jos (wait_for_syscall (lapsi) != 0) tauko;syscall = ptrace (PTRACE_PEEKUSER, lapsi, sizeof(pitkä)*ORIG_RAX);
fprintf (stderr, "syscall(%d) = ", syscall);jos (wait_for_syscall (lapsi) != 0) tauko;
retval = ptrace (PTRACE_PEEKUSER, lapsi, sizeof(pitkä)*RAX);
fprintf (stderr, "%d
", retval);
}
palata0;
}
intpää(int argc, hiiltyä **argv)
{
jos (argc < 2) {
fprintf (stderr, "Käyttö: %s prog args
", argv[0]);
poistu(1);
}
pid_t lapsi = haarukka();
if (lapsi == 0) {
palata do_child (argc-1, argv+1);
} muu {
palata do_trace (lapsi);
}
}
Sovelluksen kääntämisen jälkeen voit suorittaa minkä tahansa komennon hoitaa ja tarkista tulos:
Voit käyttää stracea moniin tarkoituksiin
strace voi auttaa löytämään virheitä ohjelmista, jotka käyttävät tarpeettomasti järjestelmäresursseja. Samoin ominaisuus, jonka ohjelma osoittaa käyttäessään käyttöjärjestelmän resursseja, voidaan myös paljastaa stracella.
Koska strace kuuntelee suoraan järjestelmäkutsuja, se voi paljastaa ajonaikaisen dynamiikan riippumatta siitä, onko suoritettavan ohjelman koodi auki/suljettu. On mahdollista saada käsitys siitä, miksi ohjelmat heittävät virheen, kun stracea aletaan käyttää.
Samoin strace auttaa ymmärtämään, miksi ohjelma päättyy odottamatta. Siksi stracen tunteminen on erittäin tärkeää Linux-ytimen kehittämisessä ja järjestelmänhallinnassa.
Luo oma käyttöjärjestelmäsi Linuxilla tyhjästä [Linux]
Lue Seuraava
Liittyvät aiheet
- Linux
- Linuxin komennot
- Linux-ydin
Kirjailijasta

Insinööri ja ohjelmistokehittäjä, joka on matematiikan ja tekniikan fani. Hän on aina pitänyt tietokoneista, matematiikasta ja fysiikasta. Hän on kehittänyt pelimoottoriprojekteja sekä koneoppimista, keinotekoisia hermoverkkoja ja lineaarisia algebrakirjastoja. Lisäksi työskentelee edelleen koneoppimisen ja lineaaristen matriisien parissa.
tilaa uutiskirjeemme
Liity uutiskirjeemme saadaksesi teknisiä vinkkejä, arvosteluja, ilmaisia e-kirjoja ja eksklusiivisia tarjouksia!
Klikkaa tästä tilataksesi