Robin

Agile SMS Fraud-Control Plan

Defense plan after a July 25 spike in invalid CN SMS requests: one-time ticket signing, rate limits with CAPTCHA, dynamic quotas from login success rate, blacklist by phone/device/IP, device fingerprint rules per platform, and product changes to de-emphasize SMS login.

8/1/2025 · 2 min read

SMS fraud-control defense plan

Background

Starting July 25, 15 CN regions saw high-frequency invalid SMS requests, sharply increasing SMS cost.

Monthly SMS volume

Daily SMS volume in July

July SMS login success rate (by country)

Attackers reused most phone numbers

New login methods in July

Third-party login success rate in July

Email login success rate

Requirements

1. One-time ticket signing

Goal: prevent SMS API abuse Sequence

sequenceDiagram
    Client ->> Signing service: ① Request ticket
    Signing service -->> Client: ② Return ticket {timestamp, nonce, server signature}
    Client ->> SMS service: ③ POST /sms/send (ticket + fingerprint + phone)
    SMS service ->> SMS service: ④ Validate ticket
 

2. SMS rate limits & CAPTCHA

Goal: cap SMS volume when the API is abused

Time windowLimitAt ≥80% of quotaAt ≥100%
Country / dayQuota × dynamic factorCAPTCHAReject
Country / hourQuota × dynamic factorCAPTCHAReject
Device / day3 messagesCAPTCHA (from 2nd request)Reject
IP / 10 min5 messagesCAPTCHA (from 2nd request)Reject

Initial quota Dynamic factor rules

  1. Compute login success rate

  • In the last hour: total SMS codes sent (S) and successful logins with code (L).

  • Success rate R = L / S.

  1. Adjust SMS cap

  • If R ≥ 55%, cap × 1.2 (max 1.5× current hourly/daily cap).
  • If 20% ≤ R < 50%, unchanged.
  • If R < 20%, cap × 0.7.

3. Blacklist policy

Monitor (same phone / device / IP)WindowThresholdAction
SMS requests ≥5 and logins ≤11 dayMetBlacklist
CAPTCHA failures ≥330 minMetBlacklist
  • First strike: no SMS for 24h
  • Second: 72h
  • Third: permanent SMS block

Required device fingerprint fields

PlatformRequired fieldsStrong match (all equal)Weak match (partial)
iOSModel, OS, resolution, locale/timezone, IDFV, app versionPunish directlyCAPTCHA; fail → punish
AndroidBrand/model, OS, Android ID, resolution, locale/timezone, app version, OAIDPunish directlyCAPTCHA; fail → punish
H5 / WebUA, Canvas/WebGL/Audio hash, locale/timezone, localStoragePunish directlyCAPTCHA; fail → punish
PCUA, Canvas/WebGL hash, locale/timezone, resolution, localStorageBan directlyCAPTCHA

4. Product: de-emphasize SMS login

  1. Guide third-party login; weaken phone login
  2. After phone signup, prompt password setup; default to password login on return

Original link

Related posts