转载于:http://blog.csdn.net/antiy_seak/article/details/7391516
本篇原载《程序员》二月号,由于字数问题,我当时已经做了一些删节,编辑同志的二次删剪又导致了其中一处技术错误。贴出这份全本儿以分享更多信息。
浅析互联网场景的身份认证方法
互联网之前的身份认证
身份认证是一个古老的话题,从最早的户籍造册,到今天的二代身份证或社会保险号码,“我是谁”或“他是谁”的问题贯穿着整个人类社会的发展。
身份认证的历史,是辨识方式演进的历史。辨识可能是基于个体,如悬赏缉拿画影图形;也可能是针对群体,比如两军对垒,要身着不同的盔甲以作混战中的敌我分辨。
身份认证的历史,也是与仿冒和窃取对抗的历史,从兵符的形状相合到盖在圣旨上的“皇帝之宝”图章,都是在与矫诏诈符进行着斗争。
因此,互联网身份认证,并不是孤立新生的技术,它具有传统的特点和新生的便利性,但也同时带来了新的困难与挑战。
如果说网络对身份识别方式的最大挑战是其凭据对物理介质的脱离以及凭据与自然人在物理距离上的脱离,那么,一个开放的互联网所带来的最大的挑战就是身份的虚拟化。
一般来说,在现实社会中,一个合法公民的身份是唯一的、终身的,但在网络上并非如此。对于大多数网络应用,用户都可以自由的拥有多个身份,并可以随时新建或废止它们,包括一不小心遗失它们。
但如果辩证的来看,作为网落用户的角度,这种身份的虚拟化、与可再生性与可废止性,也正是对于比特时代的最基本规律(信息零成本复制)的一种自适应和保护。
用户名/口令
据说最为原始的用户名/口令安全模式是出现在1962年的MIT的CTSS计算机之上。其中用户名用以保证虚拟身份的唯一,口令则用于保证虚拟身份的安全。用户名一经建立不可更改,而密码则可以随时更改。
没有人发现这其中的革命性意义么?那就是虚拟身份和验证凭证之间被分开了,与现实世界一样,用户的身份是不可改变的,但凭证是可以更新的。身份和验证凭证的分离与验证凭证可以被合法用户低成本的更改,应该是一切身份验证系统设计的最基本原则。但实际上这种原则是经常被违反的。
互联网身份认证的威胁也与传统安全要素一脉相承,包括:
- 验证场景的安全性
- 传递通道的安全性
- 凭据的质量
等等。
第一波威胁
传统的用户名/口令机制遇到的威胁,多来自其围绕着早期UNIX系统那种非常明显的君子时代的痕迹,但回头来看,这些来自上个世纪的威胁均没有消亡,并一直持续演化至今。
口令猜测:
早期系统是可以实现在低权限条件下的用户名列表的获取的,而同时也有默认用户名和内建账户的存在(包括其中默认口令可能为空的),这就使口令猜测成为可能。依托某些信息,进行单点的密码猜解是一直存在的安全威胁,并逐渐推演出单用户大密码档猜测、多用户常见密码档猜测和今天的拖库后的撞库攻击等攻击方式。
登录过程嗅探:
对于Telnet 、FTP这些非常原始的远程行命令工具来说,其连接场景都不是基于加密协议的。而HUB设备本身是基于广播的(和Switch比起来,其成本低廉),因此Sniffer是非常容易的事情。而今天基于主机在TDI、NDIS等层次的本机Sniffer,基于ARP欺骗的Switch监听和针对无线信号的各种监听威胁都显得更加普遍。
口令文件的抓取:
尽管早期的UNIX系统进行了基于MD5或DES的加密,但其权限配置通常相对薄弱,使其Shadow 文件易于抓取,之后就可以进行从容的猜测或者暴力破解,这也可以视为“拖库攻击”的雏形。
但在1998年~2000年,随着Switch全面的取代HUB提升了Sniffer的实施成本,随着Server系统的安全性普遍提高,随着SSL的逐步广泛应用,安全威胁呈现出走向桌面的趋势,并围绕着登录场景的安全构成了对用户名/口令的第一个攻击波。
登录场景的安全
登录场景的安全,焦点在于攻击者通过木马等手段,对系统输入和输出信息的获取。其中就包括了KeyLog(键盘记录)、录屏、远程控制等手段。而这就使用户名和口令的输入过程会被攻击者获取,从而可以在另一地点,冒用身份进行登录,或者在用户本机,进行非用户本人的操作。
而随着主流桌面系统日趋复杂,其体系就更容易遭到相关手段的威胁,根据不完全整理,能够进行输入信息获取的威胁点包括:
系统钩子 | 按键状态轮询 | 底层输入接口 | 消息查询 | 驱动 |
CallWnd CallWndRet Message Keyboard LowlevelKeyboard Journalrecord Debug | GetKeyState GetAsyncKeyState GetKeyboardState
| GetRawInputData GetRawInputBuffer DirectX Input
| WM_GETTEXT EM_SETPASSWORDCHAR
| FilterDriver KeyHookDriver |
从场景安全的角度,安全工作者和应用开发者想到了很多方法来改善场景的安全,除了主机检查、主机加固和反病毒软件外,也对于登录过程的安全做了针对性的尝试。
软键盘:
用以对抗Keylog,通过鼠标点击即可进行密码输入,其主要问题是不抗远程录屏等。当然也可能被有针对性的的做出一些获取程序。
加扰:
在输入过程中加入扰动和解码两部分内容,使原始的Keylog获取不到真正的击键信息,其主要问题是扰动和解码代码本身是难以有效对抗逆向分析的,而攻击者总能实现更底层的获取,力争在加扰之前或者解码之后获得真实的信息。
前置检查:
用以在登录过程之间进行安全检查,包括对环境检查(一般是针对Keylog的各个挂接点)和病毒检查量部分。而病毒检查有独立检查和外调反病毒软件两种。对于独立检查,由于不能挂载完整地反病毒引擎和库,一般都采用的是有针对性的小规则集或者采用云的检测技术。
在我们过去的前置检查的开发中,其实提供一种云的手段的价值更多在于,让网银的应急响应团队有一种脱离于厂商之外的独立升级能力。
尽管有很多产品,声称他们已经彻底的解决了登录过程的安全问题,但多数安全研究者依然倾向认为,在主机环境安全无法有效保障的情况下,很难实现这样一种安全登录方案:其过程是高安全等级的,并能与其他应用良好的兼容。
因此安全工作者开始寻找其他的方法,从双因数的思想出发,开始寻觅不依赖于主机场景安全的安全机制。
密保卡/矩阵卡
密保卡/矩阵卡作为一度在网游保护中普遍应用的产品,显然是受到了传统的密码本思路的启发。
其基本思想是,服务商建立若干组不同的“位置+信息”的数据,每组数据对应一个唯一ID,这个ID与“位置+信息”的数据以印刷的方式形成介质分发给用户,用户将相关ID与自身帐号建立关联绑定。之后,服务商则不仅要求用户在登录过程中输入用户名和密码,亦会要求用户输入在该介质上一些位置的信息。
这是一个典型的双因数安全的思想。其密钥的分发通过了传统的销售渠道来进行,从而不具备在网络上的可监听性。而其自身又通过了刮刮卡(一种在信息上覆盖可以刮掉的图层的工艺,部分工艺亦能抗强光、透视等窥探方法)等方式保护ID信息,来避免在分发渠道中遭遇翻拍记录等威胁。
但该机制很快遭遇到了安全挑战,那就是所谓的位置累计攻击。由于用户登录场景安全难以保证每次位置询问的信息均不被获取,特别是为了避免对单个位置信息的猜测式破解,一般该机制都是同时生成多个位置,要求用户输入对应信息。因此攻击者可以对相关位置信息进行累计,当累计到一定程度时,攻击者可能会进行多次的登录试探,当要求输入的全部位置都落在攻击者已经监听到的位置之内时,攻击者就可以进入系统,取消用户帐户与密保/矩阵卡的关联。
这其实反映出了矩阵卡面临的主要问题,就是其口令空间明显受到了“工艺”和纸张大小的约束,使其是一个有限集。为了对抗这种攻击,服务商只能通过增加张数的方式来增加密码本的厚度,比如每月一张甚至每周一张。
如果我们以传统密码学的思维来看待这种问题,其实亦可找到原因。目前只有一种密码体制的安全性具备着理论证明级的安全,那就是“一次一密”。但密保/矩阵卡机制由于受到密码空间的限制,因此显然是一种“伪一次一密”的方法,是完全的民用级别的安全性。当然由于成本、易于携带等因素,其应用依然十分普遍。
有人认为类似矩阵卡是基于印刷技术的,因此成本超级低廉,但实际并非完全如此。与一般性的印刷不同,任何两张密保卡之间的内容都应该是不同的,同时其还需要在印刷后准确的切割,因此只要密保卡不是用打印机打出来的话,其都是采用专业的特制设备来印刷的。在密保卡刚刚兴盛的时期,相关印刷设备价值均在数百万元,但一旦在有了生产条件和足够的批量的情况下,其成本相对电子令牌来说却是依然相对低廉。
当然作为一种频繁更换的产品,其也为网游厂商创造了一种增值服务的形式——因为密保/矩阵卡需要不停地更换。
在刚才检索资料中找到一张照片,在我过去所做的那些不靠谱的产品设计中,这个无疑是最不靠谱的,我当时以为自己找到了一种把2维矩阵卡转化为3维的方法,却完全没有考虑到这种东西的生产制作成本。(苦了我们的美工Mappy童鞋)
图1:本品仅为安天内部夭折的一个内研项目(与QQ无关)
手机动态口令
而对于采用“一次一密”思路的体系来说,最大的困难不只在于大量密钥的生成和管理,如何低成本的安全传递密钥才是关键问题。
在PKI的体系中,公钥算法被作为在同一个信道下可以实施安全的会话密钥传递的方案。但落实到目前的节点安全场景来看,无论是Private Key本身,还是用以保护其的Passphrase,都可能被入侵者非常容易的获取。因此,PKI除非依托专用的硬件来保证Private Key不被获取,否则在解决登录场景不安全条件下的登录安全的问题方面,并无优势可言。(PKI多数理论场景假定都是基于信道监听的安全,如果没有更多的与工程化技术有效结合,其显然会构成伪安全,这个笔者在早年的《关于算法决定论的一切》等报告中已经多次批判)
由于手机的普及,将文字短信作为动态口令的分发方法,把手机的显示作为动态口令的显示方式,成为一种可行的解决方案。这样的优点是不需要增加其他动态口令设备的成本,而只需要依托现有电信服务就可以解决问题。
但这样的方法,也存在明显的问题:
1.如果短信有一定滞后,用户等待的体验并不理想。有人开玩笑的说,手机动态口令最普遍的场景是运营商的网上营业厅,因为只有运营商能保证自己的短信及时到达;
2.另一个问题是,对GSM网络来说,其监听成本日趋低廉,在定向攻击中,采用GSM动态口令的安全性,可能反而不如PC+静态口令的安全性;
3.相对来说,更大而且更尴尬的问题出在手机上,传统手机的安全性一定程度上来自于其简单,当它不再是那个只能进行语音通话和文字短信的无线终端,而变成一个掌上平台;当各种木马开始捆绑进入官方和非官方的App Store或电子市场;当越来越多的预装和复制的应用难以确定其安全性和真实来源时,手机安全性已经明显呈现出比PC更差的趋势。
动态口令卡/令牌/电子密保
但是否能建立一种机制,使其既能保证动态口令的一次性,同时不产生密钥传递的成本呢?至少动态口令的体验能不依赖于第二信道的实时性,才是更为理想的。这就要求在服务器和登录者之间或者存在一个巨大的共有码表,或者拥有一个具有随时一致性的因素。而显然,最理想的后者,就是时间。
为此,基于随机数种子+时间的动态口令/令牌机制产生了,其工作机理为:服务商为用户分发一个带有口令生成机制+显示屏的电子设备,该设备在交付给用户使其完成正确的初始化,同时生成用于与时间结合生成动态口令的唯一参数,将该参数在服务端保存,从而完成一个依赖于时钟的动态口令机制。
有趣的是,这样一个动态口令机制在历史上依然出现过问题。由于考虑到时钟误差,用户操作时间等因素,这个机制必须能保证在一个较短时差之内的登录凭据的有效性(默认一般为五分钟),而攻击者则利用某厂商设计上的一个疏漏,即允许五分钟之内采用相同凭据重复登录,来获取用户输入内容,之后登录进去取消与动态口令卡的关联,或者窃取用户虚拟物品、修改密码等等。
这是一个有趣的违反基本原则的设计案例,动态口令卡的设计初衷是保证登录凭据向“一次一密”的思想靠拢,具有一次性,但这种问题却明显违背了其初衷和原则。
这种机制安全性的最大危机是去年RSA公司被入侵后,计划召回全球超过3000万个电子令牌的事件。
USB Key
USB Key显然是从加强场景安全的角度来入手的,其利用了USB接口设备内置的算法芯片,实现对数字的加密和签名,通过电路控制,实现了凭证的不可被远程获取性。
这样即使攻击者及时获得了用户名和密码,也无法在其他位置登录。USB Key目前的主要问题是,攻击者可能是通过远程控制在被害者主机上进行操作的,而此时对于USB Key体系来说,则无能为力。
这一问题不仅对USBKey存在,在用户已经完成了登录过程的情况下,远端系统都无法识别出操作是来自用户还是来自Backdoor。
而我们必须严肃指出的是,目前最大的风险是一部分USB Key并不是真正的带有加密芯片的设备,仅是所谓的隐藏数据U盘,而这种伪安全风险并没有得到足够的揭露和警示。
生物识别
在传统的物理安全领域,无论我们是否情愿,我们都会不得不遇到一些生物识别的场景。比如我们在办理某些国家签证时,必须留下掌纹;比如也有很多单位使用指纹打卡;电影里出现的一些要害部门更是使用虹膜作为入门凭证。
生物识别的最大意义,在于其与实体身份先天具备的不可脱离的对应关系。从这个意义上,生物识别对互联网基本匿名原则存在某些对立。但包括Facebook等互联网巨头在内,也莫不对脸部识别等十分感兴趣。
对生物识别的崇尚和批判,在安全领域一直都没有停止过。一些反对者认为,至少对于脸部识别和指纹识别来说,这是更容易在完全无知觉、也无法追溯条件下套取的凭据。这比传统口令只在输入过程中才有被Keylog或者Sniffer等风险相比,获取成功率要高的多。当然,复制这些凭据的成本自然也高的多,无论是制作指模,甚至对面部的3D打印。
而我认为,生物识别技术不适用于互联网场景的最关键原因,是其是一种可能被获取,但却不可废止的凭据。我们只有两个虹膜、两个掌纹和十个指纹,而这恰恰使生物识别与上述任何一种安全机制相比,都处于明显的劣势。
传统的物理安全场景,基本保证了我们的指纹打卡机、虹膜检验仪是可靠的(即使只生成签名数据,不保留原始数据)的,但如果这些手段泛化到一般性的应用,则这种保障会并不存在。而同时,由于生物识别是在高等级的安全部门所普遍采用的,如果在互联网普遍使用,也就会加大了敏感人员的个人生物信息被通过钓鱼等方式获取的风险。
当然,虹膜、骨像等认证基本不太可能出现在互联网的日常应用中,而尽管一些笔记本本身已经默认带有指纹识别,但摄像头肯定是最普适的生物识别设备,因此脸部识别的争论和博弈,就会成为主要焦点。
但实际上,像露一面就上网,或者刷一下指纹就进电脑一样,其实就是一个登录过程的Agent,充其量是解决了方便性问题而已。如果真的采用这个信息完成登录过程,那么无疑还是要生成相关的签名数据传递过去,只要有这个生成和传递过程,就有被获取的可能,因此并不需要用3D打印再造一张脸,只要实现一个签名数据的重放即可了。
尽管有的研究者专门私信给我,讨论其不保存生物信息,只提取特征并本地签名的机制是否不存在这种问题。问题在于在互联网场景下,在复杂的终端场景下,生物信息提取模块如何自证安全呢?传统的物理安全场景,是以所保护场景内的物理资产安全为核心的封闭体系,而互联网的核心价值并不是各种中枢节点,而是网民个体,在这种安全价值转置的背景下,更多不应该是网民向服务端或云来证实其自己的可信,而是服务和云端需要向网民证明他们无害和善意。
而巨头们真正对脸部识别感兴趣的原因,绝不是其安全性,而是其巨大的商业图谋,当图像识别出登录者脸上的雀斑时,能定向投放祛斑霜的广告,这是多么精准的广告投放!
尾声
安全威胁就像一个永远不能被抓获的流窜犯,只能被我们赶来赶去,当DEP和地址随机化让Worm濒临绝种,当浏览器的安全提升逐渐减小了挂马的危害,当我们认为随着动态口令卡、USB Key等的广泛使用,基于PC的关键性互联网业务安全开始获得一定保障时,安全威胁聚会点又似乎转入到了对Server端的威胁,于是在去年全年又进入了一个拖库消息此起彼伏的时代。
而同时在终端上我们亦无法解决一切问题,尽管登录过程已经有了保护,但信息交互的全程并不是仅靠加密就能保护的。五年前,当我们分析一个并不盗号的网银木马时,我们惊诧的发现,其就是截获用户转款操作,把目标帐户改为预设的帐户。显然这是上述任何机制都不能绝对解决的问题。即使USB Key是基于公钥签名算法的,其也无法判定让其签名的数据是否合法。因此在当时,我们提出了带有显示屏幕并能进行确认操作的“专用安全交易终端”才是终极解决方案。
五年过去了,尽管类似设备多次昙花一现,但终未能形成气候,因为这是对应用和便利性的反动,同时,也不可能有绝对的安全端点。类似设备如果有一点BUG,其修补显然比PC更加困难。我们对终极解决方案的追求,就像寻找永动机一样可笑,或许就像每个科学工作者心中都有玄学的阴霾。
安全界寻找终极解决方案的虚妄进一步拉开了安全落后于应用的步伐。同时安全界本身亦有很多壁垒,算法界和工程界本身就有着诸多壁垒,但就当算法界正在零知识和同态加密中钻之弥坚的时候,却发现整个应用领域,还处在是否加密、以及如何正确使用散列算法的原始困扰之中。这个责任难道只该由应用界来承担么?
而对于攻击阵营,当然也包括白帽研究者来说,其研究资源和能力却在不断地增长,他们安享算法分析领域的最新成果,他们从软件到硬件的纵深,都在我们这些纯种的防御者之上。
安全存在的价值不是为了给应用的发展设置这样或者那样的屏障,因为我们完全无力约束应用的野蛮生长。安全的价值更不是为了让用户穿着50斤重的盔甲和防毒面具去上班和晨练,因为99%的用户都拒绝为应对小概率的威胁受到持续的困扰(那种可以感觉到不方便的约束)。这就是互联网场景的安全特点。
--------------------------------
从决定发起开源密码存放的算法使用范例APM开始,从后台数据的保存到用户端的安全,我已经在这个完全不是自己工作方向的领域说了太多话了。这种越俎代庖的感觉是非常不舒服的,因此我今后不会再谈论这个话题。
如果说,我强忍一种呕吐感来写完这篇文章的收获,那就是在反思了若干虚妄后,我再一次提醒自己——作为一名职业信息安全工作者,我们只是应用价值的保卫者,而不是用户的监护人。