PHP exec()は実行されたコマンドをどこに保存しますか?

PHP exec()は実行されたコマンドをどこに保存しますか?

PHP Webアプリケーションに次のコードがあるとしましょう。

$encrypt ? $password = generatePassword($passwordstrength): $password="";
$estring = "7z a -p$password -mx0 packFoo.aes.7z mydir/foo";
if($encrypt) {
    exec($estring);
}
mailuser($password);//uses standard PHP mail function

パスワードはPHP rand()関数を使用してランダムに生成されます。

/var/logs または .bash_history でパスワードが見つかりません。

サーバーが破損している場合は、$password値をサーバーから回復できるかどうかを知りたいです。最後に、$passwordの値がサーバーに保存されていないと主張できますか?

答え1

〜のようにマットがコメントで指摘しました。、特に監査を設定しない限り、その可能性はありません。自分で命令を出す意図的にどこにでも直接アクセスできる形式で保存されます。grep -lR ... /ルーティングは悟りを与える経験になる可能性があるからです(最初にすべてを再インストールすることをお勧めしますnoatime...)。

しかし、常に「しかし」があります。この場合(特に表示されたコードで$ passwordまたは$ estring変数を安全に消去していない場合)、私が見ることができる1つの確実な可能性は、これらの変数がswap spaceに書き込まれることです。これは、アクティブな攻撃者がいなくても、少なくとも一定期間は永久保存に専念することを意味します。これは、スワップを完全に無効にするか、ランダム暗号化キーで暗号化されたスワップを実行することによって大幅に軽減できます。これにより、再起動後にスワップにアクセスできなくなります(システムRAMが消去されると、それを理解するために必要な復号化キーが失われるため)。

私はできます。想像する7zipは、不要になったらすぐにコマンドラインと内部変数からパスワードをすばやく消去するのに十分なパフォーマンスを発揮します。ただし、拡張キー計画などの項目は長期間維持され、交換される可能性が高くなります。可能性。これは必ずしもパスワードを回復できるわけではありませんが、暗号化されたアーカイブからプレーンテキストを回復できる可能性が高くなります。適切な時点で簡単なコマンドを実行すると、コマンドラインps axwからプレーンテキストでパスワードを記録する人が表示されますが、そうではありません。保存済みそしてチャンスの窓は小さいです。

電子メールを送信するときに、プレーンテキスト(またはBase64でエンコードされたメッセージ本文など、そのプレーンテキストに簡単にエクスポートできるコンテンツ)のパスワードが含まれているとします。その電子メールはほぼ確実でした。〜するシステムのメールキューに一時的に書き込むこれはパスワードが最終的にディスクに保存されることを意味します(RAMディスクにメールキューディレクトリがない場合は、メールキューが永続ストアに存在する必要があるという事実に加えて、動作上の独自の問題が発生します)。 )。特にスマートホスト設定を実行すると、キューファイルはすばやく削除される可能性がありますが、ディスクに書き込まれているので、言うと「破損が完了しました」と言います。strings /dev/sd?メッセージが通過するすべてのサーバーでこの脅威を軽減するための特別な措置を講じない限り、この方法は何を見つけるべきかを知っている人にパスワード回復を提供できます。

もちろん、電子メールはもともと完全に安全に設計されていません。 SMTP経由で電子メールを送信するときに機密性を合理的に保証する唯一の方法(SSLまたはSTARTTLSを介してSMTPを使用している場合でも)チェーン全体にメールサーバー)は、S / MIMEやOpenPGPなどのエンドツーエンドで暗号化されています。

簡単に言うと:あなたのウェブアプリケーションおそらくコマンド(パスワードを含む)またはパスワード自体は意図的にどこにも保存されませんが、それが依存する他のコンポーネントは通常の動作中に保存される可能性があります。

答え2

まず、より大きなセキュリティ問題があることに注意してください。rand()パスワード生成に適していない。高速で予測可能な擬似乱数ジェネレータを使用します。使用openssl_random_pseudo_bytes()逆に、次のように文書


コマンドの名前を記録するのは一般的ですが、その引数を記録するのはそれほど一般的ではありません。したがって、サーバーが異常量のロギング用に構成されていない限り、パスワードはシステムログに残りません。

同時に実行中のプロセスはコマンドラインを聞くことができ、7z実行するだけですps

-p()のみを渡すと、7z a -p -mx0 packFoo.aes.7z mydir/fooコマンドラインにパスワードを入力することを回避できます。この場合は、以下を使用する必要があります。予想される7zパスワードが端末から出て2回入力されると主張するので、パスワードを2回送信します。ここSSHに似た例です。

一方、パスワードは一定期間ファイルシステムに保存されます。メールバックエンドの一時ファイルに確実に保存されます。電子メールが送信された後、一時ファイルは削除されますが、空き領域を読み取るためにディスクに直接アクセスするルートとして実行されているプロセスは、パスワードに引き続きアクセスできます。パスワードがある時点で変わった可能性があります。

関連情報