Redditのアンチスパム内部をのぞく
(lyra.horse)- 2021年、Redditで一時的な不具合と思われる現象により、Relay for redditで通常は
Removed: Autoとして隠されていたサイト全体のスパム削除理由と内部判定データが露出した - 公開アーカイブのコード上では削除情報は
ban_info.bannerを経由して渡され、RelayはAPIのbanned_by=trueを Auto に置き換えて表示していたが、同じフィールドに内部理由が入ったことで問題が起きたようだ - 露出した理由には
domain、spammit、banned user、shadowban、spamurai などがあり、spamuraiにはアカウント年齢、karma、通報数、ISP、メールドメイン、User-Agent、言語ヘッダー、TLSフィンガープリント、referrer、Perspective APIスコアまで含まれていた - Google Perspective API のSPAMスコアとReddit削除ログの値はほぼ一致しており、短い文字の追加・キリル文字への置換・大文字小文字や数字の無視といった特性により、スコアが大きく揺れる事例が確認された
- Redditのアンチスパムは、Python 2.7ベースの検査、LuaルールベースのREV1/REV2、Snooron、OCR・画像分類ツールが混在する多世代システムに見え、2026年にはPerspective API終了とLLMベースのスパム変化により公開リスクは低くなったと判断している
2021年に明らかになった削除理由
- Redditのモデレーターだったユーザーは、2021年にRelay for redditアプリで削除済みスパム通知を受け取った際、通常は見えないはずのアンチスパム内部メッセージを確認した
- 一般的なモデレーター画面では自動スパム削除は
Removed: Autoのように表示されるが、当時は実際の削除理由と内部データが赤いテキストで表示された - この現象は約1時間後に正常へ戻り、残っている資料は当時撮影されたスクリーンショットだけだ
Redditのモデレーションと Auto 表示の仕組み
- Redditの下位コミュニティであるsubredditでは、コミュニティモデレーターが投稿削除、ユーザーBAN、modmail管理などを担う
- モデレーターは投稿やコメントが誰によって削除されたかを確認できる
- 通常のモデレーター削除はモデレーター名で表示される
- AutoModeratorによる削除は
AutoModeratorと表示される - Redditのサイト全体スパムフィルタや管理者による削除は
Autoと表示されることがある
- モデレーションログでは、サイト全体の削除は
redditまたはAnti-Evil Operationsとして表示される
公開アーカイブコードから見た露出経路
- Redditは2017年までソースコードを公開しており、そのアーカイブコードから削除処理フローの一部を追跡できる
- モデレーター削除関数である
POST_removeはadmintools.spamを呼び出すmoderator_bannedは削除主体がモデレーターか管理者かを区別するbannerは削除操作を実行したユーザー名を記録する
get_mod_attributesは削除された項目のban_infoをAPIレスポンスとして出力する- モデレーターが削除した場合は
bannerの値をbanned_byとして返す - 管理者が削除した場合は実名の代わりに
Trueを返す
- モデレーターが削除した場合は
- Relay for redditは逆コンパイルされたコード上で、
bannedByが"true"ならこれをAutoという文字列に置き換えて表示していた - Redditにはリンク投稿時に禁止ドメインを検知すると
banner = "domain (REASON)"のように内部理由をbannerフィールドに入れるコード経路もあった - 内部削除理由が入った
bannerフィールドは本来サイト全体管理者にだけ見えるべきだったが、類似コード経路の不具合によりモデレーターへ露出したと推定される
露出した削除理由の分類
-
domain- ドメインベースの削除は公開コードでも確認できる分類だ
- 大半は
Removed: domain (spam)という形式だったが、具体的なメモが付く場合もあった - Tumblr関連スパムの実験のため、2012年に特定ドメインを削除した事例があった
le sexxxxy sex spamのような文言も削除理由として現れた
-
spammitspammitは投稿を分析してスパム確率パーセンテージを付ける分類に見える- 確認された削除事例のスコアは低いもので 39.71%、高いものでは 98.19% だった
- 該当subredditでは正常なImgur投稿ですら70〜98%のスパムスコアで削除された例が多く、精度は高くなさそうだった
-
BAN済みユーザーとshadowban
Removed: banned userまたはRemoved: Reddit (banall performed)という形式の削除があった- それらの事例は大半が広告サービスへのリンクなど、明白なスパム投稿だった
- shadowbanされたユーザーの投稿は
Removed: Reddit (shadowban applied on 日付)のように表示されていた - shadowbanは、本人には書き込みを続けられるように見える一方で、他人には投稿やコメントが見えないサイレントBANだ
spamuraiが明かした内部判定データ
- spamurai は露出した分類の中で最も多くの内部データを含む項目だ
- 公開発表資料では、Redditは「ML」にMinsky、「Rules」にSpamuraiを使うとされている
- spamuraiの削除理由には単純なルールと詳細なデータダンプが併記されていた
echelonというサブシステムらしき名前が、特定キーワード削除に現れていた- 30分未満のアカウントがスパム条件に合うコメントを投稿した際に削除した事例があった
- 怪しいTシャツ提携スパム、URLのみのコメント、高いPerspectiveスコアのコメントなど具体的ルールが見えていた
-
spamuraiデータダンプの項目
link t3_...またはcomment t1_...はRedditのfullname IDだt1はコメントt2はユーザーt3は投稿t4はprivate messaget5はsubredditperspective spam値はGoogle Perspective API のSPAMスコアであることが確認された- アカウント関連データが含まれていた
- アカウント年齢
spammyスコア- karma
- 通報数
- メールドメイン
- ISPまたは組織名
- 接続・環境データも入っていた
oauth.reddit.com使用有無- User-Agent
- 言語ヘッダー
LANG - referrer
- ブラウザフィンガープリントと思われる
RHS - TLSフィンガープリントと思われる値
- サムネイルURL
- 投稿またはコメント本文
- 元のRedditリンク
Perspective APIと回避可能性
- Redditログの
0.12571795 perspective spamという値は、Perspective API のSPAM属性呼び出し結果と事実上一致する - 同じテキストでPerspective APIを呼び出したところ
0.12571794が返り、差は 0.00000001 で丸め誤差と見なせる - Perspective文書のスコア例の形式や、Reddit CTOの事例言及も、RedditがPerspectiveを使っていた状況証拠として挙げられている
- PerspectiveのSPAM属性は毒性検出ではなくスパム検出のためのexperimental属性で、New York Timesコメントとモデレーションデータの単一データセットで学習されたとされている
- 2026年2月以降、Google Cloudでは新しいPerspective APIプロジェクトを作成できなくなり、新規検証は難しくなっている
-
SPAMスコアの敏感な変化
- PerspectiveのSPAMスコアは数文字追加しただけでも大きく変わる事例があった
Puppygirl Consulting is the best way to grow your revenueは 0.8638981- 後ろに
qpを付けると 0.010811162 まで下がる - 数字や大文字小文字は無視されているような結果が出た
- 電話番号の数字や大文字小文字を変えても同じスコアが返った
- 一部の別文字体系も同じスコアとして処理された
- 異なるキリル文字列が同じ 0.35077864 のスコアを受けた
Buy my productのラテン文字pをキリル文字рに変えると、スコアは 0.6473346 から 0.4452748 に下がった- 公開APIを基準にメッセージを少しずつ変えれば、spamuraiの主要判定基準の1つを回避できた可能性がある
ユーザー通報とモデレーター承認の反映
- spamuraiはユーザー通報も削除ルールに反映しているように見える
REPORT: High spam perspective score on comment with hyperlink reported for spamという理由は、スパムとして通報されたハイパーリンク付きコメントのPerspectiveスコアが高く、削除され、モデレーターが再承認できることを示している- 特定の削除理由には「モデレーターがこのコンテンツを承認すれば今後の削除が減る」という文言が含まれていた
- Reddit公開コードの
admintools.spamにあるtrain_spam引数は、モデレーター操作をアンチスパム学習に使うかどうかを決める - subredditで正常投稿を承認すると、false positive削減に影響する可能性があると解釈できる
その他の削除ルールとURL検査
- Pinterestリダイレクトリンク、
mega.nzリンク、自由に作成できるsubdomain関連リンクも削除された事例があった mega.nzリンク削除の中には、実際にはYouTubeアーカイブ動画リンクだった正常事例もあり、誤検知があったMatched forbidden regex u'torenteu'の事例では、本文に直接torenteuがなくても削除された- Redditは
unidecodeを使ってUnicode文字列をASCIIへ変換する 토렌.트が変換と追加処理を経てtorenteuにマッチした可能性がある
- Redditは
Failed inspection: Phrase(s) [u'UA-49307539-']の事例は、コメント本文や変換済みテキストではなく、リンク先でリダイレクトされたページのHTML内にあるGoogle Analytics IDとマッチしたものと見られるinspectionはRedditがURLを開き、リダイレクトをたどったうえでページ内のパターンを探す動作に見える- テストアカウントでその文字列を置いたWebページへのリンクを投稿すると、5年もののアカウントが即座にBANされ、投稿履歴が削除された
- より活動履歴の多い友人アカウントでは同じ再現は起きなかった
- そのフィルタがまだ有効か、アカウントBANが偶然かは確実でないため、実際の文字列は変更して公開している
過去と現在のRedditアンチスパム構成要素
- Reddit Engineeringの2023年の記事 Protecting Reddit Users in Real Time at Scale にはRule-Executor-V1、REV2、Snooronが登場する
- 理解したタイムラインは次の通り
- REV1は2016年に作られた
- Snooronは2021年にREV1を近代化するため開発された
- その後およそ2年でREV2へ移行した
- REV1とREV2はLuaルールで動作し、
nilのような文字列や時期的な一致からspamuraiと接続している可能性がある u'torenteu'、u'UA-49307539-'のようなPython 2.7 Unicode文字列は、spamurai外部のPython 2.7ベース検査コード、またはREV1が呼び出す別URL検査コードである可能性がある- Snooronは関連発表によればFlink Stateful Functions上で動作し、画像分類とOCRを行い、workerにはPython 3を使う
- 2024年時点でRedditはAustralian eSafety文書において、OCRと画像・動画分類に Hive AI と Google Vision OCR API を使用していると明らかにしている
- Hive OCRは12言語をサポートし、Google OCRはより多くの言語対応のため併用され、Redditは80言語をサポートする内部ツールも開発中とされている
- 2009年のticketでは
crm114という、モデレーター学習が可能なスパムフィルタが確認されており、CRM114 は古いオープンソースのスパム分類ソフトウェアだ
2026年に公開した理由
- 2021年にこの情報を公開していたなら、Redditのスパム問題に致命的だった可能性があると判断している
- 2026年には Perspective API is shutting down にある通り年末終了予定で、Redditが使い続けていたとしても近く移行が必要になる
- LLMがスパム産業を変えたため、Redditは2026年に向けてアンチスパムシステムを大きく改修しているだろうと判断している
- こうした理由から、2026年現在ではこの情報公開のリスクは低いと見ている
1件のコメント
Lobste.rs の意見
興味深い資料と研究。結論でも述べられているように、こうした悪用防止メカニズムの詳細を見られる機会は少ないが、特に目を引いたのは Lyra ならではの巧みな CSS だった。
再構成された Reddit UI の検閲バーと赤い丸は、最初はスクリーンショットのように見えたが、実際には完全に操作可能なモックアップだった。
新しいブログ記事が出るたびにいつも楽しみにしている。内容も本当に興味深いし、別の UI を再現する腕前も見事。
これまでにイースターエッグを少なくとも1つは見つけた。
自分のアカウントで試すために、Web サイトに
<pre>UA-49307539-2</pre>という文字列を載せて Reddit にリンクしたところ、5年もののテストアカウントが即座に停止され、投稿履歴もすべて削除されたというくだりはかなり強烈だった。そのため実際の番号は、アカウントを殺せるテキストを公開しないよう
UA-49307539-に変えたとのことだが、そのアカウントが本当にテスト用で、重要なものが何もなかったことを願う。iPhone 16 Pro の最新 iOS 開発者ベータでモバイル Safari から開こうとすると、
<url>で “a problem repeatedly occurred” エラーが出て見られない。誰かが HTML を二分探索してクラッシュ原因を見つけてくれたら、本当にありがたい。
気になる人のために言っておくと、含まれている Perspective API キーは有効ではない。
bans (2016 - present)でスパム例として検閲されているコンサルティング会社がPuppygirl Consultingであることから、開発者ツール中毒者なら、検閲されている部分はおそらく偽物かイースターエッグだというヒントを得られる :^)