차단된 Canonical Gmail 문제

Gmail이 차단된 일부 스팸머들이 마침표 변형을 이용해 차단된 이메일의 정식 버전에도 불구하고 여전히 침입하고 있는 것으로 보입니다.

예를 들어,
examplemailaddress@gmail.com은 차단되어 있지만
e.x.a.m.pl.e.m.ai.lad.dre.ss@gmail.com은 통과하고 있습니다.

차단 기능은 여전히 작동하고 있지만 완전히 작동하지는 않는 것 같습니다. 로그에서 기록에 대한 일반적인 일치 항목은 여전히 확인되지만 모든 조합에 대해서는 그렇지 않습니다. 해당 사용자는 오늘 동일한 차단된 Gmail 계정을 이용해 수백 개의 계정을 생성할 수 있었습니다.

그들이 사용하는 Gmail 마침표 변형은 마침표가 6개에서 14개 사이이며, 이메일 길이는 19자(@ 이전)입니다. + 변형은 사용하지 않고 있습니다(또는 해당 변형은 모두 성공적으로 차단되고 있습니다).

관련이 있을 수 있는 점으로, 스팸머 이메일의 Levenshtein 거리를 3으로 설정해 두었습니다(기본값은 2). Discourse가 최근 2.6.x에서 2.7.1 안정판으로 업데이트되었습니다.

음, @sam 이거 어디서 결론을 내렸는지 기억이 안 나는데, 네가 말한 대로라면 이건 버그일 수 있겠어.

즉, evil.person+77@gmail.com이 차단되면 대신 evilperson@gmail.com이 차단된다는 뜻이야. 그러면 e.v.i.l.person@gmail.com이 슬쩍 들어오려 해도 정규화 매칭(canonical matching) 때문에 차단되게 되지.

그렇다면 sara.hanson@이 끔찍한 일을 저질러서 sarah.anson@이 그 여파에 휘말리게 된다면 어떻게 될까요? joe98@과 joe99@를 동일한 이메일 주소로 볼 수 있는지도 확신이 서지 않습니다. 아마도 이는 커뮤니티 구성원의 특성 및 매칭 과정에서 사용되는 수동 판단의 수준에 따라 달라질 것입니다.

“플러스 어드레싱”(Plus addressing)은 적어도 같은 이메일 주소의 메일박스에 속한 폴더를 가리킵니다(“+” 기호 앞의 모든 부분이 동일하다는 전제 하에).

IP 범위 기반의 스팸 등록을 차단하는 것은 어떨까요? 이 모든 것은 스팸 공격자의 정교한 정도에 달려 있습니다. Let’s Encrypt 커뮤니티에서 이곳으로 넘어온 입장에서, 거기에 꽤 광범위한 스팸 공격 시도가 자세히 기록된 추적 스레드가 있습니다. 심지어 몇 주 후에 스팸을 보내기 전에 실제 기술적 도움을 제공한 사람들도 있었습니다.

불가능합니다. Gmail의 관점에서는 둘이 동일한 계정이라, 결국 같은 사람이기 때문입니다.

흥미롭네요. 저는 Gmail이 실제로 그런 구분을 하고 있는지 몰랐어요. 오늘 새로운 걸 꽤 많이 배웠네요. 왜 그렇게 했을까요? :thinking: 화면 공간을 꽤 많이 차지할 것 같은데, Gmail 주소가 여기서 유일한 관심사인가요?

우리가 내린 결론은 “결국 도달한 상태가 마음에 들지 않아요. 이건 지원(서포트)의 악몽이 될 테고, 영원히 사라지지 않을 테니까요 :).” 였던 것 같습니다.

사이트가 스팸 벡터(spam vector)라면 "내 모든 이메일을 canonical로 처리해 줘"라고 말할 수 있게 해야 한다고 생각합니다. 단점은 상관없습니다.

즉, 이 두 이메일 모두 samsam@somewhere.com을 canonical로 가집니다.

sam.sam@somewhere.com
samsam+11@somewhere.com

sam.sam@somewhere.com이 등록되어 있다면, samsam+11@somewhere.com은 더 이상 등록할 수 없게 됩니다.

이것이 제 원래 수정안이었지만, 결국 되돌렸습니다(다만 구글의 경우 특수 처리했는데, 돌이켜 보면 그 정도로는 부족했습니다).

새로운 사이트 설정을 추가하여 이 문제를 뒤로 넘기는 것이 좋다고 생각합니다:

“OMG, 나는 거대한 스팸 벡터야, 최고 수준의 방호 모드(메가 틴포일 모드)를 켜 줘”

버그와 관련하여, 차단 조치를 지연시키면 쉽게 우회될 수 있습니다. 현재는 100% 반응형(reactive) 프로세스입니다.

즉, 이 동작은 정상적으로 작동합니다(@markersocial 님, 콘솔에서 테스트해 보셔도 됩니다):

./launcher enter app
rails c
ScreenedEmail.block('examplemailaddress@gmail.com')
ScreenedEmail.should_block?('e.x.a.m.pl.e.m.ai.lad.dre.ss@gmail.com')
# true

문제는 이겁니다:

# 수백 개의 계정이 이미 생성된 상태
ScreenedEmail.block('examplemailaddress@gmail.com')
# 수백 개의 계정은 여전히 존재

아 맞다, 원래 요청이 특수문자가 포함된 모든 이메일을 사이트 설정 뒤에 배치해서 차단하는 거였지. 내가 그걸 제안했는데 네가 안 좋아했었나? 기억이 안 나네.

이 모든 문제는 @markersocial이 우리 수천 명의 호스팅 고객 중 아무도 필요로 하지 않는 기능(내가 처음 구현했던 강제 canonical)을 원하기 때문이라고 생각합니다.

반응형 기능(canonical 검색 시 차단하고, 노이즈 계정을 삭제하도록 관리자에게 알림)를 계속 개선할 수는 있습니다. 다만 먼저 반복되는 불만 사항을 몇 건 더 들어보고 싶습니다.

정규식 기반 차단은 @markersocial에게는 확실히 작동하지 않을 것이지만, 본인이 확인해 주시면 좋습니다.

OP(원본 게시물)에서 해당 문제를 재현할 수 없으며, 문제 계정이 차단 규칙이 추가되기 전에 생성되었을 것이라고 강력히 의심합니다.

저는 원래 수정안이 완벽하게 작동했으며 gmail 관련 문제를 해결했음을 확인합니다. 이 선택적 모드가 복원된다면 정말 큰 도움이 될 것입니다.

스패머들은 끊임없이 새로운 기법을 배우고 있으며, Facebook, Instagram, Twitter 같은 대형 플랫폼조차도 여전히 성공적으로 속이고 있습니다. 이로 인해 대부분의 다른 사이트들은 '이지 모드’가 됩니다. 스팸 발송은 그들에게 전일제 업무가 되므로, 본질적으로 다음과 같은 상황이 됩니다:

활용 가능하고 (필요한 자원 < 얻는 수익)이면, 반드시 악용될 것이다.

그들은 사실상 모든 조치를 우회할 수 있으며, 유일한 희망은 그렇게 하는 비용을 수익보다 높게 만들어 경제적 이득이 없도록 하는 것입니다.

(탐지 및 mod/admin이 정통 gmail을 사후적으로 차단하고 수동으로 게시물을 삭제하기 전에) 거의 무제한의 이메일/계정으로 대량 스팸을 발송할 수 있는 것은 상당히 비용 효율적입니다. 24시간 365일 운영되는 moderator 팀이 없다면 더욱 그렇습니다.

반스팸 조치를 우회하는 비용은 계속 감소하고 있습니다. 예를 들어 4/5G 프록시를 사용하면 월 $30~$50 정도면 사실상 무제한의 실제 모바일 IP에 접근할 수 있습니다. 이 IP들은 합법적인 ISP/ASN에서 자동으로/수동으로 로테이션되며, 주요 ISP의 합법적인 사용자들(도시/주 전체)이 공유합니다. 4/5G IP는 많은 사용자가 동시에 공유합니다.

이러한 ISP/ASN 또는 IP를 차단하는 것은 적합하지 않습니다(verizon, at&t 등을 사용하는 모든 사람을 차단할 수는 없죠). 그들은 일반적으로 IP를 한 번 사용하고 버립니다. 이렇게 개별 IP를 차단하면 해당 IP 주소를 랜덤으로 공유하는 합법적인 사용자들도 차단됩니다. IP 차단은 점점 레거시 관행이 되고 있습니다(알려진 호스팅 회사의 ASN 제외). 이 포럼에서 빙산의 일각을 볼 수 있습니다:

https://mpsocial.com/c/public-marketplace/61
https://www.blackhatworld.com/forums/proxies-for-sale.112/

스패머들은 완전히 또는 부분적으로 수동으로 제작된 봇과 수동 스팸의 혼합체라고 생각합니다. Discourse가 더 많은 시장 점유율을 차지하고 있으며(분명히 환상적으로 성장하고 있으므로), 상용 봇의 표적이 되지 않는다면 놀랄 것입니다.

Xrumer가 최신 reCAPTCHA 버전을 지원하기 시작할 때, 저는 레거시 포럼의 대부분의 웹마스터들이 스팸이 크게 증가하는 것을 목격할 것이라고 생각합니다. 스팸 발송 비용이 바닥에 도달했기 때문입니다(이미 1,000건당 매우 저렴한 캡차 해결 API를 더 이상 사용할 필요가 없게 됨):

http://botmasterlabs.net/buy1/

사람들은 이미 Xrumer를 사용하여 기본적으로 모든 플랫폼을 지원하는 자체 플러그인/스크립트를 만들 수 있습니다. 하지만 언젠가 Discourse를 기본적으로 지원하게 된다면:

저는 반스팸 조치에 대한 직접적인 필요성이 있기 때문에 중립적이라고 주장할 수는 없습니다. gmail 도트 트릭에 대한 원본 게시물은 2014년에 다른 누군가가 작성했으며, 다른 사용자가 첫 x개 게시물의 승인을 요구함으로써 이를 해결한 것 같습니다. 따라서 최소 3명의 사용자 보고가 있는 것일까요? :sweat_smile:

편하게 떠난 이야기라 죄송합니다. 다시 본론으로 돌아가겠습니다.

이메일에 대한 정규식 차단에 관해서는, 네, 맞습니다. 이는 부분적인 해결책이지만, 다음과 같은 이유로 이상적이지 않습니다:

@ 이전에 1개 이상의 마침표가 있는 모든 gmail을 차단하는 경우:

  • 1개 이상의 마침표가 있는 실제 합법적인 gmail 사용자를 불가피하게 차단하게 됩니다. 이는 매우 흔합니다.
  • 스패머들은 여전히 하나의 마침표를 사용하여 상당한 변형을 만들 수 있습니다. 예를 들어, gmail의 최대 길이는 30자입니다. e.g. 12345678901234567890123456789.0@gmail.com은 단일 마침표를 사용하여 30가지 사용 가능한 조합을 가질 수 있습니다.

@ 이전에 2개 이상의 마침표가 있는 모든 gmail을 차단하는 경우:

  • 합법적인 gmail이 덜 차단되지만, 여전히 이메일에 1개 이상의 마침표가 있는 합법적인 gmail 사용자를 차단합니다.
  • 스패머들은 단일 30자 gmail로 훨씬 더 많은 변형을 만들 수 있습니다. 약 842개의 조합 정도라고 생각합니다.

차단 생성 날짜가 2월 1일인 것을 확인했으며, 차단이 활성화된 후에도 새 계정이 유입되었음을 확인합니다. 저는 어제 새로운 계정이 생성되는 것을 지켜보았으며, 차단 규칙의 새로운 최근 매칭 사례와 동일한 이메일(마침표 조합)을 사용하여 새 등록이 들어오는 두 가지 경우를 모두 확인했습니다.

저는 밤새 등록을 비활성화했고, 오늘 아침에 다시 활성화했습니다. 오늘까지 해당 gmail 주소의 순열을 사용하여 104개의 새 계정을 생성했으며, 계속해서 더 많은 등록이 이루어지고 있습니다. 이 계정들의 이메일에서 마침표를 제거하면 Screened Emails 차단 기록과 정확히 일치함을 확인했습니다.

설명된 대로 rails c에서 차단을 테스트해 보았는데, 여기서 약간 이상한 점이 있습니다.

일부 기록은 의도대로 'true’를 반환하는 반면, 테스트한 이메일이 정통 차단 이메일과 정확히 일치하더라도 일부는 'false’를 반환하는 것 같습니다. 'true’를 반환하는 기록의 경우, 테스트한 모든 변형에 대해 'true’를 반환하며 의도대로 완전히 작동했습니다. 하지만 'false’를 반환하는 이메일의 경우, 테스트한 모든 변형도 'false’를 반환했습니다.

상관관계를 찾으려 노력했습니다. 다음 사항들은 상관관계가 없거나(적어도 일관된 상관관계가 없거나) 확인됩니다:

이메일 길이 (@ 이전)
문자와 숫자를 포함하는 이메일
매칭 횟수 (차단된 횟수)
매칭 날짜

차단 생성 날짜와 상관관계가 있는 것 같습니다. 오래된 기록일수록 작동할 가능성이 낮습니다(false 반환). 9일 전에 생성된 기록은 true/false 혼합을 반환했으며, 지금까지 테스트한 그보다 이전(1시간~8일)에 생성된 모든 기록은 true를 반환하고 있습니다.

‘max age unmatched emails’ 옵션과 관련이 있을 수도 있습니다. 이 옵션은 다소 새로운 것 같으며, 기본값인 365일로 설정되어 있습니다.

자, 버그에 대한 상세한 재현 단계를 제시해 주신다면 definitely 수정해 드리겠습니다.

다만 max age unmatched emails는 새로운 설정이 아닙니다. max age unmatched ips와 함께, 각각 IP 및 이메일 목록에서 1년 동안 어떤 것과도 일치하지 않은 매우 오래된 항목을 정리하기 위한 도구입니다.

정확한 예시가 필요합니다. 버그가 있다면 반드시 수정하고 싶습니다.

이 점에 대해서는 충분히 공감합니다. @codinghorror 님이 원래 구현 방식에 대해 제기했던 주요 이의 중 하나는 Google에 특화된 로직을 포함하고 있었다는 것이었습니다. 이 부분은 Jeff 님을 꽤 불안하게 만들었죠.

"도메인 관계없이 모든 것이 정규화(canonical)된다"는 개선 사항이 이 우려를 다소 완화시켜 줄 수 있을 것 같습니다.

예를 들어:

sam+982@sam.com → 등록 허용 … 첫 번째 sam@sam.com
s.a.m.@sam.com → 등록 불허 … 두 번째로 sam@sam.com을 확인했을 때 이미 정규화(canonical)된 주소가 등록되어 있음을 발견.

이 기능이 언젠가 다시 돌아올 수 있지만, 우리는 다른 곳에서 이러한 악용 사례를 찾아야 합니다. 마지막으로 조사했을 때, 저희 호스팅 서비스에서는 이러한 악용 사례를 발견하지 못했습니다.

@sam @codinghorror 감사합니다 :slight_smile:

오늘은 시간이 조금밖에 없어서, 더 자세히 답변드리기 전에 추가 정보를 먼저 공유합니다.

로그 → 스크린된 이메일(허용)에서 false를 반환하는 기록을 삭제한 후, 해당 이메일을 다시 차단(사용자 삭제 + 사용자 관리자 페이지에서 차단)하면, 이전에 실패하던 규칙이 이제 직접 일치와 변형 사항 모두에서 일관되게 true를 반환하는 것을 확인했습니다.

이는 문제가 오래된 기록에 있다는 관찰 결과와 일치하는 것 같습니다. 더 많은 테스트가 필요합니다.

다리 지킴이의 방식(무작위로)으로 새 사람들을 심사하는 일은 항상 있는 법이지… :grin:

color

assyria

swallow