【求助】IPMI 固件防火墙(30h/93h)多项行为与用例/规格不符

问题描述

在 KunLun 系列鲲鹏服务器(iBMC 0.21.00 / ipmi_core 1.121.10)上验证 IPMI 命令屏蔽(Firmware Firewall)特性,按客户测试用例执行 8 组场景,出现以下与预期不符的现象:

  1. uTool 关闭白名单后再开启,白名单列表未被清空(用例期望开启即清空)
  2. 白名单模式(Mode=1,列表为空)下,带内仍能执行 0x06 0x60 Set Command Enables 并返回成功
  3. 设置类命令 0x06 0x09 / 0x0A / 0x60 / 0x61 与 OEM 0x30 0x93 可以被"配置"、也可以被加白名单
  4. GetNetFnSupport(0x06 0x09)返回的支持集中不含 0x30 / 0x38 / 0x3A,但路由表里 0x30 有 572 条命令
  5. 0x06 0x0A / 0x0C 上报 0x02 等命令"已支持/可配置",但用 0x06 0x60 去设置却失败
  6. 白名单模式下删除默认白名单中的 0x06 0x01 返回成功(用例期望失败)
  7. 加白后删除,带内执行 0xff 0x01 / 0x77 0x77 等 8 组非法 NetFn/Cmd,未返回 D4h/D6h
  8. 0x06 0x61 查到的 0x06 0x60 使能状态与 ipmitool firewall info 展示不一致(工具侧三条子功能全 “Invalid command”)

环境信息

  • 操作系统:iBMC(openUBMC 系)Active 0.21.00 Build 001,构建时间 2026-10-14 21:02:03
  • 软件版本:ipmi_core/1.121.10@openubmc/stable(commit 14e815a0),BMCSDK 5.14.00.11,IPMI 版本 2.0
  • 硬件配置:KunLun 系列鲲鹏服务器,2× Kunpeng 920 72A2C,BIOS (U75)0.03.06,Uboot 23.1.10.0
  • 测试工具:uTool(setipmiwhitelist / getipmiwhitelist)、ipmitool 1.8.x

重现步骤

  1. 带外执行 raw 0x30 0x93 0xdb 0x07 0x00 0x4a 0x01 0x01 0x00 开启防火墙、白名单模式(ClearFlag=0)
  2. 带外查询:raw 0x30 0x93 0xdb 0x07 0x00 0x4b 0x01 0x00 0x00(白名单列表)、raw 0x06 0x61 0x0f 0x06 0x00(使能掩码)、raw 0x06 0x0a 0x0f 0x06 0x00(支持位)、raw 0x06 0x0c 0x0f 0x06 0x00(可配置位)、raw 0x06 0x09 0x0f(NetFn 支持集)
  3. 带内(OS 侧 ipmitool)执行 raw 0x06 0x60 0x0f 0x06 0x00 0xde 0x17 0x00 0x00 0x34 0xc0 0xfb 0x3f 0xff 0xff 0xf4 0x03 0x03 0x00 0x00 0x00
  4. 带内依次执行 raw 0xff 0x01 / raw 0x77 0x01 / raw 0xff 0x00 / raw 0x77 0x77 等非法组合
  5. 带外执行 raw 0x30 0x93 0xdb 0x07 0x00 0x3f 0x01 0x01 0x00 0x06 0x01 0x08 删除默认白名单条目
  6. 执行 ipmitool ... firewall info channel 0x0f lun 0x00 netfn 0x06 command 0x60

期望结果

  1. 白名单开启后(或带 ClearFlag=1 时)白名单列表被清空
  2. 白名单模式下带内非白名单命令(含 0x06 0x60)被拒绝,返回 0xD4 Insufficient Privilege
  3. 防火墙自管理命令不可被配置、不可被加白
  4. GetNetFnSupport 明确反映"是否支持该 NetFn 的防火墙管理"语义
  5. 能力位(Support / Configurable / Enables)与实际可设置性一致,Set 失败时不留部分配置
  6. 删除默认名单条目返回失败(非 0x00)
  7. 非法 NetFn/Cmd 返回规范错误码,且白名单模式下带内应被防火墙拦截
  8. ipmitool firewall info 能正确显示使能状态

实际结果

  1. 开启后分页查询白名单仍有条目(11:22:19–11:22:30 连续 20+ 次 Query White User List 均成功,说明列表非空),operation.log 中无任何 clear 记录
  2. 带内 0x06 0x60 返回成功;白名单模式下带内 0x0C 0x02(lan print)等命令同样成功
  3. 0x06 09/0A/60/61 与 30h/93h 3F~4C 均可被 3Fh 加白;默认黑名单仅 3 条(06h 02/60/61)
  4. raw 0x06 0x09 0x0f 返回集合 = {0x00, 0x04, 0x06, 0x0A, 0x0C, 0x2C},不含 0x30/0x38/0x3A
  5. 0x06 0x0A 支持位为 1、0x0C 可配置位为 1 的命令,用 0x06 0x60 设置返回 0x80
  6. 删除 0x06 0x01 返回成功:IPMI white list delete commands(RAW=06-01-08-ff) successfully
  7. 非法组合返回 0xC1(Invalid Command),全量日志中 0xD4/0xD6 出现 0 次
  8. firewall info 三条子功能全部 command failed: Invalid command,A/C/E 列全 X

尝试过的解决方案

  1. 核对 30h/93h 规格书 3Fh/4Ah/4Bh/4Ch:确认 ClearFlag 需显式下发、默认名单来源未定义、3Fh 未定义"默认条目不可删"
  2. 一键收集日志分析:
    • PoweroffPer.json:t_white_list 50 条、t_black_list 3 条(06-02-08 / 06-60-08 / 06-61-08)、t_list_mode=255
    • route_table.txt:06/60、06/61 各 1 条;06/0B、06/0D、06/62、06/63 均为 0 条;netfn 0x30=572 条
    • net_stream.log:firewall info 的请求序列包含 0x0B/0x0D/0x62/0x63,4 条均 ret=0xc1
    • operation.log:add 记录 0 次、clear 记录 0 次、删除 55 次全部成功;两次 Reset BMC 后删除被启动重建任务回滚
  3. 反查产品字节码常量池:4Ah 确有 ClearFlag 分支与 clear_list;ipmi_core_app.lua 启动时重建默认黑白名单
  4. 对照同源开源实现 openUBMC/ipmi_mgmt@1.0.118:
    • std_firewall_mgr.h:31 constexpr uint8_t STD_FIREWALL_NETFN_MAX = 0x2F; ⇒ 解释了 #4
    • firewall_filter.h 存在"BIOS POST 未完成时带内放行"分支 ⇒ 可能是 #2/#7 的原因
    • set_cmd_enables 命中默认黑名单返回 0x80 且不回滚已应用位;del_whitelist 不校验默认名单,一律返回 0x00 ⇒ 解释了 #5/#6

分析结论

  1. #4 不是缺陷而是设计边界:标准 Firmware Firewall 仅覆盖 NetFn ≤ 0x2F(STD_FIREWALL_NETFN_MAX),故 0x30/0x38/0x3A 不会出现在 GetNetFnSupport;日志 get all netfn is [0, 6, 10, 44, 4, 12](44=0x2C ≤ 0x2F)与此完全吻合。求确认:是否要把 OEM NetFn 纳入标准防火墙?
  2. #8 是工具与固件能力不匹配:BMC 未实现 0x0B/0x0D/0x62/0x63 子功能级查询(路由 0 条、请求返回 0xC1),ipmitool 因此无法判断子功能并全标 X;0x61 的 16 字节使能掩码本身与路由表/默认名单可逐位对齐,未见计算错误。求确认:是否计划实现这 4 条子功能查询?
  3. #5/#6 属返回码与原子性实现缺陷:能力位语义不一致(Support/Configurable/Enables 三套判据)、Set 中途返回 0x80 且不回滚、删除默认条目报成功。
  4. #2/#7 疑为同一根因:白名单模式下带内请求未被拦截(可能是"BIOS POST 未完成时带内不限制"分支,或该过滤器未覆盖带内通道)。求确认:BIOS POST 未完成时带内全放行是否为正式设计? 我们将在主机正常进 OS 后复测以定性。
  5. #1/#3 属规格缺口:4Ah 的清空是显式 ClearFlag 而非"开启即清空";规格未定义默认名单可否修改、未定义"不可配置/不可加白"清单。

希望社区协助确认: 上述 2、4、5 项在 openUBMC 主线(ipmi_mgmt 1.118+ / ipmi_core 1.121.x)上的预期设计与后续计划;若有对应 issue/MR 或规格补丁,麻烦指路,我们可配合提供完整 dump 与复测脚本。