トップページ

2006年11月22日

ぜろちゃんねる(0ch BBS Script)掲示板のスパム対策

1ヶ月ほど前から、うちのぜろちゃんねる掲示板に英文スパムが来襲するようになり、当初はDNSブラックリスト(DNSBL/RBL)で対処してたのですが、プロのスパム屋は新しいプロキシを次々と用意してくるわけで、ブラックリストがすべてを網羅できるわけはなく。それでも数が少ないうちはコマメに消してたのだけど、日増しにその数が増えて、やってらんねえ状態になったので、こんなふうにしてみますた、というメモ。

やってることは、2ちゃんねる BBQなどの任意のDNSBLサービスに登録されてるホストからの投稿を弾くのと、日本語文字(Shift_JISの2バイト文字)が本文に含まれない投稿を弾くこと(いわゆるひとつのBanAscii)。後者はURLだけのカキコとかも弾いてしまうわけですが、まあしょうがない。

ぜろちゃんねるスクリプトの改造は正直かなりマンドクセー('A`)わけですが、これなら改造が1箇所で済むし簡単な処理なのだけど、結構効果的なのではなかろうか、と。

追記@2007/01/30

# 0ch BBS Scriptの2005/11/13、2006/02/27、2007/01/24版で確認

# test/module/vara.plファイル内の
# IsRegulation(規制チェック)サブルーチン(2007/01/24版なら296行目あたり以降)内の
# 適当なところ(例えば「# 規制ユーザ・NGワードチェック」とある行の前)に
# 以下の「...」に囲まれている箇所を追加

# エラー番号は既存のものを流用なのでエラーメッセージも既存のもののままです
# それではワケワカランと思われる場合は、test/info/errmsg.cgiに新しい番号とメッセージを追加し
# 以下の「return」の後に続く番号をそれと取り替えるとモアベター

sub IsRegulation
{

...

  # 本文にShift_JISの2バイト文字が含まれていなければ
  # 600エラー(NGワード)

  if ($this->{'FORM'}->Get('MESSAGE') !~ /[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]/) {
    return 600;
  }

  # 本文に<a~>または[url=や[url]が含まれていれば
  # 600エラー(NGワード)

  if ($this->{'FORM'}->Get('MESSAGE') =~ /(<a\b[^>]*?>|\[url(?:\s?=|\]))/i) {
    return 600;
  }

  # メール欄に@が含まれていれば
  # 600エラー(NGワード)

  if ($this->{'FORM'}->Contain('mail','@')) {
    return 600;
  }

  # IPアドレスが以下で指定するDNSBLのいずれかに登録されてれば
  # 997エラー(PROXY規制)
  # ブラックリスト鯖はお好みで

  my @dnsbls = (
    'niku.2ch.net',
    'bsb.spamlookup.net',
    'bbx.2ch.net'
  );

  $ENV{'REMOTE_ADDR'} =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
  foreach my $dnsbl_host (@dnsbls) {
    $dnsbl_host = "$4.$3.$2.$1.$dnsbl_host";
    if (gethostbyname($dnsbl_host)) {
      return 997;
    }
  }

...

}

で、昨日これを仕込んで以降24時間のうちに、以下のようなホストがスパムの投稿にやってきたわけですが、幸いすべて弾けた模様。エラーが103となってるものは「本文長すぎ」で、これは規制チェックより前に実施されるので、これに引っ掛かるヤツもいるのだけど、これで既に結構な数が弾けている。で、600エラーが本文に日本語文字が含まれなかったもの。ここまでですべて弾けてしまい、結局DNSBLのチェックにまではどいつも至ってなかったり。

来襲時刻エラーホスト名#1#2#3#4#5
11/21 20:29103c-71-230-86-217.hsd1.pa.comcast.net     US
11/22 19:13600bzq-84-110-225-57.red.bezeqint.net     IL
11/22 19:13600bzq-84-110-236-82.red.bezeqint.net     IL
11/22 19:12600bzq-84-110-231-119.red.bezeqint.net     IL
11/22 19:12600bzq-84-110-233-25.red.bezeqint.net     IL
11/22 16:4810382.137.247.132yes    SY
11/22 15:00103www.farmington.k12.mi.usyes    US
11/22 13:2210384-123-102-217.onocable.ono.com     ES
11/22 12:11600200.29.137.217yes   yesCL
11/22 12:10600218.236.45.155yesyesyes  KR
11/22 12:05600S01060040ca37ccf6.cn.shawcable.netyesyes   CA
11/22 12:05600avquarantine.sec.kq.noyesyes   NO
11/22 11:23103proxy4-jan.integrity.comyes    US
11/22 10:1710389-149-205-145.internetserviceteam.com yes   DE
11/22 09:51600218.236.111.150yesyesyesyes KR
11/22 09:3710382.137.247.131yes    SY
11/22 07:5010394.190.189.72.cfl.res.rr.com     US
11/22 06:21600ool-44c0fe41.dyn.optonline.net     US
11/22 06:02103adsl-75-52-193-66.dsl.chcgil.sbcglobal.netyes    US
11/22 04:11600bzq-84-110-226-237.red.bezeqint.net     IL
11/22 02:27103ulbcenter-04-b07.it-datacntr.louisville.edu     US
11/22 01:08103riy01che02.ae.net.sayesyesyes  SA
11/22 00:3810364.8.149.34     US
11/21 23:56600bzq-84-110-251-251.red.bezeqint.net     IL
11/21 23:56600bzq-84-110-252-72.red.bezeqint.net yes   IL
11/21 23:55600bzq-84-110-241-44.red.bezeqint.net     IL
11/21 23:31600220.119.158.14yesyesyes  KR
11/21 23:3060086.35.202.101yes yes  RO
11/21 23:29600211.207.215.84yes yes  KR
11/21 23:25600210.113.30.208yesyesyesyesyesKR
11/21 22:5310363-109-248-28.reverse.newskies.netyes yesyes US
11/21 21:1510389-149-205-145.internetserviceteam.com yes   DE

上表の「#1~5」の欄は、各ホストについて以下の各DNSBLサービスでの登録の有無です。

  1. 2ちゃんねる BBQ - niku.2ch.net
  2. SpamLookup - bsb.spamlookup.net
  3. The Spamhouse Project - sbl-xbl.spamhaus.org
  4. SpamCop.net - bl.spamcop.net
  5. RBL.JP - all.rbl.jp

ご覧の通り、どのブラックリストにも登録されていないホストが結構あり、プロのスパム屋に狙われたら、やっぱしDNSBLでの規制だけでは不十分なんだよね、ということですな。

なお、2ちゃんねる BBQはDSBLでの登録状況も併せて応答するので、上表ではDSBLは端折ってます(なので、このふたつを併用するのは無意味です)。また、ちなみにどのホストも、2ちゃんねる BBX(bbx.2ch.net)には登録されていなかったので、こちらも上表では端折ってます。

参考になったり興味深く拝見したページ

以下追記@2007/05/23

Apacheでのアクセス制限

上のような改変やNGワードによる対策は、スパムが来襲するたびにCGIが動作するため、CGIの負荷が制限されている共用のレンタルサーバでは、それで制限オーバーということにもなりかねないわけで。CGIの処理以前に、Apacheのmod_accessmod_setenvifなどで、IPアドレスやUser-Agent(HTTP_USER_AGENT)などで弾けるものは弾いてしまったほうがいいです。

アクセス制限の際にはFiles/FilesMatchで対象ファイルを限定したり、Limit/LimitExceptでメソッドを限定したりするのだけど、多くのスパムは先ず(ぜろちゃんねるの場合)read.cgi/r.cgiをGETして、投稿フォームの内容を拾ってからあらためてPOSTしてきやがるので、うちの場合こうした限定はせずに兎に角アク禁にしてます。

.htaccessなどでのアクセス制限の記述の基本は以下の通り。

Order Deny,Allow

# ----------------------------------------------------------------------
# User-Agentによるアクセス制限
# ----------------------------------------------------------------------

BrowserMatch User-Agentに合致する正規表現その1 spam
BrowserMatch User-Agentに合致する正規表現その2 spam
...
Deny from env=spam

# ----------------------------------------------------------------------
# IPアドレスによるアクセス制限
# ----------------------------------------------------------------------

Deny from IPアドレス(範囲)
...

Order Deny,Allowは、それ以降に出現するDenyディレクティブに合致する場合はアクセス拒否、それ以外は許可(わざわざAllow from allと書く必要はありませぬ)。BrowserMatchはSetEnvIf User-Agentと同じ(大小文字を区別しない場合はBrowserMatchNoCase)。User-Agentが正規表現に合致する場合はspamという環境変数(変数名はなんでもいい)がセットされ、Deny from env=spamで、spamという環境変数がセットされてるホストはアクセス拒否。

BrowserMatch/SetEnvIfのパラメータは正規表現なので、特別な文字(^$.?*+|()[]{}など)の\記号によるエスケープと、スペースを含む場合は引用符で囲むことをお忘れなく。また正規表現の文法は、Apahce 1.3ではPOSIXの拡張正規表現(ヘンリー・スペンサー Henry Spencerによって開発されたhsregex)で、2.0ではPerl互換正規表現(PCRE)です。前者は後者のサブセットなので、前者に慣れてるひとはバージョンを意識する必要はありませんが、Perlや、PHPのPCRE関数(preg_*)などを通じて後者に慣れてるひとは、Apache 1.3の場合要注意です。

IPアドレスによるアクセス制限は、スパムの大半がボットネットによって送信されていると言われる現在では、個別のIPアドレスをマメに登録するのは無意味なわけですが。それでも同じネットワークから大量に送りつけてきやがるバカがいて、そのネットワーク全体をアクセス拒否してしまっても運用上支障がないなら有用ではないかと。

余談:おマヌケなユーザエージェントの皆さん

スパムボットはあれこれUser-Agentを偽装してきやがるわけですが、なかにはおマヌケな輩もいやがるので晒してみる。

User-Agentが空(笑)

BrowserMatch ^$ spam

これはかなりアタマが悪い。しかも送信元は常に同じネットワーク(ホスト名はunknown.hostforweb.com、またはunknown.servershost.net)。しかも大量にやってくる。永らくアク禁にしてるにも関わらず、まったく懲りる様子もなく、未だに相変わらず1日数十~数百回もやってくる、真正のDQN。送信元のネットワークが同じなのでIPアドレス範囲でも弾けるのだけど、あまりにもわっかりやすいUser-Agentなので、こっちで弾くほうがIPアドレスを調べる手間もなく簡単。

「User-Agent」で始まるUser-Agent(笑)

BrowserMatch ^User-Agent: spam

User-Agentが「User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)」みたいな。User-Agentの意味がわかってなくて、設定間違っちゃったんだろうなあ。これまた永らくアク禁なのに、未だにやってくるんだよな。

Category: ウェブ制作
Posted 2006年11月22日 23:38

トラックバック

このエントリーのトラックバックURL:
http://www.rcdtokyo.com/mt/mt-rcdtokyo5428-tb.cgi/789

コメント

コメントをどうぞ



保存しますか?


Aoaka Style Valid Aoaka