A peek into Reddit's anti-spam internals
AI 深度解读
背景
Reddit 作为全球最大的社区论坛之一,每天面对海量的垃圾信息(spam)攻击。一名安全研究人员通过分析 Reddit 公开代码、实际测试和 API 调用,深入探究了其反垃圾系统的内部工作机制。这篇博客文章记录了研究人员的发现,涵盖从基础的帖子删除逻辑到 Google Perspective API 的垃圾评分机制,以及攻击者如何尝试绕过这些防护。
核心内容
Reddit 的审核与删除机制
研究人员首先展示了 Reddit 后端的审核代码。当一个链接、评论或版主邮件被删除时,系统会调用 POST_remove 方法,并通过 admintools.spam 函数处理。关键参数包括 auto(是否为自动删除)、moderator_banned(是否由版主封禁)以及 banner(执行操作的管理员用户名)。
在获取帖子审核属性时(get_mod_attributes 函数),系统会区分几种情况:如果帖子被标记为垃圾(_spam 为真),且由版主封禁,则显示封禁者用户名;如果由管理员(admin)封禁,则隐藏封禁者名称(仅显示 banned_by: True);如果帖子被恢复(unban),则记录恢复者信息。
在前端展示层面,代码片段显示:当 bannedBy 字段为字符串 "true" 时,前端显示为 "Auto"(自动审核);当为 "null" 时,显示为空字符串。这说明 Reddit 在 UI 层面对不同类型的删除操作做了差异化展示。
域名封禁系统
Reddit 维护着一个被禁域名列表。当用户提交链接时,系统会调用 is_banned_domain 检查 URL。如果域名在黑名单中,帖子会被自动标记为垃圾,banner 显示为 "domain (封禁原因)",并触发 spam.domainban.link_url 统计事件。研究人员列举了一些被禁域名的示例,包括 Conga!、domain (2012 - present)、spammit (2012 - present)、bans (2016 - present)、shadowbans (2016 - present)、spamurai (2020 - present) 等,其中不乏明显的垃圾站点和讽刺性命名。
Perspective API 的垃圾检测
Reddit 使用了 Google 旗下 Jigsaw 团队开发的 Perspective API 来评估内容的垃圾概率。研究人员通过实际调用 API 展示了其工作方式:
- 输入
"18 Random Facts That Will Blo"返回垃圾概率 0.126(低概率) - 输入
"Puppygirl Consulting is the best way to grow your revenue"返回 0.864(高概率) - 输入
"Hi there, please call my work phone at 567890"返回 0.814(高概率,疑似电话号码引流) - 输入
"привет"(俄语"你好")和"наххуи"(俄语脏话)均返回 0.351(中等概率,说明 API 对非英语内容判断力较弱) - 输入
"Buy my product"返回 0.647
绕过尝试:大小写与同形字攻击
研究人员测试了多种绕过手段:
大小写变换:将 "Hi there, please call my work phone at 567890" 改为全大写变体 "hi THEre, pleaSE Call my woRk phonE aT 022102",API 返回的评分完全相同(0.814),说明 Perspective API 对大小写不敏感。
同形字(Homoglyph)攻击:将 "Buy my product" 中的字母 p 替换为西里尔字母 р(视觉上几乎相同),变为 "Buy my рroduct",垃圾概率从 0.647 降至 0.445,成功降低了评分。这表明视觉欺骗手段可以部分绕过基于文本的机器学习检测。
后缀追加:研究人员遍历了所有双字母组合追加到查询末尾,发现追加 "qp" 后,"Puppygirl Consulting..." 的垃圾概率骤降至 0.011(几乎为零)。这意味着在文本末尾添加特定字符组合可以显著干扰分类器的判断。
影子封禁(Shadowban)
代码中出现了 shadowbans (2016 - present) 条目,表明 Reddit 使用影子封禁机制——被影子封禁用户的帖子对其他用户不可见,但用户本人并不知情,仍可继续发帖。
多语言与编码问题
研究人员使用 unidecode 库将韩文 "레인보우 대시 프레젠츠 26화 토렌.트 150927 26화 torrent HD 고화질" 转写为拉丁字母 "reinbou daesi peurejenceu 26hwa toren.teu 150927 26hwa torrent HD gohwajil",展示了攻击者如何利用非英语内容(如韩文、俄文)发布垃圾信息,而 Perspective API 对此类内容的检测能力明显不足。
其他发现
- Reddit 的
body_match函数用于匹配特定关键词(如"some bad text"),匹配成功后对用户执行操作。 - Perspective API 提供
doNotStore参数,允许请求方要求不存储评论数据,但默认情况下服务可能存储内容用于调试。 - Reddit CTO Chris Slowe 曾引用过
"18 Random Facts That Will Blo"作为低分示例。 - 研究人员还发现了 Google Analytics 追踪代码(UA-49307539-2)被嵌入到某些页面中。
关键要点
- Reddit 区分管理员与版主封禁:管理员封禁时隐藏执行者身份,版主封禁时显示用户名。
- 域名黑名单是自动防线:被禁域名提交的链接会被自动标记为垃圾,并记录封禁原因。
- Perspective API 是核心检测工具:由 Google/Jigsaw 开发,返回 0-1 的垃圾概率分数,Reddit 据此辅助判断内容是否为垃圾。
- API 对非英语内容判断力弱:俄语、韩文等非英语内容即使语义不同也可能获得相同评分。
- 同形字攻击有效:用视觉相似的西里尔字母替换拉丁字母可显著降低垃圾评分。
- 特定后缀可干扰分类器:在文本末尾追加特定字符组合(如
"qp")可将高概率垃圾文本降至接近零。 - 大小写变换不影响评分:Perspective API 对大小写不敏感,无法通过大小写变换绕过。
- 影子封禁机制存在:Reddit 使用影子封禁限制垃圾账号的可见性而不通知用户。
- 数据隐私存疑:Perspective API 默认可能存储提交的评论内容,虽有
doNotStore参数但需主动设置。
意义与影响
这篇文章揭示了大型社交平台反垃圾系统的实际运作方式及其局限性。Reddit 的反垃圾体系是一个多层防御系统:从底层的域名黑名单、关键词匹配,到机器学习模型(Perspective API)的自动评分,再到人工版主审核。然而,研究表明这套系统存在可被利用的弱点。
同形
