ส่องเบื้องหลังระบบแอนติสแปมของ Reddit
(lyra.horse)- จากอาการที่ดูเหมือนเป็นข้อผิดพลาดชั่วคราวของ Reddit ในปี 2021 ทำให้ เหตุผลการลบสแปมระดับทั้งเว็บไซต์ และข้อมูลการตัดสินภายในที่ปกติถูกซ่อนเป็น
Removed: Autoใน Relay for reddit ถูกเปิดเผยออกมา - จากโค้ดอาร์ไคฟ์ที่เปิดเผย ข้อมูลการลบถูกส่งผ่าน
ban_info.bannerและ Relay จะแสดงbanned_by=trueจาก API เป็น Auto แต่ดูเหมือนจะเกิดปัญหาเมื่อฟิลด์เดียวกันนั้นมีเหตุผลภายในถูกใส่เข้ามา - เหตุผลที่ถูกเปิดเผยมีทั้ง
domain,spammit,banned user,shadowban, spamurai เป็นต้น โดย spamurai มีข้อมูลอย่างอายุบัญชี, karma, จำนวนรายงาน, ISP, โดเมนอีเมล, User-Agent, language header, ลายนิ้วมือ TLS, referrer ไปจนถึงคะแนนจาก Perspective API - คะแนน SPAM ของ Google Perspective API เกือบตรงกับค่าในล็อกการลบของ Reddit และพบกรณีที่คะแนนแกว่งอย่างมากจากคุณลักษณะอย่างการเพิ่มตัวอักษรสั้น ๆ, การแทนที่ด้วยอักษรซีริลลิก, และการเพิกเฉยต่อการพิมพ์เล็กใหญ่กับตัวเลข
- ระบบแอนติสแปมของ Reddit ดูเหมือนเป็นระบบหลายยุคที่ผสมทั้งการตรวจสอบบน Python 2.7, REV1/REV2 แบบกฎบน Lua, Snooron และเครื่องมือ OCR/จัดหมวดหมู่ภาพ และในปี 2026 ผู้เขียนมองว่าความเสี่ยงจากการเปิดเผยลดลงแล้วเพราะ Perspective API จะยุติบริการและสแปมก็เปลี่ยนไปตามยุค LLM
เหตุผลการลบที่ถูกเปิดเผยในปี 2021
- ผู้ใช้รายหนึ่งซึ่งเคยเป็นผู้ดูแล Reddit พบ ข้อความภายในของระบบแอนติสแปม ขณะได้รับการแจ้งเตือนสแปมที่ถูกลบในแอป Relay for reddit เมื่อปี 2021 ทั้งที่ปกติไม่ควรมองเห็น
- ในหน้าจอผู้ดูแลทั่วไป การลบสแปมอัตโนมัติมักแสดงเป็น
Removed: Autoแต่ในตอนนั้นกลับมีเหตุผลการลบจริงและข้อมูลภายในแสดงเป็นข้อความสีแดง - อาการนี้กลับเป็นปกติหลังจากนั้นราวหนึ่งชั่วโมง และหลักฐานที่เหลืออยู่มีเพียงภาพหน้าจอที่ถ่ายไว้ตอนนั้น
การดูแล Reddit และวิธีแสดง Auto
- ใน subreddit ซึ่งเป็นชุมชนย่อยของ Reddit ผู้ดูแลชุมชนจะรับผิดชอบการลบโพสต์, แบนผู้ใช้, จัดการ modmail เป็นต้น
- ผู้ดูแลสามารถเห็นได้ว่าโพสต์หรือคอมเมนต์ถูกลบโดยใคร
- หากผู้ดูแลลบเอง จะแสดงชื่อผู้ดูแล
- หาก AutoModerator ลบ จะแสดง
AutoModerator - หากตัวกรองสแปมระดับทั้งเว็บไซต์หรือผู้ดูแลระบบของ Reddit ลบ อาจแสดงเป็น
Auto
- ในบันทึกการดูแล การลบระดับทั้งเว็บไซต์อาจปรากฏเป็น
redditหรือAnti-Evil Operations
เส้นทางการเปิดเผยจากโค้ดอาร์ไคฟ์สาธารณะ
- Reddit เปิดซอร์สโค้ดไว้จนถึงปี 2017 ที่ source code และจากโค้ดอาร์ไคฟ์นี้สามารถตามรอยบางส่วนของลำดับการลบได้
- ฟังก์ชันลบโดยผู้ดูแล
POST_removeเรียกadmintools.spammoderator_bannedใช้แยกว่าเป็นการลบโดยผู้ดูแลชุมชนหรือผู้ดูแลระบบbannerใช้บันทึกชื่อผู้ใช้ที่ทำการลบ
get_mod_attributesส่งban_infoของรายการที่ถูกลบออกไปใน API response- ถ้าผู้ดูแลชุมชนลบ จะคืนค่า
bannerเป็นbanned_by - ถ้าผู้ดูแลระบบลบ จะคืนค่า
Trueแทนชื่อจริง
- ถ้าผู้ดูแลชุมชนลบ จะคืนค่า
- จากโค้ดที่ถอดกลับของ Relay for reddit หาก
bannedByเป็น"true"แอปจะแปลงไปแสดงเป็นสตริงAuto - ใน Reddit ยังมีเส้นทางโค้ดที่เมื่อตรวจพบโดเมนต้องห้ามระหว่างส่งลิงก์ จะใส่เหตุผลภายในลงในฟิลด์
bannerเช่นbanner = "domain (REASON)" - ฟิลด์
bannerที่มีเหตุผลการลบภายในนี้เดิมควรให้เห็นได้เฉพาะผู้ดูแลระบบระดับทั้งเว็บไซต์เท่านั้น แต่คาดว่าเกิดข้อผิดพลาดในเส้นทางโค้ดที่คล้ายกันจนผู้ดูแลชุมชนเห็นได้
หมวดหมู่ของเหตุผลการลบที่ถูกเปิดเผย
-
domain- การลบตามโดเมนเป็นหมวดที่ยืนยันได้จากโค้ดสาธารณะด้วย
- ส่วนใหญ่แสดงเป็น
Removed: domain (spam)แต่บางกรณีก็มีโน้ตเฉพาะแนบมาด้วย - เคยมีกรณีลบโดเมนบางตัวในปี 2012 เพื่อทดลองกับสแปมที่เกี่ยวข้องกับ Tumblr
- มีข้อความอย่าง
le sexxxxy sex spamปรากฏเป็นเหตุผลการลบด้วย
-
spammitspammitดูเหมือนเป็นหมวดที่วิเคราะห์โพสต์แล้วใส่ เปอร์เซ็นต์ความน่าจะเป็นว่าเป็นสแปม- คะแนนที่พบในกรณีการลบมีตั้งแต่ 39.71% ไปจนถึง 98.19%
- ใน subreddit เหล่านั้น มีหลายกรณีที่โพสต์ Imgur ปกติก็ถูกลบด้วยคะแนนสแปม 70~98% จึงไม่ดูเหมือนว่าจะแม่นยำมากนัก
-
ผู้ใช้ที่ถูกแบนและ shadowban
- มีการลบในรูปแบบ
Removed: banned userหรือRemoved: Reddit (banall performed) - กรณีเหล่านี้ส่วนใหญ่เป็นโพสต์สแปมชัดเจน เช่น ลิงก์บริการเชิงโฆษณา
- โพสต์ของผู้ใช้ที่ถูก shadowban จะแสดงเป็น
Removed: Reddit (shadowban applied on วันที่) - shadowban คือการแบนแบบเงียบที่ทำให้เจ้าตัวยังรู้สึกว่าโพสต์ได้ตามปกติ แต่คนอื่นจะไม่เห็นโพสต์และคอมเมนต์นั้น
- มีการลบในรูปแบบ
ข้อมูลการตัดสินภายในที่เผยผ่าน spamurai
- spamurai เป็นรายการที่มีข้อมูลภายในมากที่สุดในบรรดาหมวดที่ถูกเปิดเผย
- ในเอกสารนำเสนอสาธารณะ Reddit ระบุว่าใช้ “ML” กับ Minsky และ “Rules” กับ Spamurai
- เหตุผลการลบของ spamurai มีทั้งกฎแบบง่ายและข้อมูลดัมป์รายละเอียด
- ชื่อที่ดูเหมือนเป็นระบบย่อยอย่าง
echelonปรากฏในกรณีลบคำคีย์เวิร์ดบางอย่าง - มีกรณีลบคอมเมนต์ของบัญชีอายุน้อยกว่า 30 นาทีเมื่อเข้าเงื่อนไขสแปม
- เห็นกฎเฉพาะอย่างสแปมแอฟฟิลิเอตเสื้อยืดที่น่าสงสัย, คอมเมนต์ที่มีแต่ URL, คอมเมนต์ที่มีคะแนน Perspective สูง เป็นต้น
- ชื่อที่ดูเหมือนเป็นระบบย่อยอย่าง
-
รายการในดัมป์ข้อมูลของ spamurai
link t3_...หรือcomment t1_...คือ fullname ID ของ Redditt1คือคอมเมนต์t2คือผู้ใช้t3คือโพสต์t4คือ private messaget5คือ subreddit- ค่า
perspective spamถูกยืนยันว่าเป็นคะแนน SPAM จาก Google Perspective API - มีข้อมูลที่เกี่ยวกับบัญชีรวมอยู่ด้วย
- อายุบัญชี
- คะแนน
spammy - karma
- จำนวนรายงาน
- โดเมนอีเมล
- ISP หรือชื่อองค์กร
- ยังมีข้อมูลการเชื่อมต่อและสภาพแวดล้อมด้วย
- การใช้
oauth.reddit.com - User-Agent
- language header
LANG - referrer
RHSที่ดูเหมือนลายนิ้วมือเบราว์เซอร์- ค่าที่ดูเหมือนลายนิ้วมือ TLS
- URL ของ thumbnail
- เนื้อหาโพสต์หรือคอมเมนต์
- ลิงก์ Reddit ต้นฉบับ
- การใช้
Perspective API และความเป็นไปได้ในการหลบเลี่ยง
- ค่า
0.12571795 perspective spamในล็อกของ Reddit ตรงกับผลลัพธ์จากการเรียก Perspective API สำหรับแอตทริบิวต์ SPAM แทบทั้งหมด - เมื่อนำข้อความเดียวกันไปเรียก Perspective API ได้ค่า
0.12571794ต่างกันเพียง 0.00000001 ซึ่งน่าจะเป็นความคลาดเคลื่อนจากการปัดเศษ - รูปแบบคะแนนในตัวอย่างเอกสารของ Perspective และกรณีอ้างอิงจาก CTO ของ Reddit ก็เป็นหลักแวดล้อมว่ามีการใช้ Perspective จริง
- แอตทริบิวต์ SPAM ของ Perspective ไม่ใช่การตรวจจับความเป็นพิษ แต่เป็นแอตทริบิวต์เชิงทดลองสำหรับตรวจจับสแปม และระบุว่าเทรนจากชุดข้อมูลเดียวที่รวมคอมเมนต์ของ New York Times กับข้อมูลการดูแล
- หลังเดือนกุมภาพันธ์ 2026 จะไม่สามารถสร้างโปรเจกต์ Perspective API ใหม่บน Google Cloud ได้ จึงยากที่จะทดลองใหม่
-
การเปลี่ยนแปลงอย่างไวของคะแนน SPAM
- คะแนน SPAM ของ Perspective มีกรณีที่เปลี่ยนมากแม้เพิ่มเพียงไม่กี่ตัวอักษร
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 ได้
การสะท้อนรายงานจากผู้ใช้และการอนุมัติของผู้ดูแล
- spamurai ดูเหมือนจะนำรายงานจากผู้ใช้มาใช้ในกฎการลบด้วย
- เหตุผล
REPORT: High spam perspective score on comment with hyperlink reported for spamหมายความว่าคอมเมนต์ที่มีไฮเปอร์ลิงก์ซึ่งถูกรายงานว่าเป็นสแปม ถูกลบเพราะมีคะแนน Perspective สูง และผู้ดูแลสามารถอนุมัติกลับได้ - ในเหตุผลการลบบางรายการมีข้อความว่า “หากผู้ดูแลอนุมัติคอนเทนต์นี้ การลบในอนาคตจะลดลง”
- อาร์กิวเมนต์
train_spamในadmintools.spamจากโค้ดสาธารณะของ Reddit ใช้ตัดสินว่าจะนำแอ็กชันของผู้ดูแลไปใช้ฝึกระบบแอนติสแปมหรือไม่ - จึงตีความได้ว่าเมื่อ subreddit อนุมัติโพสต์ปกติ ก็อาจช่วยลด false positive ได้
กฎการลบอื่น ๆ และการตรวจสอบ URL
- มีกรณีลบลิงก์ redirect ของ Pinterest, ลิงก์
mega.nz, และลิงก์ที่เกี่ยวกับ subdomain ที่สร้างได้อย่างอิสระ - ในการลบลิงก์
mega.nzก็มีกรณีปกติที่เป็นลิงก์วิดีโออาร์ไคฟ์ YouTube จริง ๆ จึงเกิด false positive ด้วย - กรณี
Matched forbidden regex u'torenteu'แม้ในเนื้อหาจะไม่มีtorenteuตรง ๆ ก็ยังถูกลบ- Reddit ใช้
unidecodeเพื่อแปลงสตริง Unicode เป็น ASCII - คำเกาหลี
토렌.트อาจถูกแปลงและผ่านการประมวลผลเพิ่มจนไปแมตช์กับtorenteuได้
- Reddit ใช้
- กรณี
Failed inspection: Phrase(s) [u'UA-49307539-']ดูเหมือนว่าไม่ได้แมตช์จากเนื้อหาคอมเมนต์หรือข้อความที่แปลงแล้ว แต่ไปแมตช์กับ Google Analytics ID ใน HTML ของหน้าที่ลิงก์รีไดเรกต์ไป inspectionดูเหมือนเป็นพฤติกรรมที่ Reddit เปิด URL, ตามรีไดเรกต์, แล้วค้นหารูปแบบบางอย่างในหน้าเว็บนั้น- เมื่อลองโพสต์ลิงก์ไปยังหน้าเว็บที่ใส่สตริงดังกล่าวไว้ด้วยบัญชีทดสอบ บัญชีอายุ 5 ปีก็ถูกแบนทันทีและประวัติการโพสต์ถูกลบ
- แต่เมื่อใช้บัญชีเพื่อนที่มีประวัติกิจกรรมมากกว่า กลับไม่สามารถทำซ้ำผลลัพธ์เดิมได้
- ยังไม่แน่ชัดว่าตัวกรองนี้ยังทำงานอยู่หรือการแบนบัญชีเป็นเรื่องบังเอิญ จึงมีการเปลี่ยนสตริงจริงก่อนเผยแพร่
องค์ประกอบระบบแอนติสแปมของ 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 - สตริง Unicode แบบ Python 2.7 อย่าง
u'torenteu',u'UA-49307539-'อาจมาจากโค้ดตรวจสอบบน Python 2.7 ที่อยู่นอก spamurai หรือเป็นโค้ดตรวจ URL แยกต่างหากที่ REV1 เรียกใช้ - ตาม งานนำเสนอที่เกี่ยวข้อง Snooron ทำงานบน Flink Stateful Functions, ทำการจัดหมวดหมู่ภาพและ OCR และใช้ Python 3 ใน worker
- ณ ปี 2024 Reddit ระบุในเอกสาร Australian eSafety ว่าใช้ Hive AI และ Google Vision OCR API สำหรับ OCR และการจัดหมวดหมู่ภาพ/วิดีโอ
- Hive OCR รองรับ 12 ภาษา ส่วน Google OCR ใช้ร่วมกันเพื่อรองรับภาษาได้มากขึ้น และ Reddit ยังระบุว่ากำลังทำเครื่องมือภายในที่รองรับ 80 ภาษา
- ใน ticket ปี 2009 มีการยืนยันว่าผู้ใช้ชื่อ
crm114เป็นตัวกรองสแปมที่รองรับการเรียนรู้จากผู้ดูแล และ CRM114 คือซอฟต์แวร์จัดหมวดหมู่สแปมโอเพนซอร์สรุ่นเก่า
เหตุผลที่เผยแพร่ในปี 2026
- ผู้เขียนมองว่าหากเปิดเผยข้อมูลนี้ตั้งแต่ปี 2021 อาจกระทบปัญหาสแปมของ Reddit อย่างรุนแรง
- ในปี 2026 Perspective API is shutting down มีกำหนดยุติปลายปี ดังนั้นต่อให้ Reddit ยังใช้อยู่ก็ต้องย้ายระบบในไม่ช้า
- ผู้เขียนมองว่าอุตสาหกรรมสแปมเปลี่ยนไปเพราะ LLM ทำให้ Reddit น่าจะปรับระบบแอนติสแปมครั้งใหญ่แล้วภายในปี 2026
- ด้วยเหตุผลเหล่านี้ จึงเห็นว่า ณ ปี 2026 ความเสี่ยงจากการเปิดเผยข้อมูลดังกล่าวอยู่ในระดับต่ำ
1 ความคิดเห็น
ความคิดเห็นบน Lobste.rs
เป็นข้อมูลและงานวิจัยที่น่าสนใจ อย่างที่กล่าวไว้ในบทสรุป โอกาสที่จะได้เห็นรายละเอียดของ กลไกป้องกันการนำไปใช้ในทางที่ผิด แบบนี้มีไม่บ่อยนัก แต่สิ่งที่สะดุดตาเป็นพิเศษคือ CSS อันชำนาญเฉพาะตัวของ Lyra
แถบเซ็นเซอร์และวงกลมสีแดงใน UI ของ Reddit ที่สร้างขึ้นใหม่นั้น ตอนแรกดูเหมือนสกรีนช็อต แต่จริง ๆ แล้วเป็นโมเดลจำลองที่โต้ตอบได้เต็มรูปแบบ
ทุกครั้งที่มีบล็อกโพสต์ใหม่ออกมา ผมตั้งตารอเสมอ เนื้อหาน่าสนใจมาก และฝีมือในการสร้าง UI อื่นขึ้นมาใหม่ก็ยอดเยี่ยม
จนถึงตอนนี้ผมหา อีสเตอร์เอก เจออย่างน้อยหนึ่งอย่างแล้ว
ตอนที่บอกว่าเพื่อทดสอบด้วยบัญชีของตัวเอง เขาใส่สตริง
<pre>UA-49307539-2</pre>ไว้บนเว็บไซต์แล้วลิงก์ไปที่ Reddit จากนั้น บัญชีทดสอบอายุ 5 ปี ก็ถูกระงับทันทีและประวัติการโพสต์ก็ถูกลบทั้งหมด เป็นส่วนที่โหดจริง ๆเลยบอกว่าเลขจริงถูกเปลี่ยนเป็น
UA-49307539-เพื่อไม่เผยแพร่ข้อความที่สามารถฆ่าบัญชีได้ ก็หวังว่าบัญชีนั้นจะเป็นบัญชีทดสอบจริง ๆ และไม่มีอะไรสำคัญอยู่ในนั้นถ้าพยายามเปิดด้วย Safari บนมือถือใน iOS developer beta รุ่นล่าสุดของ iPhone 16 Pro จะเกิดข้อผิดพลาด “a problem repeatedly occurred” ที่
<url>จนดูไม่ได้ถ้ามีใครช่วยทำ binary search กับ HTML เพื่อหา สาเหตุที่ทำให้แครช ได้ ผมจะขอบคุณมาก
สำหรับคนที่สงสัย Perspective API key ที่รวมอยู่ในนั้นใช้งานไม่ได้
bans (2016 - present)แล้วเห็นว่าบริษัทที่ปรึกษาซึ่งถูกเซ็นเซอร์ไว้เป็นตัวอย่างสแปมคือPuppygirl Consultingเหล่าคนติด developer tools ก็น่าจะได้เบาะแสว่าส่วนที่ถูกเซ็นเซอร์ไว้น่าจะเป็นของปลอมหรือ อีสเตอร์เอก :^)