日記ブログ、または雑多なメモ
2010年11月15日

スパムメールと戯れる with procmail





 おかんが「かきが大量にあるから食べてや」というので、「食べ過ぎたらあたるから気をつけないかんね」というと、「ハ?」と言われた。

../../diary/pic/pic10111601.jpg

 まず柿を食う。

 で、iPhoneのためにprocmail+bsfilterをサーバに設定しほぼ100%、Inboxにスパムメールが入るのは避けることが出来ているのだが、推論フィルタゆえまるっぽ信用するわけにもいかず、間違って必要なメールがスパム判定されていないか避けられたメールに一応ひと通り目を通さないといけない。 実際まれに間違いが発生することもある。 しかし、それこそ1日200通近くあるスパムからほとんどないであろう間違いをさがすというのも目が疲れるし、時間の無駄。

 じゃあどうするかといえば、スパムメール群はよく見ればほぼ9割がた一目でスパムとわかる体裁をなしているので、procmailの判断であからさまなスパムメールは直接/dev/null行きにすればよい。


 英文で来るスパム。 特徴的な単語の組み合わせをそのまま条件に当てはめてやればすんなり/dev/null行きにできる。
#特徴的な副詞・修飾子+名詞系
:0
* ^Subject: .*(Spectac|bargen|discount|cheap|elegant|classy|magnificent|luxury|branded|chanel|wholesale|popular|quality|perrelet|genuine).*(clocks|boots|shoes|bags|pens|items|brands|footwear|goods|watch|pills|drugs|software|medicine|price|accessories|sale)
/dev/null

#特徴的な単語
:0
* ^Subject:.*(pfizer|breitling|heuer|sexual|consolidation|time[^a-z0-9]?piece|herbals|manhood|Lloyds Bank|ejaculation|blackjack|visa line|franck muller|orgasm|oyster perpetual|versace|erectile|your (health|partner)|win millions|indiana.*energy|natwest|update.*billing|casino|(downloadable|free).*porno|genuine.*artifacts|deposit|bonus|discount|stupid.*face|discrete.*shipping|greeting.*ecard|Miley.*loves|Beautiful.*Russian|(University|MBA) Degree|Weight loss|WESTERN UNION TRANSFER|Russian.*wife|Sex.*Pharm|Alliance.*Leicester|diploma|(no rx|free).*ship|(nice|good) pic\ |codeine|amazing|youre hot|awesome|dating|perma|you want|Xerox WorkCentre|let\`s|lets|you does|calcium|ur info |not need|naked|read this|news.*letter|gift|order (now|today)|Surpris|Huge success)
/dev/null

 もう少しあるが長くなるので、後ほど全部をまとめたテキストへのリンクを貼る。 こうしてみると、英語でもいろいろと表現方法があるんだなぁ、と感慨にふけっている場合ではない。

 ややこしいのはバイアグラとサイアリスで、
VIIAGRA
V ll A G R A
V 1 1 A G R A
V Y A G R A

などと、そこまでやって誰が読むんですかというパターンで色々来る。 ここ数カ月のチェックでは以下でだいたいブロックできる模様。
:0 HB
* < 60000
* .*v[^0-9a-z]?([yil1|]+[ ]?)+[^0-9a-z]?a[^0-9a-z]?g[^0-9a-z]?[rl1i]+[^0-9a-z]?a
/dev/null

:0 HB
* < 60000
* .*[c]+[^0-9a-z]?([il1]+[ ]?)+[^0-9a-z]?[a]+[^0-9a-z]?[il1][^0-9a-z]?[il1][^0-9a-z]?s
/dev/null

 ネットでみかけたバイアグラ正規表現には3行に渡るものすごいのもあったが、これでも結構ブロックできると思われる。 サブジェクトの文面では判断できないスパムの中身がたいていバイアグラだったりするので結構重要なルール。


 難しいのは日本語メール。 何しろ表現方法が多彩すぎる。 押さえた、と思ってもすり抜けてくる。

まず金絡み。
:0
* $DECODED_SUBJECT ?? .*(読んで後悔|高収入|必見|(月|年)収|低金利|株手法|自動入金|無料情報|金利が.*%|業界|お金|秘密厳守|お宝|秘(訣|策)| (GET|ゲット|法).*(!|!)|儲(かる|け)|稼(いで|ぐ|げ|ぎ)|(無料|当選).*モニタ|一切|現金|投資|融資|配当|万円|無料|最低.*(万|マン)|クレジットカードについてのお知らせ|激安|チャンス|画期的|金回り|実績|キャッシング)
/dev/null

 どう考えても通常のメールでサブジェクトに入るはずのない単語群。 こんなメールを受けて誰か中身を読むのか。 電柱に貼ってあるニコニコローン広告ばりに怪しい。

続いてエロ・ドラッグ・違法系。
:0
* $DECODED_SUBJECT ?? .*(乳首|sex.*(す|し)|SEX|セックス|せっくす|クリトリス|おまんこ|オマンコ|クンニ|セフレ|出会い|無修正|即ヤリ|オナニー| 犯して|熟女|奥さん|アナル|ヤリ(マン|場)|即エッチ|逆(援|ナン)|バ│イ│ア│グ│ラ|裏DVD|(男|女)性|欲情する|淫ら.*・・|人妻.*(ます|誘|ください|暇つぶし|三昧|らしい|・)|オンライン風俗|実態|男はマグロ|刺激に飢え|セレブ|(や|ヤ)(らせ|り)|違法| (恋愛|楽しい|事実|興奮).*(!|!)|淫乱な|(デート|ホテル)代|ホテル.*お呼び|愛人|療法|と会える|マダム|エッチ.*(がしたい| お知らせ|楽し|みたい)|脱が|不倫|痴態|(ド|ド)(m|s|M|S)|股間|出会|割り(切|き)|(既|未)婚|外人|熟年|エロミク|恋人|年(上|下)|GAL|寂しい|歳未満|風俗|モロ|裏.*(DVD|DVD)|なってく|(新|若)妻|(えっち|エッチ|H|H)な|濃厚|過激|エロい.*(人妻))
/dev/null

 まるでエロ辞書である。

続いてサブジェクトにおける文面でありえなさを判断する系。
##### 文面フィルタ
:0
* $DECODED_SUBJECT ?? .*(万人|(ではなく|のは).*です|(まずは.*|か)(?|?)|いますよ|ますね^^|秘密(です|の)|突然.*ごめん|紹介.*遅く|問いません|(スグ|すぐ)にでも|見つかります|自分自身で|とにかく安心|安心の|ここだけ|いくら(で|くらい)|あなた|私と|新着メール|裏側|募集|歓迎|悩.*解決|最速|伺って|最新.*情報|アクセス.*(アップ|収集)|くれる方|人に|いつもご利用|お(届|とど)けします|おいといて|(今(スグ|すぐ)|してね).*(!|!)|補足.*連絡|名様|貴方|当選しました|大好評.*サイト|サマより|単純な作業|スキンケア)
/dev/null


 一見日本語としては自然だがサブジェクトに入ってるのはおかしいだろうという系統。 場合によっては誤判断する可能性もなきにしもあらずだが、自分の場合はたぶん大丈夫だと思われる。

 競馬系。 さほど来ない。
:0
* $DECODED_SUBJECT ?? .*(レース(の|は)|馬券|競馬|的中|天皇杯|馬主|勝(つ|ち))
/dev/null



 ややこしいのが文字化け系統のメール。 ヘッダ内でマルチバイト文字を使っているのにMIMEエンコードせずに生エンコードを入れてくる系統。 今のところ/dev/null行きにはしてないが、しばらく観察してみたところ、たぶん/dev/null行きにしてもよさそう。
:0
* < 50000
* ^Subject:\/.*
{
    :0
    * ^Subject:
    NKF_SUBJECT=|echo "$MATCH"|nkf -g
}

:0
* $NKF_SUBJECT ?? .*(BINARY|Shift_JIS|EUC-JP|cp932|cp51932)
* !^Subject:.*(shift.*jis|euc.*jp|cp932|cp51932)
./spam/test


 nkfでサブジェクトの文字コードを検査、その結果日本語エンコードと思われるのにエンコードの文字列が入ってなければ排除。


 字面だけでは判断しにくい系統もある。
サブジェクトが妙に馴れ馴れしいのになぜかボディにリンクがあるメール。
:0 HB
* < 50000
* $DECODED_SUBJECT ?? .*((ね(ぇ|え)|かな).*(?|?)|してください|考えちゃいます)
* .*http:\/\/
./spam/test


 ついさっき作ったルールなので条件が少ない。 よって、まだ/dev/null行きにはしておらず。 今の条件だと「〜〜かな?」にヒットするようにしているつもりだが、「かなり〜〜?」「ばかな〜〜?」「どうかかなった?」等色々微妙な表現もヒットしてしまう。 そういうサブジェクトでさらにボディ内にリンクがあることはないだろうから、まあ大丈夫だろうが、知り合いがサブジェクトに軽く文言を入れつつ、本文にリンクを入れてくることはありえないこともないので、ちょっと難しいルールかもではある。 見てイライラするスパムメールナンバーワンパターンなので100%/dev/null行きの刑に処したいところが、確実な処理となるとfromでホワイトリストを作ることだがあまりスマートじゃないねぇ。


 有用そうなのが、初対面の紹介、挨拶を含んだご丁寧なサブジェクトな割に、ボディ内にこちらの名前が一切ない失礼なメール。
:0 B
* < 50000
* $DECODED_SUBJECT ?? .*(突然.*ません|まして|といいます|招待|(失礼|もう|申)します|(よろ|宜)しく|ご紹介)
* !? nkf -e | egrep -i '(自分の名前1|自分の名前2|かり〜な等)'
./spam/test


 これも作ったばかりなのでまだ/dev/null行きにはしておらず。 たぶん使えるんじゃないかと。 スパムではなく、本当に失礼な人からそういうメールが来ても排除されるが、それはそれでありかもしれない。


 これも使えそう。 ビジネス風味サブジェクトに合わない変なボディ。
:0 B
* < 50000
* $DECODED_SUBJECT ?? .*((ご|御)連絡|急ぎ.*件で|(様|さま)です|しております|提案|(し|伺い|受け)ました)
* ? nkf -e | egrep -i '(当社のお仕事|ある方は|逆援|主婦です|(既|未)婚|体の相性|セフレ|コミュニティ|招待入|パートナー|シークレット|会える|無料で|もちろん.*無料)'
./spam/test


 あまり本文内で頑張って語句を集めてもキリがなさそうなので、超ありがちなやつを数個入れておくだけにした方がよさそうである。 サブジェクトを見て一見「仕事のメールか?」と疑いそうなメールを排除してくれるのでチェックがだいぶ楽にはなる。


 最後に、ありがちなスパムな文言を直接指定。
:0 B
* < 50000
* ? nkf -e | egrep -i '((不要な方|リンクから).*解除|解除.*願い|無料でお試し|完全無料)'
./spam/test


 このルールも上のと同じく凝るとキリがないので超ありがちなやつだけ。 あまり邪悪でないメーリングリストから来るメールも引っかかるおそれあり。


 というわけでこれらの20数グループのルールでスパムの量がどうなるかといえば、1日200通が10通以下程になる感じ。 まあ、チェックはずいぶん楽になった。


 全体のテキストはこちら(euc-jp)。 中で一部使っているmail-body- emptyというコマンドはグーグルで検索していただいてきたrubyで書かれた空ボディ検査スクリプト。



コメント欄
(投稿なし)

コメントなどありましたらこちらからどうぞ
名前
内容
 ※名前、内容ともに入力必須です
- C'sGallery Blogっぽく見えるシステム3.2 -
小武 (管理人) eta2@tim.hi-ho.ne.jp