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처럼 표시되지만, 당시에는 실제 제거 사유와 내부 데이터가 빨간 텍스트로 나타남 - 이 현상은 약 한 시간 뒤 정상으로 돌아왔고, 남은 자료는 당시 찍은 스크린샷뿐임
Reddit 중재와 Auto 표시 방식
- Reddit의 하위 커뮤니티인 subreddit에서는 커뮤니티 중재자가 게시물 제거, 사용자 차단, 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% 스팸 점수로 제거된 사례가 많아 정확도가 높아 보이지 않았음
-
차단 사용자와 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-only 댓글, 높은 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의 주요 판단 기준 중 하나를 회피할 수 있었을 가능성이 있음
사용자 신고와 중재자 승인 반영
- spamurai는 사용자 신고도 제거 규칙에 반영하는 것으로 보임
REPORT: High spam perspective score on comment with hyperlink reported for spam사유는, 스팸으로 신고된 하이퍼링크 댓글의 Perspective 점수가 높아 제거됐고 중재자가 재승인할 수 있음을 나타냄- 특정 제거 사유에는 “중재자가 이 콘텐츠를 승인하면 앞으로 제거가 줄어든다”는 문구가 포함됨
- Reddit 공개 코드의
admintools.spam에 있는train_spam인자는 중재자 액션을 안티스팸 학습에 사용할지 결정함 - subreddit에서 정상 게시물을 승인하면 false positive를 줄이는 데 영향을 줄 수 있다는 해석이 가능함
기타 제거 규칙과 URL 검사
- Pinterest redirect 링크,
mega.nz링크, 자유롭게 만들 수 있는 subdomain 관련 링크도 제거된 사례가 있었음 mega.nz링크 제거 중에는 실제로 YouTube 아카이브 영상 링크였던 정상 사례도 있어 오탐이 있었음Matched forbidden regex u'torenteu'사례는 본문에 직접torenteu가 없었지만 제거됨- Reddit은
unidecode를 사용해 유니코드 문자열을 ASCII로 변환함 - 한국어
토렌.트가 변환과 추가 처리를 거쳐torenteu와 매칭될 수 있었음
- Reddit은
Failed inspection: Phrase(s) [u'UA-49307539-']사례는 댓글 본문이나 변환된 텍스트가 아니라, 링크가 리다이렉트된 페이지의 HTML 안 Google Analytics ID와 매칭된 것으로 나타남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와 연결될 가능성이 있음 u'torenteu',u'UA-49307539-'같은 Python 2.7 유니코드 문자열은 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년 현재는 해당 정보 공개의 위험이 낮다고 봄
댓글과 토론
Lobste.rs 의견들
-
흥미로운 자료와 연구임. 결론에서도 말하듯 이런 악용 방지 메커니즘의 세부를 볼 기회가 드문데, 특히 눈에 띈 건 Lyra 특유의 능숙한 CSS였음
재구성한 Reddit UI의 검열 막대와 빨간 원이 처음엔 스크린샷처럼 보였는데, 실제로는 완전히 상호작용 가능한 모형이었음- 이 댓글을 읽기 전까지 이미지가 아니라는 걸 전혀 눈치 못 챘음
-
새 블로그 글이 올라올 때마다 늘 기대됨. 내용도 정말 흥미롭고, 다른 UI를 재현하는 솜씨도 훌륭함
지금까지 이스터에그를 적어도 하나는 찾았음- 고마움. 이번 글에는 그런 걸 꽤 많이 넣어뒀음 ;)
-
자기 계정으로 시험하려고 웹사이트에
<pre>UA-49307539-2</pre>문자열을 올리고 Reddit에 링크했더니, 5년 된 테스트 계정이 즉시 정지되고 게시 기록도 전부 삭제됐다는 대목이 정말 거칠었음
그래서 실제 번호는 계정을 죽일 수 있는 텍스트를 공개하지 않으려고UA-49307539-로 바꿨다는데, 그 계정이 진짜 테스트용이고 중요한 게 없었길 바람 -
iPhone 16 Pro의 최신 iOS 개발자 베타에서 모바일 Safari로 열려고 하면
<url>에서 “a problem repeatedly occurred” 오류가 나서 볼 수 없음- 그게 왜 그런지 전혀 모르겠고, 지금은 iPhone도 곁에 없음
누가 HTML을 이분 탐색해서 충돌 원인을 찾아준다면 정말 고마울 것 같음
- 그게 왜 그런지 전혀 모르겠고, 지금은 iPhone도 곁에 없음
-
궁금한 사람들을 위해 말하면, 포함된 Perspective API 키는 유효하지 않음
bans (2016 - present)에서 스팸 예시로 검열된 컨설팅 회사가Puppygirl Consulting인 걸 보면, 개발자 도구 중독자들은 검열된 부분들이 아마 가짜거나 이스터에그라는 힌트를 얻을 수 있음 :^)