回答:
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が設定されているすべてのものがログに記録されます。
別の提案は、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/
送信されるメールにヘッダーを追加することにより、どのスクリプトがメールを生成しているかを示すPHPのパッチがあります。コアPHPにパッチを当てるのが苦手なので、テストはしていませんが、良いことは聞いています。
メッセージがスプールに追加されたときのタイムフレームに適合するものについて、アクセスログをgrepする必要があります。
"mail("サブストリングのソースファイルを検索するだけかもしれません。