Wenn Programme, die unter Linux ausgeführt werden, die vom Betriebssystem verwalteten Ressourcen verwenden möchten (Dateien lesen, Prozesse erstellen usw.), führen sie Systemaufrufe an das Betriebssystem durch. Systemaufrufe arbeiten auf der Kernel-Ebene und führen die erforderlichen Operationen durch, wobei die Kontrolle wieder dem aufrufenden Programm überlassen wird. Das Strace-Tool bietet die Möglichkeit, diese Systemaufrufe unter Linux zu verfolgen.

Typische Verwendung des strace-Befehls

Um Systemaufrufe für eine Anwendung zu überwachen, rufen Sie einfach den Befehl mit auf spur im folgenden Format:

strace ls /tmp

Allerdings gibt es oft Prozesse, die viel früher beginnen und im Hintergrund weiterarbeiten. Aufgrund von Problemen möchten Sie möglicherweise zusätzliche Informationen im Zusammenhang mit solchen Prozessen sammeln. Sie können anhängen spur an jede laufende Anwendung, indem Sie die Prozess-ID des Prozesses an die übergeben -p Parameter:

strace -p 2759

Ausgabe:

Verfolgen Sie Threads und Forks einer App

instagram viewer

Mit strace können Sie alle Threads und andere untergeordnete Prozesse, die ein Fork der Anwendung sind, mithilfe von überprüfen -f Flagge.

strace -f -p 2759

Ausgabe:

Prüfen Sie bestimmte Systemaufrufe mit strace

Die standardmäßige Strace-Ausgabe kann manchmal ziemlich überfüllt sein. Wenn Sie nur bestimmte Systemaufrufe verfolgen möchten, können Sie dies mit dem tun -e Parameter:

strace -f -e trace=öffnen, schreiben, schließen, verbinden,auswählen -p 19770

Um nur Systemaufrufe zu verfolgen, die sich auf Dateioperationen beziehen, verwenden Sie -e trace=Datei:

strace -e trace=Datei -p 19770

Geben Sie an, um nur netzwerkbezogene Systemaufrufe zu filtern -e Trace=Netzwerk im Befehl:

strace -e trace=network -p 19770

Erhalten Sie Zeitinformationen in Sekunden

Bei der Ausgabe von Systemaufrufen können Sie die verwenden -t Parameter, um Zeitinformationen mit Genauigkeit in Sekunden zu erhalten. Meistens wird die Genauigkeit für Ihre Bedürfnisse nicht ausreichen. In solchen Situationen können Sie die verwenden -tt Parameter, um Zeitinformationen mit Mikrosekundengenauigkeit zu erhalten:

strace -tt ls /tmp

Sammeln Sie Statistiken über Systemaufrufe

Mit dem -c Parameter können Sie so lange Statistiken über Systemaufrufe sammeln, wie Sie möchten:

strace -f -c -p 19770

Protokolle in einer Datei speichern

Wenn Sie strace längere Zeit ausführen und die resultierenden Protokolle später genauer untersuchen möchten, müssen Sie die Protokolle speichern. Mit dem Parameter können Sie die Datei angeben, in der strace die Protokolle speichern soll:

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

ptrace-Blockierungsprozess

Mit dem prctl-Systemaufruf kann jede Anwendung unter Linux verhindern, dass sie von Nicht-Root-Benutzern mit ptrace gesteuert wird. Wenn die Anwendung die löscht PR_SET_DUMPABLE über prctl für sich selbst kennzeichnen, können andere Benutzer als root diese Anwendung nicht mit ptrace steuern, selbst wenn sie das Recht haben, die Anwendung zu signalisieren.

Eine der typischsten Anwendungen dieser Funktion ist in der OpenSSH-Authentifizierungsagentensoftware zu sehen. Somit entfällt die Steuerung der Anwendung durch eine andere Anwendung mit ptrace wird bei der Benutzerauthentifizierung verhindert.

ptrace und Sicherheit

Aufgrund der im traditionellen Linux-Prozessmodell festgelegten Ptrace-Funktion hat jede Software, die Sie mit Ihrem Benutzer auf Ihrem System ausführen, die Berechtigung, bösartigen Code darin einzufügen. Vom einfachsten xterm-Tool bis hin zu fortschrittliche Webbrowser-Anwendungen, kann eine solche Malware dank des ptrace-Systemaufrufs die Kontrolle über alle Ihre anderen laufenden Anwendungen übernehmen und wichtige Informationen kopieren, ohne dass Sie es bemerken.

Als Reaktion auf diese Situation, die vielen Anwendern nicht bewusst ist, wurde mit dem so genannten Sicherheitsmodul ein Schutzmechanismus entwickelt Yama im Linux-Kernel.

Sie können die Antwort auf den Systemaufruf ptrace über steuern /proc/sys/kernel/yama/ptrace_scope Datei. Standardmäßig schreibt diese Datei einen Wert von 0.

Folgende Werte sind akzeptabel:

Wert Bedeutung
0 Konventionelles Verhalten: Alle Anwendungen, die das Recht dazu haben ptrace kann überprüft werden.
1 Eingeschränkter Ptrace: Nur die direkt übergeordnete Anwendung oder Debug-Anwendungen, die von der Anwendung mit zugelassen werden PR_SET_PTRACER Option haben die Kontrolle. So sind die Verwendungen von gdb Programmname und strace Programmname funktioniert weiterhin, aber Sie können danach keine laufende Anwendung mehr anhängen.
2 Ptrace zum Systemadministrator: Nur Anwendungen mit definiert CAP_SYS_PTRACE Eigenschaft oder untergeordnete Prozesse, die die definieren PTRACE_TRACEME Option mit prktl kontrolliert werden können.
3 Völlig deaktiviert: Nein ptrace ist unter allen Umständen erlaubt. Wenn diese Eigenschaft einmal definiert ist, können Sie sie zur Laufzeit nicht mehr ändern.

Viele Entwickler wissen nicht, dass Anwendungen ptrace selbst über prctl deaktivieren können, außer für den Root-Benutzer. Obwohl sicherheitsrelevante Software wie der OpenSSH-Agent diese Vorgänge ausführt, wäre es nicht richtig, dasselbe Verhalten von allen auf dem System ausgeführten Softwareprogrammen zu erwarten.

Vor kurzem, einige Linux-Distributionen haben damit begonnen, den Standardwert für festzulegen ptrace_scope Datei, oben beschrieben, zu 1. Somit wird bei eingeschränkten Ptrace-Operationen eine sicherere Arbeitsumgebung im gesamten System bereitgestellt.

Verwenden einer Beispiel-Strace

Registrieren Sie die Beispielanwendung unten mit dem Namen ministrace.c. Dann können Sie es mit dem folgenden Befehl kompilieren:

gccministraceministrace.c

Code:

#enthalten <sys/ptrace.h>
#enthalten <sys/reg.h>
#enthalten <sys/wait.h>
#enthalten <sys/types.h>
#enthalten <unistd.h>
#enthalten <stdlib.h>
#enthalten <stdio.h>
#enthalten <Fehlernr.h>
#enthalten <string.h>
intwait_for_syscall(pid_t Kind)
{
int Status;
während (1) {
ptrace (PTRACE_SYSCALL, Kind, 0, 0);
waitpid (Kind, &Status, 0);
if (WIFSTOPPED(status) && WSTOPSIG(Status) & 0x80)
Rückkehr0;
if (EHEFRAU VERLASSEN(Status))
Rückkehr1;
}
}

intdo_child(int Argc, verkohlen **argv)
{
verkohlen *args [argc+1];
memcpy (args, argv, argc * sizeof(verkohlen*));
args[argc] = NULL;
ptrace (PTRACE_TRACEME);
töten(getpid(), SIGSTOP);
Rückkehr execvp (arg[0], Argumente);
}

intdo_trace(pid_t Kind)
{
int Status, Syscall, Retval;
waitpid (Kind, &Status, 0);
ptrace (PTRACE_SETOPTIONS, Kind, 0, PTRACE_O_TRACESYSGOOD);
während(1) {
Wenn (wait_for_syscall (Kind) != 0) brechen;

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

Wenn (wait_for_syscall (Kind) != 0) brechen;

retval = ptrace (PTRACE_PEEKUSER, Kind, sizeof(lang)*RAX);
fprintf (stderr, "%d
", Wiederkehr);
}
Rückkehr0;
}
inthauptsächlich(int Argc, verkohlen **argv)
{
wenn (Arg < 2) {
fprintf (stderr, "Verwendung: %s Programm-Argumente
", arg[0]);
Ausfahrt(1);
}
pid_t Kind = Gabel ();
wenn (Kind == 0) {
Rückkehr do_child (argc-1, argv+1);
} anders {
Rückkehr do_trace (Kind);
}
}

Nach dem Kompilieren der Anwendung können Sie jeden Befehl mit ausführen ministrace und untersuchen Sie die Ausgabe:

Sie können strace für viele Zwecke verwenden

strace kann dabei helfen, Fehler in Programmen zu finden, die unnötigerweise Systemressourcen verbrauchen. Ebenso kann die Eigenschaft, die ein Programm bei der Verwendung von Betriebssystemressourcen aufweist, mit strace aufgedeckt werden.

Da strace direkt auf Systemaufrufe lauscht, kann es Laufzeitdynamiken offenlegen, unabhängig davon, ob der Code des ausgeführten Programms offen/geschlossen ist. Es ist möglich, sich ein Bild davon zu machen, warum die Programme beim Start mit strace einen Fehler ausgeben.

In ähnlicher Weise hilft Ihnen strace zu verstehen, warum ein Programm unerwartet beendet wird. Daher ist die Vertrautheit mit strace in der Linux-Kernel-Entwicklung und Systemadministration sehr wichtig.

Erstellen Sie Ihr eigenes Betriebssystem mit Linux von Grund auf neu [Linux]

Lesen Sie weiter

TeilenTwitternTeilenEmail

Verwandte Themen

  • Linux
  • Linux-Befehle
  • Linux Kernel

Über den Autor

Fatih Küçükkarakurt (6 veröffentlichte Artikel)

Ein Ingenieur und Softwareentwickler, der ein Fan von Mathematik und Technik ist. Schon immer mochte er Computer, Mathematik und Physik. Er hat Spiele-Engine-Projekte sowie maschinelles Lernen, künstliche neuronale Netze und lineare Algebra-Bibliotheken entwickelt. Darüber hinaus arbeitet er weiter an maschinellem Lernen und linearen Matrizen.

Mehr von Fatih Küçükkarakurt

Abonnieren Sie unseren Newsletter

Abonnieren Sie unseren Newsletter für technische Tipps, Rezensionen, kostenlose E-Books und exklusive Angebote!

Klicken Sie hier, um sich anzumelden