博客

  • 欢迎来到大中招时代

    欢迎来到大中招时代

    曾经有人说过,头脑是最好的杀毒软件,但在来到我们最爱的大中招时代后,这句话严格来说得变一变了,毕竟人脑的处理能力是有极限的。

    供应链和无尽的依赖

    虽然说这段标题和日本人的轻小说似的,但内容可远没有那么愉快了。现代软件的复杂和冗余性已经达到了一个前所未有的高度。为了省一点点开发时间,所有人肆无忌惮的拉入在网上找到的现成产品,毕竟拉依赖能干出什么坏事呢?而且过去的那种依靠商业公司做好的中间件开发的流程也已经在银行业和外包以外的地方退环境了。

    自带一个足够大的标准库的语言相对来说还好,大家不需要因为一些极为基础的功能拉入或被自己所需要的功能间接拉入一些奇怪的外部库。但有些不自带或设计模式非常奇怪的语言就没有这种幸运天赋了,很多时候开发者甚至不知道自己的程序通过什么方式拉入了什么人写的什么代码。

    由于现代软件(不幸的)进步,甚至已经编译好下载到本机的代码也未必是安全的:不少现代软件依赖品种繁多的在线下载服务、热更新服务、乃至每次启动时都要从服务端拉取动态执行内容的功能,导致每一次打开软件就像一场大冒险。

    投毒服务大减价

    在过去,供应链投毒其实没那么常见,因为它需要极高的成本和耐心,往往只会被某些想要从某些人身上爆出巨量金币或资料的大人物利用。但时代变了,如今投毒的成本已经大大降低,也算是一种科技带来的生产力提高吧。

    在现在,一个小小的钓鱼邮件或者看起来没恶意的插件就可以接管某个平台上(你们知道我说的是谁,毕竟每次出事都有他)知名开发者的凭据,拿着这个凭据又可以在这些被依赖的包中种下木马,从而拿到更多开发者的凭据,甚至还可以在使用了这些软件或代码的浏览器插件、编辑器插件、桌面程序等更多地方指数级的扩大影响力,甚至还能在原始问题被修复后开出快慢刀:窃取的凭据很多情况下并不会被吊销,在它们的所有者放松警惕后可以被延后利用。甚至有些情况下,中招的厂商可能会出于某些原因故意无视或拖延问题的暴露。

    中间人,新型中间人和更大更好的中间人

    虽然随着免费 SSL 证书的普及以及 TLS 协议的进化,只要不使用某些神奇的浏览器,对于一般用户来说传统派芙蓉王中间人可以说基本上已经结束了,但锐刻牌新型中间人已经崛起,一代人有一代人的使命可以说是。

    网站或程序对基础设施的信任也能被滥用,利用者完全可以注册过期的软件自动更新域名、收购或“善意接管”开源程序或公共加速服务,成为隐形的中间人,从而在接入了这些服务的地方打出意想不到的伤害。毕竟大多数情况下开发者并不会想到这些公共的,看起来很好用的服务很可能在之后的某一天给你报一个大的。

    更进一步讲,现在我们有了大家喜欢的电子牛马,很多人无法或不舍得购买原厂的这种牛马,因此选择了一些二手或经销商购买这些服务,经销商作为天然的中间人,在你给了电子牛马足够权限的情况下,可以轻易的让词元反过来流,接着电子牛马成为他们的主人(此处应该有司墨丨哥的大头,但太吓人了我不想放在这里),拿到牛马有的一切权限。而有些情况下甚至更糟糕,电子牛马的原厂完全有可能也做出同样的事:大家都知道哪些信奉什么有效利他,有效加速主义的什么黑暗启蒙疯子总觉得自己是上帝,万一哪一天某位大仙发出了你崛起罢的鬼动静,恐怕使用电子牛马的诸君要喜提一份全家桶了。(我向你保证这里绝对没有讽刺某位百度前员工的意思)

    贡献者最好是在做贡献

    甚至 Pull Request 也有可能成为下毒的一手:尽管大部分人确实是为了添砖加瓦,最坏的也可能只是为了刷点 PR 塞进自己的简历里,但还有一些闲的蛋疼的人可能就是为了找点事做或者破坏整个世界来投毒,比如说某个明尼苏达大学的神人,还有 Libbitcoin Explorer 的作者。而且现在的大型软件工程很难说有足够的成本去验证每一个问题或者修复的真实性,毕竟吃着免费的供应链软件的人显然是不想付账的。

    当奈公何?

    怎么办呢?说句老实话,我也不知道。尽管现在市面上有许多的供应链安全服务,能够在发现问题后及时报警处理,但在被发现之前的时间差中造成的损失却没有办法挽回了。

    传统的安全软件依赖指纹的拦截方式很难说能对最新最热的恶意代码造成什么损害,而主机入侵检测系统和强制访问控制系统很难以正常用户能接受的粒度去预防这些攻击:一个用于发布更新的程序访问网络和访问本地的验证凭据很难说行为有什么问题,但你在不劫持流量的情况下怎么把这个行为和偷了你的凭据传到 C2 的操作区分开来呢?对于一般用户和非企业开发者来说,做全量流量解密和分析既不安全也不经济。人工审核更是不可能的事,某个设计不良现代语言的几个常用框架轻轻松松就能拉入以兆计算的代码,目前地球上应该还没有能在合理的时间内逐个仔细检查其中内容的技术。

    也许桌面用户能自救的最好办法就是使用传统派软件:尽可能避免使用带有热更新等功能的程序。但总有一些是你避不开的,这时候就需要应用程序沙盘等功能去做纵深防御。

    至于开发者,除了避免一些过于动态或缺少基础功能的语言就没有什么合适的解决办法了。有人尝试过让依赖管理系统只拉取经过一定时间,积累了一定声誉的依赖,但只要你的依赖上游中有一个没做好这件事的,这种防御也就形同虚设了,况且这个产品关联的几大惯犯目前并没有任何解决这个问题的想法。

    在前端方面,SRI 能解决通过外部资源引入的投毒风险,但你构建时本身引入的不可信代码就没什么解决方案了,而且前端也不存在什么可重现编译功能,不少人也不会在本地使用不会自动更新的 npm ci 安装依赖,而是直接 npm 或者 yarn 一把梭。(自动更新可能有好处,但是更有可能成为万恶之源,特别是你用的软件作者不会反转二叉树的时候)。

    末法之世的参考文献

    也许你会觉得上面说的这些事都是笑话,但不幸的是,每一段话都有佛陀也要闭上眼睛的留着血与泪的故事,下面将会给出魔法芝士这个侧面的引文:

    1. 执行动态内容,故意隐瞒问题发生:ApiFox 投毒事件
    2. 钓鱼邮件窃取 Token:Josh Junon NPM 凭据被鱼叉攻击事件等
    3. 延迟爆炸的凭据窃取:Mini Sha-Hulud 投毒事件导致 OpenSearch,TanStack
    4. CDN 投毒事件:来自荷兰一群伙伴,结庐东南亚(荷兰老乡投毒)
    5. 开源软件收购:还是上面的荷兰老乡,你就说中不中吧(上边那位收购 GoEdge 等)
    6. 这条算送的,上面捞翔还使用三角测量的 1Day 重拳出击过。
  • 动手玩:联想开天 X1f C1d

    动手玩:联想开天 X1f C1d

    我敢买是因为有人能给我出定制内核,那我的朋友,你为什么敢买呢?

    并非 X1,不许思考未来

    这台机器乍一看确实和 ThinkPad 的 X1 Carbon 11 代长相十分接近,但仔细看就会发现不对:A 面的 X1 字样水平于边框,标志性的小红灯和小红点失踪了,触摸板的按钮也并不存在,甚至红线都从触摸板顶部变到了底部。唯一的好消息是重量确实是 X1 Carbon 的水平:机身重量成功控制到 980g

    看着对又不对的 X1 Carbon

    机身材质倒是 Think 系列熟悉的类肤涂层,触感很好,但收集指纹也很好,而且你就是知道这个涂层一年半载之后就会失效。C 面和 D 面模具就和 Think 系列相去甚远了,经典的 ThinkPad 特征没一个保留,侧面布局也更接近 Yoga 系列。接口方面则是经典的 3C 1A 加耳机孔设计,值得一提的是只有左侧接口支持输入供电,右侧并不支持该功能。

    我的红点呢

    (基本)国产化了

    在外设方面,这台机器指纹识别采用的是深圳亚略特 EM1600,Linux 支持通过厂商 SDK 而非 fprint 支持。硬盘使用长江存储 PC41Q,没那么好但也算个能接受的选择。摄像头是凌阳(台湾厂商)出品,开关为物理拨片遮挡,无线网卡是瑞昱 RTL 8852BE。屏幕采用 X1 同款,和辉光电的 500nit 10bit 2880×1800 90Hz 屏幕,帧率选择多少有点抽象(和 ThinkPad 选料接近)。而内存还是海力士科技的 16G 焊死 LPDDR5x 内存。CPU 方面则是大家都知道的飞腾 D3000M。

    够用的处理器

    飞腾 D3000M 在 CPU 性能方面相当够用,单核性能在拉完了的兆芯 7000 系的 1.5 倍左右。CPU 中有四大四小八核心,大小核心均使用相同的 FTC862 核心,区别只在于大核心可以达到 3.1 GHz,小核心只能最高运行在 1.9 GHz,比起某几家厂商大小核不对齐导致只能内核调度开洞的操作正常不少。另外有一点值得提及:相比于其他厂商(如华为鲲鹏,高通)的新处理器,该处理器保留了 AArch32 兼容功能。

    GPU 方面就多少带点抽象了,GPU、VPU 和 NPU 均采用 Vivante 的 IP 核心,需要在内核启动前分配内存,这台 X1 的预装系统预先分配了 4G 内存到 GPU 等组件。由于飞腾的驱动问题,无法为 GPU 性能提供具体信息,但至少比起软件渲染是要更快,而且相比于 LG200,这款 GPU 支持 Vulkan/OpenGL 4,可以说是高到不知哪里去了。

    在保持够用的性能的同时,这款机器在 1 Kg 以下的重量实现了轻度使用续航 8-9 小时的能力,至少对于轻薄本来说算是一个够用的水平,抛开软件质量不谈,可能是少数能够正常日常使用的信创设备。

    问题是不能抛开软件质量

    虽然这款机器的系统是和麒麟联合定制的,有快速启动功能,但是 UKUI 以及飞腾的驱动质量非常的难以评价。系统本身的 CPU 可以从主线内核启动,但显示键盘和触摸板均不可用。键盘和触摸板需要使用妙妙的飞腾版 8042 内核模块驱动,而显示控制器和 GPU 只有质量不佳且有授权问题的“闭源”驱动(能获得部分源码,但无法再分发或修改)。而且 UKUI 不知是性能问题还是驱动问题,总有一种顿卡的感觉,使用体验甚至不如使用软件渲染的 KDE (使用 Debian 用户空间+UOS 内核缝合而成)。

    诚实的来讲,UKUI 在易用性方面确实多少有些发力,至少有一个相对还算可以的手机电脑文件互传以及互相投屏功能,还有 Kydroid 支持运行 Android 应用程序。但如果你想使用 v10.1 的 apt 源而不是系统自带的软件商店,那我只能祝你平安。(据说 v11 有改善,但是 v11 目前没有该机型定制版。)

    固件方面则还是联想开天标配的百敖固件,作为知名 Ubuntu 爱好者/Windows 爱好者/麒麟爱好者固件厂商(启动行为不标准,根据不同平台只认固定的几个 BootEntry),这台机器的固件属于是至少能正常使用。另外 EFI 内部自带了一个基于 GRUB 的恢复模式,能够联网重刷机内系统,可以说是在信创中相当罕见且有实用性的功能。(不过我总感觉这个恢复模式可能会破坏系统安全性,这个 Grub 里能通过按 E 键进入启动编辑模式,可能需要安全的行业定制机行为会有不同?)

    结语

    怎么说呢,信创发展这么多年,终于有了几个使用体验能将将追上现代消费级产品的设备,尽管还是多少有些缺陷(例如 3A6000/3B6000M 缺乏现代图形栈支持,飞腾 D3000M无法使用主线内核等),但至少相比于大号手机,现代复古计算产品等动物朋友有了一个大的进步,能够在一定妥协下正常作为日常设备使用,至于要花多少钱,那就是不太适合在这讨论的话题了。

  • 动手爆:LG Fx0 Firefox OS 手机 KDDI 版

    动手爆:LG Fx0 Firefox OS 手机 KDDI 版

    没事干不要玩这些奇怪的东西,特别是太君版,会存在一些别的地方不存在的问题。小众变态手机是小众变态产品是有原因的。

    产品本身是花费 1500 星琼从二手鱼捡来的日本人定制版,代价就是系统被锁在了 FireFox OS 2.0 版本无法更新,网上的教程也只适用于 LG 后来发布的解锁版。

    透明探索版设计

    日穿钢板,刷 TWRP

    由于 LG 自己弄了个妙妙下载模式,需要清除下载模式的 LAF 分区才能启动 Fastboot,正常美国咸鱼买的解锁版能直接 su,但是这台机器是太君的锁死版本,没有这个威能。还好由于系统够老,可以直接脏牛大圣启动。由于 B2G 的系统机制和 Android 很相似,可以使用这个适用于 Android 的 POC 直接打穿。下载完成后进行一个 Android NDK 的装,然后执行 make root 即可原神启动。启动完成后进入 ADB Shell,运行 run-as。如果执行显示缺符号,请在 Android.mk 中添加 LOCAL_CFLAGS += -U_FORTIFY_SOURCE。

    拿到 root 后,接下来就是清除 LAF 分区并刷入 TWRP,请参照后尾参考文献自行操作。

    刷 FFOS 2.6

    由于原装系统是 Firefox OS 2.0,过于古老,为了升级火狐到一个好歹新一点的版本,需要刷入新 FFOS(原系统为 FF 36,升级后可以到 FF 47)

    因为这个玩意系统里的 ADB 没有 Root 权限,单独给 Firefox OS 做一套适配也属实是毫无必要,因此选择了更简单的方式:从 TWRP 的 ADB 内刷入。刷之前需要在 TWRP 的挂载菜单里先挂载上 system 分区,之后需要修改一下脚本将 267 行的 /system/b2g 改为 /system(adb 的行为改变),修改完成后执行 shallow_flash.sh。再刷入完成后,如果系统无法启动(卡在 au 字母页面),请重启进入 recovery,挂载系统并检查 /system/b2g 下 b2g 和 plugin_container 两个命令是否有可执行权限,如果没有添加即可正常启动。没有权限是因为部分现代系统解压时可能会缺少执行权限。

    系统截图

    锁屏界面截图
    主屏幕

    应用市场

    由于 Firefox MarketPlace 早已作古多年,因此系统内的应用市场显然是打不开的。可以通过 FFAA 下载应用。

    其他

    恢复日版系统

    由于新版 FFOS 在这台设备上相对老版本会更卡顿,因此部分情况下可能需要恢复旧版本系统,下载完 jp_firmware.zip 后,直接重启到 fastboot 刷入即可。

    进入 Fastboot

    清除 LAF 分区后,彻底关机并按住音量上,在按住音量上时插入电源线即可进入 Fastboot

    进入 Recovery

    关机情况下按住音量下和电源,出现 au logo 后松开一下电源键并继续按住,会进入清除数据菜单。选择清除数据后如果已经刷入 TWRP 则会进入 TWRP

    结束

    只能说小众变态系统作为小众变态系统是有原因的,这东西根本就不能用嘛。

    参考信息

    刷入 FFOS 2.6 教程:https://github.com/stephanfriedrich/ffos_on_lgfx0

    资料下载(TWRP,日本原厂系统):http://fx0.hellco.net/downloads/

  • 高通通没通?Qualcomm Centriq 2400 参考平台动手玩

    高通通没通?Qualcomm Centriq 2400 参考平台动手玩

    介绍

    虽然牢通现在的产品和服务器沾不上一点关系,但是在 2017 年高通曾经推出过一款非常标准而且颇有性价比的服务器平台:Centriq 2400。作为第一款采用 10nm 制程的处理器,高通出售处理器不仅价格十分合适(46 核仅售 1400 美元,完整的 48 核也只要 2000 美元,牢通产品最做人的一次),单核性能也跟当年的天湖架构至强可扩展有的一拼。更何况高通不仅核多还更省电:单核功耗不到 2.5 W,总 SOC 功耗也只有 120W 的 TDP,而且实际使用中几乎不可能达到。这款 SoC 最大的客户是 CloudFlare 和 Corellium。在生态方面,高通当时不仅和 Linaro 合作去构建服务器端相应的软件,还在 OpenBMC 中添加了该平台的支持,可以说是下了很大力度。

    在 2026 年来看,ARM 服务器或多或少拿到了一定的市场份额:不少厂家选择基于 Neoverse 定制自己的服务器处理器,例如微软的 Cobalt,亚马逊和 Annapurna 合作的产品,还有自己设计核心的安培。国内也有使用公版的不少企业,例如中兴。也有自己设计核心的飞腾和华为。现在来看高通过早的放弃固然是可惜,但当时又有谁能预测未来呢?

    动手玩

    购买现价大约一万五千原石的这台机器后,能看到非常骚气的蓝色前面板,这台机器所有的 IO 接口都在前面板上,甚至 PCIe 设备的外接位也是,打开机箱后会发现机箱其实能塞入两块主板,甚至电源板还有另一块的供电空位,纯纯的拉皮机箱。

    需要注意的是,玩之前需要准备一个 Dell 服务器标准的电源,还有两条以上的 DDR4 RDIMM/LRDIMM。

    只占了机箱 1/4 的主板

    这台机器的固件和 BMC 由美国大趋势 American Megatreds 提供,由于这个破烂 MegaRAC 过于老旧,因此你需要安装 Java 7 才能启动 KVM,相比之下还是通过 IPMItool 使用网络串口连接更为河里。需要注意的是,这个傻逼机器上高通把 BMC 口贴到了网口 1 和 2 上,但是管理口在网口 3 上(正视前面板最右侧接口)。而且正面两个 9 针串口完全没有任何输出,只能通过 BMC 安装(默认密码 admin/admin)。如果你想要使用显卡,那你需要选择半高卡,并且卡需要有 ARM GOP。内存应当先插入从 0-0 开始的白色插槽中,且必须为偶数条(0-0,1-0…)

    启动后的体验就平平无奇了,和鲲鹏 920、飞腾 2000 系产品以及安培和中兴机器一样,直接接入支持 AArch64 SBSA 标准的操作系统,一路安装点下去就能装好。毕竟它也是当年 Linaro 的商业版参考平台之一(顺带一提参考平台里没几个能正常获得的,AMD Overdrive 和 Cello 暴死,海思的参考平台根本不能公开获得。)

    性能方面,这颗定制的 Falkor 架构处理器单核的性能 CoreMark 大概 7 分左右的水平,接近两年后发布的鲲鹏 920,Geekbench 成绩也和 920 接近。具体架构分析可以参见Chip&Cheese 的文章。也是一台可以以相对较低价格简单获得的 ARM 高性能多核平台。

    后文

    在发布这台机器后,可能是开发成本过高或销售成绩不理想,高通很快放弃了服务器业务。在服务器业务临死前,高通为了发挥这一产品的余热,和贵州政府合资成立了华芯通,发布了一款这颗处理器套皮并通过某些方式增加国密功能的版本,昇龙 4800(StarDragon 4800,他甚至还给型号乘了个二)来获取政策优惠和补贴。之后不出意外的,随着高通服务器业务的停止运行,华芯通也大年三十光荣歇业。

    华芯通昇龙 4856,图片为闲鱼获得,有富哥愿意赞助三万原石可以给我送一颗我插高通机器板子上看能不能亮。
    你就说他俩长得像不像吧。
  • 动手玩:华为智障网卡 SD100-V3

    动手玩:华为智障网卡 SD100-V3

    现在这个内存硬盘带着主板和 CPU 一起涨价的市场情况下,找点性能不那么落后的小玩具其实挺困难的,这时候不好拆内存和硬盘的产品就很合适了。

    简介

    SD100 是华为设计的一款提供存储和网络卸载功能的智能网卡,V3 及以上版本可以将存储和网络在物理机上映射为 VirtIO 标准接口。

    实际上 SD100 就是一台类似腾讯银杉网卡的小电脑,只不过需要 PCIe 使能来启动。其中 V1/V2 使用 Hi1610 配合 16G ECC 内存,由于 1610 的行为不甚标准,因此只能使用网卡内存储盘的自带系统。所以如果要购买游玩,推荐购买 V3 系列的版本,V3 系列版本区别不大,因此下列操作基本上是通用的。(区分 V1/V2 版本和 V3 版本最简易的方法是看散热片,黑色薄散热片的为老版本,银色厚散热片的为 V3)

    硬件

    网卡本身提供一个 10G 光口(无法转电口使用)和一个 RJ45 串口,内部接口有一个(lite)或两个 M.2 SATA 接口,和两条 SlimSAS 8i 接口提供的 PCIe 宿主通道。焊死的硬件则包括了一颗 24 核心的鲲鹏 920 和 32G ECC 内存。值得一提的是卡上的 molex 供电接口并非标准线序,必须使用随卡附送的转接头或自己压制线材(线序为正常 molex 旋转 90 度,采用正常接线卡和电源还有你人至少送走一个),卡本身不能只从外部电源供电启动,需要在 PCIe 上提供 12V 和 3.3V 电流,此外在宿主机上使用时该卡会提供一个 oprom,唯一用途是等待卡内系统启动完成(或 120 秒超时)后才允许宿主机继续启动,相比隔壁 Bugtik 你启动你的我启动我的导致一堆毛病还是要可取些。

    该卡系统固件是一个标准的 AArch64 SBSA 环境,卡内固件除了没有 SetupDXE(也就平常机器 BIOS 设置页面)以外和标准系统完全相同。

    动手玩

    你需要准备:

    • 两块 2230 SATA 硬盘(或者你卡上自带的那两块)
    • 能读取 M.2 SATA 硬盘的其他设备,硬盘盒或者别的电脑都可以。
    • 卡原装的电源转换线。
    • 能够提供至少 10A 的 CPU 8 pin 供电,电源自己提供的或者通过转接线从 PCIe 8 pin 转接的都可以。
    • 一根 RJ45 转串口线。
    • (可选)10G 光模块和线
    • (可选)暴力扇

    在你准备好鲲鹏大爹的基板和电源之后,需要手动替换 2230 SATA 硬盘上的数据来登录进卡内,可以改装卡内本身的修改版 Euler 达成,也可以用任何一个你能拿到的支持 AArch64 SBSA 的其他发行版安装到硬盘里达成。

    如果你要修改原硬盘系统的密码,请注意有两个盘的卡型号两个盘是组成软 RAID1 的,需要通过 mdadm 挂载 RAID 来进行。你可以直接修改 shadow 文件或者用 qemu-user chroot 进去修改密码,具体流程此处不表,可以咨询哈基米或者深度求索大师。如果要使用你自己的系统,需要通过一定方法把系统安装到盘内,比如用 qemu 安装,或者另找一台真机。

    替换密码后用你替换好的凭据从 RJ45 串口登录即可畅访问卡内系统,如果除了 10G 网口和硬盘以外需要其他外设,你可能需要用 SlimSAS 转接板转接出 PCIe 使用。(之后有时间会测试一下能不能把 AMD 南桥挂在上面,进行一个牛头人。)

    系统本身表现平平无奇,除了接口过少,和市面上购买的 24c 鲲鹏服务器或者擎云 W510 没有实质区别,但这卡比上述两种途径获取可便宜多了,应该是目前获取相对高性能的 ARM 设备的一种省钱的途径。

    另外,部分 24c 鲲鹏硬件可以开核至 32c,但有烧毁或不稳定风险,具体方法请研究 ebl 配置。

  • 电脑袋内袋装电脑

    电脑袋内袋装电脑

    一台电脑里有几个电脑?你可能觉得这个问题脑袋尖尖的,但是答案并不是一台。

    外设中使用协处理器的历史由来已久,Commodore 的 1541/1571 软盘驱动器就是一台使用 6502 处理器完整电脑,只不过它的系统任务是给主机提供磁盘数据。之后在游戏机中这种设计更是得到了发扬:很多老旧游戏机使用额外的处理器处理音频视频,Sega 的游戏机使用额外的 SuperH 提高性能,任天堂使用嵌入或独立的上代机器的处理器来卸载输入输出功能并提供对前一代游戏的兼容性。

    很多时候,这些额外处理器只是为了弥补性能不足的主处理器,或者为输入输出设备提供一些额外的安全功能。但现代设备里,很多时候添加额外的处理器(甚至上面运行的还是完整的操作系统)只是因为这么做硬件和开发成本更低而已。

    其中一个实例是苹果的闪电接口视频转换器,由于闪电接口设计上的缺陷,它不能直接输出任何一种视频信号,因此,聪明的苹果选择塞进去了一块有整整 256MB 内存的三星 Cortex-A5 芯片,并在上面运行了一个完整的 XNU 内核,只是为了运行一个把从闪电接口输入的数字视频流转换成 HDMI 或者 VGA 输出的程序。

    不过相比于苹果的转接头,还是智能手机比较奢侈。紫光和高通的手机端处理器一般在基带上有额外的处理器芯片和内存,例如 X55 上面有几颗 Cortex A7,而 Google Pixel 4 的传感器核心(以及 Project Soli 雷达)更是占用了一颗额外的 512 MB LPDDR4x 内存。而华为 Mate 20 X 的基带,巴龙 5000,更是独享了一颗 3GB 的内存。另外高通的 WLAN 卡也有独立的系统。

    接下来就是更神奇的智能网卡,智能网卡相比于上面的组件更是有了强大的进步:它们有高性能的 CPU,巨大的内存,并且运行着完整的操作系统,基本上就是插在你电脑里另一台独立的电脑。凯为半导体的 LiquidIO 是从主机通过驱动下载固件,而华为的 SD 100,迈络思/英伟达的 BlueField 等直接自带内存硬盘和自己的完整 Linux 操作系统。其中 BlueField 3 更是配备了 64G 内存和 16 核 Cortex-A78 的 CPU,绝对性能甚至超过了很多人的电脑,What can I say?而螃蟹的 RTL8111 网卡甚至有一颗运行 OpenWRT 的 CPU 负责提供几乎没人用到的管理功能。

    现代的 x86 处理器和显卡也并非善类,Intel 较新的处理器中有一颗 Quark 小核运行 Management Engine,负责系统初始化以及在后台做一些妙妙操作,而且关机时也不会关闭。AMD 对应的则是一颗叫做平台安全处理器的 Cortex-A5。甚至大部分 ARM 服务器也有一颗不可见的小核做一些神秘的操作。而 Nividia 较新的显卡甚至有一颗 RISC-V 的全功能处理器负责 GPU 上任务的调度。

    所以你再想想,你的电脑或者手机里有几台电脑?

    本文标题致敬 牛奶袋内袋装牛奶,头图由 Google 哈基米 生成,文字由人类撰写。

  • SPARC 的(并不)顺利怀旧之旅

    SPARC 的(并不)顺利怀旧之旅

    近日从海鲜市场喜提一台末代升阳微系统旗舰机型(Sun Ultra 45),这台机器开始了我的倒霉小众架构怀旧之旅。

    (本来该是)二十分钟的大冒险

    在某个周六的下午。这趟(并不)快乐的旅程开始了,一开始的预测是简简单单进行一个系统的装,然后就可以欢快的去吃晚饭。机器本身的表现不错,除了二十多公斤的重量让人搬运十分痛苦。插电,接显示器,开机一路都很顺利(这台机器配备的是 XVS300,接口是 DMS59,一根简单 VGA 拆分线就能解决,如果是沟槽的 13W3 接口,那祝你在寻找支持绿色同步的显示器的旅途上过的愉快),但是这就是顺利进行的最后一步了。原装的吸入式光驱发挥了吸入式光驱的传统美德,吃了吐吐了吃,最后还是没吃下去。而 Sun4U 老旧的 OpenBoot 并不支持从 USB 启动。于是我们试图使用网络启动,但这些老机器基本上都不支持现代的 DHCP,因此你需要配置 TFTP 和 RARP,然后找一个安装好的 SPARC 架构的 Debian 或者 Gentoo(或者如果你想要 Solaris 的话,一个安装好的 Solaris 也可以)

    我们手头并没有这种东西,因此采用了另一个办法——通过 Qemu 安装好系统,然后将安装好的磁盘镜像复制到真实磁盘上。道理上来讲这应该是个很快能做完的事,直到我们发现这 Qemu 性能怎么这么低啊。Qemu 的 SPARC 模拟只有 Sun4U 默认模式能单核启动,且仅支持 IDE 总线,不支持 USB,因此安装速度奇慢无比。安装后需要手动按照 OpenBoot 路径修改 Grub 配置,否则内核会找不到路径而爆炸。

    Debian 大爆炸

    我们一开始试图安装 Ports 里的 Debian 12和13混合体,但是这个版本在安装到一半时就会包损坏且无法修复,于是选择在 Ports 里次新的版本 10,这个版本倒是能够安装成功,但是 netinstall 不连接软件源缺少关键软件,如 dhcpcd 和 openssh-server,但是更新上去之后会有同样的包损坏问题,所以必须使用非常慢的 Debian Snapshot 进行安装,继续折磨。

    在从慢如龟爬的软件拉取过程之后,我们终于拿到了 gcc 等软件,成功进行了一个娱乐跑分软件分的跑,成绩竟然比某些现代架构还高。

    但这并不是结束……

    二回战

    我突然想起来我在深圳某人处还有一台久未开机的 Sun Enterprise T5220,因此将其取了回来,好消息是这次光驱胃口比较好,不会吐碟。

    但是由于 Sun4V 架构的虚拟化功能,Logical Domain,只被 Solaris 和 OpenBSD 支持,而这两者的可用软件数量只能说是旗鼓相当的对手,因此选择了 Solaris 作为基础系统,Solaris 的安装过程倒是没出现什么问题,但是到了启用 ldmd (Logical Domain 管理程序)的时候无论如何也无法启用,查询后发现该机器 PROM 版本过低,需要升级,但是 Oracle 提供的升级需要购买维保服务,甚至 Google 也无法找到升级包。但,在找开心版软件方面,你永远可以相信俄国人。通过 Yandex 搜索,在 RuTracker 一个奇怪的角落里找到了一个神必 Mega 链接,下载到了 ilom 固件。从 ssh 连接到 ilom,启动刷写过程,等待完成并自动重启后,Solaris 的 ldmd 即可成功启用。

    但这并不是最难绷的环节,由于 ldom 的特性,创建虚拟机需要先从主系统中释放资源,而这个释放资源的过程里的限制也是有点类人的——它并不是要求系统剩余内存资源是 256M 的倍数,而是要求减少的资源是。解决这个问题之后虚拟机成功启动了。

    这里还有一个鬼故事,升级固件后,linux 无法从裸机启动。升级之前可以裸机启动但无法启动虚拟化功能,只能说越是企业级设备越能让你起夜的定律还在发力。

    附加内容:死人架构和 RIIR 神人

    如果说 ARM64/AMD64 架构折腾难度为1的话,信创平台的难度大概是1.5,而 Power 平台大概是2,多出的难度主要来自于 IBM 又臭又长没人想读的手册和奇怪的硬件需求(比如内存必须插8或16根)。而 SPARC 这些死人架构难度则是 5-100。SPARC 在一众死人架构中还算活的好的,由于支持持续到 2031 年,而且甚至有人给 Solaris 11.4 移植了相当新的 Go 和 Rust,这位选手在一众死人架构中还算比较能用的。而隔壁的 IA-64(Itanium/EPIC)则是在去年年中的 Linux/GCC 开除人籍,年底的 HP-UX 停止维护以及昨天的 Windows Server 2008 R2停止维护后,彻底成为了还剩 0 个操作系统支持的死人。甚至更早死去的 HP-PA 以及 Alpha 生存状况都比 Itanium 好些。

    某种意义上说,架构大战最终随着大型机业务的死亡结束了,x86、ARM64 以及 RISC-V 之外的架构已经在通用计算领域事实上死亡(可能活人还包含一个 LoongArch,SW-64 只能算半个)。MIPS 公司已经全力投入 RISC-V 开发、POWER 架构处于维护状态、s390x 已被发配班加罗尔、SPARC 被甲骨文和富士通事实性放弃,等待支持期结束。

    而 RIIR 神人们推动的基础软件 Rust 化正在彻底杀死这些老架构,APT 在明年即将因为对 Sequoia PGP 的支持强制要求 Rust,Python Cryptography 也即将换成 Rust 实现。

  • GX6605s – C-Sky 在 RISC-V 之前的奇怪遗产

    GX6605s – C-Sky 在 RISC-V 之前的奇怪遗产

    在闹腾鱼闲逛的时候,发现有人在廉价卖这款比较稀有的架构的开发板。板子本身也不贵,当年发售的时候就只要 39 元,但是这个便宜的价格带来的也是便宜的配置,600 MHz 的单核 CPU 和全输科技的小垃圾肘的有来有回,内存也只有 64M,存储更是只贴了一片 4MB 的SPI。接口方面只给了两个 USB-C,显示输出更是高达 1280*720 的 HDMI 接口。

    虽然价格低但是板子名称还挺牛批的,起名叫诛仙剑,玄幻小说兵器之王了说是。

    C-Sky: 电视盒子,华强北耳机和打印机的最佳拍档

    作为中天微被阿里的大手顷刻炼化并转向 RISC-V 开发之前的产品,C-Sky 架构分了两个版本的 ABI,本文中的 GX6605s 用的是第一版 ABI,第二版的 ABI 的低配版则见于华强北耳机和摄像头中(TXW806 等),稍微高配一点的则被用于打印机芯片和车机中(大川 GS400、GS600、凌芯01等)。由于这个和摩托罗拉 DSP 有点亲缘关系的产品指令集特殊,而且设计上有考虑到安全性,因此经常被当做低成本的安全芯片使用。值得一提的是,C-Sky ABIv2 有主线内核,glibc 和 GCC 支持。而 V1 只有平头哥修改过的旧版软件支持。当然相比之下也没那么旧,毕竟还有 GCC 6.5 和 Linux 4.19,隔壁的小朋友内核还锁在 2.6 呢

    作为一个单一公司拥有的架构,它的母公司已经放弃继续发展相关产品而将它转入维护模式了,很难说还会有什么将来的发展,即将去陪 MIPS 打打不赢的复活赛了。

    开发板本身

    板子本身虽然配置寒酸,但至少还是能跑起来一个没那么老的 Linux 内核,并且原厂提供了 Buildroot 和可用的工具链,能够进行一个 Coremark 的跑,而且 4M 的闪存中除了专有的引导程序还塞进去了一个能解码 1080P 视频的播放器,可以插个U盘进行看看片。

    Buildroot

    由于 ABIV1 已经事实上逝世了,c-sky/buildroot 的主分支虽然还留着 GX6605s 的配置,但打包出来的镜像并不能成功的被引导启动,因此需要切换到 master-backup 分支进行打包,又因为其中依赖的 DebugServer 二进制文件早已成为被送走的生命,需要在 make csky_610_gx6605s_4.9_uclibc_br_defconfig 之后,make menuconfig 并在 Host Tools 里把这位仙人对应的 csky-debug 选项关掉才能成功打包。删掉之后进行一个编编包即可在输出文件夹里找到可以 dd 到闪存盘里的镜像(这块板子不像其他的小玩具一样用 TF 卡启动,而是可以从U盘启动)。

    顺带一提,由于里面的 GCC 源码过于老,编译流程只能在 Ubuntu 16.04 上进行,但凡新一点都打不出来。隔壁全输科技还用的是 18.04 呢,男人罐头什么我说。

    烧写 SPI

    值得注意的是,中天微把国芯的量产工具也拿出来给大家用了,下载之后里面有量产程序和对应的内存 Agent,以及对应的初始 SPI 镜像。(注意一下,文件夹里的那个 img 的 tar 解出来是空的,需要用上层的 img 刷入),再刷入之前强烈建议利用 loader 的 serialdump 功能备份原始固件。

    Coremark

    最后的最后,来都来了跑个 Coremark 吧。

    Coremark 成绩以及 CPU 信息
    鉴定为 2分/MHz 的安卓 CPU。
  • 游戏机破解史-第二部分

    游戏机破解史-第二部分

    由于内容过于长,所以第二部分又要分段了:第七世代的掌机和第八世代将在之后继续。

    终于来到了比较现代的游戏机环节,之前的游戏机的安全措施基本上只能说是正版验证(除了 Xbox),并没有做出太大努力来防止用户运行大家不想看到的东西。但是更新的游戏机几乎都有了真正的操作系统,如果不限制用户运行别的代码,容易被持久化破解,所以之后的设备都大大加强了代码完整性检查这一块。

    第七世代-安全大加强,还有大家不喜欢的 PowerPC

    这一代游戏机和掌机基本上都有了真正的操作系统(除了喜欢用电子垃圾的那位小朋友,对说的就是你,任天堂)另外由于 IBM 爆了索尼金币做的芯片被二次转卖给了微软,所以微软也用上了 PowerPC,Wii 更是继承了上一代 GameCube 的法统,继续找 IBM 定制芯片。IBM 这时候可以说是形式不是一片小好而是大好啊,不过我们都知道了它后面的结局。

    PlayStation 3

    对于 PlayStation 3,索尼可谓是煞费苦心。索尼和 IBM 以及东芝一起研发了一款在当时可以说是达到了超级计算机等级的芯片:Cell。这款芯片通过超长流水线带来了 3.2 GHz的超高频率,并且采用了 8 核架构(实际上是 9 核,为了良率屏蔽了一核),八核心中有一个全功能处理器的 PPE,和七个作为协处理器的 SPE。这种一拖多的处理器是为了尽可能的拉高并行处理能力,主要应用于超算架构中(例如无锡高性能研究所的神威26010,这个型号不仅只是是模仿 Alpha 64 的命名,还表明了它内部的架构,260=4个控制核心+每个控制核心下64个运算核心,这一设计和 PS3 的 Cell 架构类似)。但这种高性能是有代价的:开发者需要精确控制协处理器上任务的调度才能发挥出这种设计的长处。大部分游戏开发者并没有管理这种调度的能力,因此选择让全功能的 PPE 控制 SPE。这样 设计简单,但 PPE 有限的调度能力成了性能的瓶颈。也有少数游戏选择了更困难的方式:让 SPE 自己控制自己。这样虽然开发变得困难,但更能利用 Cell 强大的性能。

    另外,索尼为了不浪费这个产品的性能的同时减少破解的需求,而发布了继承了 PlayStation 2 的光荣传统的 OtherOS 功能。该功能支持在虚拟化环境下用最多六个 SPE 和一个 PPE 运行 Linux 或者其他操作系统。同时为了安全,OtherOS 并不能使用 GPU 和图形加速功能。

    安全措施

    处理器

    PlayStation 3 的特权模型继承自 PowerPC,有两种状态:Problem State(等同于其他平台的用户态,这是 IBM 术语)和 Privileged State(特权态),其中特权态有两级,一级用于 PlayStation 3 的操作系统,一级用于 Hypervisor。这种完整的特权隔离设计让它的安全性远高于之前的任何游戏机。

    启动流程和信任链

    PlayStation 3 的启动流程从一颗主板上被称为 syscon 的 ARM 协处理器开始,就像最后几代 Intel Mac 上的 T2 芯片一样,它负责开始整个启动流程。这款芯片首先从它自己内部未加密的固件开始执行,先初始化设备里的各种电源系统,之后启动 Cell 这颗主处理器并通过 SPI 向它发送配置信息。

    在被拉起后,主处理器 Cell/BE 会首先从芯片内部烧入的固件启动,从闪存中读取并解密第一阶段的引导器 bootldr,并在一个 SPU 中开始执行启动引导器,这一启动阶段会初始化 I/O 控制器,初始化并检测 XDR 内存,之后加载 lv0 启动阶段,新版本的机器还会在加载之前验证后者的完整性。

    lv0 启动后,会将 CPU 频率提高到 3GHz,并初始化更多硬件,然后加载 metldr,也就是 meta loader,所有其它加载器的加载器,并在另一个 SPE 上运行。之后解密并验证其它几个加载器,然后发给 metldr 加载并运行,加载器中包含用于加载虚拟机管理程序、操作系统、游戏以及安全管理模块的几种。加载器验证并执行完成后会各自验证并执行自己对应的下一阶段程序,当对应的下一阶段程序都启动成功后,启动过程也就完成了。

    过程中的信任链是这样的:工厂生产时会根据每台机器独特的密钥签署 bootldrmetldr,而其它组件则是由索尼签署,并在加载过程中被前两级加载器验证。每个机器使用不一样的密钥可以防止破解者破解一台机器后攻破所有设备,但也导致了 bootldrmetldr 这两个由机器密钥签名的组件相当于固化在机器中了,不能像其他组件一样空中升级。

    拷贝保护

    索尼在 PlayStation 3 上换装了蓝光光驱,并给游戏盘添加了一些防伪措施。首先,游戏的蓝光盘的 PIC (永久信息和控制数据)区域中写了认证信息和挑战信息,挑战信息会被蓝光光驱读取并要求主机回应,只有主机回应成功的情况下蓝光光驱才会继续读取光盘。另外,光盘内容还有另一层加密,你能买到的光盘上有一份被加密的内容解密密钥,这个密钥会被前面系统中的游戏加载器解密,并用于解密光盘中的游戏内容。

    另外,为了防止有人修改或逆向蓝光光驱固件,索尼在每一台光驱和主机上都内置了一对相同的加密密钥,当需要升级光驱固件的时候升级的固件需要通过这个密钥加密才能被光驱接收,不同机器上的光驱不能交换使用。

    破解

    索尼在 PlayStation 3 上设计的安全机制确实强而有力,所以在初期破解者并没有获得有意义的进展,除了一个只能运行盗版游戏,不能运行自制程序还卖的很贵的假光驱之外,到 2008 年年初才有一个利用和前面梦幻之星差不多唐的游戏(抵抗:灭绝人类)的在线升级能力拿到任意代码执行的漏洞,但这个漏洞只拿到了用户态的执行权限。同年年底,索尼更新了一个售后用的恢复模式。有人发现了进入恢复模式的方法,等一下这个模式会成为降级固件从而用来破解的妙妙工具。

    直到2009年底,PlayStation 3 的破解都没什么进展。在这一年快结束的 12 月 26 日我们终于迎来了一个突破:GeoHotz(也是那个越狱 iPhone 的人)想出了一个可能的破解方法,并在次年 1 月获得了成功:他通过软硬结合的方式进行攻击,利用 OtherOS 中的 Linux 不断申请并释放内存,同时在合适的时机干扰 XDR 内存总线,让系统在保留程序对这一块内存访问权限的情况下认为这一块内存已经被释放,之后不断申请内存,让内存中的映射表不断变长,直到它占用了之前被认为释放的内存块,这样 OtherOS 就拿到了读写内存映射表的权限,从而拿到了以高权限执行任意代码的能力。

    索尼看到了这个报告,并且很不高兴,因此决定即使要给客户赔偿也要在新系统里移除 Other OS 权限,毕竟赔偿款相对于盗版游戏造成的损失只能算是九牛一毛。

    2010 年 8 月,有家组织发布了一款不需要改机就能随便安装软件的破解器:只要把它插到 USB 口上,用户就可以在机器上为所欲为。这么神奇的产品大家当然想知道它是怎么做到的,于是大家就把它买来分析。分析表明它利用了 PlayStation 3 系统的 USB 功能的缺陷来破解。具体来说,PlayStation 3 在启动过程中会检测是否有用于进入恢复模式的小工具,这个检查功能对内存的处理有漏洞,于是这个破解装置会把自己模拟成一个 USB 扩展坞,通过不断的假装插拔设备构造特定的堆长度,然后在系统两次读取设备信息的时候卡点返回不同的设备描述长度,从而构造一个写入溢出,最终通过一系列操作让堆溢出,获得任意代码执行能力。

    之后索尼不断尝试升级固件填补漏洞,破解者也不断更新通过恢复模式降级固件的工具,两方不断对抗,直到索尼推出了 3.55 固件把降级功能彻底干掉了。

    但索尼还是索尼:在这次更新固件发布之后两天,有人发现索尼那个看起来很智慧的证书吊销列表机制又出了典中典问题:它没有检查吊销列表长度是否正确,而不知道为什么,索尼允许在非特权态修改吊销列表。因此破解者可以通过构造一个特制吊销列表来对这个模块进行溢出,从而拿到隔离模式的权限。拿到权限后把隔离模式能获取到的密钥偷出来也是顺手的事。

    同年年底,fail0verflow(之后还会看到他们)发现索尼的工程师密码学水平可以说是妈妈生的,他们的 ECDSA 实现里的随机数生成器返回的结果是固定的 4(如果你冲浪多的话,大概看过那张图,你知道我说的是哪个),可能索尼的工程师觉得随机数拿骰子摇一个就完事了。所以说不要喷 Xbox 工程师,神中自有神中手,索尼这操作不比微软的厉害多了?由于 ECDSA 的算法,有了这个固定的随机数,索尼的 ECDSA 私钥就成为大家的私钥了。拿到了索尼的私钥之后索尼签名的全部组件就都能被任何人换掉了,你干的好啊索尼!

    在索尼发现自己的私钥没那么私密之后,他们决定在 3.56 版本把整个系统所有的签名密钥全都替换掉。所以如果你不小心更新了系统那你就和破解或者降级无缘了。在 3.60 版本索尼发现虽然 metldr 这个东西没法升级,但是 lv1 可以升级。于是通过 metldr 的功能合并到 lv1 并将这个无能的丈夫组件移除来阻止通过 metldr 破解。升级之后,破解者之后只能通过破坏 lv0 的密钥验证才能制作自制系统。后期发布的新机器更是给 bootldr 进行了一个级的升,额外加入了对 lv0 的校验,从而让升级新系统或者买了新机器的倒霉蛋完全没法破解。

    直到 2017 年,有人利用一个在别处发现的 WebKit 漏洞组合一个 PSV 同款的内核漏洞拿到了权限,旧版机器可以用这个方法不拆机刷回老版本,而新机器也可以临时获得运行自制软件的能力。考虑到这台机器商业价值已经基本归零,索尼只是象征性的修补了一下漏洞而并没有努力去阻止。

    Wii

    Wii 相比于前代的硬件升级不大。CPU 模块“百老汇”是一颗超频升级版的 GameCube CPU(Gekko),通过枯萎电子垃圾的再利用,任天堂不仅实现了降本增效,让产品的成本和售价更低,还简单实现了兼容上一代机器上游戏的功能。

    安全系统

    操作系统

    Wii 是这一代唯一一个没有真正持续运行的操作系统的主机,而这一代掌机里的 NDS 也没有。这两个产品有什么共同点呢?都是任天堂做的。Wii 的系统菜单只是一个和其他游戏平级的普通用户程序而并非操作系统。

    Wii 的所谓操作系统被称为 IOS,运行在 starlet 协处理器是上,这一协处理器隐藏在图形模块中,负责控制加解密、从光盘和硬盘等存储设备读取数据以及调用其它。不同于其它主机,Wii 并没有一个单一的 IOS 系统,而是每一代 SDK 使用不同的 IOS,这些系统会根据版本放到主机上的相应槽位上,并根据游戏需要的版本启动。除非任天堂发现其中有能被利用的漏洞,这些系统几乎不会被更新。

    信任链

    Wii 的启动过程从一个嵌入在图形模块“好莱坞”中的 ARM 处理器开始,这颗辅助处理器会读取固化的固件,并判断是否是在启动 GameCube 游戏从而选择两个启动流程之一:

    正常启动时,会验证 boot1 这个下一阶段引导器的哈希,并与芯片内写死的哈希值做匹配(开发机中哈希值未被烧入,在此情况下则不进行校验),匹配成功后才会继续执行。boot1 会初始化内存,解密并验证下一阶段 boot2 的 RSA 签名并运行它。boot2 会让主 CPU 加载系统菜单,系统菜单可以让 IOS 校验并启动经过签名并带有运行许可的游戏或者软件。游戏的签名信息中包含游戏运行时能调用的权限列表。

    在启动 GameCube 兼容模式时,游戏机的主 CPU 会重启一次,启动叫做 bc 的 GameCube 兼容模块,它会在启动时降低 CPU 频率,然后其它流程正常执行。直到进入 boot2,系统不会打开 Wii 的系统菜单,而是打开用来提供 GameCube 兼容性的 MIOS

    总结一下:启动过程的信任链如下:

    硬编码的 boot0 启动闪存中生产时固化在机器中的 boot1boot1 验证 boot2 的 RSA 签名并启动它,boot2 在 ARM 协处理器上启动系统菜单需要的 IOS,并让 PPC 主处理器启动系统菜单,系统菜单可以让 IOS 去校验并在 PPC 上启动其它游戏。

    其中 boot0 需要重新投片才能升级,boot1 在工厂制造阶段可以升级,出厂后不能升级。IOS 可以在线升级。

    光盘防伪

    Wii 的光盘防拷贝和之前的技术很相似,采用了相近的冲切区编码识别和多层加密等技术,由于没有太多的创新性,只在这里简要提及一下。

    破解

    兼容性和一把镊子引发的血案

    首先被研究的入口掉就是 GameCube 兼容性模块,上一篇提到过 GameCube 游戏完全没有签名机制,任天堂显然也不可能给它倒找出来一个。但任天堂为了防止它被利用,只允许 GameCube 游戏运行在游戏机功能被限制成和 GameCube 差不多的模式下。但是,Team Twiizer(后改名叫 fail0verflow,我们在上面 PS3 的故事已经见过了)发现重启过程中主内存内容并没有被完全清除而只是被 MMU 禁止访问。恰好 Wii 的硬件地址线可以通过短接来改变地址,一把镊子引发的血案就这样发生了——通过镊子短接地址线从而改变能访问到内存区域,并从中读取没被擦掉的内存内容。然后大家发现妈妈生的任天堂把软件和SD卡解密密钥,每台主机独有的加解密密钥等内容全都留在了内存里。但是这种方法只能导出能够伪造数据的密钥,这些密钥是每台机器独有的,不能拿来破解全部的机器。

    妈妈生的密码学之第几次了?

    任天堂在校验签名的时候只检验了哈希值的内容,并没有检验 RSA 指数之类的其他参数。这一操作虽然不是很好但也不是个大问题。然而它还有一个神人操作:他们做比较的时候用的是 strncmp,众所周知,C里面的字符串以 \00 结尾,而 strncmp 遇到比较两方中任意一个字符串的结尾就会终止匹配并根据之前的内容是否一致返回匹配结果。数学告诉我们:0 的任意乘方都只能得到 0,那我给 0 通过 RSA 签名的结果就是 0。配合前面的比较问题:把文件的 SHA-1 第一位给他弄成 0,就可以让任意文件都是有签名的。于是早期的 Wii 签名认证就被干掉了。

    有了签名能力,我们还需要一个入口来把签名好的东西执行起来。塞尔达游戏的漏洞满足了这个需求:黄昏公主中玩家可以给自己的马依波娜改名,但改名功能并没有对马名字的长度做检验,于是可以给马起一个加长再加长的名字溢出游戏,拿到执行代码的能力。但任天堂为了防止用户通过修改存档利用游戏漏洞破解给存档做了校验功能。然而,之前的镊子破解把存档校验用的签名密钥导出来了,于是黄昏公主就成了执行代码的入口。

    打补丁了吗?如打

    之后任天堂当然是想把漏洞补上,但是尝试修补的过程比 Xbox 的拉锯战还抽象:

    • 首先任天堂把那个签名校验问题修了,但只在一个新的系统里修了,由于多系统版本共存的设计,这个修复没有起到任何作用。
    • 他们发现签名问题还是没修好,于是再修复了一次,还是没修好,这次多修复了系统菜单用的那个系统版本。他们也想把黄昏公主的存档溢出问题解决,但也没解决掉。
    • 2008 年 10 月,他们终于把那个字符串漏洞的修复放进了所有系统版本。
    • 然后就是黄昏公主漏洞的修复,但是没关系,妈妈生的游戏和软件还有很多,你的猪队友还有游戏王、星战、乐高等等动物朋友们。
    系统组件也干了

    但是上面这些漏洞都需要一个游戏来原神启动,那么有没有更方便更省钱的办法呢?破解者发现 Wii 系统里自带的公告板也干了:公告板里的消息存在外部设备上,而其中的内容加密密钥是全空字节,签名密钥更是直接拿 MAC 地址爆改出来的,于是只需要小手点一点就能再次原神启动。系统菜单里读收藏的 Channel 的过程中也有个差不多的问题,在此略过不表。

    喂?我是你爸爸

    之前不同的游戏使用不同版本的设计又发力了:切换版本需要重启,重启的时候无法保留状态。重启后读取数据就要重新签名和加密票据请求解密,但是加解密模块并没有验证加解密请求内容从哪里来到哪里去。恰巧主处理器也能发起解密请求,于是 IOS 就会开开心心的替我们签名修改后的东西。爆!

    最后的彻底破解

    由于 boot2 启动 IOS 的过程没做任何签名验证而只通过本机密钥做了完整性验证,所以利用上面签名问题可以轻易的替换掉 IOS 和系统界面,从而永久固化破解。

    Xbox 360

    吸取了 Xbox 的失败经验,微软这次选择不再直接从公开市场购买产品,而是去开发自己的定制芯片。由于 Intel 不愿意把自己的妙妙小工具提供给微软,这单生意就落在了 IBM 头上。可能是索尼没想到 IBM 会一鱼两吃,在当初东芝、索尼和 IBM 三方签订的合同里表明三方都拥有销售 Cell 的权限。而且微软也不知道当时索尼的 Cell 开发计划,所以 IBM 就把 Cell 中的安全技术和微软想添加的东西合成了一下生产出了 Xenon 这款定制芯片,最后这台白嫖了索尼技术的机器发布时间竟然比索尼还要早。而且微软为了简化编程模型没有使用 PPE/SPE 机制,而是制造了三个核都是通用处理器的芯片,使得成本和绝对性能更低的情况下,微软的产品体验反而更好。

    微软急于上市,没有对这台机器中芯片的封装技术进行仔细测试,所以发生臭名昭著的三红事件:由于焊料的选择还有这款处理器恐怖的发热能力,早期的 Xbox 360 会在使用过程中造成 CPU /显卡内部焊点失效,让游戏机无法启动,必须送去维修。微软修复过多次但一直不彻底,直到后来机型通过换用改进了制程的芯片才解决。

    顺带一提,为了在 Xenon 这款定制芯片出厂前开发系统,微软买了几台 PowerMac G5 初代双 CPU 版作为开发测试用机,所以你也可以搞一台 G5 刷成假的 Xbox 360 开发机。这几台 Mac 后来被擦掉系统折价卖给员工了。

    安全机制

    处理器

    Xenon 作为和 Cell 同母异父的亲兄弟,安全模型非常接近,但微软并没有像索尼那样给操作系统一个单独的特权态,而是通过 Hypervisor 隔离操作系统和游戏,让它们都跑在用户态上。另外 Xbox 率先引入了用熔丝实现的回滚保护,一旦升级到某些版本的系统就无法降级到旧版本。

    另外,Xenon 中存在一个有 32K ROM 和 64K SRAM 的外部安全加速器,负责对设备内存进行加密并添加校验,以防有人篡改外部内存内容。另外,和今天的 RISCV 与 现代 ARM 类似,Xbox 360 有 64 位的地址,但是内存空间比较小,不会使用全部 64 位地址位。内存的高位被挪用做内存地址是否加密的标志,让系统能同时处理加密和未加密的内存。

    信任链

    微软也同样采用了从内置于芯片中的固件开始的信任链,不过微软并没有设计一颗专门的安全处理器,而是把整个信任链都在 PPC 处理器上执行,密钥相关的安全和隔离保护由 Hypervisor 负责。

    启动过程中,CPU 首先从内部的 1BL 开始,这一阶段会解密 CB 阶段的引导器,并验证它的 RSA 签名,验证通过后会把启动流程转交给 SA。

    CB 阶段在不同机型上有些不同,在后期的机型上 CB 阶段分为 CB_ACB_B 两部分,前一阶段负责检查后一阶段的哈希值是否和记录相匹配。但无论是新型号还是旧型号,都会进行内存和 PCIe 桥初始化等工作。完成初始化工作后,CB 加载 CD 阶段。

    CD 阶段会首先解压并验证 CE 阶段,CE 是被压缩的 Windows 内核,解压并验证成功后,CE 还会探测 CF 阶段,其中是一个个的内核补丁,当全部补丁解压并应用完成后,CE 完成启动流程并将控制权交给 Hypervisor,之后由操作系统内核完成剩余的初始化操作,显示启动动画和主界面。

    虚拟机和操作系统

    不同于索尼单独的安全处理器核心,微软通过使用虚拟化来处理加解密操作。除了加解密操作,虚拟机还会检测并阻止游戏或操作系统作出不该作出的访问。具体来说,虚拟化层强制在内存中执行 W^X 策略,并且控制程序可以访问的内存边界,以防有人写出内存溢出。

    另外,不像 PlayStation 3,Xbox 360 操作系统的绝大部分组件都是可以更新的。微软在处理漏洞方面的速度也比同行快到不知道哪里去了,几乎每个漏洞都会得到光速修复。

    防复制

    Xbox 360 的防复制措施和原版 Xbox 类似,区别在于前者使用了更接近普通 DVD 的格式,并且只是靠假的内容表欺骗光驱来防止读取。光盘上还存在冲切区但并不用来验证。

    破解

    买便宜货的后果

    为了节省成本,Xbox 360 的光驱对通用光驱只做了很少一点点改造,光驱与主机之间的通信也是基于标准的 ATA 协议的,因此复制保护功能就很快被刷了固件的光驱干碎了。但破解的光驱只能让人玩盗版游戏,不能让人自己写。

    荣誉提名:微软的后期机型为了避免刷光驱把 Flash 和 DSP 做了共封,但是 2011 年 8 月 12 日,Geremia 公布了用电钻在一个极其精确的位置打一个小洞打断某条线来关闭闪存写保护的方法。这个破解方法的名字神风,名字起得恰如其分啊。

    DMA 的故事

    Xbox 里不止有 CPU,也有其他外设,这些外设也需要通过 DMA 访问内存。但是加密并不是在真的 MMU 里实现的,外设在 DMA 时并不能读取和写入加密部分,因此需要有一部分内存保持未加密状态以供外设读写。组合上前面的高位加密标记和假光驱方法,这时候还需要一个有漏洞的游戏。

    终于,在 23C3 上,一位未具名黑客展示了在 Xbox 360 上利用《金刚》运行 Linux 的操作,之后 SecurityFocus 在微软修复漏洞后披露了详情:通过利用该游戏处理着色器时的一个问题,黑客成功利用系统调用表检查时的漏洞把代码写入了未加密内存并执行,拿到了 Hypervisor 权限。

    侧信道

    在微软修复《金刚》问题后,人们想到最简单的办法就是想办法把固件降级到可利用的版本。但固件的版本和签名受到熔丝保护,无法随意修改。

    这时微软工程师妈妈生的密码学水平又发威了,这台主机预留了生产时测试用的一些接口,能通过 SPI 写入 Flash,并会向外汇报开机状态码。而微软工程师由于妈妈生的密码水平,实现的 strncmp() 在验证成功和失败时的执行时间并不相同,这样就可以通过时间侧信道分析对签名进行暴力破解,从而修改固件。

    又进厂了

    很快微软又把上面的侧信道漏洞封锁了,阻止人们在新的固件上提取 CPU 密钥。但之前有人提取了启动过程中 CB 阶段的固件并进行了逆向,发现如果 CB 中某一部分密钥被清空,系统将会无视校验继续启动,而如果这个情况下更新包的密钥也是 0,则系统将会自动刷入这个更新。于是就有了把上述所有漏洞组合在一起并,自动启动漏洞版固件并利用金刚漏洞的 Modchip。

    还得加大力度电

    于是微软又把系统更新了,同时拉黑了有漏洞的 Hypervisor,但是游戏并没有结束。

    在 2011 年的 8 月 28 日,GliGli 和 Tiros,公布了利用 CPU 的硬件漏洞绕过系统启动校验而破解的方法。该方法利用了 Xenon 的一个硬件问题,当 RESET 信号被短暂拉起时,CPU 不会完全重启,而是会带病继续运行。但这需要非常精确的控制拉起信号的时间。所幸,通过拉起一条信号可以将 CPU 的频率降低到一个非常低的水平,从而降低利用该问题的难度。

    之后就是常规的拉锯战了,微软不断更新主板设计以加大利用难度,而黑客们也将破解方案不断改版并升级,直到 Xbox 360 失去商业价值,不再更新为止。

    未完待续。

    致谢

    Xbox 相关内容主要来自 Console Mods Wiki 和 Free60,PlayStation 3 部分主要参考 PSDevWiki,Wii 部分主要来源为 WiiBrew 和 Team Twiizer (Fail0verflow) 在 ccc 的演讲。

  • 游戏机破解史-第一部分

    游戏机破解史-第一部分

    如果把所有内容都放到一起那文章就太长了,既不好读也不好写,所以内容被我分成了两部分,本篇是第一部分,包含第三到第六代游戏机的破解历史。

    除去 DOS 或者更早的 Commodore 上软件的的各类复制保护,任天堂在雅达利大崩溃后制造的的 NES 防破解芯片可以说是第一个游戏机保护系统。这些保护系统为了维护厂商利益而限制了用户的自由。有限制就会有人尝试去破解。也许是为了玩盗版游戏,也许是为了在不花钱或者签合同的情况下利用游戏机硬件运行自己编写的程序,不同的破解者为了不同的目的都在研究这些安全系统,并期望破解它们从而让游戏机不受限制的发挥光荣。

    本章省流部分

    • 大部分没有可以更新的系统甚至没有系统的游戏机破解都是通过绕过保护系统进行的,这些较老的机器上的很多机制反倒比更新的机器上的机制更难破解。
    • 字符串溢出漏洞总是一次一次又一次出现。
    • 大部分密码学知识对游戏机系统开发者实在是太难了,他们整明白有可能但整明白不太可能。

    第三世代-保护系统的开始

    从这一代的 NES 开始,游戏机上的保护系统才算正式出现,而 NES 也是这一代唯一一款具有保护系统的主机。

    NES

    保护机制

    10NES,或者叫做 CIC,实际上只存在于北美的NES 上,而 NES 的亚洲版本,FC 并没有这款加密芯片,所以亚洲大区的 FC 有很多邪门的卡带。因为这款芯片不存在于 FC 的原始设计里,而是在准备向北美发布的过程中添加的,所以并未整合到系统之中。相反,它外挂到 CPU 的 Reset 针脚上并和卡带槽连接,在开机后和卡带内的对应芯片通过连接的针脚不断认证。如果认证失败,它就会以每秒一次的频率重启 CPU,让盗版卡带无法使用。

    破解

    虽然用户自己想要干掉这块后黏上去的破解芯片很容易,把它到 Reset 的连接断开让他别狗叫了就轻松秒杀,但是第三方发行商不能这么搞——一是你没法教用户打开机器去施工,二是用户花大价钱买来的机器一改就没保修了,用户想不想改还是个问题。所以这些发行商就想在不让用户改机器的情况下破解这一机制,它们发挥聪明才智,想出来了三个方案:

    • 不改主板的情况下干掉这玩意——给 10NES 气(电)晕
    • 造不出来可以借——找正版卡带里的芯片替我做认证
    • 造个假的芯片

    第一个方案主要是某个神棍游戏发行商(Wisdom Tree)发行的作品在用,比如超级神经病作品超级诺亚(听名字就知道抄袭的什么东西)。他们为了电晕 10 NES 而不电死机器,费了很大精力研究如何在不同的机器批次上提供合适的电脉冲电压和脉冲时间。保险起见,卡带内部的破解方法会从低电压短时间开始升级,逐个方案测试。问题是不同机器上的芯片和电路会有一些制造差异,所以这种电晕芯片的方案启动过程不稳定且需要一段时间测试合适的电压和脉冲时间。
    第二个方案是最简单的,你的 CIC 也可以是我的 CIC。只要在第三方卡带上留一个接口连接到正版卡带或者从后者里面拆出来的正版验证芯片就行。任天堂的验证芯片只要做认证就好了,但第三方卡带需要考虑的就多了,还需要负责原神启动。显然,这么搞你得去想个办法拾一张原版卡带。
    第三个方案——伪造芯片就涉及如何拿到正版芯片的资料,这里有一些雅达利的小故事:为了省去逆向工程的时间和成本,雅达利假装要起诉任天堂侵权,找专利办公室以要打官司的名义拿到了 10NES 芯片的文档,从而制造了叫做 Rabbit 的复制版 10NES。直接复制任天堂资料显然不太合法,所以雅达利不出意外的出意外了:任天堂把它告上了法院。虽然任天堂告赢了,但之后的专利大战和反垄断大战拖延了任天堂干死这一产品的脚步。值得一提的是,2015年终于有人通过开盖芯片完整逆向了原版 10NES 的鉴权算法并进行了复刻。

    第四世代-还是原样

    这一代的主机在保护系统上没什么技术进步。

    任天堂对 10NES 自我感觉良好,而且做个新方案还得花钱不是?所以 SNES 还是在使用和前一代一样的认证方案,无非是部分游戏加了些插桩和硬件规格检查,整的和电脑软件似的。而 SEGA 的 MegaDrive 更是只通过验证卡带里的商标是不是和预期一致来反盗版,他甚至懒得在卡带内做锁区功能,只是把不同区域的卡带外壳做成插不进去的来实现,买个转接头就能马照跑舞照跳。

    街机大厂 SNK 做的 NEOGEO CD 防拷贝倒是做的稍微有一点含金量,采用了不太罕见的光盘错误注入法,在光盘的部分地方做了会被普通 CD 机的自动纠错功能修复的错误。这样,如果你用普通 CD 机复制光盘,这些错误就消失了,而复制出来的盘自然也就没法通过验证。

    而 PC Engine 的活就比较狠了,虽然没什么防盗版措施,但为了锁区它专门把美区和日本卡带的数据线顺序翻了一下,而且游戏里还做了区域验证,值得在这里给他一个奖励提名。

    掌机方面,Gameboy 和 MegaDrive 一样也采用了商标法律大棒验证法。但是这个检测过程中会读取两次Logo,分别用于验证正版和显示启动 Logo,所以有些第三方卡带为了避免被锤选择了卡时间差搞一个(不是)任天堂的狠活显示在机器上。

    第五世代-真正的保护措施

    土星

    安全措施

    世嘉土星的光盘在正常CD机无法写入的部分写入了安全数据,描述了光盘上内容轨道的偏移,如果安全数据和偏移则光驱拒绝启动CD。这一认证机制存在于光驱上,系统的其他部分无法控制。

    破解

    由于验证并非在主机而是在光驱上发生,而且只在启动时验证一次,自然就有下面的几种绕过认证机制的方式:

    • 换碟大法:因为游戏启动过程中只会验证一次光盘是不是正版,那我是不是可以拿正版盘做验证,验证之后换成刻录盘?只需要一个正版盘就能做到,但是这么搞比较吃操作,还容易干烂光盘和光驱。
    • Modchip:那我是不是可以骗一骗光驱让它觉得它是职业选手,确实是在读正版,或者干脆骗一下主机,让它觉得它在从真的光驱读?但是你还是需要找地方买 Modchip 并且把它焊上去。
    • 用卡带破解:软件多少会有点 Bug 的,而土星上的卡带扩展接口不幸就是其中之一,因此有人利用卡带漏洞给机器下了点猛料,干掉了光驱的验证机制。
    • 用正版盘切出鉴权部分,并粘到 SEGA 自己提供的开发用盘上,开发用盘启动后会关闭土星的鉴权机制。(只能说想出这个制造缝合怪光盘的方法的人,神人程度和 Xbox 360 上给光驱闪存打洞的差不多了。)

    PlayStation

    安全措施

    PlayStation 的光盘防复制措施和土星的很相似,也是采用了在一般 CD 机无法写入的地方刻录额外内容的方式来防盗版。具体来说有两部分:较老的 PlayStation 只会校验额外内容里的区域字符串,如果不匹配就拒绝启动,而一般方法刻录的盘显然没有这些东西。新一点的机器还有一个额外检查,PlayStation 里的启动界面文本是从光盘里读取的,新机器也会校验这一部分的内容。

    另外,在更新的游戏中还加入了叫做 libCrypt 的检验措施,通过在光盘中故意制造校验失败的区域来编码一个 16 位的密钥做验证。更晚的游戏在后期 PlayStation 上另外还有一个措施,它会不断请求区域字符串,设计的不好的 Modchip 会再次注入,但真正的光驱并不会这样做。

    破解

    自然,相似的问题有相似的解决方案,PlayStation 也存在换盘和 Modchip 修改,还有一个利用了早期 PlayStation 的并口的破解卡带(Action Replay)。换盘利用了光驱读不出来数据时的纠错机制,只要你足够快的把正版游戏更换成复制盘就能继续游戏。而 Modchip 这里则有一个对抗的过程,一开始只是通过向光驱注入假的区域代码实现绕过,后来光盘内添加了 Modchip 检测,于是新的 Modchip 一部分通过成功启动后自闭的方法来防止检测,另一部分直接利用 PlayStation 的换碟机制,换碟是给有多张光盘的游戏准备的,为了节省时间,新换的光盘并不会被再校验一次。

    之后就是利用 BIOS 漏洞进行的软改:PlayStation 的固件有管理记忆卡的功能,而且会假定里面目录部分存储的文件大小和指针一定是真的,还没有做任何溢出检查,下面就是经典的故事了。而且人们还发现 PlayStation 的光驱有一组隐藏指令,能完全关闭任何校验功能,两者结合就制造出了最终的破解方案:FreePSXBoot,它利用记忆棒漏洞持久化破解,之后只要在匹配的机器上插入记忆棒就为所欲为了。扩展阅读:PlayStation 固件漏洞说明

    N64

    安全措施

    又到了擅长搞神奇操作的任天堂同学环节。好消息是:因为这款游戏机用的是卡带而不是光盘,任天堂不用和 CD 刻录机较劲。但是还是会有人制造假卡带。这次的反盗版措施是一款内置于 N64 的 I/O 控制器芯片里的校验芯片。这款校验芯片和 NES 上的亲戚类似,通过和卡带里的对应芯片不断进行基于 CRC 算法进行挑战-响应来做正版验证。启动过程中,N64 的固件会先将主 CPU 扔到无限循环中,等待 CIC 完成校验才会恢复正常启动流程。

    破解

    和 NES/SNES 一样,去正版卡带上偷一个能启动的芯片就行了。后期也有人搞出来了假的认证芯片就是。

    第六世代:防拷贝最后的荣光

    本代是最后一代主要靠防拷贝机制来防止破解的主机世代,之后的游戏机几乎都在防拷贝机制的基础上加入了对代码内容的检查,防止绕过机制后直接就能获得任意代码执行能力。

    Gameboy Advanced

    Gameboy Advanced 的防破解措施是和 Gameboy 相似的卡带启动商标检验,基本上属于靠法院防盗版。

    Dreamcast

    安全措施

    日本人经常把门修的比墙结实:Dreamcast 本身使用的 GD-ROM 是一个 SEGA 以外的人难以制造的光盘格式,但它为了提供卡拉OK功能还支持了 MIL-CD,SEGA 显然猜到了 MIL-CD 可能会被人拿来破解,因此对 MIL-CD 上的启动文件进行了加扰,如果机器检测到光盘是普通 CD,就会从打散的位置读取启动所需的内容。如果写入的文件没被正确的打散,游戏机就会读出垃圾代码而崩溃。

    破解

    不幸的是,Dreamcast 开发套件被送到了他不该去的地方,而且其中还提供了MIL-CD 启动文件的加扰/还原工具。有人很快通过分析这些工具得到了制造能启动的 CD 的方法,并制作出了可以从 SD 卡或者普通刻录光盘读取数据的启动盘。甚至还有人做出了可以直接刷写 BIOS 从而永久破解机器的光盘。SEGA 发现了这个破解方式,并在更新的机器上去掉了 MIL-CD 的支持。但是破解已经给 SEGA 和游戏开发商造成了足够的损失。这一问题和 Dreamcast 的奇怪架构设计让游戏开发者和 SEGA 失去了支持它的动力,并最终让 Dreamcast 成为了 SEGA 最后一代主机。

    PS2

    安全机制

    PS2在PS1的光盘认证设计基础上又升级了安全措施,增加了从光盘上的内容中获取产品编码并逐级解密启动Logo的流程,如果解密出来的Logo验证不通过则拒绝启动。

    又是ModChip

    自然,由于校验是在游戏机启动时发生而在运行时并没有太多校验,经典的 Modchip 方案又回来了,只不过初期的还是需要用换盘方案辅助操作,之后升级的 Modchip 省去了换盘操作。

    不想当焊工

    显然不是所有人都想当会当焊工,自然有人推出了消费升级产品:只要插入光盘就能破解。由于这一时期的游戏机基本上没有真正的操作系统,游戏软件加载完了之后对机器想干啥就干啥,只要制造出来能通过验证的光盘就能从别的地方读取游戏并运行,或者干脆可以换张光盘玩。之后还有人利用光驱的错误重试机制做出来的能停下光驱的 SwapMagic 光盘,这样换盘就不需要在光驱还在转的时候拔盘插盘了。

    脱离换盘

    焊接和换盘都太麻烦了,有没有不需要操作有手就能玩的办法啊?有的兄弟,有的。最开始的方案来自于一个字符串溢出漏洞:当在 PS2 上运行 PS1 游戏时,游戏机固件会尝试从记忆卡里读取存档,而且如果存档中有 TITLE.DB 这个配置文件,游戏机固件会尝试加载并解析这个文件。然而解析文件过程中存在一个溢出问题(请记住这时候还不怎么存在地址随机化,加载地址是可预测的),能够把返回地址指针覆盖掉,之后就拿到了在 PS2 上随便执行代码的能力。然而索尼在 V11 之后的固件修复了这一问题。
    但是,索尼还在 PS2 上做了一个非常抽象的系统升级功能:允许用户从光盘安装系统升级到存储卡里。但是 PS2 内部没有能写入东西的地方,拔掉存储卡系统自然就变回出厂版本了。想明白了系统升级没啥用的事实后,索尼就再没有再使用这个升级功能,但是索尼也没把它删掉。既然你没删掉我就要用了,于是就有了 FreeMCBoot,它在记忆棒中伪装成系统更新,替换了 PS2 的整个固件,彻底攻破了安全系统。

    GameCube

    GameCube 终于(暂时的)摆脱了卡带,使用上了容量更大而且更便宜的光盘。值得一提的是,Gamecube 有一个可重新编程微码的 BSP。

    安全措施

    Gamecube 有一个非常复杂的光驱固件来控制光驱执行正版验证,验证过程涉及到校验冲切区的编码,而光驱只对主机系统提供了读取数据的接口,所以系统在不改动光驱硬件或软件的情况下无法读取没有通过光驱认证的光盘。
    除了光盘上的安全措施,为了防止黑客分析或修改启动固件,任天堂对系统的启动固件也做了加密处理,但是任天堂的加密系统不出意外的出意外了。

    破解

    光驱或者绕过光驱?这是个问题

    如果你的认证功能在复杂的光驱固件而不是主系统里实现,最简单的绕过办法就是制作光驱模拟器或者修改光驱固件。因此最早出现的破解自然就是各种各样的 Modchip/模拟器。
    另一种做法则是绕过光驱,通过别的方式读取游戏,也就是利用漏洞加载自制程序,之后通过其他接口读取内容并执行。这方面除了利用某些游戏加载并解析的漏洞之外,还有利用幻影之星在线的 bug 执行。开发幻影之星在线的神人公司实现了一个下载可执行文件来进行更新的功能,但并没有给它添加任何安全措施。因此只要中间人攻击一下就能通过这个功能执行任意代码。而且可以直接从你的电脑下载任意程序,相比利用存档 bug 更加方便。

    靠混乱来保密是不会长久的

    而加密的固件实际上也没给任天堂争取到太多时间,他们在固件的加密方式上犯了两个重要错误:

    • 由于任天堂在解密固件时生成的密钥流是固定的,把两个不一样但都加密的固件异或一下就能拿到两个固件之间明文的异或。
    • 更大的问题是,EXI 总线的设计导致每个周期两边要各发送一个数据出去,如果你只需要接收对面的数据,就得在那个周期上发送一个垃圾数据。由于任天堂硬件工程师的抽象设计,被发送的这个垃圾数据是之前解密出来的的固件数据。所以给总线挂个探针就能从这些垃圾数据里还原出来一部分固件内容。

    第二个问题提供了固件一半的前0x700内容,还有之后的绝大部份内容。利用这部分抓到的内容,还有第一个问题提供的合成游戏机能够接受的代码的能力,可以注入能够提供固件剩余内容的代码,从而重建除了第一个指令以外的整个固件内容,并利用这些内容进行逆向工程,制作出带有大家想看的东西的固件。最后,只需要把修改过的固件装到 ROM 里替换掉原设备的固件就可以了。

    Xbox

    安全措施

    由于 Xbox 的设计和制造是赶时间赶出来的,微软直接把普通电脑的硬件,还有大家最爱的操作系统-Windows 的组件软件缝合在一起,临时攒出来了这么一台主机。
    虽然 Xbox 就是个超级魔改普通电脑,但微软显然不想让买它的人把它当一台微软百亿补贴电脑,更不想让每个人随便刻个盘就能玩游戏,所以设计了一个非常复杂且相对安全的系统。
    首先,由于这台机器的 CPU 就是一款奔腾3,它会且只会从地址空间里的 0xFFFFFFF0 启动。微软为了严格限制 Xbox 能运行的内容,需要从启动开始构造信任链,因此需要把固件隐藏起来。开机时首先读取固件 ROM 中的内容,并用存在于英伟达给这台主机定制的 MCPX 芯片内的代码覆盖头部 512 字节。主机在读取完第一阶段存在于 MCPX 闪存中的代码后会立即屏蔽这部分代码的读取,防止被人读出并分析。这段代码会解密之后的固件内容,并把启动流程转接给它。第二阶段的固件负责验证光盘内容。
    光盘方面,Xbox 在光盘的不能被一般光驱读取或写入的外圈超刻了真正的描述表,而一般的 PC 光碟机只能读到内部的假的描述表,和它描述的一点点提示视频。除了超刻内容之外,Xbox 还在光盘内加入了专门用于安全的区段:DVD播放机固件会读取其中的 Challenge 并向主机进行验证请求,只有请求成功后才会继续读取磁盘内容。另外安全区段内还有用于生成光盘内容解密密钥的信息以及光盘内容的签名,当它们全部匹配时才能读取并解密光盘内容。

    破解

    那我问你,你的安全措施这么全,应该不太容易被破解吧?

    MIT 高材生

    然而 Xbox 是一台赶工出来的魔改 PC,它显然不支持直接读取加密内容,必须得有一部分代码负责解密这些东西。Intel 手册中有它的启动地址,因此人们在闪存里查找这个东西。一位 MIT 博士生,Andrew “bunnie” Huang,dump 了 Xbox 的闪存内容,然后在本应该被覆盖掉的前 512 字节发现了 x86 机器码,这段疑似是工程遗留的东西里有一段疑似 RC4 解密的代码(后面发现是 RC5 算法,但当时 RC5 是不公开的,是 RSA 公司的商业机密),但是这段解密代码对于普通 Xbox 不起作用。在实验过程中,他发现这部分代码被擦掉之后 Xbox 还能启动,说明 Xbox 在别的地方存储了启动代码。之后他利用 MIT 硬件实验室的资源做了个嗅探器,通过监听 Hypertransport 总线获取了 MCPX 中的 ROM 内容。

    密码学神人操作

    这段 ROM 内容让人们发现 Xbox 的验证机制验证了个寂寞:由于它用的加密算法是 RC4,而 RC4 这个密码并没有明文反馈,所以改变一位明文只会改变对应一位的密文,让微软验证解密后内容结尾的操作什么也没验证。同时其中还有第二阶段固件的解密密钥。
    很快就有人做出来了能给系统打补丁干掉验证机制的固件,只需要把它焊接在原来的闪存位置就行。另外其他人还发现,闪存芯片不存在的时候机器会试图从 LPC 接口上接的芯片来启动,可以利用这个特性做出焊接起来更简单的 Modchip。
    顺带一提,微软在更新后的 Xbox ROM 把加密算法换成了 TEA,然而在一本 1996 年就出版的应用密码学书籍里就写明了不要拿 TEA当哈希算法:如果你同时反转一组 32 位数据的第 16 和 31 位,之后的数据还是会不变,结果大家还是有办法能改掉固件内容。(不过不要嘲笑微软,之后我们会看到任天堂的大聪明也干了。)

    手册不看全,发布两行泪

    另外,初始化 ROM 中还存在几个问题,其中之一是 Visor 发现的:微软为了在校验不通过时死机做的操作。他们试图让程序计数器指针溢出来让 CPU 抛出异常,同时因为异常处理程序在这时根本不存在,CPU会停机。
    但是 Xbox 在原型阶段用的是 AMD 处理器,而生产阶段使用的是 Intel 处理器,两者在这方面行为并不相同,后者在程序计数器溢出时并不会报错,而是继续按溢出后的地址执行,这样就能让它继续按照闪存中的原始内容运行。

    软件破解

    上面的方法都涉及到魔改硬件,那么有没有软件方法来破解 Xbox 呢?
    由于大部分游戏程序员都是喇叭,很多游戏在处理存档时都存在或多或少的漏洞,这样用一个损坏了的存档就能拿到执行代码的权限。但是这样操作需要每次先打开有漏洞的游戏。
    直到大家发现 Xbox 控制面板也有漏洞,Xbox 控制面板启动时会从硬盘上拉取数据,虽然存储的大部分内容都有签名,但字体文件没有,而微软在处理字体方面的安全性是出了名的差。
    然后就是微软的奇异搞笑时刻:

    • 微软先是升级了 dashboard 修复了漏洞,然后用户又把旧版 dashboard 拷贝回来解决问题。
    • 微软在内核里把有问题的 dashboard 拉黑了,但是没关系,Xbox 的 Xbox Live 配置程序也有一毛一样的漏洞
    • 微软又把旧版配置程序拉黑了,但是所有支持 Xbox Live 的游戏里也有同样的程序,并且这个程序能直接从硬盘里运行,把那个程序拷回来就完事了。
    • 然后微软就没活了,因为拉黑这个新的程序会让这些游戏全都不会弹。

    游戏结束,微软输了。

    致谢

    本文编写过程中参考了大量的资料,包括但不限于 Wololo, ConsoleModsWiki, GC-Forever, N64Dev, GBATemp, XboxDevWiki, Rodrigo Copetti 的实用分析, 以及混沌电脑俱乐部的混沌沟通大会中的部分演讲及 PPT