フィルタリング1 メールの配送を拒否する方法

フィルタリング ON
著名なウィルス(の original)を弾く
Word ファイルなどにマクロが仕込まれているかどうかを検査する
正規表現が複数行マッチをするように設定する
メールウイルス臨時対策設定その1
メールウイルス臨時対策設定その2
received: 行のどこかに spam.co.jp というドメインを含んでいたら拒否
本文にhttp-equiv=3DContent-Type なHTMLをつけてくる迷惑なメールは拒否
From: のドメインが Message-ID に含まれていないなら拒否
To: および Cc: 行に ML のアドレスが入ってなければ,そのメールを拒否
自サイト以外のアドレスを拒否
ファイル拡張子 .xxx が危なそうなもの(?)はかたっぱしから認めない
sjisやeucで書かれたメールは拒否
登録された複数ドメインのFromであったら投稿は許可するが、それ以外の投稿は拒否
ちょっと複雑な HOOK
独自のスパム処理をする方法
「!広告!」なメールを弾く
uuencode な添付ファイル付きメールを弾く



●フィルタリング ON
【fml-help:01002】
【virus_check.ph】

$USE_DISTRIBUTE_FILTER   = 1;


●著名なウィルス(の original)を弾く
【fml-help:01002】
【virus_check.ph】

# どうせ変形版がすぐにでるので subject: で弾くのは気安めだが
# やらないよりはましだとおもう
# X-Spanska                 happy99 original
# Subject: Important ...    Melissa original    (Word's macro)
# Subject: ILOVEYOU         I Love You original (VB script)
$USE_DISTRIBUTE_FILTER = 1;
&DEFINE_FIELD_PAT_TO_REJECT("X-Spanska", ".*Yes.*");
&DEFINE_FIELD_PAT_TO_REJECT("Subject", ".*Important Message From .*|ILOVEYOU");


●Word ファイルなどにマクロが仕込まれているかどうかを検査する
【fml-help:01002】
【virus_check.ph】

# virus かどうかを検査しているわけではないので弾き過ぎるのは
# 承知の上で使うこと 
#   例: Melissa シリーズ
# 
$USE_DISTRIBUTE_FILTER = 1;
$FILTER_ATTR_REJECT_MS_GUID = 1;


●正規表現が複数行マッチをするように設定する
【fml-help:01002】
【virus_check.ph】
$USE_DISTRIBUTE_FILTER = 1;
$DISTRIBUTE_FILTER_HOOK .= q@ $* = 1; @;
# (メモリ使用量がぐーんと上がるとおもうが)


●メールウイルス臨時対策設定その1
【fml-help:00897】

いずれも副作用覚悟のやや乱暴な設定です。

$USE_DISTRIBUTE_FILTER = 1;
### For TROJ_HYBRIS
&DEFINE_FIELD_PAT_TO_REJECT('From','^\s*$') ;
### For TROJ_SIRCAM
$DISTRIBUTE_FILTER_HOOK = q#
    if ($e{'Body'} =~ /^Content-Type:.*application\/mixed/im) {
        return 'Please do not send such type of file!  It looks like a VIRUS.';
    }
#;
#application/mixedって他であまり見かけないようなので...


●メールウイルス臨時対策設定その2
【fml-help:01484】

##### Distribute Filters for Anti-VIRUS #####
#
$USE_DISTRIBUTE_FILTER   = 1 ;
### Notifies the rejection to the sender.
$FILTER_NOTIFY_REJECTION = 1 ;
### Reject without 'From' - HYBRIS etc.
&DEFINE_FIELD_PAT_TO_REJECT('From','^\s*$') ;
### Reject mail without 'To' - NIMDA etc.
&DEFINE_FIELD_PAT_TO_REJECT('To','^\s*$') ;
###
# "*.XXX.pif" etc. - BADTRANS
# Type application/mixed - SIRCAM etc.
# "whatever.exe" - ALIZ.A
# "Gone.scr" - Goner.A
# "CHRISTMAS.EXE" - MALDAL.C
# "JAVASCRIPT.EXE" - ZOHER.A
###
$DISTRIBUTE_FILTER_HOOK .= q%
  my ($error) ;
  if ($e{'h:Content-Type:'} =~ /multipart/i)
  {
    # Check typical virus file extensions.
    my($extension) =
    'lnk|hta|com|pif|vbs|vbe|js|jse|exe|bat|cmd|vxd|scr|shm|dll';
    if ($e{'Body'} =~ /(filename|name)=.*\..{3}\.($extension)/i)
    {
      $Envelope{'Addr2Reply:'} =~ s/^_//;
      $error = 1 ;
    }
    # Check typical virus attachement file names.
    my($attachement) =
    'readme.exe|whatever.exe|gone.scr|christmas.exe|javascript.exe' ;
    if ($e{'Body'} =~ /(filename|name)=.*($attachement)/i)
      { $error = 1 ;}
    # Check application/mixed type - SIRCAM
    if ($e{'Body'} =~ /^Content-Type:.*application\/mixed/im)
      { $error = 1 ;}
  }
  # Return with error message.
  if ($error)
  {
    my($message) =
    "Your mail seems to be infected by a VIRUS!\n".
    "   メールからウイルスと類似したデータが検出されました!" ;
    &DEFINE_FIELD_OF_REPORT_MAIL('Subject','VIRUS detected ??') ;
    &DEFINE_FIELD_OF_REPORT_MAIL('From',$ML_FN) ;
    &DEFINE_FIELD_OF_REPORT_MAIL('Reply-To',$MAINTAINER) ;
    return $message ;
  }
%;
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

(補足)
・Fromが空欄もしくは存在しないメールを拒否
  → いくつかのワームと多くのSPAMを排除
・同様にToが空欄もしくは存在しないメールを拒否
  → 同上、ただし副作用もあるので適時コメントアウトのこと
・BADTRANS対策で、投稿メールのFromアドレスの先頭が"_"ならば
 除去し、エラーメールのFromは "ML名 <>" で返信


●received: 行のどこかに spam.co.jp というドメインを含んでいたら拒否
【fml-help:01002】
【チュートリアル−フィルタリング−2.4 received: 行のどこかに spam.co.jp というドメインを含んでいたら拒否】

$USE_DISTRIBUTE_FILTER = 1;
$DISTRIBUTE_FILTER_HOOK = q#
     if ($e{'h:received:'} =~ /from spam.co.jp/) {
 	return 'from a host in spam blacklist';
     }
#;


●本文にhttp-equiv=3DContent-Type なHTMLをつけてくる迷惑なメールは拒否
【fml-help:01002】
【チュートリアル−フィルタリング−2.5 本文にhttp-equiv=3DContent-Type なHTMLをつけてくる迷惑なメールは拒否】

$USE_DISTRIBUTE_FILTER = 1;
$DISTRIBUTE_FILTER_HOOK = q#
     if ($e{'Body'} =~ /http-equiv=3DContent-Type/) {
 	return 'mail with appended HTML documents';
     }
#;


●From: のドメインが Message-ID に含まれていないなら拒否
【fml-help:01002】
【チュートリアル−フィルタリング−2.6 From: のドメインが Message-ID に含まれていないなら拒否】

$USE_DISTRIBUTE_FILTER = 1;
$DISTRIBUTE_FILTER_HOOK = q#
    local($domain) = (split(/@/, $From_address))[1];
    if ($e{'h:message-id:'} !~ /$domain/i) {
 	return 'Message-Id conflicts your From: address';
    }
#;


●To: および Cc: 行に ML のアドレスが入ってなければ,そのメールを拒否
【fml-support:07289】

$USE_DISTRIBUTE_FILTER = 1;
$DISTRIBUTE_FILTER_HOOK = q#
     if (($e{'h:to:'} !~ /$MAIL_LIST/i) && ($e{'h:cc:'} !~ /$MAIL_LIST/i)){
        if ( ! &CheckMember($From_address, $MEMBER_LIST) ) {
         return 'Not addressed to mailing list';
        }
     }
#;


●自サイト以外のアドレスを拒否
【fml-support:07630】

$START_HOOK = q%
   if ($From_address !~ /u-tokai\.ac\.jp$/i) {
        &Mesg(*Envelope, 
           "We permit user@*u-tokai.ac.jp can ask this list.");
        $DO_NOTHING = 1;
   }
%;


●ファイル拡張子 .xxx が危なそうなもの(?)はかたっぱしから認めない
【fml-help:01002】
【virus_check.ph】

#	.vbs: VB script
#	.js : Java script ?
#	.exe: executable
#	.doc: word
#	.rtf: RTF (embedded object in RTF is possible?) ?
#	.pif: win32/MTX sircam?
#	.scr: win32/MTX
#	.lnk: sircam ?  
$USE_DISTRIBUTE_FILTER = 1;
$DISTRIBUTE_FILTER_HOOK .= q#
    my($extension) = 'lnk|hta|com|pif|vbs|vbe|js|jse|exe|bat|cmd|vxd|scr|shm|dll';

    if ($e{'Body'} =~ /filename=.*\.($extension)/i) {
	return 'dangerous attatchment ?';
    }
#;


●sjisやeucで書かれたメールは拒否
【fml-support:07020】

$USE_DISTRIBUTE_FILTER =1;
$DISTRIBUTE_FILTER_HOOK = q%
  if( $e{'Body'} =~ /[\x80-\xFF]/ ){
    return 'Mail Body is Not ISO-2022-jp';
  }
%;
#拒否されると ログに
#99/11/24 22:40:59 EnvelopeFilter::reject for 'Mail Body is Not ISO-2022-jp' #(hoge@foo.domain)
#の様に return の返り値が 記録され管理人宛に Subject が
#「Rejected mail by FML EnvelopeFilter (ml-name)」
#のメールがきます.


●登録された複数ドメインのFromであったら投稿は許可するが、それ以外の投稿は拒否
【fml-help:00903】

(1) $PERMIT_POST_FROM = "members_only";
    にしておく。

(2) HOOK を書く。

$START_HOOK = q{
    $DOMAIN_LIST = "$DIR/domain";
    ($domain) = $From_address =~ /\S+\@(\S+)/;
    if ($domain && &CheckMember($domain, $DOMAIN_LIST)) {
        $PERMIT_POST_FROM  = "anyone";
    }
};

(3) ML ディレクトリの下の domain というファイルに、
    投稿を許すドメインを @ なしで列記する。
    members ファイルは空でも良いし、
    「ドメインに関わらずこの人だけは投稿を許す」という人を
    列記しても良い。


●ちょっと複雑な HOOK
【fml-help:01002】
【virus_check.ph】

$USE_DISTRIBUTE_FILTER = 1;
$DISTRIBUTE_FILTER_HOOK .= q#
    if ($e{'Body'} =~ /Content.*\.vbs|filename=.*\.vbs/i) {
	return 'VB script attatchment';
    }

    if ($e{'Body'} =~ /filename=.*\.Pretty Park\.exe/i ) {
	return 'original Pretty Park virus';
    }

    if ($e{'Body'} =~ /filename=.*\.Pretty.*Park.*\.exe/i ) {
	return 'original Pretty Park familly ?';
    }

    if ($e{'Body'} =~ /filename=.*search.*URL.*\.exe/i ) {
	return 'P2000 virus familly?';
    }
#;


●独自のスパム処理をする方法
【fml-help:01009】

$REJECT_ADDR_LIST = "/dev/null";
# ↑騙しておく(↓ここが「"$DIR/spamlist"」以外なら不要かも)
$SPAMMER_LIST = "$DIR/spamlist";  # 拒否したいアドレスリスト
$START_HOOK = q#
  my $ORG_REJECT_ADDR_LIST = $REJECT_ADDR_LIST;
  $REJECT_ADDR_LIST = $SPAMMER_LIST;
  if (&RejectAddrP($From_address) || &RejectAddrP($UnixFrom)){
    <ここにログに書いたり、メールを送ったりする独自処理を書く>
    $DO_NOTHING = 1;
  }
  $REJECT_ADDR_LIST = $ORG_REJECT_ADDR_LIST;
#;


●「!広告!」なメールを弾く
【fml-help:01432】

$DISTRIBUTE_FILTER_HOOK = q#
  require "libMIME.pl";
  require "jcode.pl";
  $DecodeSubject = &DecodeMimeStrings( $Envelope{'h:Subject:'} );
  &jcode'convert( *DecodeSubject, 'euc', 'jis');
  if( $DecodeSubject =~ /^\s*[!!]広告[!!]/ ){
    return 'No spam !!';
  }
#;


●uuencode な添付ファイル付きメールを弾く
【fml-help:01479】

$DISTRIBUTE_FILTER_HOOK = q#
    if (($e{'Body'} =~ /^begin\s+\d{3}/)&&($e{'Body'} =~ /^end/)) {
        return 'Please do not send such type of file!  It looks like a VIRUS.';
    }
#;