備忘録のため,内容の正当性については責任を持ちません。

今日から 6 月なので,5 月に届いた迷惑メールの集計結果を発表する。といっても今月から始めたばっかりだけど。


対象

解析の対象は,先月 (2010 年 5 月) に届いた迷惑メール,計 10,745 通。うち,日本語で書かれたものが 2,190 通,そうでないものが 8,555 通だった。ただし,この比率は環境によって変わるため,あまり重要ではない。


集計方法

今回も mbox 形式のファイルを解析するスクリプトを作成した。まず,以下の Perl スクリプト (getsenderip.pl) で,送信元の IP アドレスを求める。

#!/usr/bin/perl

use strict;

my ($flag, $ip);
my (%ips);

$flag = 0;
while (<STDIN>) {
    $_ =~ s/[\n|\r]//g;

    if ($_ =~ /^From /) {
        $flag = 1;
    } elsif ($flag == 1 && $_ eq '') {
        $ips{$ip}++;
        $flag = 2;
        $ip = undef;
        next;
    }

    if ($flag == 2) { next; }
    if ($_ !~ /^Received:/) { next; }
    if ($_ !~ /\[([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\]/) { next; }

    $ip = $1;
}

foreach $ip (keys %ips) {
    print $ip . "\n";
}

これだと,プライベート IP アドレスが振られたコンピュータが送信元だった場合に不都合が起きるが,今回は該当がなかったので考慮していない。

このスクリプトに対して,次のようにして標準入力に mbox を渡すことで,送信元の IP アドレスが出力される。

$ cat thunderbird/other | ./getsenderip.pl
59.98.168.XXX
95.155.40.XXX
41.248.221.XXX
122.168.247.XXX
92.84.204.XXX
  :

さらに,次の Perl スクリプト (getcc.pl) により,IP アドレスから国別コードを求める。詳細は先日のエントリに書いたとおり。

#!/usr/bin/perl

use strict;

my ($cc);
my (%ccs);

my (@ipv4db) = &ip2cc_prepare();

while (<STDIN>) {
    chomp;
    $cc = &ip2cc(*ipv4db, $_);
    $ccs{$cc}++;
}

foreach $cc (sort {$ccs{$b} <=> $ccs{$a}} keys %ccs) {
    print $ccs{$cc} . ',' . $cc . "\n";
}

exit;

sub ip2cc_prepare {
    my ($file) = 'ipv4.txt';
    my (@ipv4db);

    open(FH, $file);
    @ipv4db = <FH>;
    close(FH);

    chomp @ipv4db;

    return @ipv4db;
}

sub ip2cc {
    *ipv4db = shift;
    my ($addr) = shift;

    if ($addr !~ /^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/) { return; }

    my ($d1, $d2, $d3, $d4) = split(/\./, $addr);
    my ($num) = (($d1 * 256 + $d2) * 256 + $d3) * 256 + $d4;

    foreach (@ipv4db) {
        my ($start, $end, $cc) = split(/\t/);
        if ($start <= $num && $num < $end) {
            return $cc;
        }
    }

    return;
}

これにより,件数の降順で件数と国別コードが出力される。

集計結果

日本語で書かれたメールとそうでないものに分けて集計を行った。その結果を以下に示す。

まず,日本語で書かれたメール 2,190 通からは,送信元 IP アドレスが 1,691 件取得できた。3 割弱少ないのは,重複したものを取り除いたためである。その結果を次に示す。

$ cat thunderbird/japanese | ./getsenderip.pl | ./getcc.pl
1442,CN
76,SG
54,PH
37,KR
24,TH
12,MY
9,US
6,TW
6,IN
3,JP
  :

これをグラフにしたものを次に示す。

日本語で書かれた迷惑メールの送信元


このように,2 位のシンガポール (SG) や 3 位のフィリピン (PH) を大きく引き離して,大多数が中国から送られてきたものであることがわかる。

一方,日本語以外で書かれたメール 8,555 通からは,送信元 IP アドレスが 7,798 件取得できた。その結果を次に示す。

$ cat thunderbird/other | ./getsenderip.pl | ./getcc.pl
678,IN
483,CN
454,US
386,BR
340,KR
335,GB
329,RU
267,DE
252,CO
249,NL
  :

これをグラフにしたものを次に示す。

日本語以外で書かれた迷惑メールの送信元


このように,実にカラフルなグラフとなっていることから、ある特定の国から大多数が送信されているのではなく,様々な国から分散して送信されていることがわかる。これは bot から発信されているためだと考えられる。

今回の調査では、日本語か否かを問わず、日本国内から送信された迷惑メールはほとんど見られなかった。これは、もし国内の PC が bot 化したとしても、ISP の Outbound Port 25 Blocking によりメールが送信できないためだろう。

まとめ

今回の調査で,日本語とそうでないものでは,送信元の国にまったく違う傾向が見られることがわかった。国内で迷惑メールをフィルタリングする場合,

  • 日本語で書かれているか否か
  • 送信元の国

を判定基準の一つとして用いることができると考えられる。ただし、日本語でない迷惑メールは様々な場所から発信されているので、送信元以外の基準で判別する必要があるだろう。

コメント

コメントする




CAPTCHA