こんにちは、4月ではや5年目になります、開発部の茶谷です。
約2年ぶりの投稿になります...😳
はじめに
さて、最近のスパムメールは私達をだまそうと非常に巧妙になってきています。
スパムメールはどのようにして「スパム」であると判定するのでしょうか?
その判定技術のうちの1つに、ベイジアンフィルタがあります。
これは統計学で使われるベイズの定理をもとに、メールに含まれる単語などの特徴からスパムであるかを判別する方法です。
具体的には、過去に受信したメールを学習用データとして、「スパム」か「非スパム」に分類し、
新しいメールを受信したときに、どちらに近いかを確率的に判断します。
単語を使って行う場合は、そのメールに含まれる単語の登場頻度などを調べ、それがスパムメールである確率を計算します。
スパムメールである確率が、通常のメールである確率より高ければ、そのメールをスパムメールとして扱います。
どんなメールだったのか
今回見つけたメールはこんな感じのメールでした。
一見すると何の変哲もないスパムメールです。
しかし、ここでHTMLソースを確認してみると、スパムメール送信者の「工夫」が見えてきます。
謎の文字列がfont-size: 0pxで大量に埋め込まれているのがわかりますね。
なぜこのようなメールになっているのか
なぜこのようなメールになっているのか。
それは、先ほど触れたベイジアンフィルタの判定を力技で回避するためです。
確<font style="font-size:0px;">x</font>認してください
HTMLメールを上記のように記述すると、以下のような現象が起こります。
- 人間が見る画面: 0px の文字は表示されないため、「確認してください」と読める。
- 機械(フィルタ)が読む文字: 「確x認してください」という文字列として認識される。
もしフィルタが「『確認』という単語が入っていたらスパムの可能性が高い」と学習していても、間に別の文字を挟むことで単語を分断し、検知をすり抜けようとするわけです。
また、見えない場所に「ニュース記事」や「挨拶文」など、スパム判定されにくい(=日常的な)単語を大量に埋め込むことで、メール全体の「スパム確率」を強引に下げるという手法も存在します。
終わりに
実際のメールの中身を覗いてみると、スパム判定を避けるためにこんな工夫をしているのかと、妙に感心してしまいました。
実際のスパムフィルタリングでは、font-size:0 pxで指定されている文字を除外(クリーニング)することで、対策を対策していたりしていると思われますが、スパムメール送信者もあの手この手ですり抜けようといたちごっこを続けているのでしょう...
こうして裏側を解析するのはエンジニアとして面白いものですが、皆さんは不審なメールは決して開かないように十分注意してくださいね。


