メールを送信しているphpスクリプトを見つける方法はありますか?.
「標準」インストールにApache + php(mod_suphpもsuexecもない)があり、witch phpスクリプトがメールを送信していることを確認したいのですが、ログを確認すると、メールを送信しているユーザーのuidが表示されます(私の場合はApache)ですが、電子メールを発信したスクリプトを見つけたいと思います。
それの追跡を維持するために可能ですか、それともsuexecまたはmod_suphpをインストールする必要がありますか?
助けてくれてありがとう。
php 5.3は、より良いメールトレースを取得するためにスロットされましたが、それが起こったかどうかはわかりません。 (編集:はい、php 5.3にはロギングが組み込まれています-php.iniには、phpコードからのメールの使用を記録する設定変数mail.logがあります。)
Sendmailをラッパーシェルスクリプトにすることで問題を解決しました。
Php.iniに新しいメーラーを設定します。例えば。:
sendmail_path = /usr/local/bin/sendmail-php -t -i
Sendmail-phpスクリプトは、ロガーを使用して情報を取得し、システムのsendmailを呼び出します。
#!/bin/bash
logger -p mail.info -t sendmail-php "site=${HTTP_Host}, client=${REMOTE_ADDR}, script=${SCRIPT_NAME}, filename=${SCRIPT_FILENAME}, docroot=${DOCUMENT_ROOT}, pwd=${PWD}, uid=${UID}, user=$(whoami)"
/usr/sbin/sendmail -t -i $*
これにより、syslog.confファイルでmail.infoが設定されているすべてのものがログに記録されます。
もう1つの提案は、suhosin php拡張機能をインストールして、PHPの抜け穴を厳しくすることです。ただし、これがすでにデフォルトになっているDebianまたはUbuntuを実行している場合を除きます。
これを解決するには、実際にはいくつかの手順が必要です。ロガースクリプトはphpではなくbashスクリプトであり、bashスクリプトはphpの変数にアクセスできないため、ログが空白になるため、上記のラブラドールのソリューションは実際には機能しません。基本的に、記録したいものはすべて、ロガーがデータにアクセスできるように、メールを送信する前にphpの環境変数に保存する必要があります。他のユーザーのスクリプト(必ずしも自分のものではない)を検出しようとしているため、phpコードを制御できないため、PHPのauto_prepend_file機能を使用して、実行されたすべてのphpが他のすべてのスクリプトよりも前に初期化コードを実行するようにする必要があります。ロガーに必要なデータがあることを確認するために、php.iniを介して次のコードを追加しました。
<?php
/**
* This passes all SERVER variables to environment variables,
* so they can be used by called bash scripts later
*/
foreach ( $_SERVER as $k=>$v ) putenv("$k=$v");
?>
これを機能させる方法に関する完全なチュートリアルをここにまとめました: http://mcquarrie.com.au/wordpress/2012/10/tracking-down-malicious-php-spam-scripts/
パッチ for PHPは、送信されるメールにヘッダーを追加することにより、どのスクリプトがメールを生成しているかを示します。私はそれをテストしていないので、 mコアPHPへのパッチの適用には熱心ではありませんが、良いことは聞いています。
メッセージがスプールに追加されたときのタイムフレームに適合するものについて、アクセスログをgrepする必要があります。
"mail("サブストリングのソースファイルを検索するだけかもしれません。
Php.iniでこれらを有効にするだけです
mail.add_x_header = On
mail.log = /var/log/phpmail.log
次にそのファイルを作成し、書き込み権限を付与します。その後、それを見てください。