摘要
电子撬锁——滥用门锁
危害物理安全
目前已知最古老的锁可以追溯到4000年前,它发现于古埃及帝国的废墟中。这种锁因当时在该地区流行而被称为埃及锁。锁是用木头做的,内有不同长度的木销。门上的一个槽可以插入带有与锁销长度匹配的木销的木钥匙。钥匙插入到锁中并抬起,使木销均匀地在门闩顶部对齐,这样便可以打开门。
从埃及人开始,我们受希腊、罗马和各种来自中国、土耳其、印度等东方国家的锁的影响,以及后来英国和美国的影响,造就了今天我们所依赖的各种不同类型的锁,它包括了可移动的杠杆、圆柱形的钥匙和销栓的组合,没有正确的钥匙就很难打开它。
虽然我们很多人都知道用不同的技术开锁是多么容易,但目前家中还是依赖锁来保障我们的安全。许多国家和地区试图通过颁布禁止拥有开锁工具的法令来阻止其大肆流行。但是,诚如你所想,仅仅存在规定,并不能阻止那些想要进入房屋的恶意实体(犯罪分子)。
展望物联网设备的未来,对我们来说,摆脱对传统物理锁具挑选的关注,分析使我们处于高风险状态的电子门锁机制就变得重要了。本章将探讨现有的电子门锁安全问题,其无线机制,以及它们与移动设备的集成。我们将在接下来的几节中逐步完成这些话题,探讨电子门锁当前的安全机制(或不足)。制造厂商建立起不良安全决策之后,我们会更了解潜在的风险,并对这些类型的锁在未来将需要什么样的安全措施有更好的想法。
2.1 酒店门锁和磁卡
研究员Cody Brocious发现了一个常见的门锁漏洞,它影响着世界各地数以百万计的酒店门锁。鉴于其潜在的影响,在此便不可不提。事实上,Brocious在2012年7月的黑帽安全大会上曝光这一问题之后,很多酒店出现了入侵者利用这个漏洞进入酒店房间并窃取财物的真实案例。Brocious的作品滥用了基本安全设计缺陷,在信息安全社区流行起来,这里是开始了解电子门锁相关安全性问题的理想场所。
2.1.1 Onity门锁
Onity HT门锁非常受欢迎。如果你曾入住过酒店,很有可能已经用到过,并依靠它保护你的安全和隐私。Onity锁有一个磁性钥匙卡读卡器,如图2-1所示。酒店的客人都有磁性钥匙卡,通过划过读卡器来打开门锁。酒店员工可以在客人办理入住手续或客人要额外的门卡时发给客人。酒店给员工发通用钥匙卡,例如打扫房间的工作人员可以打开多个门。
研究具有传统机制的采用磁卡作为钥匙的Onity锁很重要,因为下一代基于物联网的门锁可能保留传统机制(普通钥匙和磁条卡)并混合更智能的方法,如无线认证和电子钥匙,这将在本章接下来的部分讨论。理解Onity锁的安全问题非常重要,因为这为理解基本的安全设计缺陷打下基础,使得能够利用这些信息影响全世界使用的锁。我们必须努力防止发生这种情况。
图2-1:Onity门锁
2.1.2磁条
我们生活中经常遇到磁条卡,从信用卡、公共交通卡到酒店房卡,我们依赖磁条卡获取服务和进入特定场所。图2-2展示了一张典型的带有磁性条带(即磁条)的信用卡的背面。标签①指磁性条,②是签名条,③表示卡的安全码(CSC)。下文中讨论的酒店房卡,通常只有背面的磁条与正面的酒店标志。
图2-2:带磁条的卡片
通常,磁条包含3个存储不同数据块的独立磁道。磁道1和2一般用于金融行业的ATM、借记卡和信用卡,并没有限定哪个机构使用特定的磁道。Onity门锁使用磁道3,它包含以下数据序列:
16位识别码
一个识别码包含了卡能开的房门和卡的复制版本信息。为酒店员工创建主卡时,通过存储的一个值代表酒店员工的身份而不是门的标识。当客人入住酒店时,为指定房间的门制作的第一张卡的复制标识位设置为0,接下来的复制卡标识位依次加1,以便识别。
8位标志字节
用一个字节设置各种其他选项的值。
16位过期日期
客人办理入住手续时,设置门卡的有效时长。
24位未知位
设置为全0。
24位钥匙编码
该值被写入单个门锁。这时,门锁中配置一个提前量。例如,一把门锁的钥匙编码是100,提前量是50,那有效的钥匙编码值是100~150的一个整数。每当插入有效卡时,门锁把自身的钥匙编码重置成门卡的值。通过这种方式,门锁钥匙编码增加以确保较旧的门卡失效。注意,代表主钥匙的具体钥匙编码也存储在门锁中。酒店用不同的主钥匙编码来分割不同的区域,使得仅有某些锁能够用酒店指定的主钥匙卡打开。
站点代码(site code)值是由Onity随机分配的唯一的32位随机值,采用站点代码来加密24位钥匙编码,以便确认酒店财产。如果这个值被破解,便能造出任意磁卡开锁,也能给门锁重新设置(如后文所述)。
站点代码实际使用的加密算法在Cody Brocious的白皮书附录B中。
除了这里所述的典型钥匙卡之外,该系统还包括编程卡和备用卡。当刷过编程卡后再刷备用卡,那么备用卡就成了这道门的客人门卡了。这些卡是当编码器(用来制作客人门卡)出现故障时使用的。编程卡也是用站点代码值加密的,然而备用卡是没有加密过的。当(用编程卡)制作一批备用卡时,每张卡的识别码都依次递增。
客人将卡插入门锁,利用站点代码解密卡上的数据。下一步,检查是否在有效期内。最后,检查钥匙编码,如果在提前量范围内就能打开门锁。
2.1.3 编程端口
锁的右下角有一个编程端口,该端口也用作直流电源适配器接口。在安装门锁和更换门锁电池时,会导致存储被重置,这时可用一个便携的编程器(PP)给门锁编程。安装时,PP用来配置锁的识别码和钥匙编码。
PP也能用来连接门锁并发出指令,如提供正确的站点代码来开锁。
PP还可以通过编程端口读取锁的存储区。
2.1.4 安全问题
Brocious的白皮书描述了有关Onity锁的各种安全问题。了解这些问题是非常重要的,因为它们会影响数以百万计的配备这些锁的酒店房门。他们还表示,其他锁制造商应尽量避免缺乏基本的安全控制。
微控制器漏洞
如果站点代码是已知的,就能通过连接到编程端口使用简单的微控制器打开锁,如便宜($50以下)流行的Arduino。
Cody Brocious在他的白皮书的附录A中介绍了Arduino开锁所需代码(也称为sketch)。基本上,Brocious的sketch利用了这个事实:使用Arduino可以从编程端口读取存储器的任何部分。Brocious用这个办法读取存储器的站点代码,然后用它调用开锁命令开锁。
对数以百万计安装在世界各地不同地方的Onity锁来说,这是一个严重的安全问题。只要有在附近电子商店购买的Arduino微控制器,任何人都可以走到使用Onity锁保护的门前,打开它。事实上,著名的连锁酒店,如假日酒店、长住酒店、优质酒店、拉昆塔酒店、红屋顶酒店、汽车酒店六、经济酒店、万怡万豪酒店和舒适客栈报道的盗窃案都是由这一特殊的安全问题造成的。
锁存储中的主钥匙编码
通过读取锁存储中的主钥匙编码可以制作主钥匙卡。站点代码也可以从存储中读出,这个值可用来制作主卡。如前所述,酒店可以选择不同区域内的锁使用不同的主卡。因此,主钥匙可以限定在酒店的特定区域房间使用。
然而,这仍然是一个严重的问题,因为潜在的入侵者可以用一次性创建的主钥匙卡进入酒店一整片区域的房间。
未加密的备用卡
如前所述,每一个附随的备用卡都是通过增量识别值创建的,是没有加密的。当编码器故障时可以使用这些卡。因此,如果入侵者可以拿着识别值为500的备用卡,那他可以制作识别值为499或501的备用卡去尝试打开其他门。
当然,用新制作的备用卡具体能打开哪扇门不太容易确定,这种攻击实施起来有些困难。
2.1.5 厂商的应对
2012年7月24日,Brocious向全世界发表了他的研究和文章,为装备有廉价Arduino芯片的人提供所有需要的信息,进入数以百万计的酒店房间。同时,警示公众需要承担入住配有Onity门锁的酒店的风险。公众和酒店拥有者监督着Onity公司,他们期待Onity公司提供相应的解决方案。
2012年7月25日和8月13日,Onity公司分别发表回应,指出将通过固件升级来缓解这一问题。同时承诺在编程端口插入一个机械盖子防止访问端口,并采用额外的Torx螺钉进行固定。
Onity的声明有几个问题。首先,对一般的犯罪分子来说,打开机械盖子并最终连接编程端口仅仅是增加了些许难度——仅需几件额外的工具(在电子或杂货商店花几美元就能买到的梅花螺丝刀)。此外,正如Brocious的反驳所指出的那样,Onity的门锁设计无法做到不更新电路板而进行真正的固件更新。因此,实际上,酒店业主不得不更换电路板(数百万门锁的费用),而不只是进行简单地更新固件。
做出响应几个星期后,Onity删除了网站上所有相关的痕迹。进一步调查显示,Onity公司已经根据门锁的生产日期为一些连锁酒店更换电路板。
针对特定制造商特殊的安全问题,揭示出当涉及大规模产品设计时,我们必须认识到维修费用问题以及最终会给制造商(Onity)和客户(保障客人安全的连锁旅店)带来品牌声誉的负面影响的问题。首先,批量生产的设备应尽可能包含发布在需要时相关补丁的能力,这是至关重要的。因为相对硬件修复来说,软件补丁成本更低,更具可扩展性。其次,鉴于独立研究人员在安全分析方面的兴趣,供应商需要更加透明,并与研究机构一起促进道德规范和维持最终消费者对其信任。
在本节中,我们关注了为数以百万计的人们提供安全保障的一种很流行的门锁,虽然这种门锁是传统的(基于磁条的),但仍是面向未来发展的重要一课,因为下一代门锁将包括磁条卡以及具有更多机制的电子钥匙。我们在本节中学到的内容为继续探讨分析接下来章节中所涵盖的无线和电子钥匙功能的门锁提供了坚实的基础。