2016-04-01 11 views
0

私はフォークボムを検出しようとしています。そのプロセスを通して、各プロセスの子孫カウントを計算しようとしています。しかし、フォークボンベは非システムプロセスであるため、非システムプロセスの子孫数を計算したいだけです。しかし、どうしたらいいのか分かりません。これは私がこれまで持っているものです。C - プロセスがシステムプロセスであるかどうかを確認するには?

struct task_struct *pTask; 
for_each_process(pTask) 
{ 
    struct task_struct *p; 
    *p = *pTask; 

    //trace back to every ancestor 
    for(p = current; p != &init_task; p->parent) 
    { 
     //increment the descendant count of p's parent    
    } 
} 

それは&init_taskですので、このループは、正しいinitタスクに上がりますか?代わりに最初のシステムプロセスに行き、停止する方法はありますか?例えばフォーク爆弾はシステムプロセスの直下の子になるからです。どんな助けでも大歓迎です、ありがとうございます!

[編集] システムプロセスによって、私は例えばbashのようなものを意味します。私はもっ​​とはっきりと説明したはずですが、基本レベルでは、ブートアップから実行されるプロセスを削除したくありません。起動後に実行されるユーザー空間からのプロセスは、公正なゲームですが、他のプロセスはそうではありません。 tomcathttpdのようなものはチェックしません。なぜなら、これらのプロセスが実行されないことを100%知っているからです。

+3

「システムプロセス」とは何ですか? – fuz

+2

*システム*プロセスとは何ですか? rootが所有するプロセス?あなたは 'sshd'デーモンについてどう思いますか? Webサーバー上の 'tomcat'やApacheの' httpd'(一般的に**ルートとして実行されない**)はどうでしょうか?ホワイトリストを作成しますか?システム内のすべてのプロセスはpid 1の壮大な子です... –

+0

@SergeBallesta私は質問を更新しました。不明な点がありましたらごめんなさい!希望は意味をなさない。 – ocean800

答えて

1

ログインbashシェルがexec(プロセスが等コンソールログインシェル、SSHログインシェル、GNOME端末シェルであるか否かに依存して)別のプロセスによって編bashをINGのプロセスexecinitによってexecエドであるか、またはいくつかの他のプロセスは、カーネルではなくinitによって起動されます。

ユーザーは、自分自身をフォークするbashスクリプトを簡単に作成することができます。したがって、/bin/bashをチェックしないと、bashで書かれたfork bombは検出されません。たとえば、次のスクリプトは、fooというファイルに格納され、現在のディレクトリで実行され、フォークボムを作成します。

#!/bin/bash 
while [ /bin/true ] 
do 
    ./foo & 
done 

あなたは、特定のユーザーが実行できるプロセスの数を制限する場合bash(1)またはsetrlimit(2)ulimitを見てみましょう。

または、プロセスを強制終了するトリガーとなる子孫カウントのしきい値を高く設定することができます。両親の鎖がinitに戻っていれば、おそらく何か怪しげなことが起きているでしょう。

1

logind/ConsoleKit2 D-Bus APIを使用して、プロセスのセッションをPIDで判断できます。 「システム」プロセス(IIRC)はセッションを持たない。

明らかに、これにはlogind(Systemdの一部)またはConsoleKit2が実行されている必要があります。

ユーザーセッションを追跡するようなサービスがないと、おそらくユーザーID以外の「システム」プロセスをユーザープロセスから区別する信頼できる方法がない場合があります(フォークボンベがシステムユーザ)。多くのディストリビューションでは、システム・ユーザーIDは1000未満で、通常のユーザーIDは「nobody」ユーザー(通常は65534)を除き、> = 1000です。

関連する問題