电话欺诈通常直接向攻击者付费,中间没有买家或赎金。没有任何东西被窃取或加密,所以常见的入侵迹象都不存在。损失体现为通话费用。
这决定了防御方式。你无法通过检查通话内容中的异常来发现它。所有控制手段都围绕呼叫可以去往哪里、可以有多少、以及可以花费多少。
如果我的系统已经做了安全加固,为什么还需要防御这个?
因为一次入侵的价值是即时的,而窗口期很短。
一个被盗的 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 中更改,最高不超过组织的上限。永远不会触发的上限不是控制措施。在 Voice → Destinations 中,为你很少拨打但又无法关闭的国家/地区添加更低的每日上限。验证通话也计入其中。
- 收紧中继的白名单,因为以上所有控制只对能到达中继的呼叫有效。
- 关注拒绝原因本身。 突然大量出现
destination_not_enabled或calls_per_second_exceeded就是控制措施生效时攻击的表现。它们不是日志中需要过滤掉的噪音,而是告警。
语音目的地涵盖国家/地区的启用和禁用,通话日志列出了每种拒绝原因及其修复方式。
简而言之
攻击者的收入来自目的地,而非你。
他们入侵电话系统并拨打能为自己带来收入的号码,因此费用落在你的账户上,而利润落在他们手中。
国家/地区默认关闭,需要你手动开启。
目的地必须先启用才能接通呼叫,因此一次入侵的影响范围仅限于你启用的列表,而非全世界。
可用性和你的开关是两回事。
可用性表示你是否有权启用某个国家/地区。你的开关表示它是否已开启。一个国家/地区可以是可用但关闭的。
每个上限都会独立拒绝呼叫。
每日消费、并发呼叫数和每秒呼叫数各自独立地阻止呼叫。每个工作区都有每日消费限额,可在 Voice → Spend limit 中更改。你还可以在 Voice → Destinations 中为每个目的地国家添加每日限额。两者均在下一个 UTC 日开始时重置。