- FSE運営者は、Fediverseインスタンスに流入した違法ユーザーを追跡する中で、BoardReader/SocialGistによるスクレイピングとFBIの情報要請へと続く流れを、ログとメールで整理した
- 問題の発端は、外部サーバーの投稿までFSEの投稿のように見せていたBoardReaderの検索結果であり、それによって違法ユーザーの流入と誤った帰属が同時に起きたと見ている
- BoardReaderは
User-Agentを隠し、住宅用プロキシ、Tor、ブラウザーセッションの再生を使って/api/v1/timelines/public?local=falseを取得しており、ブロック後もリクエストを繰り返してサーバー負荷とコストを増大させた
- FBIは2023年3月14日、
WitchKingOfAngmarに関するEmergency Disclosure Requestを送ったが、そのアカウントはFSEではなくsneed.socialのユーザーで、添付スクリーンショットもFSEの画面ではなかった
- 運営者は偽タイムラインでBoardReaderのインデックスを汚染した後、特定の文言がFacebookからのリクエスト急増を引き起こすと観察し、2024年のTorswats報道によってFBIの関心事項の一部背景がつながったと見ている
違法ユーザーの流入から始まった追跡
- FSE運営者は、小児性愛関連のユーザーがサーバーに入ってくることを、FSEにとっての存在論的脅威と見なした
- 違法な児童性的搾取物のアップロード、法執行機関の関心、機材押収の可能性が直接的なリスクだった
- 一部のユーザーは複数のサイトに違法物をばらまいたうえで、どのアカウントがブロックされないかを確認する形で動いていると判断した
- IP、メール、
User-Agentなど可能な情報を公開して抑止しようとしたが、効果は大きくなかった
- 多くはファイルをアップロードしたり取得したりした後に去り、ブロックされない場所を探し回るパターンに見えた
- 流入経路を追跡する中で、多くのユーザーの
Refererヘッダーがboardreader.comを指していることが明らかになった
ログで追跡した方法
- 公開インターネットに露出したfediインスタンスを運営するには、ボット、スキャナー、ワーム、異常トラフィックを自ら分析できる必要がある、という前提がある
- ログ分析には
awk、tail -f、mawk -Winteractive、grep、sqlite3、R、sed、sort、psqlなどが使われた
awkはテキストログに対するSQLのようなツールとして紹介されている
dig、whois、traceroute、tcpdump、iftop、Shodan、Tor出口ノード一覧のようなネットワークツールも併用された
- nginxなどWebサーバーのログ形式を変更し、任意のヘッダー、応答時間、バックエンド応答時間などを残した
- FSEのログはタブ区切り形式に近い形にして、
awkやスプレッドシート系ツールで扱いやすくしたという
- 単純な統計も異常検知に使われた
- リクエスト数の平均と標準偏差を計算し、急に跳ねたIP、エンドポイント、リクエストパターンを探した
- ある時点では「POSTリクエストの90%が同じアドレスから来ている」といった判断を、この方法で下した
BoardReader/SocialGistの追跡
- boardreader.comはもともとフォーラム検索ツールで、FSE運営者は、このサイトがfediを正しく理解しておらず、FSEを1つのフォーラムのように扱っていたと見ている
- 他のインスタンスから来た公開投稿まで、
freespeechextremist.comフォーラムの投稿のように表示されていたという
- SocialGistは「accessible social data」を販売していると説明しており、開発者がセルビアにいるというブログ内容と実際のIPが一致したと見ている
- 2023年3月5日、FSEのログにはBoardReaderの明示的な訪問記録はなかったが、
/api/v1/timelines/public?local=falseに対する高速スクレイピングが見つかった
- ブラウザーはChromeだと主張していたが、人間がスクロールする速度よりはるかに速かった
spider1.boardreader.comからspider43までAレコードがあったが、実際のトラフィックは当時DediPath所有のIPである45.15.176.187から来ていたという
- IPブロック後には米国の住宅用IPから多くの試行が続き、運営者はBoardReaderが住宅用プロキシを購入して検知を回避していると判断した
- 2023年3月8日、
awk、iptables、Rubyスクリプトで特定トークンを使うリクエストのブロックを開始した
- その後、セルビアのISPのIPから
devtools.boardreader.comにつながるリクエストが現れた
- このリクエストは通常のブラウザーのようにリソースを読み込み、Bearerトークンを取得してJavaScriptを実行した後、そのトークンでスクレイピングを再開したという
- 429、401、403、500応答を返してみたが、スクレイパーがリクエストをさらに多く繰り返し、事実上DoSになった
- その後
402 Payment Requiredを返し始め、その間TWKNの公開タイムラインへのアクセスは遮断された
SocialGistとのメールのやり取り
- 運営者は2023年3月5日、
info@boardreader.com宛てにクローラー情報を要求した
- 2023年3月13日、
dave@socialgist.comから、何を知りたいのかを尋ねる返信が来た
- 運営者はローカル投稿だけを取得し、BoardReaderを識別する
User-Agentを使うよう求めた
- 自分が所有する全IP範囲をクロール停止対象として伝え、小児性愛関連の流入問題も知らせた
- Daveはエンジニアリングチームに伝えると言ったが、運営者は同じ時間帯にも開発者がスクレイパーをデバッグしていたと見ている
- ログには2023年3月13日、
109.92.154.188からdevtools.boardreader.comを参照するリクエストが残っていた
- 運営者は、SocialGistが停止すると言いながら迂回作業を続けていると判断した
FBIのEmergency Disclosure Request
- 2023年3月14日、運営者は
fbi.govのメールアドレスから、件名がEmergency Disclosure Requestのメールを受け取った
- Special Agent Peter Christensonが
WitchKingOfAngmarユーザーに関する加入者情報を求めていた
- 添付ファイル名は
FSE Screen Shot.PNGだった
- メールヘッダー、メールサーバーログ、
fbi.govのSPF情報を確認したうえで、本物のFBIから来たメールだと判断した
- 添付されたスクリーンショットはFSEの画面ではなかった
- FSEを「forum」と表示し、上部には「Forum • Blackrock Executiv...」が見えていた
- 「kill blackrock」「larry fink」といった検索語がハイライトされていた
- 簡単な感情分析も含まれていた
- 投稿はメールより26日前に作成されていたが、スクリーンショットには「11 hours ago」「13 hours」のような時刻が表示されていた
WitchKingOfAngmarはFSEユーザーではなく、sneed.socialのユーザーだった
- 運営者はFBIに、そのユーザーの情報はFSEにはなく、BoardReaderが「Free Speech Extremist」を付けていたが投稿元はFSEではない、と返信した
- FBI捜査官は誰に問い合わせるべきか尋ね、運営者は元のサーバーを確認するよう案内した
BoardReader、Facebook、FBIへと続いたと見られる流れ
- 運営者は、FBIとBoardReaderが同じ方法でUnicodeを壊しており、外部サーバーの投稿をFSEの投稿のように誤って帰属させていた点が重なると見ている
- 元のUnicodeコードポイント
1f9e2、1f438、1f44dが、無効なUnicodeを意味する疑問符入りの四角に変わっていたという
- この状況をもとに、FBIがBoardReaderのデータを見てFSEに連絡したと判断した
- 2023年3月15日にもBoardReaderはFSEにリクエストを続け、402応答だけを受け取っていた
- 運営者は限定的な公開説明を投稿し、FSEをロック状態に移行した
- アカウントなしではTWKNや公開タイムラインを見られないようにし、登録も閉じた
- 2023年3月16日以降も、BoardReaderは住宅用プロキシ、Tor、リクエストごとに変わる
User-Agentで迂回を試みたという
偽タイムラインとデータ汚染
- 2023年3月24日以降、BoardReaderのスクレイピングと小児性愛関連の流入が続いたため、運営者は偽タイムラインを提供し始めた
- 小さなCGIスクリプトを作り、存在しないアカウントと存在しない投稿を組み合わせたJSONを生成した
- 初期IDはランダムな32ビット数で、後にはリクエスト時刻の一部を混ぜてBoardReader内で追跡しやすくした
- nginxはCGIをサポートしないため、そのエンドポイントへのリクエストをlighttpdへ渡した
- 実装は主に
awkで行ったという
- 投稿の単語リストには、BoardReaderの検索語とCARNIVORE関連の単語リストを混ぜた
- 偽投稿はBoardReaderにインデックスされ、運営者はランダムIDをBoardReaderの検索欄に入れて、FSEのWebサーバーログとインデックス項目を照合した
Facebookリクエスト急増の観察
- 運営者は、偽投稿URLに対してFacebookから大量のリクエストが入っていることをログのヒストグラムで確認した
- 緑/青の
4が多い区間は402応答で、ほぼすべてFacebookからのリクエストだったという
- リクエストURLは偽投稿と一致していた
- BoardReaderがインデックスした直後に、Facebookがその投稿を取得していると見ている
- 偽投稿の単語リストを「larry fink」だけに変えると、Facebookリクエストがほぼ即座に急増したという
- その文言を削除するとトラフィックが減り、止まった
- 再び入れると、BoardReaderのインデックス待ちの後に急増が再開した
- 運営者は流れを、
awk CGI → lighttpd → nginx → BoardReaderクローラー → BoardReaderインデックス → Facebook → FBI内部検索UI、と推定している
- この流れの中で、FacebookがFBIにとってどのようなツールまたは保存場所の役割を果たしていたのかは、最後まで明確ではないとしている
SocialGistを止めた方法
- 帯域超過コストを減らすため、応答を非常に遅くし、タイムアウト直前に終わるよう調整した
- ときどきJSONの末尾を一部切り落として、パース失敗を誘発した
- BoardReaderは一般的なJSONパーサーを使っているように見え、約1分を費やしても有用なデータを得られないと見ていた
- その後、ランダム生成した投稿にDaveの電話番号を入れたところ、翌日Daveが返信した
- DaveはJiraチケットを作成し、まもなく回答すると述べた
- 短いやり取りの後、スクレイピングはすぐに止まったが、FSEがBoardReaderのインデックスから外れるまでには約1週間かかった
Torswats報道でつながった後日談
- 2024年1月18日、Wiredはカリフォルニア州ランカスターのAlan Winston Filionの逮捕を報じた
- 彼はTorswatsに関連する人物で、爆破予告や偽の人質事件など、数百件の虚偽通報を作り出したと報じられたという
- 運営者は、
WitchKingOfAngmarがまさにこのTorswatsだったと見ている
WitchKingOfAngmarは「Lord of the Rings」への言及に見えるという
- TorswatsはLarry Finkに向けた無意味な脅迫的長広舌を頻繁に行っていたため、FBIがLarry Fink関連の脅威に関心を持ったと見ている
- この後日談により、FBIの要請、「larry fink」検索語、Blackrock幹部への脅威に関する関心が一部つながった
- 残る疑問もある
- 現在のBoardReaderが何なのか
- SocialGistがもっともらしい口実としてBoardReaderを使っているのか
- Facebookがこのパイプラインでどのような役割を果たしたのか
- FacebookがFBIにツールを提供しているのか、それともデータ保存場所のように使われているのか
fedi運営者に残した助言
- 運営者は、fediデータが欲しいならスクレイピングではなく、偽インスタンスを作ってリレーにつなぐ方が、サーバーを壊しにくいと述べている
- この方法も不適切だと見ているが、少なくとも相手サーバーを壊さずにリアルタイムでデータを受け取れるという
- 騒々しい一般的なスクレイパーだけが表に出る一方で、ActivityPubソフトウェアやリレーを静かに改変してデータを集める主体には気づきにくいと見ている
- 運営者は、SocialGistがミスをしたから追跡できたのであり、同じことをしながらそうしたミスをしない組織がどれだけあるのかは分かりにくいと警告している
1件のコメント
Hacker News のコメント
ブログ記事のリンクは、デフェデレーションを選んだインスタンスの一覧にしかつながっていない
公式の Fediblock 一覧に行かない理由は、Fediblock が数年前に終了したから。Fediblock の作成者は、どんな形であれ最終判定のように使うのではなく、掲載されたインスタンスの基準を各自の基準と入念に照合するよう明確に述べていた。直感では、筆者は Fediblock の項目にリンクしようとして見つけられず、きちんと確認しないまま最も近いリンクで代用したのだと思う
Fediblock や他のコミュニティ的なブロック機構とはまったく関係ない。ユーザーたちの振る舞いがひどく、管理者が何もしなかったので、これ以上やり取りしたくないと判断しただけ。FSE が何か秘密結社のせいでブロックされていると愚痴るのは滑稽だ。大げさな陰謀がなくても、普通のトロールが自分で他人をいら立たせ、複数のサーバーに切られるよう仕向けることはできる
話は、実際のユーザーを害するので CAPTCHA を導入したくないというところから始まっているのに、その後の80%は公開登録と公開タイムラインがどれほど長く落ちていたか、そしてそれがユーザーにどれほど悪影響を与えたかを扱っている点がよかった
それでも面白い記事だったし、オンラインで他人のためのコミュニティ空間を自分でホストするのは自分には無理だと確信した
この記事には気に入った部分がかなり多い。ある個人が FBI の情報収集/監視装置の一部を把握する市民科学をしており、Fediverse のドラマの断片も出てきて、小規模サーバー運営者向けのシステム管理戦術も興味深い
torswats という人物はかなり厄介者に見え、最終的に逮捕されて興味深いサブプロットになっている。筆者もかなり頭がよさそうで、文体も気に入った。星5つで読む価値がある
別の CEO がわずか6か月前に殺害された事実を考えると、なおさらだ。記事の終盤に行くと、その人物はすでに代理人を通じて数え切れないほどの暴力行為を行っていた。FSE 側の人物が連邦機関とやり取りしたのは幸いだが、脅迫のスクリーンショットを見ても即座に暴力的な人物であるはずがないと仮定するのは、危険な偏りを示している
「FSE が許可したことのない行為を許可したかのように Fediblock が虚偽の印象を与えた」と言いながら、ソースコードが kiwifarms にホストされているウェブサイトにリンクしている
ブロックされた理由は、私たちの大半が「表現の自由」陣営と関わりたくないからで、ほぼそれがすべてだ
良い記事。非常に些細で、あまり意味はなく、もしかすると間違っているかもしれない修正が1つある
内部検索エンジンのスクリーンショットにある「Negative」という言葉を感情分析と見ていたが、実際にはその投稿が検索意図に合わない「ネガティブ」な結果、つまり内部システムで誤検出として報告するボタンだった可能性がありそうだ。この状況で感情分析がそれほど有用だとは思えない
「FSE に小児性愛者が現れた」というのは、Fediverse 全般の問題のように見える。認めるなら Discord も同じだ
この件が Referer ヘッダーのせいで始まったという点が興味深い。ブラウザがデフォルトでサーバーに自分の閲覧履歴の一部を知らせるのは、プライバシー上の問題に見える
記憶が正しければ Tor にはその問題はない
ほとんどのブラウザ、少なくとも関係のあるブラウザは、参照元サイトが設定した referer-policy ヘッダーを尊重する 1。Django のような一般的なサイトフレームワークにも、これを制御するオプションがある 2。ほとんどのユーザーエージェントがこれに従うため、インデックスサイトが望めば、大半のユーザーについてそのヘッダーが送信されないよう簡単に防げたはずだ
スクレイパーを止めるのに、もっと良い技術的方法はなかったのだろうか? リクエストを処理する代わりに、入口で IP やドメインをブロックするような方法だ。それでもリクエストトラフィックの費用は払っていたかもしれない
API エンドポイント向けのサードパーティ DDoS 防御サービス市場はあるのではないか、Cloudflare のようなものだ。ただし「Free Speech Extremist」には適した解決策ではなかった可能性が高いし、費用もかかる。それでも、こういう状況では実際にコストを節約できたかもしれない