Spigotが生成する偽のJPEG画像でWebクローラーを困らせる新手法
フォトジェニックな偽サイト:JPEGの詐称生成 2025年3月25日:偽のJPEG生成 Spigotは、Webクローラーの行動を観察するための小さなWebアプリケーションです。このアプリは、Markov Chainを利用して意味不明なコンテンツを生成し、激しいアクセスを受けるウェブページの階層構造を作り出します。最近、毎日100万台以上を提供しているにもかかわらず、そのログをチェックしてみると、多くのクローラーがIDを隠すためにランダムなブラウザ署名を使用していたことがわかりました。これは、おそらく数千台のデバイスを違法に利用するボットネットによるものであると考えられます。 2週間前、新しい大規模なクローラー「ImageSiftBot」が現れました。しかし、Spigotのページには画像は含まれていませんでした。それでも、ImageSiftBotは毎時間数千回のリクエストを送り、画像を探していました。この無駄な探し方に同情し、Spigotのサーバー負荷を使いこなし、クローラーを騙す方法を考え始めました。 画像を生成するとCPU負荷が増えるため、既存のJPEGファイルの構造を利用することにしました。JPEGファイルは、サイズ、色深度などの「構造化」部分と、圧縮されたピクセルデータの「非構造化」部分で構成されています。ピクセルデータの領域にランダムデータを挿入すれば、クローラーから見れば正当なJPEGと認識されるはずです。しかし、ランダムデータをそのまますると、Huffman符号化の構造が壊れ、解码時にエラーが発生します。 そこで、既存のJPEGファイルから「Comment」チャンクを削除し、「Pixel Data」チャンクの長さだけをメモしてテンプレートを作成しました。514枚のJPEG画像(合計約150MB)をスキャンした結果、テンプレートデータセットは500KB未満に収まりました。これにより、さまざまなサイズや色深度のリアリティックなテンプレートが得られました。 Pythonでのテストコードを作成し、ランダムデータを「Pixel Data」チャンクに挿入することで、偽のJPEG画像を生成できることが確認されました。ほとんどのJPEGビューアがこれらのエラーのあるデータを受け入れ、画像として表示します。エラーが発生しても、クローラーはデータを取得して解码してからしかそのことに気づけません。これにより、クローラーのコストを増加させることができます。 生成の効率について見ると、私のWebサーバーでは秒間約900枚(約190MB/秒)の偽JPEG画像を生成することができます。これは、サーバーのインターネット接続速度よりもはるかに速く、高効率な方法だと言えます。 現在、Spigotが生成するページの約60%にこれらの偽JPEG画像を含めるように設定しています。URLに基づいて乱数をシードすることで、同じURLから生成される画像が常に同じになるようにしました。ImageSiftBotは、今日約15,000枚の偽JPEG画像を取得し、今後数日のうちにさらに取得量が増えると予想されます。Metaのボット、AmazonBot、GPTBotも同様に興奮しています。 近々、このPythonクラスをGitHubに公開する予定です。Huffman符号化の詳細について検討し、ランダム生成データに0x6Dのビットマスクを適用することで、3つ以上の連続する1の出現を防ぎ、無効なHuffmanコードの生成確率を大幅に抑えました。 業界関係者のコメント: 「Spigotのようなツールの使用は、違法なWebクローリング行為に対する有効な対策であり、サーバーリソースの保護に貢献しています」と、セキュリティ専門家は述べています。また、Spigotの開発者は、「このプロジェクトは、Webの健全性を維持するための一環であり、引き続き改善を続けていく予定です」と語りました。