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

JaaTweetJaaSähköposti

Liittyvät aiheet

  • Linux
  • Linuxin komennot
  • Linux-ydin

Kirjailijasta

Fatih Küçükkarakurt (6 artikkelia julkaistu)

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.

Lisää Fatih Küçükkarakurtilta

tilaa uutiskirjeemme

Liity uutiskirjeemme saadaksesi teknisiä vinkkejä, arvosteluja, ilmaisia ​​e-kirjoja ja eksklusiivisia tarjouksia!

Klikkaa tästä tilataksesi