プロセス作成時のフック操作

プロセス作成時のフック操作

各プロセスの作成時にスクリプト実行をリンクすることは可能ですか?

ディスクアクティビティを監視するためには、inotifywaitと基本的に同じですが、プロセステーブルに適用されます。

プロセスの作成中にロギング、cgsetなどの操作を実行できます。新しいプロセスの課題に再帰的に適用されることがわかります。しかし、競合状態の脆弱な変更を特定するために、プロセステーブルをできるだけ早くポーリングするよりも良い方法はありますか?

ありがとう

答え1

まず、プロセスの作成は記録に役立つイベントではなく、セキュリティ(リソース制約を除く)とは関係ありません。私の考えでは、あなたはプログラムの実行をリンクすることを意味すると思います。execve、いいえfork

第二に、あなたが引用したユースケースは、通常、それ自体をリリースするよりも、この目的のために設計された既存のメカニズムを使用する方が良いです。

  • ロギングの場合、BSDプロセス会計情報はほとんど提供されず、LinuxのほとんどのUnixバリアントで動作します。GNU会計ユーティリティ(配布パネルからパッケージをインストールしてください)。 Linuxでより複雑なロギングには、次のものを使用できます。監査サブシステム(これauditctlマニュアルページには上記のように例があり、記録したいシステムコールは次のとおりですexecve
  • 特定のプログラムにセキュリティ制限を適用するには、セキュリティフレームワークを使用してください。SELinuxまたは鎧を適用
  • コンテナで特定のプログラムを実行したり特定の設定を使用したりするには、実行可能ファイルを移動し、その場所に必要な設定を設定し、元の実行可能ファイルを呼び出すラッパースクリプトを配置します。

他のプログラムの動作に影響を与えずに、特定のプログラムが別のプログラムを呼び出す方法を変更したい場合は、次の2つのシナリオがあります。プログラムは潜在的に敵対的である可能性があります。

  • プログラムが悪意のある可能性がある場合は、専用の仮想マシンで実行してください。
  • プログラムが共同作業の場合、最も確実な攻撃角度は異なりますPATHマウントネームスペース(あなたも見ることができますカーネル: 名前空間のサポート)。本当に詳細な制御が必要な場合は、呼び出し元を使用してライブラリをロードし、特定のライブラリ呼び出しをオーバーライドできますLD_PRELOAD=my_override_library.so theprogram。バラより実行前のファイル記述子のリダイレクト例えば。内部Cライブラリの呼び出しは影響を受けないため、これに加えて内部で呼び出されるすべてのCライブラリ関数をexecveオーバーライドする必要があります。次のプログラムを実行すると、より正確な制御が得られます。これにより、Cライブラリ関数によって生成されたシステムコールを無視できますが、設定するのがより困難になります。 (簡単な方法はわかりません。)これ)。execveLD_PRELOADptrace

答え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ラッパー(上記と似ていますforkが代わりにexecve)は機能しますが、生成されたsetgpidプロセスでいくつかのバグが発生する可能性があります。

明らかに、libcfork関数には私がよく理解していないいくつかの追加機能があります。 )

関連情報