掌上游戏机软件IPL设计安全技术初探

时间:2022-10-01 04:47:45

掌上游戏机软件IPL设计安全技术初探

摘要:文章深入分析了掌上游戏机IPL的检验过程技术原理及其特性,针对其 IPL的检验过程中存在的技术缺陷和系统破解者通常采用的技术方法,以及对系统安全体系造成危害的情况,应用逆向工程的方法,从源代码上剖析了这一技术过程,指出了在软件开发中软件IPL设计安全技术的重要性。

关键词:IPL;检验过程;软件安全;逆向工程

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2012)29-6990-02

2011年,日本Sony公司称,由于旗下的PSP软件系统遭受不明黑客攻击,导致该系统信任链被破坏,几十万用户的信用被泄露,由此给公司及用户带来巨大经济损失,并称将由此开展反黑客的调查和诉讼。为此,社会舆论一片哗然,在业内引起了强烈震动。事情虽然过去一段时间,现在再来认真分析研究这个事件,吸取其经验教训,仍然十分必要。为此本文从技术的角度,对掌上游戏机软件IPL设计安全技术问题做一次有益的探索。[1]

1 IPL概述

PSP是一款由Sony公司出品的掌上游戏机。长期以来,由于PSP IPL的检验功能以及PSP装载固件时的信任链机制,PSP固件破解一直停留在使用系统漏洞而破解的程序的阶段,无法实现真正的开机后自动完成破解。2007年8月,Prometheus C+D小组宣告破解PSP IPL检验过程,并在其中发现了Sony的工程模式后门,于是PSP被完全破解。

尽管这个破解补丁在网上早已公开,但其工作原理却尚知之甚少。为了说明IPL补丁的工作原理,下面简要介绍一下PSP的IPL。PSP的IPL分三个部分。

第一部分:它是IPL的启动代码,位于IPL块解密完成时的entry地址上。它被放置在显存上,是因为此时DDR内存还没有被初始化。第一部分将重置PSP CPU状态,将pre-IPL移出内存映射区域,解密并跳转到IPL第二部分。

第二部分:又被称为main.bin,同样被装载在显存之上。它附带了一些简单的驱动代码,将初始化DDR内存,初始化显卡驱

动等。完成这些操作后,它将解密并跳转到IPL第三部分。

第三部分:又被称为kbooti.bin。这个部分被装载在内存之上。它负责加载一些NAND上的内核模块,包括sysmem.prx, init.prx和loadexec_0xg.prx。在加载过程中,它会检查模块的签名安全性。然后init.prx将打开PSP运行级模块列表文件(pspbtcnf.bin),启动所有PSP启动时需要的模块。有点像UNIX的init进程。而黑客的主要目的就是消灭这些模块安全性检查和设法在PSP运行级模块列表文件中插入自己的模块。[2]

1.1 IPL补丁第一部分

它将对pre-IPL完成解密IPL块时跳转到entry(IPL入口)的代码作补丁,并从NAND读取并复制IPL补丁的后3个部分到显存安全位置,然后将修改内存中的IPL块表,把第一个块之后的块前移一项,相当于删除第一个块项。然后重新执行pre-IPL读取IPL的代码。这样pre-IPL还是能正常解密来自于官方固件的IPL。由于pre-IPL跳转到entry的代码已经被修改,结果最后一个官方固件IPL块被解密正确后,不是跳转

到其entry(即IPL第一部分),而是执行黑客的代码。我称这段代码为IPL补丁第二部分。

1.2 IPL补丁第二部分

它会对IPL第一部分跳转到第二部分的

跳转代码补丁自己的代码。在这段代码中,它将复制自己的后几个部分到安全位置上,并补丁IPL第二部分中初始化显卡驱动的调用代码为IPL第三部分,以及补丁IPL第二部分到第三部分的跳转代码为IPL补丁第四部分,然后回到IPL第一部分的执行。之所以这样做,是因为IPL补丁位于PSP显存上,即将被显卡驱动清空。

1.3 IPL补丁第三部分

由于显卡驱动初始化时将对显存清零,此处的显存已经不再安全,它会复制IPL补丁的第四部分到紧接IPL第三部分之后的内存地址上,然后返回执行IPL第二部分中的显卡驱动。

1.4 IPL补丁第四部分

经过东躲后,IPL补丁的最后一个部分终于可以对IPL第三部分的安全性检查代码做补丁了。它将对IPL第三部分的模块安全性检查代码做补丁,让PSP不再对模块检查签名,并接受黑客的自制固件模块。它还会对IPL第三部分的文件打开函数做补丁,当发现IPL第三部分打开PSP运行级模块列表文件时,返回其自带的一个插入了黑客的自制固件的运行级模块列表文件。从而导致PSP从一开机后, PSP失去了分辨Sony公司模块和黑客非法模块的能力,即信任链被攻破。

在装载过程中,CPU将对IPL块进行校验。PSP将使用其内部的加密硬件“Kirk”,对IPL块进入校验和解密。校验和解密算法为Sony私有,目前已知的特征是可能为一种128位CBC算法,类似于AES,但是密钥固化在Kirk硬件中无法得知。

在验证时,Kirk分两步进行。首先验证IPL块的头部信息(0x00~0x3f字节),结果同header_hash相比较。如果不同而出错退出。然后验证IPL的数据部分(0x40~0xff字节),结果同data_hash相比较。如果不同而出错退出。

当Kirk解密成功后,会把数据从解密缓冲复制到loadaddr地址,复制大小为blocksize,如果loadaddr为0,则不复制继续解密下一个IPL块。为了防范重放攻击,checksum必须等于上个IPL块的全部字节的加法和(第一个IPL块的checksum为0)。当解密成功最后一个IPL块时,这个IPL块的entry将有效,然后pre-IPL跳转到entry去执行。

如果IPL解密时任何步骤出错,PSP将死锁而无法开机,这种现象也被PSP用户称为“变砖”。

3 IPL检验过程的安全隐患

Kirk硬件看似坚不可摧,实际上有个严重的安全性问题:它在Kirk内部比较hash是否正确时,只要遇到任意四字节不正确,就会提前退出。这样,就为黑客对其进行时序攻击提供了机会。而且由于是分别检查头部和数据的hash,所以攻击变得更加容易。只需分别找到一个可用的头部和数据hash就可以了。

由于通过系统漏洞破解的PSP同样可以使用Kirk硬件,所以就为穷举法破解IPL校验奠定了实践基础。

攻击方法很简单,使用穷举法。黑客可以简单的在CPU调用Kirkd硬件解密一个伪造的IPL块时关中断,并在CPU等待Kirk解密时自增一个变量。通过比较变量的大小,推断出解密时花费了多少CPU指令周期,从而根据经验分析出可能是hash中第几个字(32位)不正确,然后修改出问题的hash字并继续穷举。这样做成功的把本来2^128的穷举量,化简为4个2^32的穷举量。前者穷举时间是个天文数字,而后者一台PSP一般只需3天即可找出一个能通过验证的伪造的IPL块。[4]经过穷举,黑客成功找到了一个能通过pre-IPL验证的伪造的IPL块。图1的IPL块是一个被各种PSP自制固件广泛采用的伪。

4 结束语

千里之堤,溃于蚁穴。软件设计者为了防范掌上游戏机软件被破解,采取了许多技术措施,然而尽管软件拥有信任链设计,拥有一套私有校验算法来防范穷举攻击,却因一个解密硬件上的小小失误,导致了软件整个安全体系土崩瓦解,损失惨重。这个案例告诉我们,加强软件系统安全防范技术措施的重要性,要达到理想的设计目标必须采取严密有效的安全防范技术措施。

参考文献:

[1] 张横云,何海涛.SOA体系的安全研究与设计[J].四川理工学院学报:自然科学版,2009,22(1):44-47.

[2] Rahimzadeh A.?Hacking the PSP[M].北京:科学出版社,2007.

[3] Silver Spring.PSP Boot sequence, [DB/OL].silverspring.lan.st/NPSPTD_01.txt.

[4] 邱树伟.基于模式识别的入侵检测系统.[J].四川理工学院学报:自然科学版,2011,24(1):77-81.

上一篇:视频先锋YouTube:一番挣扎归到谷歌麾下(上) 下一篇:拒绝三宗罪