来电显示从未经过身份验证。响铃电话上显示的号码只是发起方在字段中填入的值。在电话网络的大部分历史中,下游无法检查该号码是否有权被使用。STIR/SHAKEN 就是为该字段添加签名的框架,让对端能够验证。
呈现给被叫方的不是密码学本身,而是一个字母:A、B 或 C。
STIR/SHAKEN 实际上在呼叫上放了什么?
它在建立呼叫的 SIP 消息的 Identity 请求头中放入一个签名令牌。该令牌说明了谁在为这次呼叫担保,以及担保的程度。
该令牌是 Personal Assertion Token (PASSporT),其 SHAKEN 扩展在 RFC 8588 中定义,这是 IETF 于 2019 年 5 月发布的标准跟踪文档。它在基础令牌上增加了两个声明。Secure Telephone Identity (STI) 是为 SIP 添加已验证来电身份的工作,第一个声明就是你会看到的那个:
This provides three levels of attestation: a full attestation when the service provider can fully attest to the calling identity, a partial attestation when the service provider originated a telephone call but cannot fully attest to the calling identity, and a gateway attestation, which is the lowest level of attestation and represents the service provider receiving a call from a telephone gateway that does not support PASSporT or STI.
该声明本身是一个字符。RFC 8588 第 4 节:
The "attest" claim can be one of the following three values: 'A', 'B', or 'C'. These values correspond to 'Full Attestation', 'Partial Attestation', and 'Gateway Attestation', respectively.
RFC 8588 将定义委托给了 "See [ATIS-1000074] for the definitions of these three levels of attestation"。该文档由 Alliance for Telecommunications Industry Solutions (ATIS) 而非 IETF 发布,且不可免费阅读。因此 A 和 B 之间的规范界限位于付费墙之后,这也是这些等级总是被二手描述的部分原因。
A、B 和 C 分别是什么意思?
A 表示提供商知道你是谁,且该号码属于你。B 表示它知道你是谁,但不确定该号码属于你。C 表示两者都不知道,因为呼叫是从其他地方到达的。
FCC(美国通信监管机构)在其 来电身份验证第二报告和命令(发布于 2020 年 11 月 17 日的 85 FR 73360)中给出了公开说明。每个等级记录了提供商能就主叫方和号码确认多少。监管机构原文:
- A:"A provider assigns an A-level attestation when it is the entry point of the call onto the IP network, it can confirm the identity of the subscriber making the call, and the subscriber is using its associated telephone number."
- B:"A provider uses a B-level attestation to indicate that it is the entry point of the call onto the IP network and can confirm the identity of the subscriber but not the telephone number."
- C:"A provider uses a C-level attestation when it is the point of entry to the IP network for a call that originated elsewhere but has no relationship with the initiator of a call, such as when a provider is acting as an international gateway."
在 C 等级下,提供商是通道而非来源,因此它无法为任何一方担保。
这就是为什么等级不是评分。一个完全合法的呼叫可能带有 B,因为主叫方使用的号码不是该提供商发放的,提供商无法确认。一个骚扰电话可能带有 A,因为发起方是已知客户且使用的是自己的号码。这个字母描述的是提供商掌握的证据,而非呼叫的意图。
谁来决定我是否获得 A?
签名呼叫的提供商来决定,使用的是它自行定义的测试方法。
同一 FCC 命令指出,每个提供商定义自己的测试方法:
The method or process a provider uses to determine the legitimacy of the caller's use of a telephone number is specific to each provider. As a result, a provider's reputation is tied to the rigor of its evaluation process.
因此,不存在你可以满足以获得 A 的外部标准,也没有任何设置可以授予 A。决定权在于提供商是否确认了关于你的两件事,以及它为判断失误所承担的声誉代价。这个问题的实际版本不是 "how do I get an A",而是 "what has my provider established about me and about this number",后半部分的答案通常是来电显示验证。来电显示号码介绍了如何注册号码并证明对其的控制权,这是改变对你可做出何种认证的关键步骤。
由承载呼叫的提供商分配给你的号码,与你在别处拥有并通过该提供商呈现的号码处于不同的地位。Bird 自己的来电显示指南从另一个角度阐述了同样的观点。它将反欺骗框架列为你从其他地方获取的号码可能无法传递到对端的原因之一。
获得 A 是否意味着我的呼叫一定会接通?
不。标准将认证视为他人决策的输入。
FCC 命令说明了这些等级的用途:
The STIR/SHAKEN standards envision these various attestation levels as information that can facilitate traceback and to enhance the spam identification solutions that terminating voice service providers enable for their customers.
由此产生两个结果。追溯是事后用途:第二个 SHAKEN 声明是来源标识符,它的存在使调查人员可以将违法呼叫追溯到其进入网络的位置。垃圾信息识别是实时用途,由接收运营商及其分析合作方运行的系统完成。该系统将认证作为众多信号之一。已签名的 A 等级呼叫仍可能被标记,为什么我的呼叫可能被标记为垃圾信息介绍了由谁添加标记以及有哪些申诉途径。
为什么认证没有到达?
因为请求头并非在所有路由上都能保留。
FCC 的命令明确说明了这一机制:"if a call is routed at any point over an interconnection point or intermediate provider network that does not support the transmission of SIP calls, the Identity header will be lost." 一个呼叫可以在发起端被正确签名,却在到达对端时没有任何可验证内容,因为中间的某一段线路不支持 SIP。
同一命令指出,终端提供商自身的覆盖范围与你的同样重要。它只能在能够验证的地方对身份验证信息采取行动。如果请求头已丢失,就没有可操作的内容。因此,对端收到的未签名呼叫并不能证明发起方提供商未进行签名,而两者之间的路径也不是任何一端能完全控制的。
认证在存续时是一个强信号,丢失时则无声无息。因此,应将其视为被接听的因素之一,而非保证接通的机制。
简而言之
等级描述的是提供商的了解程度,而非通话质量。
A、B 和 C 记录了签名提供商能担保多少:主叫方和号码、仅主叫方、或两者都无法担保(因为呼叫来自其他地方)。
获得 A 的标准由提供商自行决定。
FCC 表示,判断主叫方是否可以使用某个号码的方法因提供商而异,并且该提供商的声誉取决于其审核的严格程度。
认证是标记的输入,而非最终判定。
标准将这些等级视为用于追溯和接收运营商进行的垃圾信息识别的素材。认证本身不决定手机上显示的内容。
签名可能在到达之前丢失。
如果呼叫经过的网络不承载 SIP,Identity 请求头就会丢失,因此已签名的呼叫到达对端时可能没有任何可验证的内容。