是否可以在每個進程創建時掛鉤腳本執行?
本質上相當於 inotifywait 來監視磁碟活動,但應用於進程表。
它將允許在進程生成時執行操作,例如記錄它、cgset 等等。我可以看到它將遞歸地應用於新流程的挑戰。但是,有沒有更好的方法,而不是盡快輪詢進程表以捕獲容易受到競爭條件影響的變更。
謝謝
答案1
首先,進程建立很少是需要記錄的有用事件,並且與安全性無關(資源限制除外)。我認為你的意思是掛鉤程式的執行,這是由execve
, 不是fork
。
其次,您引用的用例通常最好使用為此目的而設計的現有機制,而不是自行推出。
- 對於日誌記錄,BSD 行程會計提供少量信息,並且適用於大多數 Unix 變體;在 Linux 上,安裝GNU 會計實用程序(從您的發行版安裝軟體包)。對於 Linux 上更複雜的日誌記錄,您可以使用審計子系統(這
auditctl
手冊頁有範例;正如我上面所解釋的,您想要記錄的系統呼叫是execve
)。 - 如果您想對某些程式套用安全限制,請使用安全框架,例如SELinux或者應用裝甲。
- 如果要在容器中執行特定程式或使用某些設置,請移動可執行檔並將包裝器腳本放在其位置,以設定所需的設定並呼叫原始可執行檔。
如果您想要修改特定程式呼叫其他程式的方式,而不影響其他程式的行為方式,則有兩種情況:該程式可能具有潛在的敵意。
- 如果該程式可能存在惡意,請在專用虛擬機器中執行它。
- 如果程式是協作的,最明顯的攻擊角度就是使用不同的
PATH
.如果程式使用了不易配置的絕對路徑,在非古董Linux系統上,可以在單獨的目錄中運行它掛載命名空間(也可以看看核心:命名空間支持)。如果您確實需要精細控制,您可以載入一個函式庫,透過使用 呼叫程式來覆寫某些函式庫呼叫LD_PRELOAD=my_override_library.so theprogram
。看執行前重定向檔案描述符舉個例子。請注意,除了 之外execve
,您還需要重寫execve
內部呼叫的所有 C 函式庫函數,因為LD_PRELOAD
不會影響內部 C 函式庫呼叫。您可以透過執行以下程式來獲得更精確的控制ptrace
;這允許您覆蓋系統調用,即使它是由 C 庫函數進行的,但它更難設置(我不知道有什麼簡單的方法可以做到這一點)。
答案2
//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);
}
在終端機中:
$ gcc -fPIC -shared fakeExec.c -o fakeExec.so
$ export LD_PRELOAD=$PWD/fakeExec.so
現在您應該將每個新執行的文件記錄到stdout
.
叉子包裝顯然需要更多的工作才能完成。
( 簡單的fork
包裝器(與上面類似,但 forfork
而不是execve
)可以工作,但會setgpid
在用它產生的進程中導致一些錯誤。
顯然 libcfork
函數有一些額外的東西,我不太明白。 )