Hook-Aktion bei Prozesserstellung

Hook-Aktion bei Prozesserstellung

Ist es möglich, bei jeder Prozesserstellung eine Skriptausführung anzuhängen?

Im Wesentlichen das Äquivalent von inotifywait zur Überwachung der Festplattenaktivität, jedoch auf die Prozesstabelle angewendet.

Es wäre möglich, beim Erzeugen der Prozesse eine Aktion auszuführen, z. B. sie zu protokollieren, sie zu cgseten oder andere. Ich sehe die Herausforderung, dass dies rekursiv auf die neuen Prozesse angewendet würde. Aber anstatt die Prozesstabelle so schnell wie möglich abzufragen, um Änderungen abzufangen, die anfällig für Race Conditions wären, gibt es einen besseren Weg?

Danke

Antwort1

Erstens ist die Prozesserstellung selten ein nützliches Ereignis zum Protokollieren und es ist für die Sicherheit irrelevant (außer bei der Ressourcenbeschränkung). Ich denke, Sie meinen das Einhängen der Ausführung von Programmen, was durchexecve, nichtfork.

Zweitens lassen sich die von Ihnen angeführten Anwendungsfälle normalerweise am besten bewältigen, indem man für diesen Zweck vorhandene Mechanismen nutzt, statt eigene zu entwickeln.

  • Für die ProtokollierungBSD-Prozessabrechnungbietet eine kleine Menge an Informationen und ist auf den meisten Unix-Varianten verfügbar; unter Linux installieren Sie dieGNU-Buchhaltungsdienstprogramme(installieren Sie das Paket aus Ihrer Distribution). Für anspruchsvolleres Logging unter Linux können Sie dasAudit-Subsystem(DieauditctlDie Manpage enthält Beispiele. Wie ich oben erklärt habe, ist der Systemaufruf, den Sie protokollieren möchten, execve).
  • Wenn Sie Sicherheitsbeschränkungen für bestimmte Programme anwenden möchten, verwenden Sie ein Sicherheitsframework wieSELinuxoderAppArmor.
  • Wenn Sie ein bestimmtes Programm in einem Container oder mit bestimmten Einstellungen ausführen möchten, verschieben Sie die ausführbare Datei und platzieren Sie an ihrer Stelle ein Wrapper-Skript, das die gewünschten Einstellungen festlegt und die ursprüngliche ausführbare Datei aufruft.

Wenn Sie die Art und Weise ändern möchten, wie ein bestimmtes Programm andere Programme aufruft, ohne das Verhalten anderer Programme zu beeinflussen, gibt es zwei Fälle: Entweder das Programm ist potenziell feindlich oder nicht.

  • Wenn das Programm möglicherweise feindlich ist, führen Sie es in einer dedizierten virtuellen Maschine aus.
  • Wenn das Programm kooperativ ist, ist der naheliegendste Ansatzpunkt, es mit einem anderen auszuführen PATH. Wenn das Programm absolute Pfade verwendet, die nicht einfach zu konfigurieren sind, können Sie es auf einem nicht-antiken Linux-System in einem separaten ausführen.Mount-Namespace(siehe auchKernel: Namespaces-Unterstützung). Wenn Sie wirklich eine genaue Kontrolle benötigen, können Sie eine Bibliothek laden, die einige Bibliotheksaufrufe überschreibt, indem Sie das Programm mit aufrufen LD_PRELOAD=my_override_library.so theprogram. SieheLeiten Sie einen Dateideskriptor vor der Ausführung umals Beispiel. Beachten Sie, dass Sie zusätzlich zu execvealle C-Bibliotheksfunktionen überschreiben müssen, die execveintern aufgerufen werden, da LD_PRELOADinterne C-Bibliotheksaufrufe nicht betroffen sind. Sie können eine genauere Kontrolle erhalten, indem Sie das Programm unter ausführen ptrace. Dadurch können Sie einen Systemaufruf überschreiben, auch wenn dieser von einer C-Bibliotheksfunktion ausgeführt wird. Dies ist jedoch schwieriger einzurichten (ich kenne keine einfache Möglichkeit, dies zu tun).

Antwort2

//fakeExec.c
#include <unistd.h>
#include <stdio.h>
#include <sys/syscall.h>
int execve(const char *path, char *const argv[], char *const envp[]) {
  printf("Execing \"%s\"\n", path);
    return syscall(SYS_execve, path, argv, envp);
}

Im Terminal:

$ gcc -fPIC -shared fakeExec.c -o fakeExec.so
$ export LD_PRELOAD=$PWD/fakeExec.so 

Und jetzt sollte jede neue ausgeführte Datei protokolliert werden stdout.

Eine Gabelverpackung erfordert offenbar etwas mehr Arbeit, um sie richtig zu machen.

( Der triviale forkWrapper (wie der oben, aber für forkstatt execve) funktioniert einigermaßen, führt aber zu einigen setgpidFehlern in den damit erzeugten Prozessen.

Offenbar verfügt die libc- forkFunktion über ein paar zusätzliche Dinge, die ich nicht ganz verstehe. )

verwandte Informationen