Anubis は実際には誰を止めているのか?
(fzakaria.com)- HTTP アクセスの前に**Proof-of-Work(作業証明)**を要求する Anubis は、AI スクレイパーよりも一般ユーザー、低スペック端末、JavaScript 非対応クライアントに、より大きな継続的コストを課している
- LLM が作った anubis-fetch は Proof-of-Work を直接解き、必要なら Chromium を起動し、Chrome の TLS/JA3 フィンガープリントを模倣して Cloudflare の手動ブロックまで通過する
- スクレイパーは発行された Cookie をキャッシュ・再利用して、コストを複数リクエストに分散して償却できるが、人間は訪問のたびに数秒の待ち時間とバッテリー消費を受け入れなければならない
- デフォルト難易度 4 は平均 65,536 回のハッシュを要求し、ネイティブ Go 実装では約 1.3ms、ブラウザ JavaScript では約 130ms かかるが、実際の体感待ち時間は約 1〜5 秒
- 1 回あたりの体感時間を 2 秒、エネルギーを 20J と仮定すると、1 日 100 万回のチャレンジは年間で約 23 人年・2MWh、1 日 1 億回では約 2,300 人年・200MWh を消費する
AI が迂回した Anubis
- Linux カーネルで
binfmt_miscの bpf を通じてインタープリタPT_INTERPに$ORIGINをサポートするパッチを作業している際、LLM に Linux カーネルメーリングリストのスレッドを読むよう依頼した - lore.kernel.org は、リソースアクセスの前に Proof-of-Work を要求する HTTP プロキシ Anubisを導入していた
- LLM はこの制限に対応する anubis-fetch を作成した
- まず Proof-of-Work をネイティブで解き、失敗すると Chromium で URL を訪問する
reqで実際の Chrome の TLS/JA3 フィンガープリントを模倣し、Cloudflare の手動ブロックも通過するanubis-fetch <URL>は HTML を標準出力に出力し、--textオプションは読みやすいプレーンテキストを出力する
- Anubis が狙っている AI やボットは、Proof-of-Work 対応を一度追加すれば容易に迂回できる
- スクレイパーはチャレンジを解いた後に受け取った Cookie をキャッシュ・再利用し、コストを複数リクエストに分散して償却する
- 一方で人間は訪問のたびにスピナーを待ち、バッテリーを消費し、このコストを他のユーザーと分担することはできない
- 低スペック端末やスマートフォンほど負担が大きくなり、JavaScript を使わない w3m・lynx・スクリーンリーダー・RSS リーダーはアクセスできない
- AI を止めようとする仕組みが AI には容易に迂回される一方、人間とオープンな Web にはコストを課し続ける逆進的な負担として機能している
Proof-of-Work が生む時間・エネルギーコスト
- 難易度
dは、ハッシュが持つべき先頭 0 の 16 進文字数であり、解答 1 回あたりの期待作業量はW = 16^d回のハッシュである- 一般的なデフォルト値である難易度 4 は 65,536 回のハッシュを要求する
- 約 50 MH/s のネイティブ Go 実装:約 1.3ms
- 約 0.5 MH/s のブラウザ JavaScript:約 130ms
- ページ読み込み、ワーカー実行、再読み込みを含む体感時間:約 1〜5 秒
- 難易度 5 は 1,048,576 回のハッシュを要求する
- ネイティブ Go 実装:約 20ms
- ブラウザ JavaScript:約 2 秒
- 体感時間:約 5〜15 秒
- 一般的なデフォルト値である難易度 4 は 65,536 回のハッシュを要求する
- 世界全体での 1 日あたりの Anubis チャレンジ解答回数を
C、1 回あたりの体感時間をt = 2秒、画面と CPU を含む端末エネルギーをE = 20Jと仮定する- 年間の人間時間は
C × t × 365 / 3.15×10⁷で計算する - 年間エネルギーは
C × E × 365 / 3.6×10⁶kWh で計算する
- 年間の人間時間は
- この仮定に基づく年間コストは次のとおり
- 1 日 100 万回:約 23 人年、約 2MWh
- 1 日 1,000 万回:約 230 人年、約 20MWh
- 1 日 1 億回:約 2,300 人年、約 200MWh
- すべての数値は大まかな推定値であり、ボットファームや AI ツールは数桁多いエネルギーを使うため、環境問題を主張するための計算ではない
- ロボットにとって時間は制約ではないが、人間の時間は有限であるため、利用者は AI 時代以前には存在しなかった Web サイトアクセス待ちに、集団として相当な時間を費やすことになる
1件のコメント
Lobste.rs のコメント
Anubis が狙っている相手が簡単に無力化できる、という話には同意しにくい。Anubis の主な目的は LLM エージェントやバイブコーディングで作ったプログラムではなく、LLM 企業が使う無差別なウェブスクレイパーを止めること
回避方法はあり、エージェントや LLM を活用することもできるが、大多数のスクレイパーは単純で、運用者も Anubis を導入した少数のサイトまでわざわざ回避しようとはしない。回避コストを少し上げて、収集する価値をなくすことが目的に近い
ただし、この目的には Anubis は過剰設計だ。ボタンを一度押させたうえでアクセス Cookie を発行しても同じ保護効果は得られるし、Apache に実装してみたところ、複雑なプルーフ・オブ・ワークなしでも十分うまく機能した
私のデータマイニング作業でも使っている現代的なスクレイピングツールは、障害物をほぼすべて回避できるほど優秀で、Anubis も簡単に回避できる
非常に特殊な構成なら抜けられるかもしれないが、悪意ある相手ではなく怠惰な相手を止めるのが目的
Anubis はボットをふるい分けるのではなく、クライアントのリクエスト速度を制限するもの
Anubis は AI エージェントのアクセスを防ぐというより、サービス拒否攻撃への防御手段に近く、現実的に AI エージェントを判別してブロックするのも難しい
ただし、モバイル端末で見慣れないサイトを訪れ、JavaScript をオフにしている私のようなユーザーも一緒にブロックする
実際の運用結果を見ると、記事の結論には同意しにくい。ホームラボのウェブサイトを fly.io の公開プロキシと Tailscale のフォワーディングで提供していたところ、Facebook をはじめとするスクレイパーのせいで毎月約20ドルの帯域料金が発生していた
プロキシに Anubis を導入した後、無料枠に戻った。必要なら回避できても構わないし、robots.txt を無視する少数の悪質な主体による大量収集トラフィックの大半をブロックできれば十分
スマートテレビのような低性能デバイスのボットネットを利用するスクレイピング作業には、Anubis のプルーフ・オブ・ワークが実際の障害になり得るように見える。 https://lobste.rs/s/kpaxih/update_on_scraper_situation でもこの問題が少し扱われている
Anubis で最も気になる部分は、オープンウェブとの衝突だ。私のウェブサイトは主に RSS フィードで消費されているが、RSS を Anubis で保護するとフィードが動かず、保護しないとすべてのコンテンツが機械に読みやすい形でスクレイパーにさらされる
このようなプルーフ・オブ・ワークの障壁は、私たちが目指していたオープンウェブやインディーウェブとは根本的に両立しにくい
他人が下した選択を尊重しない態度が露骨に表れている
最も不快なのは、これが CFAA のような法律に明白に違反する行為に見えるにもかかわらず、ほかの犯罪的な DDoS サービスのように身元を隠していること
他人の成果物を盗み、オープンソースコードをロンダリングすることに事業モデル全体を依存している企業が、法律を守ると期待すること自体が滑稽
Anubis は通常 Dillo をブロックしないが、サイト設定によってはブロックされることもあり、これは JavaScript がなければ存在する資格もないという空気を助長するので非常に厄介: https://paste.rs/jNgwd.png
住宅用プロキシに含まれるすべての IP リストを収集・管理し、一定期間ブロックできるか検討中で、ipset ならこの規模に耐えられるかもしれない。ログを見ると、ボットは CSS や画像のような他のリソースは読み込まない一方で、Dillo リポジトリのすべてのコミットにあるすべてのファイルを巡回するため、比較的簡単に識別できる
各サイトでは IP あたり1件のリクエストしか見えなくても、同じ IP が複数のサイトを取得している可能性が高いので、複数回報告された IP をブロックできる。単に接続を切るのではなく、別ポートの案内ページにリダイレクトして、ブロック理由と解決方法を知らせるべき
そうすれば、ブラウザー拡張や携帯電話アプリにリバースプロキシのバックドアを仕込む誘因も減る。ユーザーが実際にブロックされ始めるからだ
IP レピュテーションシステムに依存せざるを得ないのは残念だが、他に効果的な対策はあまり見当たらない。脆弱なデバイスはボットネットのコマンド&コントロールサーバーが取り除かれても、次の攻撃者に再び乗っ取られ、新しいボットネットに組み込まれ得る
記事で「もちろん LLM の助けを借りてこの作業をしている」と述べていたが、それならなぜバイブコーディングタグが付いていないのか気になる
vibecodingタグは pushcx が削除した