概要
- Spigot は、マルコフ連鎖で自動生成した偽ウェブページを大量配信する小規模Webアプリケーション。
- 最近、 ImageSiftBot など画像収集クローラーへの対応として、効率的な偽JPEG画像生成手法を考案。
- テンプレートを利用し、低CPU負荷で「それらしい」JPEGを高速生成。
- 画像データ部にはランダムデータを挿入、クローラーのコスト増加を狙う。
- Pythonによる実装を GitHub で公開、追加の改良も実施。
Spigotによる偽JPEG画像生成の仕組み
- Spigot は、攻撃的なウェブクローラー向けに、マルコフ連鎖で作成した無意味なコンテンツを配信。
- サーバーへの負荷を抑えつつ、毎日100万ページ以上配信実績。
- クローラーの挙動監視のため、アクセスログを定期的に確認。
- 特に正体を隠すクローラー(例: ランダムなUser-AgentやIPアドレス)は、 ボットネット 経由の可能性が高い。
- 新たなクローラー「 ImageSiftBot」が画像を求めて大量アクセスしていることを発見。
偽JPEG画像生成の工夫
-
本来、画像生成や圧縮はCPU負荷が高いが、 JPEGの構造 を活用して低負荷化を実現。
-
JPEGファイルは「構造部分」と「ピクセルデータ部分」に分かれている。
-
既存JPEGから「構造部分」と「ピクセルデータ部分の長さ情報」のみ抽出しテンプレート化。
-
画像生成時は、テンプレートの「ピクセルデータ部分」に ランダムバイト列 を挿入。
-
これにより、見かけ上JPEGとして認識されるファイルを高速生成可能。
- テンプレート選択
- 構造部分の出力
- ピクセルデータ部分はランダムデータで埋める
実装と効果
- サイト内の514枚のJPEGからテンプレートを抽出、合計500KB未満のデータセットを作成。
- 1秒間に約900枚の偽JPEG画像(1枚200-300KB)を生成可能。
- 画像はURLからランダムシードを生成し、同じURLなら同じ画像を再現。
- ImageSiftBot は1日で約15,000枚の偽画像を取得、今後さらに増加見込み。
- MetaのbotやAmazonBot、GPTBotも反応。
JPEGデコーダとHuffmanコード対策
- 純粋なランダムデータではJPEGデコーダがエラーを検出する場合あり。
- Huffmanコード の構造に注目し、ピクセルデータ部分の各バイトに 0x6D をAND演算で適用。
- これにより、連続する1ビット列が減り、不正なHuffmanコード生成確率を90%以上から4%未満に低減。
- 完全なHuffman符号列生成も可能だが、CPU負荷増大のため採用せず。
公開と今後
- 偽JPEG画像生成用Pythonクラスは 100行未満、GitHubで公開済み。
- 今後、コードのコメント追加や整理を予定。
- 目的は「自分の負担を最小化し、悪質クローラーの負担を最大化」すること。
まとめ
- Spigot は、悪質クローラー対策として低コストで偽JPEG画像を大量生成・配信する仕組みを実現。
- JPEGファイル構造の理解とランダムデータの活用で、サーバー負荷を抑えつつクローラーの解析コストを増加。
- シンプルな実装ながら十分な効果、今後も改良と公開を継続予定。