Wanneer programma's die op Linux draaien de bronnen willen gebruiken die door het besturingssysteem worden beheerd (bestanden lezen, processen maken, enz.), doen ze systeemaanroepen naar het besturingssysteem. Systeemaanroepen werken op kernelniveau en voeren de nodige bewerkingen uit, waarbij de controle wordt overgelaten aan het aanroepende programma. De strace-tool biedt de mogelijkheid om deze systeemaanroepen op Linux te traceren.

Typisch gebruik van het strace-commando

Om systeemaanroepen voor een toepassing te volgen, roept u gewoon de opdracht op met strace in het volgende formaat:

strace ls /tmp

Er zijn echter vaak processen die veel eerder beginnen en op de achtergrond door blijven werken. Vanwege eventuele problemen wilt u mogelijk aanvullende informatie verzamelen over dergelijke processen. Je kunt bijvoegen strace aan elke actieve toepassing door de proces-ID van het proces aan de -p parameter:

strace -p 2759

Uitgang:

Blijf op de hoogte van threads en vorken van een app

Met strace kunt u alle threads en andere onderliggende processen controleren die een vork van de toepassing zijn met behulp van de

instagram viewer
-f vlag.

strace -f -p 2759

Uitgang:

Bepaalde systeemoproepen controleren met strace

De standaard strace-uitvoer kan soms behoorlijk druk zijn om te volgen. Als u alleen bepaalde systeemoproepen wilt volgen, kunt u dat doen met de -e parameter:

strace -f -e trace=open, schrijven, sluiten, verbinden,selecteer -p 19770

Om alleen systeemaanroepen met betrekking tot bestandsbewerkingen te traceren, gebruikt u -e trace=bestand:

strace -e trace=bestand -p 19770

Als u alleen netwerkgerelateerde systeemoproepen wilt filteren, geeft u op: -e trace=netwerk in het commando:

strace -e trace=netwerk -p 19770

Krijg tijdinformatie in seconden

Bij het uitvoeren van systeemoproepen kunt u de -t parameter om tijdinformatie met precisie in seconden te krijgen. Meestal zal de precisie niet voldoende zijn voor uw behoeften. In dergelijke situaties kunt u de -tt parameter om tijdinformatie te krijgen met een precisie van microseconden:

strace -tt ls /tmp

Verzamel statistieken over systeemoproepen

Met de -c parameter kunt u statistieken over systeemaanroepen verzamelen zolang u wilt:

strace -f -c -p 19770

Logboeken opslaan in een bestand

Als u strace lange tijd uitvoert en de resulterende logs later in meer detail wilt bekijken, moet u de logs opslaan. Met de -O parameter kunt u het bestand specificeren waarin strace de logs moet opslaan:

strace -f -o /tmp/strace.log -e trace=bestand ls /tmp

ptrace blokkeerproces

Met behulp van de prctl-systeemaanroep kan elke toepassing onder Linux voorkomen dat ze wordt bestuurd door niet-rootgebruikers die ptrace gebruiken. Als de toepassing de PR_SET_DUMPABLE voor zichzelf te markeren via prctl, zullen andere gebruikers dan root deze applicatie niet kunnen besturen met ptrace, zelfs als ze het recht hebben om de applicatie te signaleren.

Een van de meest typische toepassingen van deze functie is te zien in de OpenSSH-authenticatieagentsoftware. Dus de besturing van de applicatie door een andere applicatie met ptrace wordt voorkomen bij gebruikersauthenticatie.

ptrace en beveiliging

Vanwege de ptrace-faciliteit die is ingesteld in het traditionele Linux-procesmodel, heeft elke software die u op uw systeem draait met uw gebruiker de bevoegdheid om er schadelijke code in in te voegen. Van de eenvoudigste xterm-tool tot geavanceerde webbrowsertoepassingen, kan dergelijke malware de controle over al uw andere actieve toepassingen overnemen - dankzij de ptrace-systeemaanroep - en belangrijke informatie kopiëren zonder dat u het merkt.

Als reactie op deze situatie, waarvan veel gebruikers zich niet bewust zijn, is een beschermingsmechanisme ontwikkeld met de beveiligingsmodule genaamd Yama in de Linux-kernel.

U kunt de reactie op de ptrace-systeemoproep regelen via de /proc/sys/kernel/yama/ptrace_scope het dossier. Standaard schrijft dit bestand een waarde van 0.

De volgende waarden zijn acceptabel:

Waarde Betekenis
0 Conventioneel gedrag: Alle toepassingen die het recht hebben om ptrace kan worden gecontroleerd.
1 Beperkt bereik: Alleen de directe ouder van de applicatie of foutopsporingsapplicaties toegestaan ​​door de applicatie met de PR_SET_PTRACER optie de controle hebben. Zo is het gebruik van gdb programmanaam en strace programmanaam blijft werken, maar u kunt daarna geen actieve toepassing toevoegen.
2 Ptrace naar de systeembeheerder: Alleen toepassingen met gedefinieerde CAP_SYS_PTRACE eigenschap of onderliggende processen die de. definiëren PTRACE_TRACEME optie met prctl kan worden gecontroleerd.
3 Volledig uitgeschakeld: Nee ptrace is onder alle omstandigheden toegestaan. Als deze eigenschap eenmaal is gedefinieerd, kunt u deze tijdens runtime niet opnieuw wijzigen.

Veel ontwikkelaars weten niet dat applicaties ptrace zelf kunnen uitschakelen via prctl, behalve de rootgebruiker. Hoewel beveiligingsgerelateerde software zoals de OpenSSH-agent deze bewerkingen uitvoert, zou het niet juist zijn om hetzelfde gedrag te verwachten van alle software die op het systeem draait.

Kort geleden, sommige Linux-distributies zijn begonnen met het instellen van de standaardwaarde van de ptrace_scope bestand, hierboven beschreven, om 1. Dus, met beperkte ptrace-activiteiten, wordt in het hele systeem een ​​veiligere werkomgeving geboden.

Een voorbeeldstrace gebruiken

Registreer de voorbeeldtoepassing hieronder met de naam ministrace.c. Dan kun je het compileren met het volgende commando:

gcc-Oministerieministerie.c

Code:

#erbij betrekken <sys/ptrace.h>
#erbij betrekken <sys/reg.h>
#erbij betrekken <sys/wait.h>
#erbij betrekken <sys/types.h>
#erbij betrekken <unistd.h>
#erbij betrekken <stdlib.h>
#erbij betrekken <stdio.h>
#erbij betrekken <errno.h>
#erbij betrekken <string.h>
intwait_for_syscall(pid_t kind)
{
int toestand;
terwijl (1) {
ptrace (PTRACE_SYSCALL, kind, 0, 0);
waitpid (kind, &toestand, 0);
if (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80)
opbrengst0;
indien (VROUWENVERVALD(status))
opbrengst1;
}
}

intdo_child(int argc, char **argv)
{
char *args [argc+1];
memcpy (args, argv, argc * sizeof(char*));
args[argc] = NUL;
ptrace (PTRACE_TRACEME);
doden(getpid(), SIGSTOP);
opbrengst execvp (args[0], argumenten);
}

intdo_trace(pid_t kind)
{
int status, syscall, reval;
waitpid (kind, &toestand, 0);
ptrace (PTRACE_SETOPTIONS, kind, 0, PTRACE_O_TRACESYSGOOD);
terwijl(1) {
indien (wait_for_syscall (kind) != 0) pauze;

syscall = ptrace (PTRACE_PEEKUSER, kind, sizeof(lang)*ORIG_RAX);
fprintf (stderr, "syscall(%d) = ", syscall);

indien (wait_for_syscall (kind) != 0) pauze;

retval = ptrace (PTRACE_PEEKUSER, kind, sizeof(lang)*RAX);
fprintf (stderr, "%d
", terugval);
}
opbrengst0;
}
inthoofd(int argc, char **argv)
{
als (argc < 2) {
fprintf (stderr, "Gebruik: %s prog argumenten
", argv[0]);
Uitgang(1);
}
pid_t kind = vork();
if (kind == 0) {
opbrengst do_child (argc-1, argv+1);
} anders {
opbrengst do_trace (kind);
}
}

Na het compileren van de applicatie, kunt u elk commando uitvoeren met ministerie en bekijk de output:

U kunt strace voor vele doeleinden gebruiken

strace kan helpen bij het vinden van bugs in programma's die onnodig systeembronnen gebruiken. Evenzo kan het kenmerk dat een programma vertoont tijdens het gebruik van besturingssysteembronnen ook worden onthuld met strace.

Omdat strace rechtstreeks naar systeemaanroepen luistert, kan het runtime-dynamiek onthullen, ongeacht of de code van het programma dat wordt uitgevoerd open/gesloten is. Het is mogelijk om een ​​idee te krijgen waarom de programma's een foutmelding geven wanneer ze strace gaan gebruiken.

Op dezelfde manier helpt strace u te begrijpen waarom een ​​programma onverwacht wordt beëindigd. Daarom is het erg belangrijk om bekend te zijn met strace bij de ontwikkeling van de Linux-kernel en het systeembeheer.

Creëer je eigen besturingssysteem met Linux from Scratch [Linux]

Lees volgende

DelenTweetenDelenE-mail

Gerelateerde onderwerpen

  • Linux
  • Linux-opdrachten
  • Linux-kernel

Over de auteur

Fatih Küçükkarakurt (6 artikelen gepubliceerd)

Een ingenieur en softwareontwikkelaar die een fan is van wiskunde en technologie. Hij heeft altijd van computers, wiskunde en natuurkunde gehouden. Hij heeft zowel game-engine-projecten als machine learning, kunstmatige neurale netwerken en lineaire algebra-bibliotheken ontwikkeld. Bovendien blijft men werken aan machine learning en lineaire matrices.

Meer van Fatih Küçükkarakurt

Abonneer op onze nieuwsbrief

Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!

Klik hier om je te abonneren