如何写酒店附录(酒店该怎么写)

最近有很多老铁都十分关心如何写酒店附录这个问题。还有网友想弄明白酒店该怎么写。对此,碳百科准备了相关的内容,希望能给你带来帮助。

阅读之前,译者有话说

一口气看完这篇技术文档,感觉是什么?《职业特工队》和《谍影重重》的混合体。原文没有插图,所以请耐着性子看完。

作者科迪·布罗修斯何许人也?美国人也。一名Mozilla开发工程师,著名手笔有Linux上购买iTune上的音乐(学生时期)、破解iPhone(就是越狱)、破解脑-机接口并开源(就是用人脑控制计算机),还有就是破解酒店门锁。

我能理解作为一名破解黑客,而不是骇客本身的心情。本来想花心思,卯足全力挑战那个久负盛名的难题(就是酒店安全门锁),却赫然发现远低于自己预想难度(当然比我等的水平高了很多),轻易就被破解了,而且漏洞百出。就如同连续复习了一个月,考试难度堪比作业的感觉。

而这篇技术文档所在的网站,即科迪自己的网站,首页简洁到不能再简洁了,却没有这篇文档的直接链接。但这篇文档依然留在他网站的服务器里。这意味着什么?慢慢猜吧,我不猜了,信息量太大了。

好了,不说废话了,郑重呈上技术翻译作。

介绍

在本文中,我们来探讨酒店使用的Onity HT门锁系统的设计和内部原理。全球现役大约有一千万套Onity HT酒店门锁,占有全球约三分之一酒店数目或超过一半酒店门锁比例。

我们希望能以独特视角来揭秘Onity HT系统的工作原理,以及潜在不同的隐患。

Onity门锁系统设计原理

Onity门锁系统中分为几个部分:

·编码器:用来制作门禁卡,也储存了所有种类信息。(例如客房列表、时间表等等)它可接入便携式编程器。

·便携式编程器(以下称为PP):向门锁写入客户钥匙编码、主管编码、时间表和其他信息。

·门锁:在这里我们说的门锁,主要指的是实际判断门的开关逻辑操作过程的电路板。有好几种门锁配置,例如外门和客房门等,但我们主要探讨客房门锁。

虽然编译器在整个系统中,因其处理门禁卡上的密码编码而显得很重要,但我们首要关注的是PP和门锁。

重要概念

源代码

它由Onity随机生成的32位编码, 代表客房在酒店内唯一的身份标识,同时也是通往整个系统安全的关键。源代码用于对门卡编码/解码、对门锁编程及开锁。

此等缘故,源代码不对任何人公开,甚至酒店拥有者。

钥匙编码值

钥匙编码值包括24位数据,用来获取开锁权限。而门锁除了包含客人钥匙编码外,还生成一个或多个主管钥匙编码。

与其为每个客人重新对门锁编程,或是需要制作多几份主管门禁卡,行业上采用了“卡循环”这个概念。赋值门锁一个提前量,通常是50,意思是让一张门卡在多少张新卡投入使用前仍能有效开锁。加入一位客人手上的钥匙编码是123,而门锁的钥匙编码是100,那么提前量最少也要是23才能使得那张门卡有效。当一张有效卡塞入门锁时,门锁的钥匙编码则变为该卡的钥匙编码。因此,门锁就能在新卡启用时自动对老卡销户。(译者注:方便与安全是成反比的。)

特别强调的是提前量对钥匙编码数量可能降低了不少。一个24位编码值就有约一千六百七十万个不同可能(译者注:即2的24次方。),但却要除以提前量加一这个数,让在提前量范围内的每一张卡生效。因此,假设你手头上有一张标准型提前量为50的门卡,它的密钥可能数则少至328965个。当提前量放到最大,即255时,密钥可能数则降为可怜的65536个。这意味着在最背的时候,你在一道锁上需要尝试32768张门卡才能打开它。这么一来,另一个问题出现了。

倘若两道门的钥匙编码很相近,近到加上提前量后产生了交集,那会否产生一张原本用于开一道门的门卡也能在同一酒店内开另一道门呢?为这些门编制初始编码时,它们每个是前后相差1000而减少那发生的可能。不过,酒店内所有门并不是同时进行编码的,而总有些客房比起其他房间更加客如轮转,直接导致钥匙编码很可能发生越界重复现象。

识别码

每一张卡包含一个16位识别码。在一张客人卡上这分为两部分:卡指定能开的房门,及卡的某个拷贝版本。在主管门卡上,指定能开房门的部分被员工编号代替了。

当入住酒店时,你一般会选择是否要多一张门卡,那就是拷贝。将识别码除以6取余数,就能得知卡是第几份拷贝。0则是原卡,1至4是特别标号拷贝,5则可能是任何门卡的第五份拷贝或以上。门与门之间根据数据库被分隔开来,允许“门卡拷贝范围”现象出现。

需要特别强调的是,门锁并不晓得它自己的标识码是什么。标识码纯粹是用来标识门卡,例如用编码器读取的时候,然后储存在门锁的审核日志中。

审核日志

另一个叫法是开机日志,包含哪些卡用于开锁的记录(用识别码来确定),使用在PP的开锁功能,及新客人门卡。每道记录是由一个16位标识(或在特殊场合下例如PP的开锁功能使用时产生的虚假标识)及尾随的16位时间戳组成的。

特殊门卡

在一些特殊门卡中,我们的探讨中最重要的是编程卡和备份卡。当一张编程卡塞入门锁后,在塞入一张备份卡,那张备份卡就变为这门的客人门卡了。

编程卡和备份卡通常用于编码器出错导致客人无法进入客房,而普通门卡又没做出来的场合。不过,这又招致新的危机——一旦做出了编程卡,任何酒店客房形同虚设。

可以知道,编程卡是由酒店物业的源代码加密编码而来,而备份卡和其他卡差不多,不包含任何加密,仅简单包含一个流水编号。

叙述流程

观察日常使用下的系统情况能使事物之间联系变得紧密些。以下以普通常见方式叙述酒店的门锁系统。

安装

在由Onity人员安装编码器时,酒店内的门就以指定标识码和初始钥匙编码方式录入数据库内。然后酒店员工就用编码器将房门数据载入到便携式编程器内。当门锁在酒店内安装时,它们都被便携式编程器赋予了特定钥匙编码和主管编码。这种情况也在门锁没电导致数据丢失,然后更换门锁电池时发生。

客人入住

当客人进入一家酒店入住时,Onity系统的第一步是生成1张或多张门卡。房门号被输入至编码器,紧随的是逗留天数(为自动失效)及生成门卡数。门卡按序放置,将客房特定数据编码其中。

当客人第一次在锁中插入门卡,几件事发生了:

  • 门卡的填充位数据生效,或数据不完整时门卡即时被拒。

  • 门卡由门锁上的源代码解码。

  • 经过校验,门卡生效或门卡校验不符被拒。

  • 寄存器和转码器检测过期日,如果过期则被拒。

  • 最后,检查钥匙编码。若酒店门卡上的提前量不超过门锁则门锁开启。

酒店门卡上到底有什么

前面讨论了一些门卡数据片段,下面就来完全拆解它的数据结构:

  • 16位识别码

  • 8位标志字节

  • 16位到期日

  • 8位授权字节(和本讨论无关)

  • 24位未知数据(零)

  • 24位钥匙编码

这些数据然后以酒店的源代码进行加密,储存在标准磁条卡的第三磁轨上。加密算法在本文附录B有说明。

门锁交互

和门锁之间的交互以单线双向方式进行。在门锁底部,门板的外面,有一个直流电源接口,通常用作供电,也将数据通过传输线接到其他设备上。

在其之上,是高层次的数据传输,允许读取内存信息和开锁。便携式编程器中还有其他几个功能,但因为和本文描述的漏洞无关,开锁设备也不需要,在此不表。

线路协议

基本概念

我们先定义能和门锁产生交互的设备为“主人”,主导所有交互功能。

在上拉电阻作用下,线路闲置在3.3伏高电平。“主人”和门锁要产生交互,需要产生一段时间的低电平信号(接地),称为脉冲。交互信息以瞬发方式进行,我们称之为“数据组”,即“主人”发送每段20微秒同步脉冲,之间间隔200微秒(两个脉冲边缘之间)。实际的交互在这些同步脉冲之间进行。如果一组12微秒数据脉冲在这些同步脉冲中出现,则设备之间交换了1比特信息。数据脉冲的缺失则视为一个零比特。

这里的重点是,无论“主人”还是门锁都能用数据脉冲进行交互,但同步脉冲只能由“主人”产生。

数据组结构

如上所述,数据组包含重复的同步脉冲,当中也许有数据脉冲,也许没有。要注意一下,所有数据组都有一个同步跟踪脉冲,当中并没有数据脉冲在内。

根据实验所得,数据组之间时间间隔不少于500微秒,而基本时序记录是2700微秒。

要在“主人”与门锁之间发送数据,无需一个起始信息,只要将数据组按次序发送即可。不过,正因为门锁本身无法生成自己的同步脉冲,它必须提示“主人”它希望得到信息。做到这一点,在线路闲置时将其中电平信号降低120微秒即可。门锁做到上一点的话,“主人”就开始生成同步脉冲,并监察门锁发送的数据脉冲信号。

高层传输协议

下面将会讲到相关高层控制指令的细节。注意:当提到“字节”时,意思是从最低有效位开始的8个比特位。

校验上的注意事项

每个高层指令看起来都有自己的校验值,其实只是指令值对自己和指令特定常量的异或运算。我们不清楚这些常量哪里得到的,也许它们单纯是硬编码随机量而已,只是为了将传输协议搞得更加复杂罢了。

读取指令

读取命令会用到一个16比特内存地址,然后返回该地址的16字节信息。这意味着如果你从地址0读取信息后,再读取地址1时,会有15字节信息重复。通常你每次读取信息时,是希望得到每行不重复的16字节信息的。

读取指令中,单个数据组用以下的格式编码:00000000000000000000000000000000000000001010001111AAAAAAAA1BBBBBBBB1CCCCCCCC。A字节是内存地址高8位信息,B是低8位,C字节是一个校验值,由A^B^0x1D异或运算得到。

当这条信息发送时,门锁会发出信号,传出165比特为一数据组的信息。头13比特信息作用不明,随后有16个9比特字节(就是每个8位字节后跟随1个比特),在最后就是用于校验的8比特信息。(每个常规通信都是如此)

开锁指令

开锁指令需要用到32位的源代码,假如门卡身份信息与门锁内信息吻合,马上就开。

开锁指令用到好几个数据组,下面是它们传输的格式与顺序:

00000000000000000000000000000000000000001010001001AAAAAAAA1BBBBBBBB1CCCCCCCC1DDDDDDDD1SSSSSSSS000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100110101111001010

上面的A、B、C和D字节分别为源代码的第一、第二、第三、第四字节。S字节是校验结果,由A ^ B ^ C ^ D ^ 0xDD异或运算得到。

无论运算结果正确或错误,门锁都不对“主人”作回应,只是源代码计算正确的话,就会开启。(译者注:这句看起来好矛盾,但如果还记得文章中门锁的定义,那就好理解了。门锁不对门卡进行消息反馈例如失败什么的,反正门卡没有耳朵眼睛,但是我们人有,所以通常开锁失败时候闪红灯,那是给人看的,不是给卡片看的。)

门锁内存信息

从前面详细叙述门锁通信协议细节来看,我们能做到读取所有内存信息,然后给予一个源代码来开锁,只是你必须清楚源代码到底在内存地址当中哪个位置。

下面是普通客房门锁当中几个关键内存地址。而其他类型的门,例如墙上刷卡机(多数用作酒店外部的门)和客房门锁的内存映射有一点点差异。

· 源代码:在0×114有4个字节 · 编程卡编码:在0×124有3个字节 · 钥匙编码:在0x412C 钥匙编码所在的地址包括了一系列不同的值。首先是客人的值,共3个字节,后面跟随了一个0×00字节。再之后,就能得到一些“主人”编码,每个有效“主人”由3个字节及后面跟随一个0×80字节组成。如果不是,则后面跟随的字节为0xFF。最后一行记录(带有0xFF结尾的)一定是无效用户。

门卡加密

前面提过,门卡是通过源代码作为钥匙进行加密。在本文发布前,通常认为算法是自定义的、不公开的。而这一说法还没得到证实,但是一个用Python写的实例附在了本文附录B中。

对算法缺陷的研究一直在进行中,但是给予一个狭小的密钥可能空间(只有32比特)以及已知明文攻击,简单的暴力破解是能做到的。

漏洞

前面提到了很多Onity门锁系统内部工作原理,但还是应该难以理解,何以所有岔子都走在一块了。

开锁功能

只要有能力读取门锁内存,以及得知源代码在内存哪个位置,读取其中的源代码然后以开锁指令格式发送回去简直是小菜一碟。这样就能马上获得开门权限,在审核日志当中不过只是显示PP(便携式编程器)曾经用过门锁。

这个过程在四分之一秒内能够完成,在附录A中有破解设备例子可以参考。

制作主管门卡

因为我们有能力读取门锁内存,以此类推,将主管钥匙编码读出门锁,制作自己的主管门卡成为了可能。和赋予员工编号差不多,只要有主管编码,任何门都是可进的。

当然,一卡在手还是不能进所有的门的。因为就算是酒店的主管们也分几等。举例来说,酒店会将主管们分为三类,而客房部的主管们则人手一张主管门卡。因为这样的分类配置,拿到了一张主管门卡只能让你拥有酒店三分之一的权限。

编程卡制作

能够存取内存,我们就能获得酒店的源代码及编程卡编码。有了这些,我们就能够为每把锁做一张编程卡。做一张备份卡无需对酒店或一切锁的了解,而且能提前为未来准备完成。

在对门锁使用了编程卡后,只要插入备份卡,门锁就能开启。(译者注:其实就像是单位门禁卡管理中,不看说明书强行为下属获取门卡的主管,一个劲在门上刷,碰巧和前面步骤相符就能制作新卡,完事后还一个劲抱怨工作辛苦什么的。)日后,这张备份卡能够不断反复使用进入房门,能熬到新客人入住为止。

伪造备份卡

缺乏加密,以及备份卡能逐渐制作出来,那么伪造备份卡获得进入另一个房间也是可行的。

举个例子,一台编码器故障了,住户们正由酒店员工手工发放备份卡进行入住手续。你获发一张编号为1234的备份卡,但你能够将其改为1233或1235,然后尝试进入其他房门。虽然没有其他情报下,判断这能具体开酒店哪个房门几近妄想,但卡本身增加的特性还是让你进入酒店某间房可能增加不少。

基本密码学破解

密钥可能空间狭小,以及门卡上缺乏真正的加密,有不少简单破解手段能够付诸实行。在后面会提到,我们仍需在分析密码上下多点工夫。

从门卡加密的结果来看,每个字节的加密只用到了源代码的一小部分,加上已知关系推敲联系,就能确定源代码。举例来说,你入住一间客房,获得两张门卡。两张门卡的区别仅仅是识别区的一个字节信息。同样,如果你知道几张卡的到期日,就能利用之间的差异作为破解提示。(译者注:这活脱脱就是明文攻击。)

这过程没有技术含量,不需要一个密码专家就能完成,在之后会有更多的研究需要去做。无需多言,这里牵扯到的密码学对安全毫无助益,对这32位加密空间涂鸦级别作品遮遮掩掩其秘密超过二十年,这样的产品不值信任。

设计凶杀案陷害酒店员工

拥有了读取门锁全部内存信息的能力,那就可能获取主管门卡编码。以上这些,结合源代码进行加密编码,就能做出主管门卡,从而获取开启酒店门锁的权限。

且看看这样一个假想情况:

· 破解者用前面提到的漏洞读取门锁的内存信息。 · 破解者利用源代码和主管门卡编码生成一张或多张主管门卡。 · 破解者利用主管门卡进入一间客房。 · 破解者在客房内杀害受害人。 · 破解者逃离现场。

而在司法侦察过程中,刑事探员们往往会查阅门锁的审核日志,以查看在何时为何人进入房门。在这当中,他们会看到某个特定员工(因为门卡在识别编码范围内是唯一编号的)在受害人死亡相近时间用主管门卡进入客房。

这样一个充分证据,将一名员工在死亡时间推进客房,在谋杀案审判中可置其万劫不复,最差也能让那员工成为头号嫌疑人。而其他因素(例如闭路电视、目击证人等)也许会对该名员工有利,但我们却无从知晓门锁审核日志的真伪性了。(译者补充:于是某些酒店为了平息事件,淡出公众视野,直接开除嫌疑人撇清责任……)

总结

在本文中,我们列举了针对Onity酒店门锁提供的安全措施每个层次破解方法。

· 门锁通信端口不可靠,能够直接对内存操作,任意读取内存信息。加上对系统的基本了解,破解者能够直接开门、制作主管门卡,甚至制作整个酒店的编程卡。 · 门卡上的密码系统有先天缺陷。密钥空间太狭窄,甚至最普通的暴力破解也能凑效。在这点上,未来将继续深入研究系统的加密算法。

· 审核日志一直以来被认为是门锁使用的安全记录,因能利用内存信息制造门卡这点上,可说是蒙人的存在。接下来的研究,在门锁通信协议中允许写入内存这点上,将对审核日志直接修改。

这些漏洞无可饶恕,它们系统本身的缺陷是我们强烈建议不要使用Onity门锁,直到充分修补这些漏洞为止。

对于任何酒店的住户,我们建议使用门链或插销,只要能提供额外安全保障就行。电子锁的门闩能够被门锁机械系统解除,它唯一的用处只有防暴而已。

披露信息

揭露出这些显而易见的漏洞(除了那不常见的通信协议外),他们的震惊,以及消除这方面影响的困难,我无法轻易决定将这篇消息公开。我们无法确定,但我们有理由相信这些问题在Onity内部能够引起注意,让他们将这些门锁投放市场前,给多超过十年改进时间。

不过,在权衡之下,揭露造成的短期潜在效应远远不及对酒店行业和公众长期危害,尤其是只有少数人知道这一秘密的情况下。

未来的研究

未来的研究方向有很多,大致分为这么几类。

密码学

当前实现的算法在分析上也许不是最优的。编辑整理好的算法,外加一个简单实例,对密码学者来说应该有所帮助。

这也许是个自定义算法,也有可能是现成就有的算法,或已有算法的某个变种。

逆向通信协议

比起读取门锁内存来说,写入内存更为可行。实际上,便携式编程器就是如此。尽管对便携式编程器通信方式还在研究,确定写入内存指令的格式只是迟早问题。

门锁内存映射

我们只了解门锁内存空间的很少部分,仅在酒店客房部分。对不同门锁用特定变量进行编程,或将其置于不同情况下,将所有Onity门锁的完整内存映射确定下来应该不难。

确定现有研究对保险柜锁是否适用

我们怀疑Onity商用锁(保险柜)所用的通信协议和他们的酒店门锁也是大同小异的。如果是的话,就能进行相似的操作乃至破解保险柜锁。

附录A:开锁设备

本附录详细列明在Arduino平台下制作及编程一台开锁设备。

附注

这台设备上有些瑕疵,以至于不能作用在一些锁上。现阶段,暂且认为是计时出错,以至于每个字节的第一个比特错误。

补充一点,基于特定司法区域的防盗相关法律下,拥有这个设备可能违法,在做一台开锁设备前最好咨询一下法律顾问。利用这台设备获取你无法进入区域的权限或为非法。本文不保证,也不承担任何责任,也就是说,责任自负。

硬件安装

需要的硬件:

· Arduino Mega 128 · 5.6千欧电阻 · 直流电源接口,外径5毫米,内径2.1毫米。

将Arduino上3.3伏电源和数字IO引脚3用电阻连接,再将数字引脚3和直流接口内部相连,最后将直流接口外部和Arduino一起接地。

本文地址: https://www.tanjiaoyicn.com/n/16090.html

版权声明:本文内容部分来源互联网用户自发贡献或其他公众平台,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们,一经查实,本站将立刻删除,如若转载,请注明出处。

发表评论
登录 后才能评论
评论列表(0条)

    联系我们

    93840186

    在线咨询: QQ交谈

    邮件:baban38@163.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注微信