5 ポイント 投稿者 GN⁺ 5 시간 전 | 1件のコメント | WhatsAppで共有
  • 2021年、Redditで一時的な不具合と思われる現象により、Relay for redditで通常は Removed: Auto として隠されていたサイト全体のスパム削除理由と内部判定データが露出した
  • 公開アーカイブのコード上では削除情報は ban_info.banner を経由して渡され、RelayはAPIの banned_by=trueAuto に置き換えて表示していたが、同じフィールドに内部理由が入ったことで問題が起きたようだ
  • 露出した理由には domainspammitbanned usershadowbanspamurai などがあり、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_removeadmintools.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 のような文言も削除理由として現れた
  • spammit

    • spammit は投稿を分析してスパム確率パーセンテージを付ける分類に見える
    • 確認された削除事例のスコアは低いもので 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 message
    • t5 はsubreddit
    • perspective 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 revenue0.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 にマッチした可能性がある
  • 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 AIGoogle 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件のコメント

 
GN⁺ 5 시간 전
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” エラーが出て見られない。

    • なぜそうなるのかまったく分からないし、今は iPhone も手元にない。
      誰かが HTML を二分探索してクラッシュ原因を見つけてくれたら、本当にありがたい。
  • 気になる人のために言っておくと、含まれている Perspective API キーは有効ではない。

    • bans (2016 - present) でスパム例として検閲されているコンサルティング会社が Puppygirl Consulting であることから、開発者ツール中毒者なら、検閲されている部分はおそらく偽物かイースターエッグだというヒントを得られる :^)