出于各种各样的原因,拿开源代码或现成的一些工具用在自己的项目里向来很常见。不过近年来诸如Log4j漏洞等安全问题的爆发,也揭露了开源工具可能带来的安全风险。这一次,风险出现在现代汽车公司用来管理软件的产品中。
今年5-6月份,软件工程师Daniel Feldman连续发布四篇博客,记录了自己破解家中现代汽车信息娱乐系统的过程与方法。其中最关键的一步是要获取现代汽车公司用来管理软件的私钥。这原本是不可能的事情,但是他一时兴起去谷歌搜索了一下,居然真的搜到了那段私钥,然后成功破解了自己的汽车。
故事要从去年夏天这位工程师新买了一辆现代汽车(2021款Hyundai Ioniq SEL)说起。这是一辆混动车,支持安卓Auto或苹果CarPlay,可以无线充电、加热座椅,还配有天窗。Daniel本人特别喜欢这辆车的车载信息娱乐(IVI)系统,他发现菜单动画很流畅,说明运行的软件不那么臃肿,不会让CPU/GPU全负荷运转。程序员的天性让他想研究个彻底,尝试破解掉系统,获取root权限,加入自己编写的软件。
破解的第一步是先搞清楚这个系统到底是个啥以及以前有没有人破解过它。经过研究,Daniel发现这个IVI系统有两个版本,一个是基于Android 系统的导航,另一个是基于 Linux 的版本。前者只要通过工程菜单安装自己的APK就能破解,后者则还没有被攻破,而且可以调整为工程模式(相当于开发者的诊断、调试模式)。只要进入IVI系统的软件更新界面,快速在更新按钮左侧按10次,再在按钮右侧按一次就可以进入工程模式。进入之后,他又通过网上搜到的教程,找到了进入工程模式的密码。
进入工程模式之后,就能看到大量诊断、调试数据和隐藏的设置。其中的 USB 拷贝以及ISV设置中的“ADB TCP”选项与“软件测试工具”选项看起来是突破口。经过一番尝试之后,Daniel还是决定直接获取固件更新包(update.hyundai.com)再解压分析。不过,虽然获取到了固件压缩包,在解压时却遇到了麻烦——需要密码。不管用什么密码破解工具都行不通。这在日常安全研究中其实很常见。
无奈之下再去分析压缩包里的文件,根据关键词去网页里搜索,不过也没什么收获。但是,在现代汽车的更新网站中却发现了一个比较特殊的更新程序,下载之后有一组文件跟固件压缩包中的一个程序名对上了。再通过ZIP解压软件的对文件CRC进行校验,在一对匹配的文件中找到了 bkcrack明文。最后经过一系列解密、编程等操作,最终成功从加密的固件ZIP压缩包中提取了所有的文件,然后开始逆向。至此,破解IVI系统走到了关键路口。
在分析固件更新文件时,Feldman 发现了大量“enc_”前缀的文件,都是加密的,如果无法读取这些文件,就无法了解系统的更新过程。因为读取加密文件,就只能再次查看此前获取的一些信息,包括从Mobis网站中下载的开源代码。这一看,就找到了关键信息。在浏览代码时,他搜索了所有shell脚本文件,然后发现了 linux_envsetup.sh 文件,这是用于创建系统更新ZIP文件的脚本。系统更新必需的zip密码、加密方式、AES对称密码块链(CBC)加密密钥以及用来加密固件映像的IV(初始化向量)值都在脚本中写得明明白白。不过,脚本中也提到的还有一些私钥是用RSA算法加密的,源代码中并没有包含这部分密钥。
Feldman 拿脚本中的[AES]加密密钥到谷歌里一搜,发现这个密钥其实是 NIST 发布的SP800-38A文档(https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf)**中列出的第一个AES 128位CBC示例密钥。**这着实有些离谱。
首先,在加密领域,CBC加密方法用得较少,而且使用填充加密的AES CBC加密方法也没那么安全。其次,这是NIST的公开文档中发布的第一个例子。就算拿去用,也顶多用于测试,但是**显然现代公司的开发人员直接拿公开文档中的密钥作为自家产品机密信息的加密密钥……**这种行为与把“12345”作为开机密码还写在便签纸上贴在电脑上也差不了多少。你以为别人不会看,但别人想看就分分钟能打开你电脑。
最后,Feldman用这个密钥解开了其中一个压缩包,然后成功从加密的固件映像文件中提取出了更多文件,并找到了处理IVI系统更新的软件,还找到了更新程序所需要的RSA公钥。谷歌搜索的方法屡试不爽,他再次拿已知的公钥片段去搜索,结果发现,这又是一个公开的教程中举的例子:RSA Encryption & Decryption Example with OpenSSL in C(http://hayageek.com/rsa-encryption-decryption-openssl-c/)。这个教程举例的项目在源代码中附有这个公钥和对应的RSA私钥。也就是说,**现代汽车公司用了这个公开教程中举例的公钥、私钥对,还把公钥放到了产品源代码中。**所以拿公钥一搜,就能搜到私钥。
解密所需要的密钥都集齐后,只待Feldman本人汽车型号对应的固件更新,就能开展行动。这一等就等到了2022年4月。Feldman早就通过 linux_envsetup.sh 脚本了解到加密固件更新的过程, 对应型号的固件更新后,他就创建了自己的固件版本,并创建了两个后门。最终,自制的固件更新包做好后,他通过最开始发现的USB拷贝功能把自制的更新包装入了IVI系统,并成功重启了系统。他通过后门就能访问、控制IVI系统,并加入了自制的程序。时隔大概一年,这位工程师终于随心所欲地控制了自己汽车信息娱乐系统。
与其他的破解相同,这次的探究出于极客的天性、需要一定的技术基础。不同之处就在于用于解密的关键密钥是直接从谷歌中搜索来的。作为车企的研发人员,直接拿网上公开教程的例子来作为真实产品的私钥,着实为安全埋了一颗雷……当科技发展得越来越复杂,人犯的错看起来就越低级。这也验证了电影《我是谁?没有绝对安全的系统》里的名言:人才是网络世界中最大的BUG……
详细过程、方法及技术细节可参考Feldman博客:
https://programmingwithstyle.com/posts/howihackedmycar/
https://programmingwithstyle.com/posts/howihackedmycarpart2/
https://programmingwithstyle.com/posts/howihackedmycarpart3/
https://programmingwithstyle.com/posts/howihackedmycarguidescreatingcustomfirmware/
GeekPwn 国际安全极客大赛积极推动各领域的网络安全发展、鼓励前沿技术的安全创新,以可视化舞台形式展现极客技术、促进提升大众安全意识。九年来,GeekPwn见证了数千名参赛选手的成长,负责任地披露了1000多个安全漏洞。2022年,GeekPwn将继续记录极客故事、见证极客力量。
分享收藏点赞在看