1. 背景

最近水群听说有车,浪潮NE5260M7准系统只要1800块钱(6月初左右)。

写这篇文章的时候卖家涨价到了2900,但是仍然很有性价比

到手之后看起来非常新,感觉就是卖家把内存CPU拆了卖了,趁着内存涨价大赚一波,然后把准系统便宜卖了

然而群友实测这个机器只能点亮正式版本CPU,很贵,没法点便宜的ES

4677 CPU有两代,SPR和EMR。EMR的ES相对不那么灵车,基本上是可用的,性能也不错。详见群友的帖子

https://cyberbus.net/post/557

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

  1. 搞清楚.hpm的签名格式,搞清楚BMC验签.hpm的逻辑,将魔改后的bios打包成.hpm
  2. 获取BMC root权限
  3. 绕过签名校验,刷入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。玩路由器的应该都熟悉怎么搞

  1. 修改rootfs,打开ssh sysadmin用户登录
  2. 重打包rootfs
  3. 插网线,进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左右,建议半核用
1
message-square
0