Wednesday, January 31, 2018

Overview of Bluetooth Security

From:
http://www.springer.com/cn/book/9783642406454

蓝牙的安全配置

基本的蓝牙安全配置由决定蓝牙设备如何实现其可连接性和可发现性选项的用户完成。
可连接性和可发现性功能的不同组合可分为三类,即三个安全级别:

1.Silence:设备永远不会接受任何连接。它只是监视蓝牙通信量。
2.Private:设备不能被发现,即它是一种所谓的不可发现的装置。只有在蓝牙设备地址(BD_ADDR)已知的情况下,才能接受连接。一个48位的BD_ADDR通常是唯一的,在全球范围内仅指一个单独的蓝牙设备.。
3.Public:设备既可以被发现,也可以连接到。因此,它被称为可发现的装置。

48位BD_ADDR分为三部分:16位非重要地址部分(NAP)、8位上地址部分(UAP)和24位下地址部分(LAP)。

BD_ADDR(NAP和UAP)的前三个字节引用蓝牙芯片的制造商并表示company_id。BD_ADDR(LAP)的最后三个字节(称为company_assigned)在不同的蓝牙设备模型中或多或少地随机使用。company_id值是公共信息,并被列在电气和电子工程师协会(IEEE)的组织唯一标识符(OUI)数据库中。

设备还可以实现四种不同的安全模式。在蓝牙技术中,设备一次只能处于下列安全模式之一:

1.不安全:蓝牙设备不启动任何安全措施。
2.服务级强制安全模式:两个蓝牙设备可以建立一个非安全的ACL链路。当向逻辑链路控制和适配协议(L2CAP)面向连接(CO)或L2CAP无连接(CL)信道请求时,启动安全过程,即身份验证、授权和可选加密。
3.链路级强制安全模式:在建立ACL链路时启动安全过程。
4.服务级强制安全模式+:这种模式与模式2类似,只是只有使用SSP的蓝牙设备才能使用它,即只有蓝牙2.1+EDR或更高版本的设备才能使用这种安全模式。

身份验证与加密

身份验证用于向另一个微微网设备证明身份。
身份验证的结果用于确定客户端的授权级别,这可以通过多种不同的方式实现:例如,可以授予所有服务的访问权,只能授予服务的子集,或者授予某些服务的访问权,而其他服务则需要额外的身份验证。

加密用于对蓝牙设备之间交换的信息进行编码,使窃听者无法读取其内容。
蓝牙使用Secure And Fast Encryption Routine+(SAFER+)和128位密钥作为认证和密钥生成算法,蓝牙版本高达3.0+HS(High Speed),而蓝牙4.0(即 Bluetooth Low Energy)用更安全的128位高级加密标准(AES)代替SAFER+。

SAFER+是由Massey等人于1998开发的。它被作为AES竞赛的候选提交,但密码没有被选入决赛。SAFER+是一种具有以下主要特性的分组密码:
·它有128位的块大小和三个不同的密钥长度(128、192和256位)。
·Safe+由九个阶段(八个相同的Round和输出转换)和一个密钥调度算法(KSA)组成,其方式如下:
A. KSA产生17个不同的128位子键.。
B. 每一轮使用两个子键和一个128位输入字从上一轮计算128位字,这作为下一轮的新的输入字。
C. 在输出转换中使用最后一个子键,这是上一轮输出和最后一个子键的一个简单的按位异或。

虽然可以有算法较快的破解SAFER+,它仍然被认为是相当安全的。

AES

AES由美国国家标准与技术研究所(NIST)于2001在AES竞赛的评估过程之后出版。Rijndael是比赛的获胜者,NIST选择它作为AES的算法。AES是一种对称分组密码,旨在取代数据加密标准(DES)作为广泛应用的公认标准,但这一过程将需要很多年。NIST预计,在可预见的将来,三重数据加密标准(3 DES)仍将是一种获得批准的算法,至少对于美国政府来说是如此。AES加密由10-14轮组成,其中数据块按以下方式一步一步地处理(最后一轮除外;值得注意的是,AES解密与AES加密是对称的):

1.Byte substitution:字节替换使用S盒来执行块的逐字节替换.。
2.Row shifting:行移位是一种简单的排列方式。
3.Column mixing:柱混合是在GF(28)上使用算术的一种替代。Galois Field,GF(28)是一个由256个元素组成的有限域,它可以用8 bit为单位组成的字符串或十六进制表示法来表示。
4.Round key adding:Round key adding是当前块的简单按位XOR,其中包含部分扩展键。

最后一轮AES加密(和AES解密)略有不同:
1.Byte substitution。
2.Row shifting。
3.Round key adding。

AES被认为是安全的,它非常快速和紧凑(大约1 kB的代码),它的块大小是32的倍数(通常是128位),它的密钥长度也是32倍(通常是128、192或256位),并且它具有非常简洁的代数描述。

配对

由于蓝牙是一种无线通信系统,所以攻击者总是有可能故意阻塞或拦截传输,或者将虚假或修改过的信息传递给微微网设备。蓝牙安全是建立在事件链的基础上的,这些事件都不应该为窃听者提供有意义的信息。为了成功地确保安全性,所有事件都必须按特定顺序发生。

为了让两个蓝牙设备开始通信,必须执行一个称为配对的过程。作为配对的结果,两个设备形成一个可信的对,并建立一个链接密钥,该链接密钥稍后用于为每个会话创建一个数据加密密钥。
在2.0+EDR的蓝牙版本中,配对完全基于两个设备共享相同的个人识别码(PIN),即密码,用于生成多个128位密钥。当用户在两个设备中输入相同的密钥时,设备产生相同的共享密钥,用于对它们交换的通信量进行身份验证和加密。当蓝牙设备第一次见面时会生成一个初始化密钥(Kinit),它用于保护其他更安全的128位密钥的生成,这些密钥是在安全事件链的下一阶段生成的。Kinit由128位伪随机数IN_RAND、L-byte(1≤L≤16)PIN码和BD_ADDR导出。值得注意的是,IN_RAND是以未加密的形式通过无线发送的。

某个键生成函数的输出可以用函数本身及其输入来表示。Kinit是在这两种设备中使用公式Kinit=E22(PIN‘,L’,IN_RAND)产生的。PIN码及其长度L在发送到E22函数之前,被修改为两个不同的量,称为PIN‘和L’。如果PIN小于16字节,则通过从设备的BD_ADDR中追加字节,直到PIN‘达到16字节的总长度或整个BD_ADDR都被追加进去,以二者中先发生的为准。如果一个设备有固定的PIN代码,则使用另一个设备的BD_ADDR。
如果两个设备都可以支持可变的PIN代码,则使用接收IN_RAND的设备的BD_ADDR。Kinit用于加密128位伪随机数(RAND或LK_RAND),即在生成链路密钥(单位密钥或组合密钥)时在事件安全链的下一阶段交换的RAND⊕ Kinit或LK_RAND⊕ Kinit 。

使用公式Ka=E21(BD_Addra,Randa),仅从一个设备(设备A)的信息中生成单位密钥(Unit Key, KA)。设备A用Kinit加密KA。即:KA ⊕ Kinit并且发送给设备B,设备B用Kinit解密KA,即:(KA ⊕ Kinit) ⊕ Kinit = KA。现在两个设备都有相同的KA作为Link Key了。

使用Unit Key的蓝牙设备只有一个Key用于其所有连接。这意味着同一密钥将与所有其他可信蓝牙设备共享。此外,任何使用相同Unit Key的可信蓝牙设备都可以窃听共享相同Unit Key的其他两个蓝牙设备之间的任何通信数据。
此外,任何使用相同Unit Key的可信蓝牙设备都可以通过复制其BD_ADDR来模拟目标设备。因此,只有资源有限的设备(即设备无法存储多个密钥),才应该使用KA,因为它只提供了较低的安全性。因此,蓝牙规范不再推荐使用KA。

组合密钥(Combination Key, KAB)依赖于两个设备,因此它是从两个设备的信息中导出的。在这两种设备中,KAB都使用公式KAB=E21(BD_ADDRA,LK_RANDA)⊕(BD_ADDRB,LK_RANDB)。值得注意的是,生成KAB只不过是两个Unit Key之间的一个简单的位XOR,KAB=KA⊕KB。每个设备都可以产生自己的Unit Key,每个设备也具有另一个设备的BD_ADDR。因此,两个设备必须只交换各自的伪随机数才能生成彼此的单位密钥。

设备A用当前密钥K加密LK_Randa,即LK_Randa⊕K,其中K可以是先前创建的Kinit、KA或KAB,并将其发送给设备B。如果设备第一次一起创建链接密钥,则K是Kinit。如果Link Key被升级为Combination Key,则K为KA,并且如果正在更改Link Key,则为KAB。
设备B用K解密LK_RANDA,即:(LK_RANDA ⊕ K) ⊕ K = LK_RANDA 现在可以生产KA。相应地,设备B用K加密LK_RANDB,也就是(LK_RANDB ⊕ K) ⊕ K = LK_RANDB,并发送给设备A。设备A用K解密 LK_RANDB 即 (LK_RANDB ⊕ K) ⊕ K = LK_RANDB,生成KB。最后,这两种设备都可以用KB XOR KA产生KAB,即KAB=KA ⊕ KB。

事件安全链的下一阶段是挑战响应身份验证,其中检查claimant对秘密链接密钥的知识。 在每次认证期间,一个新的128位伪随机数AU_RAND通过无线以未加密的形式交换。身份验证函数E1的其他输入是claimant的BD_ADDR和当前的链接密钥(KA或KAB)。在这两种设备中,通过E1(AU_Randa,BD_ADDRB,Link Key)函数产生32位结果(SRES,签名响应)和96位结果(ACO,认证加密偏移),其中链路密钥为KA或KAB。

Claimant以未加密的形式将SRES’发送给验证者。SRES’即Claimant产生的SRES值。验证器将生成的SRES值与接收到的SRES值进行比较,如果这些值匹配,则成功地完成身份验证。
当生成加密密钥时,ACO将用于事件安全链的下一阶段。
值得注意的是,SRES和SRES‘是32位值,而不是128位值。32位SRES提供了合理的保护,防止攻击者试图猜测值,同时也减少了PIN代码被能使用各种方式确定正确SRES值的攻击者破坏的可能性。

ACO、当前链路密钥(Ka或KAB)和128位伪随机数en_RAND是用于生成加密密钥(KC)的加密密钥生成函数E3的输入。master(设备A)生成EN_RAND,并以未加密的形式通过无线将其发送给slave设备(设备B)。
KC是使用公式KC=E3(EN_RAND,ACO,Link Key)在两个设备中产生的,其中Link Key是KA或KAB。密钥流生成器函数E0通过在两个设备中生成相同的密码比特流或密钥流(也称为运行密钥),因此可以进行对称加密。
E0函数的输入是KC、主时钟的BD_ADDR(BD_ADDRA)和主时钟的26位(CLK 26-1)。密钥流由E0(KC,CLK 26-1,BD_ADDRA)函数生成,该函数对每个新发送或接收的基带数据包重新初始化,即对每个新的基带数据包更新CLK 26-1。
这意味着对E0函数的输入永远不会比一个基带分组的寿命长,因此蓝牙设备会为每个新的Baseband数据包生成一个新的密钥流。

发送方通过使用密钥流(即Plaintext⊕Keystream = Ciphertext)对明文进行加密,并将生成的密文发送给接收方。
接收方通过使用相同的密钥流对密文进行解密,即Ciphertext⊕Keystream =(Plaintext⊕Keystream)⊕Keystream = Plaintext。
值得注意的是,只有蓝牙基带数据包的有效负载是加密的(而不是访问代码或报头)。因此,攻击者不能使用访问代码和报头的定期重复信息(攻击者很容易猜测),以便于对密码进行密码分析。
正如本章已经讨论过的,PIN是蓝牙2.0+EDR版本中共享秘密的唯一熵源。由于PIN通常只包含四个十进制数字,因此产生的密钥的强度不足以防止通信中的被动窃听。即使使用更长的16个字符字母数字PIN,也无法实现对主动窃听的全面保护:已经证明,可以对蓝牙通信执行MITM攻击(版本可达2.0+EDR)。

MITM

让我们假设Alice和Bob是相互通信的,他们希望使用一些公钥加密方法来保护他们的通信。在MITM攻击中,Mallory(攻击者)入侵了Alice和Bob之间的通信。Mallory可以窃听消息、修改消息、删除消息,并在Alice和Bob之间生成新消息,这样他的存在就不会被暴露,也就是说,Alice和Bob不知道它们之间的链接被Mallory破坏了。Mallory在和Alice说话时也能模仿Bob,反之亦然。这个MITM攻击的简单示例的工作方式如下:

1.爱丽丝把她的公钥发给鲍勃,但马洛里能够截取它。马洛里送给鲍勃他自己的公钥,他有匹配的私钥。现在鲍勃错误地认为他有爱丽丝的公钥。

2.鲍勃把他的公钥寄给爱丽丝,但马洛里能截取它。 马洛里送给爱丽丝他自己的公钥,他有匹配的私钥。现在爱丽丝错误地认为她有鲍勃的公钥。

3.Alice向Bob发送了一条用Mallory的公钥加密的消息,但是Mallory能够拦截它。Mallory用他的私钥解密消息,保存消息的副本,用Bob的公钥重新加密消息,并将消息发送给Bob。现在鲍勃错误地认为这消息直接来自爱丽丝。

4.Bob向Alice发送了一条用Mallory的公钥加密的消息,但是Mallory能够拦截它。 Mallory用他的私钥解密消息,保存消息的副本,用Alice的公钥重新加密消息,并将消息发送给Alice。现在,爱丽丝错误地认为这消息是直接来自鲍勃的。即使Alice和Bob的公钥存储在数据库中,MITM攻击也能工作。

Mallory可以拦截Alice(或Bob)的数据库查询,并将自己的公钥替换为Bob(或Alice)的公钥。 他还可以以某种方式侵入数据库,并将其密钥替换为Alice的公钥和Bob的公钥。 MITM攻击起作用,因为Alice和Bob无法验证他们是否真正使用了对方的正确公钥。如果马洛里没有造成任何明显的沟通延误,爱丽丝和鲍勃不知道马洛里已经入侵了他们之间的会话。

在没有公钥验证的情况下,MITM攻击通常(原则上)可以针对使用公钥技术发送的任何消息。解决这一问题的一个办法是使用公钥证书(也称为数字身份证书),它使用数字签名将公钥与其各自用户的信息,即用户姓名、用户地址等信息绑定在一起。每个用户都与受信任的授权机构、证书颁发机构(CA)相关联,并且每个证书都是由这样的CA创建的。证书在用户与其公钥之间建立可验证的连接。用户知道他们的CA的公钥,因此他们可以验证他们的CA的签名。证书存储在目录中,而且只允许CA在此目录中写入,但是CA的所有用户都可以读取目录中的信息。

针对MITM攻击的防御使用基于公钥证书、双向身份验证(也称为相互身份验证)、密钥、密码和其他方法(如语音识别和其他生物识别)的身份验证技术。蓝牙版本2.1+EDR,3.0+HS和4.0为配对过程增加了一个新的指定,即SSP。它的主要目的是通过提供对被动窃听和MITM攻击的保护来提高配对的安全性。SSP使用椭圆曲线Diffie-Hellman(ECDH)公钥密码技术,而不是使用(通常是短的)密钥作为建立链接密钥的唯一熵源。要构造Link Key,设备使用公共-私钥对、一些非CES和设备的蓝牙地址。被动窃听被SSP有效地阻止了,因为对一个拥有大约95位熵的私钥进行彻底的搜索目前被认为在合理的时间内是不可行的。为了防止MITM攻击,SSP要么使用OOB通道(例如近场通信,NFC),要么请求用户的帮助:例如,当两种设备都有显示器和键盘时,用户被要求比较两位数的数字。这样的比较也可以被认为是不受MITM控制的OOB信道。如果配对过程中使用的值被MITM篡改,则6位完整性校验和的校验概率为0.999999。

SSP配对模型

SSP使用四种配对模型。除了前面提到的两个配对模型,OOB和数字比较,还定义了名为Passkey Entry和Just Works的模型。
当一个设备具有输入功能,但没有显示六位数的屏幕时,使用Passkey入口配对模型。在具有输出能力的设备上,向用户显示六位数校验和,并要求用户在具有输入能力的设备上输入该校验和。

如果两个设备都有输入功能,但没有输出功能,则还使用Passkey条目配对模型。在这种情况下,用户选择一个6位数的校验和,并在两个设备中输入它。

最后,如果至少有一个设备既没有输入也没有输出能力,并且不能使用OOB,则使用 Just Works模型。在这个模型中,用户不需要执行任何对数字的操作:相反,设备可能只是要求用户接受连接。

配对模型的选择取决于设备功能,如下表:

LIST
LIST
LIST

DisplayYesNo表示该设备有显示器,并且至少有两个映射到“是”和“否”的按钮:使用这些按钮,用户可以接受或拒绝连接。
表中的其他符号是不言自明的。SSP由六个阶段组成:

1.功能交换:以前从未见过或出于某种原因想要重新配对的设备,首先交换它们的输入/输出(IO)功能(见上表),以确定要使用的适当的配对模型。
2.公钥交换:设备产生公钥对,并将公钥发送给对方。他们也计算了Diffie-Hellman Key。
3.认证阶段1:在此阶段运行的协议依赖于配对模型。这一阶段的目标之一是确保在设备之间的通信中没有MITM。这是通过使用一系列的非CES、对非CES的承诺以及通过OOB通道或在用户的帮助下执行的完整性校验和的最终检查来实现的。
4.认证阶段2:设备完成值的交换(公钥和非CES)并验证它们的完整性。
5.链路密钥计算:各方使用蓝牙地址、先前交换的值和第二阶段构造的Diffie-Hellman密钥计算链路密钥。
6.LMP认证和加密:在此阶段生成加密密钥,这与直到2.0+EDR的蓝牙版本配对步骤相同。

图中概述了在SSP阶段发送的消息的内容,下表解释了所使用的符号。

尽管SSP提高了蓝牙配对的安全性,但是通过强制受害者设备使用Just Work配对模型,可以实现对蓝牙2.1+EDR、3.0+HS和4.0设备的MITM攻击。此外,至少有一项针对蓝牙SSP的MITM攻击已经在实践中见过。因此,需要进一步提高SSP的安全性。