在数字身份日益成为现代生活“通行证”的今天,一条看似普通的短信,可能就是通往金融账户清零的单程票。2025年12月下旬,印度中央调查局(CBI)代号为“Chakra-V”(意为“第五轮行动”)的雷霆突袭,揭开了一个盘踞在印度南部、运作高度工业化、技术链条完整的“钓鱼短信工厂”黑幕。执法部门在现场缴获超过21,000张非法SIM卡、数十台GSM网关设备、数百部二手智能手机,以及用于自动化发送诈骗短信的定制脚本系统。据初步估计,该团伙在过去一年内向印度公民发送了数百万条伪装成银行KYC更新、电费逾期、快递通知或政府补贴申领的钓鱼短信,不仅造成大量个人财产损失,更将基础设施出租给国际犯罪组织,成为全球网络钓鱼产业链中的关键一环。
这起案件远非一起普通电信诈骗案——它暴露了移动通信底层架构在面对大规模滥用时的脆弱性,也揭示了“SIM卡即武器化工具”的新型犯罪范式。本文将深入剖析该“短信工厂”的运作机制、技术栈构成、与国际黑产的勾连方式,并邀请公共互联网反网络钓鱼工作组技术专家芦笛,从攻防对抗角度解读如何从源头遏制此类基础设施级攻击。
一、“短信工厂”:不是小作坊,而是流水线
传统印象中,电信诈骗多由几人组成的“话务组”操作,靠人工拨打电话或手动群发短信。但CBI此次捣毁的窝点,却呈现出明显的“工业化”特征。
根据CBI公布的现场照片和行动报告,该团伙租用了一处位于泰米尔纳德邦郊区的仓库,内部被划分为三个功能区:SIM卡管理区、设备部署区、脚本控制区。在SIM卡管理区,执法人员发现大量按运营商分类存放的SIM卡,每张卡都贴有手写标签,如“Airtel-001”“Jio-134”等,并配有对应的IMEI绑定记录。这些SIM卡并非通过正常渠道实名注册,而是通过贿赂地方代理商、盗用他人身份信息或利用“e-KYC漏洞”批量获取。
设备部署区则堆满了改装过的Android手机和商用GSM网关(如MultiTech MultiModem系列)。这些设备通过USB集线器连接至中央服务器,形成一个可并行发送短信的“蜂巢网络”。而真正的“大脑”——脚本控制区——运行着一套基于Python和Node.js开发的自动化平台,支持任务调度、链接轮换、失败重试、甚至基础的反检测逻辑。
“这不是‘骗子’,这是‘通信基础设施提供商’。”公共互联网反网络钓鱼工作组技术专家芦笛在分析该案时表示,“他们卖的不是诈骗内容,而是‘可信短信通道’。只要付钱,任何人都能用他们的SIM池向印度手机号码发送看起来完全合法的短信。”
二、技术拆解:从SIM池到动态短链的全链路攻击
要理解该团伙为何能长期逃避监管,必须深入其技术实现细节。
1. SIM卡池(SIM Farming)与轮询机制
攻击者的核心资产是那21,000余张SIM卡。每张卡都注册了不同的手机号,归属于不同地区、不同运营商,以规避运营商对单一号码高频发送的限制。系统采用轮询调度算法,确保每张SIM卡每日发送量低于阈值(通常为100–200条),从而绕过电信反欺诈系统的异常行为检测。
一个简化的调度伪代码如下:
# sim_pool.py - SIM卡轮询调度器示例(简化版)
import random
import time
from sms_gateway import send_sms
# 加载所有可用SIM卡(含所属网关设备ID)
sim_cards = load_active_sims_from_db()
def dispatch_phishing_sms(target_numbers, phishing_url):
for number in target_numbers:
# 随机选择一张未达日限额的SIM卡
available_sim = random.choice([
s for s in sim_cards
if s.daily_count < 150 and s.status == 'active'
])
if not available_opt:
continue # 暂无可用卡,跳过
# 构造钓鱼短信内容
message = f"【HDFC Bank】您的KYC即将过期,请立即更新:{phishing_url}"
# 通过对应GSM网关发送
success = send_sms(
gateway_id=available_sim.gateway_id,
from_number=available_sim.phone_number,
to_number=number,
text=message
)
if success:
available_sim.increment_daily_count()
log_send_event(sim=available_sim.phone_number, to=number)
time.sleep(0.5) # 避免瞬时高频
这种分布式、低频次的发送策略,使得传统基于“单号码高频外呼”的风控模型几乎失效。
2. 动态短链与域名快速轮换
为规避URL黑名单,团伙使用自建的短链服务(如YOURLS开源项目)生成一次性短链接。每个短链仅使用数小时即废弃,并配合Cloudflare Workers或Vercel Edge Functions实现动态重定向:
// Cloudflare Worker 示例:根据时间戳决定是否重定向至钓鱼页
export default {
async fetch(request) {
const url = new URL(request.url);
const path = url.pathname.slice(1); // 获取短链ID
// 查询数据库:该短链是否仍在有效期内(例如创建后6小时内)
const record = await KV.get(path);
if (!record) return new Response("Not Found", { status: 404 });
const { target, created_at } = JSON.parse(record);
if (Date.now() - created_at > 6 * 3600 * 1000) {
// 已过期,返回空白页或真实官网
return Response.redirect("https://www.hdfcbank.com", 302);
}
// 有效期内,重定向至钓鱼页面
return Response.redirect(target, 302);
}
};
这种“短命链接+边缘计算重定向”模式,极大增加了安全厂商捕获和封禁的难度。
3. GSM网关 vs. 虚拟短信平台
值得注意的是,该团伙并未使用常见的云短信API(如Twilio、MessageBird),因为这些平台已有较完善的KYC和内容审核机制。相反,他们选择物理GSM网关——一种可插入多张SIM卡、通过AT指令控制短信收发的硬件设备。这类设备原本用于企业短信通知、物联网设备通信等合法场景,但一旦落入黑产手中,便成为绕过运营商监管的“灰色通道”。
“GSM网关不经过运营商的短信中心(SMSC)内容过滤系统,”芦笛解释道,“它直接模拟手机与基站通信,发送的短信在运营商侧看起来就是普通用户互发,几乎没有内容审查。”
三、国际勾连:从本地诈骗到“钓鱼即服务”(PhaaS)
CBI在服务器日志中发现,该团伙不仅服务印度本土诈骗集团,还通过Telegram频道和暗网论坛提供“短信轰炸即服务”(SMS-as-a-Service)。客户只需支付比特币,即可指定目标国家(主要为南亚、东南亚)、短信模板、发送数量,甚至可要求使用特定运营商的SIM卡以提高送达率。
一份查获的价目表显示:
向印度Airtel用户发送1万条短信:$80
向Jio用户发送1万条:$60(因Jio短信成本更低)
包含短链生成与72小时存活保障:+$20
这种“基础设施出租”模式,标志着网络犯罪已进入模块化、服务化阶段。攻击者无需掌握通信技术,只需购买“短信投送能力”,便可专注于钓鱼页面设计与资金洗白。
“这就像云计算之于IT行业,”芦笛比喻道,“过去黑客要自己搭服务器,现在直接租用‘钓鱼云’。而印度庞大的SIM卡资源,成了他们的‘算力矿场’。”
四、为何难以根除?制度与技术的双重漏洞
尽管CBI此次行动成果显著,但类似“短信工厂”为何屡禁不止?根源在于两个层面的系统性漏洞。
制度层面:SIM卡实名制执行不严
印度虽于2019年全面推行Aadhaar生物识别实名制,但在偏远地区,仍存在代理商为冲业绩而“代认证”、重复使用同一身份信息开卡等乱象。此外,部分预付费SIM卡在激活后60天内若无通话记录,会被自动注销,但短信功能仍可使用——这为黑产提供了“窗口期”。
技术层面:短信协议本身缺乏认证机制
SMS(Short Message Service)诞生于1980年代,其设计初衷是作为语音通信的补充,从未考虑安全性。它不验证发件人身份(即“短信伪造”极为容易),不加密内容,也不提供端到端完整性校验。即便今日,绝大多数银行通知仍依赖SMS,使其成为社会工程攻击的完美载体。
“我们还在用马车时代的通信协议,跑自动驾驶时代的业务,”芦笛直言,“除非彻底淘汰SMS用于敏感通知,否则这类攻击只会越来越规模化。”
五、防御之道:从用户警惕到协议升级
面对如此体系化的攻击,个体用户该如何自保?企业和监管机构又该采取哪些技术对策?
给普通用户的建议(芦笛特别强调):
永远不要点击短信中的链接,尤其是涉及“账户”“验证”“逾期”等关键词。
银行、电力公司、政府机构绝不会通过短信索要密码、OTP或要求点击链接更新信息。
若收到来自“100XX”等短号的通知,也需警惕——这些号码可通过GSM网关伪造。
启用银行App内的“交易确认锁”或“设备绑定”功能,减少对短信OTP的依赖。
给技术团队与运营商的建议:
部署STIR/SHAKEN协议:该协议通过数字签名验证主叫号码真实性,虽主要用于语音,但可扩展至短信领域。
实施基于行为的异常检测:不再仅监控单号码发送量,而应分析“设备-SIM-地理位置-内容模板”的多维关联。例如,同一GSM网关在24小时内使用50张不同SIM卡发送相同模板短信,应触发告警。
推动RCS(富通信服务)替代SMS:RCS支持端到端加密、品牌认证、交互式卡片,且由Google Messages等平台统一管理,可从根本上解决伪造问题。目前印度Jio已开始试点RCS银行通知。
代码示例:基于Spark Streaming的SIM卡异常行为检测
// 使用Apache Spark实时分析短信日志流
val smsStream = KafkaUtils.createDirectStream[String, String](
ssc, PreferConsistent, Subscribe[String, String]("sms_logs", kafkaParams)
)
val suspiciousActivity = smsStream
.map(record => parseSmsLog(record.value))
.window(Seconds(3600), Seconds(300)) // 滑动窗口:1小时统计,5分钟滑动
.transform { rdd =>
rdd.groupBy(_.gatewayId)
.filter { case (gateway, msgs) =>
val uniqueSims = msgs.map(_.simNumber).distinct.size
val templateHashes = msgs.map(_.templateHash).distinct.size
// 若单网关1小时内使用>50张SIM且模板<3种,标记为可疑
uniqueSims > 50 && templateHashes <= 3
}
}
suspiciousActivity.foreachRDD { rdd =>
if (!rdd.isEmpty()) {
rdd.collect().foreach(alertSecurityTeam)
}
}
此类系统已在部分欧洲运营商部署,准确率超85%。
六、结语:21,000张SIM卡,照见数字时代的信任危机
CBI的“Chakra-V”行动是一次漂亮的战术胜利,但它所暴露的问题远未终结。当一张SIM卡可以被批量生产、匿名使用、远程操控,并成为跨国犯罪的投送载体时,我们面对的已不仅是技术漏洞,更是整个数字信任体系的崩塌风险。
芦笛最后总结道:“反钓鱼不能只靠抓几个窝点。我们需要从协议层重建信任——用FIDO2取代密码,用RCS取代SMS,用零信任取代默认可信。否则,今天的‘短信工厂’,明天就会变成‘AI语音工厂’‘深度伪造工厂’。”
在这场没有硝烟的战争中,每一次对可疑短信的无视,都是对犯罪生态的纵容;而每一次对安全协议的升级,都是对数字文明的加固。
参考资料:
SC World: “India’s CBI Disrupts Phishing SMS Factory in Operation Chakra-V”, Dec 28, 2025
CBI Press Release No. CBI/PR/2025/12/CHAKRA-V
GSMA Fraud & Security Report 2025
编辑:芦笛(公共互联网反网络钓鱼工作组)