트위터가 문자 메시지 2단계 인증을 비활성화함에 따라 SMS 사기가 어떻게 진행되고 앱 개발자가 이를 방지할 수 있는지 자세히 알아보는 것이 재미있을 것이라고 생각했습니다.
이는 비뚤어진 인센티브, 근시안적인 규제, 기술적 독창성에 관한 매혹적인 이야기입니다.
파헤쳐보자! 👇
먼저 Twitter의 최근 발표를 요약해 보겠습니다.
간단히 말해서 이는 유료 버전의 트위터 사용자만 로그인 시 휴대폰으로 코드가 전송된다는 의미입니다.
SMS 사기를 이해하는 열쇠는 일부 숫자가 프리미엄 이라는 점을 이해하는 것입니다. 이 번호로 전화를 걸거나 SMS를 보내려면 일반적으로 수십 센트의 비용이 발생 하며 해당 번호의 소유자는 그 수십 센트의 일부를 스스로 얻습니다.
이러한 전화번호의 소유자는 일반적으로 원격 투표, 데이트, 기술 지원과 같이 사용자에게 가치를 공급하고 제공하는 데 비용이 드는 합법적인 서비스를 제공합니다.
하지만 이 숫자는 쉽게 이익을 얻기 위해 조작될 수 있습니다 🤑
나쁜 행위자인 Bob 이라고 부르자, 그는 여러 개의 프리미엄 전화번호를 확보합니다[1]. 밥은 해커일 수도 있고, 망가진 휴대폰 네트워크 사업자일 수도 있습니다.
Bob은 자신의 프리미엄 전화번호로 문자 메시지를 보내는 웹 서비스를 찾습니다. 이러한 메시지는 2단계 인증 코드, 일회용 비밀번호 또는 서비스의 일부로 사용자에게 전송된 기타 문자 메시지일 수 있습니다(예: partiful.com은 SMS를 통해 이벤트 알림을 보냅니다).
Bob은 서비스에서 자신의 프리미엄 전화번호로 수천 통 의 SMS를 보내도록 하는 방법을 찾습니다. 이것은 매우 쉬울 수 있습니다. 프런트 엔드 서비스는 조작하기 쉬울 수 있으며 백엔드 엔드포인트는 보호되지 않고 리버스 엔지니어링하기 쉬울 수 있습니다.
더 나쁜 것은 많은 서비스가 SMS 전송을 위해 표준화된 엔드포인트를 사용한다는 것입니다. 이는 Bob이 공격할 사이트를 찾는 것을 훨씬 더 쉽게 만듭니다. 예를 들어, 서비스가 사용자를 인증하고 Auth0과 같은 2FA 또는 OTP 코드를 전송하기 위해 제3자를 사용하는 경우 SMS 전송을 위한 엔드포인트는 대부분 알려져 있습니다. Bob이 해야 할 일은 Auth0의 코드를 검색하는 방법을 찾는 것뿐입니다. 웹 서비스용 ID(웹 서비스의 프런트 엔드가 이 ID를 포함하는 요청을 하기 때문에 매우 쉽습니다)를 생성하면 해당 제3자 서비스를 사용하는 모든 사이트를 공격할 수 있습니다.
마지막으로 Bob은 서비스에서 자신의 프리미엄 전화번호로 수천 개의 SMS를 보내도록 합니다. 웹 서비스는 💵💵💵 손실을 입고 Bob은 이익을 얻습니다.
SMS 사기를 예방할 수 있는 만능 방안은 없습니다. 하지만 다음은 효과가 있을 수 있는 몇 가지 아이디어입니다.
Auth0과 같은 타사 서비스를 사용하여 사용자를 인증하는 경우 SMS를 보내는 데 사용되는 엔드포인트를 난독화할 수 있습니다. 이렇게 하면 공격이 완전히 차단되지는 않지만 공격이 가능하다는 사실을 발견하는 것이 훨씬 더 어려워집니다.
자전거 도둑이 가장 쉽게 훔칠 수 있는 자전거를 노리는 것과 비슷하게, 훌륭한 해커는 해킹하기 쉬운 웹 서비스로 이동할 것입니다. 내 직감은 이 접근 방식이 앱의 롱테일 에 충분히 효과적일 것이라는 것입니다.
클라우드 공급자, 사기성 ISP에서 발생하거나 기타 개략적인 IP의 모든 요청을 차단합니다. 이는 구현이 매우 간단해야 하며 IP 주소의 품질을 평가할 수 있는 많은 서비스가 존재하며 아마도 매우 효과적일 것입니다.
Bob의 공격을 차단하기 위해 SMS를 보내는 엔드포인트에 IP 기반 속도 제한을 추가합니다. 올바르게 설정되면 합법적인 사용자에게 영향을 미치지 않습니다. 그러나 이는 단순 공격에만 작동합니다. Bob이 다양한 IP 주소에서 요청을 보내도록 공격( 분산 공격)을 설계한다면 이는 작동하지 않을 것입니다.
쿨오프 기간 동안 해당 전화번호를 차단하기 전에 특정 전화번호로 SMS를 적은 횟수만 보내십시오. 우리는 프런트엔드에서 이 작업을 수행할 수 있지만 Bob이 마음만 먹으면 대신 공격할 백엔드 엔드포인트를 찾아낼 수도 있습니다. 백엔드에서 전화번호를 차단하는 것은 더 어렵습니다. 전화번호와 최근 로그인 시도 기록을 유지해야 합니다[2].
사용자에게 SMS를 보내기 전에 CAPTCHA를 해결하도록 강제합니다. 이 접근 방식은 공격자를 차단하는 데 효과적이지만(CAPTCHA를 해결하는 것은 대규모로 수행하기 어렵고 비용이 많이 들지만) 사용자의 서비스 경험을 저하시킵니다.
libphonenumber 를 사용하여 할증 요금 전화번호를 식별하고 차단합니다. 이것이 유망해 보이지만 데이터가 얼마나 신뢰할 수 있고 이 접근 방식이 얼마나 효과적인지 모르겠습니다.
유료 계정에만 문자 메시지를 보내세요. 이것이 트위터가 취한 접근 방식입니다. 나쁜 선택은 아니지만 위 목록에서 볼 수 있듯이 취할 수 있는 다른 접근 방식이 많이 있습니다.
사기 사용자가 많은 이동통신사를 차단하세요. 이는 분명히 나쁜 네트워크 운영자를 차단하지만 네트워크에 합법적인 사용자가 많으면 제대로 작동하지 않습니다.
대신 WhatsApp을 사용하여 메시지를 보내세요. WhatsApp은 SMS와 달리 무료이지만 전 세계 모든 사용자가 WhatsApp을 사용하는 것은 아닙니다[3].
좋은 솔루션은 공격자가 더 쉬운 목표로 이동할 때까지 시간 투자와 효율성을 우선순위로 두고 위의 접근 방식을 충분히 활용하는 것입니다.
저는 위의 조치를 시행한 개인적인 경험을 갖고 있으며, 저희 팀이 그 결과를 어떻게 처리했는지에 대해 공유할 이야기가 한두 가지 있습니다. 하지만 그건 다른 이야기로… 👨💻
이것이 나의 마지막 요점으로 이어진다:
IMO, Twilio(주요 SMS API)는 표준 API에 대한 (무료? 🙏) 추가 기능으로 SMS 사기 방지를 제공할 수 있는 엄청난 기회를 가지고 있습니다.
Twilio는 모든 계정에 걸쳐 사기성 전화번호와 이동통신사에 대한 데이터를 보유하고 있으므로, Twilio는 여러 웹 서비스에서 큰 문제가 되기 전에 잘못된 전화번호와 이동통신사를 신속하게 차단할 수 있는 고유한 위치에 있습니다.
Twilio는 차세대 인증 메커니즘인 Silent Network Auth를 사용하여 잘못된 전화번호를 완전히 감지할 수도 있으며 이 유틸리티를 사용자 간에 공유 해야 한다고 생각합니다.
저는 사람들이 사용한 다른 생각, 아이디어, 접근 방식을 듣고 싶습니다. 아래에 댓글을 작성하여 공유해 주시면 우리 모두 배울 수 있습니다.
지금은 그게 다입니다. 엔드포인트를 보호하고 즐거운 한 주를 보내세요!
HackerNews에 훌륭한 토론이 있습니다.
[1] 이러한 프리미엄 전화번호는 작동할 필요도 없습니다. 작동하고 휴대폰에 등록된 SIM 카드에 연결될 필요도 없습니다. 라우팅할 수 있는 한 이 공격에 사용될 수 있습니다.
[2] 이를 효율적으로 만들고 대규모로 작동할 수 있는 좋은 데이터 구조와 알고리즘이 있는지 궁금합니다. 혹시 알고 계신다면 공유해주세요!
[3] 제안 에 대해 HN의 @csharminor에게 감사드립니다.