电话欺诈通常直接向攻击者付费,中间没有买家或赎金。没有任何东西被窃取或加密,所以常见的入侵迹象都不存在。损失体现为通话费用。
这决定了防御方式。你无法通过检查通话内容中的异常来发现它。所有控制手段都围绕呼叫可以去往哪里、可以有多少、以及可以花费多少。
如果我的系统已经做了安全加固,为什么还需要防御这个?
因为一次入侵的价值是即时的,而窗口期很短。
一个被盗的 SIP 凭据,或 PBX(负责路由公司呼叫的企业电话系统)上的一个开放端口,一经使用立即产生收益。攻击者的动机是在任何人察觉之前尽可能多地拨打。费率最高的目的地恰恰是正常企业从不会拨打的。
这正是白名单之所以有效而非仅仅整洁的原因。大多数企业呼叫的国家/地区少且稳定。攻击者需要的是一组特定且不同的国家/地区。任何迫使两者重叠的机制都会摧毁攻击者的整个商业模式。
目的地控制是如何工作的?
每个国家/地区要么为你的工作区启用,要么未启用,呼叫只能到达你开启的那些。
两个独立的概念决定了你能对一个国家/地区做什么,混淆它们是最常见的误解:
- 可用性表示你是否有权启用该国家/地区。
Available意味着 Bird 可以从你的账户向该国家/地区发起呼叫。Not supported意味着不能,恢复它需要联系支持。 - 你的开关表示一个可用的国家/地区是否已开启。更改从你操作的那一刻起生效。
因此,一个国家/地区可用并不能说明呼叫当前是否能到达它。那取决于开关,而开关是你操作的控制项。
一些国家/地区带有高风险标记,反映其费率和欺诈暴露程度。这些正是攻击者试图拨打的目的地。除非业务确实需要呼叫它们,否则保持关闭,并在启用前确认呼叫费率。语音目的地页面列出了每个国家/地区的可用性和启用状态,语音定价提供费率信息。
因此被拒绝的呼叫会返回 destination_not_enabled。解决办法是开启该国家/地区,而不是重试。
可用性针对的是整个国家/地区。 已启用国家/地区内的某个特定号码仍可能不可达,此时会被拒绝为 no_route_found。
no_route_found 涵盖多种原因。 Bird 在检查你的目的地设置之前,先对你拨打的号码进行分类。它会拒绝不支持路由的号码类型。付费费率号码是这里最关键的:号码终接时会向号码所有者付费,这正是攻击者拨打的号码。共享付费号码和个人号码范围会分摊通话费用或转接到另一条线路。非地理号码不属于任何国家/地区的区号。这三种都以相同方式被拒绝。这些拒绝是有意为之的。它们恰好覆盖了攻击者想要拨打的号码,因为你已启用的国家/地区内的付费费率范围永远无法通过分类检查。真正不可达的号码也会报告相同的代码,因此在提交工单之前,请先检查你拨打的号码类型。
在我允许的国家/地区内,什么能限制攻击?
三个上限,每个都能独立拒绝呼叫。
| 拒绝原因 | 触发的上限 |
|---|---|
daily_spend_exceeded | 你的组织的每日语音消费上限 |
concurrent_calls_exceeded | 账户允许的最大并发呼叫数 |
calls_per_second_exceeded | 新呼叫的发起速度超过了账户允许的上限 |
insufficient_balance | 钱包余额不足以支付该呼叫,因此被预先拒绝 |
消费上限最接近欺诈控制手段,因为它以攻击者实际窃取的东西来计量。它的执行路径也与另外两个不同。它在下一个 UTC 日开始时重置,因此触发它的突发流量在那之前会被遏制,而不仅仅是被减缓。它也是唯一在你设置之前不存在的上限:未配置每日语音上限的组织不会执行任何消费上限。
另外两个上限在两个方面表现不同,影响你对它们的依赖方式。
它们按顺序检查,而非同时检查。 并发呼叫上限先评估并立即返回结果,因此同时超过两个上限的呼叫会报告 concurrent_calls_exceeded,而不会提及拨打速率。这对诊断有影响,但不影响防御。自动外呼系统可能触发 calls_per_second_exceeded,但远未达到并发上限。更改设置之前,先确认你实际收到的是哪个拒绝原因,因为它们的修复方式不同,提高错误的上限不会有任何效果。
如果某个上限自身的检查无法完成,呼叫将被放行。 如果并发计数或速率限制器无法完成评估,呼叫会被放行而非拒绝。因此这些上限在正常运行中是可靠的约束,但并非在所有条件下都有保障。这也是目的地列表重要的另一个原因:它是不依赖实时查询的那一层。
insufficient_balance 在未被刻意设计为控制手段的情况下起到了控制作用。钱包限制了一次入侵能产生多少欺诈消费。大额自动充值会移除这个限制,这使得充值金额不仅是便利性决策,也是欺诈防控决策。
谁能向我的中继发送呼叫?
只有中继 IP 白名单上的地址、它允许的 API 密钥以及它签发的会话凭据才能向它发送呼叫。
SIP 中继决定谁可以向它发送呼叫,来自其他任何地方的呼叫在任何目的地逻辑运行之前就会被拒绝,返回 source_not_allowed。出站呼叫还会与你的已验证主叫号码进行比对,因此使用未在工作区中验证的号码发起的呼叫会被拒绝,返回 caller_id_not_verified,而不会被拨出。
这两项值得与你的目的地列表按相同周期审计,因为过于宽松的白名单会使其余控制失效。SIP 中继涵盖 IP 白名单、API 密钥认证和会话凭据,主叫号码涵盖验证。
我应该怎么做?
- 只启用你需要呼叫的国家/地区,并将该列表视为需要定期审查的内容,而非一次性设置。两年前为某个活动启用的国家/地区就是一个持续的暴露面。
- 设置工作区的每日消费限额,将其设定为触发时你能注意到的水平,而不是设定为永远不会触发的水平。每个工作区都有一个默认限额;可在 Voice → Spend limit 中更改,上限为组织的最大值。一个从未触发的限额不是控制措施。
- 收紧中继的白名单,因为以上所有控制只对能到达中继的呼叫有效。
- 关注拒绝原因本身。 突然大量出现
destination_not_enabled或calls_per_second_exceeded就是控制措施生效时攻击的表现。它们不是日志中需要过滤掉的噪音,而是告警。
语音目的地涵盖国家/地区的启用和禁用,通话日志列出了每种拒绝原因及其修复方式。
简而言之
攻击者的收入来自目的地,而非你。
他们入侵电话系统并拨打能为自己带来收入的号码,因此费用落在你的账户上,而利润落在他们手中。
国家/地区默认关闭,需要你手动开启。
目的地必须先启用才能接通呼叫,因此一次入侵的影响范围仅限于你启用的列表,而非全世界。
可用性和你的开关是两回事。
可用性表示你是否有权启用某个国家/地区。你的开关表示它是否已开启。一个国家/地区可以是可用但关闭的。
每个上限都会独立拒绝呼叫。
每日消费、并发呼叫数和每秒呼叫数各自独立地阻止呼叫。每个工作区都有每日消费限额,可在 Voice → Spend limit 中更改。该限额在下一个 UTC 日开始时重置。