SpamAssassin 3.0.4 Patch

English info

現象

お気づきの方もいるかと思いますが日本語spamの本文にあるURLが検知されないことがあり、過去にいくつかのspamがすりぬけてしまいました。

これは7ビットコードの本文上で漢字に続いてhttpがあると文字列として ESC ( B のASCII移行のコードに続いてhttpがあるためBhttpとして認識されてしまって http の単語が見つけられないためです。

もう一つはHTTPやWWWのように大文字であるとやはり判断されないことです。

どちらもそれに気づいたspammerがこの穴を利用してspamを送ってきています。

パッチ

これらの穴をふさぐためSpamAssassin3.0.4に以下のパッチを当てました。

その1) ESC ( Bがあったらスペースコードを1文字追加する
その2) URI文字列の抽出で大文字小文字を区別しない

ファイルは1つのものだけが関係しています。
/usr/local/lib/perl5/site_perl/5.8.6/Mail/SpamAssassin/PerMsgStatus.pm
(バージョンのところはシステムにより異なります。PerMsgStatus.pmというファイルを探してください)

その1)ESC ( Bがあったらスペースコードを1文字追加する

1816行目(行数はインストールされているperlのバージョンによって違うことがあります。sub get_uri_list 関数の内部です)
 for (@$textary) {
    # NOTE: do not modify $_ in this loop
 for (@$textary) {
 my $jis = "(\x1b[\x28]B)"; if (/$jis/) { s/$jis/$1 /g; }
  # NOTE: do not modify $_ in this loop
 
にします。

その2) URI文字列の抽出で大文字小文字を区別しない (二カ所変更する必要があります)

1738行目(行数はインストールされているperlのバージョンによって違うことがあります。スクリプト本体です)
my $schemeRE = qr/(?:https?|ftp|mailto|javascript|file)/;
 を
my $schemeRE = qr/(?:https?|ftp|mailto|javascript|file)/i;
 
さらに 1743行目(行数はインストールされているperlのバージョンによって違うことがあります。スクリプト本体です)
my $schemelessRE = qr/(?<![.=])(?:www\.|ftp\.)/;
を
my $schemelessRE = qr/(?<![.=])(?:www\.|ftp\.)/i;
 
とします。(どちらも最後のところに i を入れるだけ)

パッチをあてたらspamdを再起動すると有効になります。

テスト

その1)ESC ( Bがあったらスペースコードを1文字追加する

テストには先日すりぬけたspammerのドメインを使いましょう。( 'あいうえお' の直後にhttpとします)
あいうえおhttp://www.j-sine.com/
を本文にして自分に送ってみます。パッチをする前と後に送ってみれば検出されたかどうかの比較ができます。 検出されれば以下のようになります。
 2.5 URIBL_SBL              Contains an URL listed in the SBL blocklist
                            [URIs: j-sine.com]
 1.5 URIBL_JP_SURBL         Contains an URL listed in the JP SURBL blocklist
                            [URIs: j-sine.com]
 2.0 URIBL_OB_SURBL         Contains an URL listed in the OB SURBL blocklist
                            [URIs: j-sine.com]
 4.0 URLBL_RBLJP            Has URI in url.rbl.jp
                            [URIs: j-sine.com]
 
その2) URI文字列の抽出で大文字小文字を区別しない

やはり先日発見されたドメインを使います。
HTTP://WWW.AKMOTIVATIONALSPEAKER.COM
あるいは
WWW.AKMOTIVATIONALSPEAKER.COM
を本文にして自分に送ってみます。パッチをする前と後に送ってみれば検出されたかどうかの比較ができます。 検出されれば以下のようになります。
 1.5 URIBL_JP_SURBL         Contains an URL listed in the JP SURBL blocklist
                            [URIs: akmotivationalspeaker.com]
 4.0 URLBL_RBLJP            Has URI in url.rbl.jp
                            [URIs: akmotivationalspeaker.com]
 

その他

1)コピーペーストして作業を行うときには改行部を含めないほうがいいようです。OSによって改行コードが違うため変な改行が追加されperlスクリプトとして動かなくなる場合があります。spamdを再起動したら念のため
ps -ax | grep spam
として以下のように表示されれば問題ありません。
  529  ??  Ss     1:46.28 /usr/local/sbin/spamass-milter -f -p /var/run/spamass-milter.sock
70714  ??  Is     0:01.87 /usr/local/bin/spamd -c -d -r /var/run/spamd/spamd.pid (perl5.8.6)
70718  ??  I      0:07.15 spamd child (perl5.8.6)
70719  ??  I      0:10.90 spamd child (perl5.8.6)
70720  ??  I      0:09.80 spamd child (perl5.8.6)
70721  ??  I      0:07.32 spamd child (perl5.8.6)
70722  ??  I      0:07.63 spamd child (perl5.8.6)
おかしい場合には
  529  ??  Ss     1:46.28 /usr/local/sbin/spamass-milter -f -p /var/run/spamass-milter.sock
だけになります。

2)この処理を入れた副作用はその1に関してだけContent previewにはスペースが追加されて表示されます。その2については副作用は今のところ発見されていません。

3)本パッチはSpamAssassinチームにも連絡しているので次回バージョンアップに反映されることを期待します。それまでは皆様でパッチをあててください。

4)説明が理解でき自分でパッチができる方のみ行ってください。ノーサポートです。


Nikki Top