2

/proc私は、PIDとコマンド ライン分析を使用してシステム上のプロセスを検証するプロジェクトに取り組んできました。私のコードはセキュリティ担当者によってチェックされなければなりませんでした。

#!/usr/bin/env perl

$0="I am running wild"; # I had no clue you can do this!

system("cat /proc/$$/cmdline");
print("\n");
system("ps -ef | grep $$");

# do bad stuff here...

私の質問:

  1. コマンドラインで指定されたパスワードを非表示にするなど、上記のユースケースがいくつか見られますが(これも悪い習慣です)、プロセスを非表示にしてスプーフィングできると、さらに多くの問題が発生しますcmdline。許される理由はありますか?システムの脆弱性ではないですか?

  2. これを防止または検出するにはどうすればよいですか? /procマウントオプションを調べました。lsofまた、予期しない動作に基づいてスプーフィングされたプロセスを特定するために使用できることも知っていますが、これは私の場合は機能しません。現時点では、少なくとも 1 つの引数が存在すると仮定するcmdline少なくとも 1 つの null ( ) 文字が含まれているかどうかを検出する簡単な方法を使用しています。\0上記のコードでは、そのチェックをバイパスするためにスペースをヌルに置き換える必要があります。これは、Perl で実装する方法が見つからなかったものです。最初の\0.

4

1 に答える 1

6

1に答えるには:

これは、新しいプロセスの開始が実際にどのように機能するかによるものです。

fork()現在のプロセスの複製インスタンスを生成してから、新しいプロセスを開始します。現在のプロセスが「新しい」プロセスにexec()置き換えられ、その結果、書き換える必要があります。$0

これは、並列コードを実行するときに実際に非常に便利です。コードを実行するときにかなり頻繁にfork()実行します。

例えば:

use Parallel::ForkManager;
my $manager = Parallel::ForkManager -> new ( 10 ); 

foreach my $server ( @list_of_servers ) {
    $manager -> start and next;
    $0 = "$0 child: ($server)";
    #do stuff;
    $manager -> finish;
}

psリストで何が起こっているかをすぐに確認できます。のような多くのマルチプロセッシング サービスで、この種の動作が見られますhttpd

しかし、それは脆弱性ではありません。とにかく、バイナリを「mv」できるだけです。

とにかく、2に答えるには...何を防止または検出しますか? つまり、プロセスがコマンドラインから何をしているのかはわかりませんが、それ以外の場合は何をしているのかわかりません (コードの一部に何か「奇妙な」ことを舞台裏で実行させる方法はたくさんあります)。

答えは、セキュリティ モデルを信頼することです。信頼できないコードを特権コンテキストで実行しないでください。彼らがそれを何と呼んでいるのかは、ほとんど無関係です。確かに、プロセス リストに失礼なメッセージを書き込むことはできますが、誰がそれを行っているかは明らかです。

于 2016-03-04T09:31:17.240 に答える