今日から 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 によりメールが送信できないためだろう。
まとめ
今回の調査で,日本語とそうでないものでは,送信元の国にまったく違う傾向が見られることがわかった。国内で迷惑メールをフィルタリングする場合,
- 日本語で書かれているか否か
- 送信元の国
を判定基準の一つとして用いることができると考えられる。ただし、日本語でない迷惑メールは様々な場所から発信されているので、送信元以外の基準で判別する必要があるだろう。
コメント