1. 背景
最近水群听说有车,浪潮NE5260M7准系统只要1800块钱(6月初左右)。
写这篇文章的时候卖家涨价到了2900,但是仍然很有性价比

到手之后看起来非常新,感觉就是卖家把内存CPU拆了卖了,趁着内存涨价大赚一波,然后把准系统便宜卖了
然而群友实测这个机器只能点亮正式版本CPU,很贵,没法点便宜的ES
4677 CPU有两代,SPR和EMR。EMR的ES相对不那么灵车,基本上是可用的,性能也不错。详见群友的帖子

EMR的CPU分为两种,XCC和MCC。考虑了一下Q2Y7和Q30G
- Q2Y7支持更高频率的内存,但是cache比较小
- Q30G有超大L3,但是内存频率支持只有4800,全核性能也差点
我拿来做all in boom,干杂活,大cache更划算,而且内存贵上天,和AI批抢高频内存也没必要
ok,那么是时候进行一波魔改研究了
/goal 装一台全新的NE5260M7,按以下配置
- 俩900的Q30G
- 锁个24或者32核,全核4.0Ghz
- 四个3.5放HDD,四个2.5放u2盘
- 两个pcie全高单槽riser
- 一个ocp 3.0网卡
可惜AI还不太能触达物理世界,还是得自己搞
2. 插电,开机
卧槽,我的CRPS电源怎么插不进去???

原来是这里有个柱子挡着,只能买某种浪潮定制电源,,,比普通的CRPS贵不少,其他机器拆的也不能用。估计是用来标识大功率的?不懂
卸掉电源板,从柱子前后分别敲一下,它就掉了。物理骇入成功!

注意敲完会爆装备,这个柱子本体+柱子上面的固定环。大概是下面这个结构,蓝色的是柱子,绿色的是柱子的固定环,红色是机箱铁皮
蓝色和绿色部分会掉下来,上下两个装备都要拾取,不然卡到机箱里面到处乱跑很容易搞短路

敲完插入CRPS电源,插电,开机,成功亮灯
3. 先装个CPU看看怎么个事+解锁大功率
果不其然,点不亮。BMC登录后可以看一下SEL,发现在报错power ok timeout

这看起来电都没上,估计是CPU供电芯片限制了功率
Intel的CPU和VRM(电源芯片控制器)之间走的是私有的VR14协议,VRM里面存储了供电相关配置,其中比较重要的是ICC_MAX,即允许通过的最大电流
之前3647,4189改大功率也是这个限制
那就找个VRM编程器插上去看看。这个板子的电源芯片是MPS MP2973,并不太能搜到资料。一般来说需要接个i2c上去刷
那么可以从lceda找一找有没有谁不小心把封装传上去了,恰好有pin定义

哈,那么I2C的SDA/SCL分别是13/14脚,量一下板子上到哪里了
发现是这个排针,1-3脚分别是SDA,GND,SCL

某鱼几十块钱买个盗版编程器捅上去即可读写电源芯片配置,关键字MPS PMBUS Programmer


高级,还能看实时功耗

直接通电,发现功率只有10-12W,CPU是基本没工作的。我们看看ICC MAX

这个ICC_MAX是486 A,我们稍微改大一点试试,改成500 A。改大之后点这个write NVM

果然,现在SEL不报power ok timeout了,从MPS软件上看,也能发现改之前CPU供电只有10W,现在能跑到70W了

然而,还是点不亮,从BMC看POST CODE,还是00,完全不跑的
4. 降级BIOS ACM模块,使其支持ES CPU
经过sth一通搜索,发现是要关掉TXT或者降级ACM模块
https://forums.servethehome.com/index.php?threads/es-xeon-discussion.5031/page-223

那么要么改主板,量一下CPU引脚里面的TXT禁用连到了哪里,补个电阻。要么改BIOS,找个低版本的ACM模块换进去

可以看到官网最新BIOS的版本是0002,群友说技嘉那个能点ES的(好像MS73还是啥)是0001,于是替换之。(这里不要用uefitool替换,因为uefitool会改变fv结构,导致bootguard验签炸掉,acm模块0001和0002长度是一样的,找一下偏移,直接覆盖binary数据即可)
另外注意这个BIOS是开了bootguard的,UEFITool 标红标黄的一丁点都不能动,动了就不开机,南桥里面存了浪潮的安全启动公钥hash!
而且看了一下微码是全的,不用动
5. 这BIOS咋刷呢?解锁BMC root权限,绕过签名验证
BIOS改好了,问题是咋刷呢?编程器夹子实测用不了,应该是3.3V负载太高,夹子带不动。如果通待机电刷,又会导致flash的访问被南桥抢
好像只能吹下来刷?不行,这嘎嘎新的机器,动烙铁太可惜了,走BMC刷吧
这个BMC的web升级功能,吃进去一个.hpm文件,然后会验证hpm的签名,再进行刷入
那么如果要绕过签名校验,就要获取bmc的root权限,替换验签公钥或者修改程序绕过验签逻辑。整理一下plan
- 搞清楚.hpm的签名格式,搞清楚BMC验签.hpm的逻辑,将魔改后的bios打包成.hpm
- 获取BMC root权限
- 绕过签名校验,刷入BIOS
5.1 分析hpm格式,自己生成一套密钥对,用公钥签名
累了累了,动不了一点,claude启动,给它个r2用用
解包BMC,逆一下升级逻辑,写个hpm签名脚本

重签一下

那么只需要把验签公钥替换,然后web上传这个重签过的BIOS文件就行了
5.2 获取bmc root权限
根据浪潮手册,bmc有几个登录方式

串口登录可以进shell,账号sysadmin密码superuser。ssh登陆admin用户,只能进一个受限的smashclp程序,执行简单的开关机或者受限的命令
一个比较rough的想法是找claude挖个ssh的smashclp漏洞,但是显然太费钱了,没必要。我们先接个串口看看,串口在哪呢?

前面板有个microusb口,然而插电脑上并不能识别。量了一下居然是3.3V的串口!!!离谱,D+,D-两个都是3.3v。VBUS和OTG都是空的。于是接个3.3V串口就能看到串口输出了

但是这个串口启动一段时间后会切换成CPU串口,无法再操作BMC了,所以手册里给的串口sysadmin用户是登不上的!
那咋整呢?可以搞一下uboot。玩路由器的应该都熟悉怎么搞
- 修改rootfs,打开ssh sysadmin用户登录
- 重打包rootfs
- 插网线,进uboot,tftp刷入rootfs
我们先看看怎么改rootfs,解包看了下这个rootfs的sshd_config是指向/conf里面的一个符号链接

厂商甚至贴心提供了一个with_sysadmin的配置

看了一下,其实就是PermitRootLogin设成了yes
那么只需要把原来的符号链接删了,替换成允许root登录的配置,重打包就行了。注意重打包要xz算法,和原来的rootfs保持一致

好了,然后进uboot,设个ip,tftp传进去,sf写spi flash,重启!
这个uboot需要按esc进入(虽然串口打印是press any key…)。然后uboot密码在官方手册里面有写


另外好像uboot还有签名验证,我们需要setenv verify no然后saveenv就行
5.3 替换验签公钥,自签名+刷入BIOS
此时BMC开机后就能成功ssh进去了(用sysadmin/superuser)

之前已经找claude分析一下这个厂商魔改的.hpm格式以及验签逻辑
Commer_HandleVerifyHpmImage(hpm_path, args)
│
├─ Commer_IsValidHPMImage(hpm_path) # [1]
│ ├─ open(hpm_path, O_RDONLY)
│ ├─ read 8 bytes → buf
│ ├─ strncmp(buf, "PICMGFWU", 8) # magic check
│ └─ return 0 if valid
│
├─ if (cmd == 0x18 || cmd == 0x19) # flash/verify cmd
│ └─ Commer_VerifyBinImage(hpm_path, args) # [2]
│ ├─ check file accessible
│ ├─ fseek(fd, 0, SEEK_END) → filesize
│ └─ Commer_HpmImageHeaderCheck(...)
│
├─ else
│ └─ Commer_VerifyHpmImage(hpm_path, args) # [3]
│ ├─ fopen → r7
│ ├─ fseek(r7, 0, SEEK_END) → filesize
│ ├─ fclose
│ ├─ fcn_00003d38(hpm_path) # [4] ★ SIGN CHECK
│ │ ├─ open(hpm_path, O_RDONLY) → fd
│ │ ├─ lseek(fd, 0, SEEK_END) # get filesize
│ │ ├─ malloc(0x100) # sig buffer
│ │ ├─ lseek(fd, -264, SEEK_END) # ★ position to sig
│ │ ├─ read(fd, sig_buf, 0x100) # ★ read 256B sig
│ │ ├─ lseek(fd, 0, SEEK_SET) # rewind to start
│ │ ├─ LoadPublicKey(...) # ensure /conf or /etc/defconfig/public.pem
│ │ ├─ fcn_00003b80(fd, "SHA256") # [5] ★ compute hash
│ │ │ ├─ lseek(fd, 0, SEEK_END) # filesize
│ │ │ ├─ EVP_get_digestbyname("SHA256")
│ │ │ ├─ EVP_DigestInit_ex(ctx, sha256)
│ │ │ └─ while(read(fd, chunk, 0x1000))
│ │ │ EVP_DigestUpdate(ctx, chunk, nread)
│ │ │ EVP_DigestFinal_ex(ctx, digest, &len)
│ │ └─ VerifySignatureWithDigest( # [6] ★ verify
│ │ pubkey_path, sig_buf, digest, "SHA256")
│ │ └─ returns 0 on success
│ └─ success → split image & flash
写一套签名/解析脚本

把自己的公钥替换原机里面的/conf/public.pem

web上传BIOS刷入

6. 成功点亮!
开机!成功跑码进系统

BIOS默认配置有点问题,sst选得是最低的一档,全核只有2.7。改成policy 0就能拉到4.1Ghz了。cstate也开一下省一点电费。实测双路待机60W左右

7. more
既然有bmc root权限了,还可以搞一些东西,比如修改风扇调速表或者风扇调速代码,限制最大转速,防止机器在家里起飞
读者可以自行研究一下,逻辑在libipmihalhw.so里面

另外因为机器太丐了,riser和散热都只有一个,建议梭哈两台然后卖一台空机
8. 免责声明
- 修改和使用时候需要注意VRM设置的最大电流,这个机器TDP写的是225W,Q30G全核功耗有310W左右,建议半核用

