最近看到了一个很有意思的技术项目,名叫HAOC。这是由中关村实验室与 openEuler 开源社区联合推进的,全称是 Hardware-assisted OS compartmentalization,即“硬件辅助的操作系统隔离技术”。简单来说,它的目标就是为 Linux 内核建造一个“隔离舱”,当某个局部出现问题时,不会蔓延至整个系统。
项目地址:https://gitee.com/openeuler/kernel
一个问题:为什么现在才做这件事?
说实话,Linux内核的安全隐患早已是老生常谈。超过3000万行的代码量,且每天都在增加,漏洞的出现和修补就像是一场永无止境的“打地鼠”游戏——刚按下一个,旁边又冒出来两个。
传统的应对思路是“修补漏洞”。但这背后有一个尴尬的现实:从漏洞出现到被发现,平均需要60天;从发现到发布补丁,又需要20多天。更棘手的是,有研究显示,超过半数的安全补丁并没有从根本上解决问题。
更深层的原因是,当前的Linux内核架构就像一艘所有舱室都彼此连通的老式战舰。调度器、内存管理、文件系统、驱动程序……这些核心模块都在同一个扁平的地址空间内“裸奔”。一旦某个模块被攻击者攻破,他们就能在内核里“横行无忌”,轻易访问到其他关键区域,例如进程权限凭证。
进入云原生和AI时代,这种安全模型越发令人担忧。无论是你部署的 Kubernetes 集群,还是承载关键业务的数据库,亦或是训练中的AI模型,其底层都依赖于内核的安全。内核一旦沦陷,整个基础设施便危如累卵。
因此,HAOC转变了思路——核心不再是堵住每一个漏洞,而是建造可靠的隔舱。即使某个地方“漏水”,也能将其影响限制在局部,确保整艘“船”不会沉没。
它到底是怎么工作的?
很多技术人在初次听说HAOC时,第一反应可能是:“这东西怎么用?需要我修改应用程序代码吗?”
答案是:完全不用。你的上层应用无需任何改动。
这正是HAOC设计的精妙之处。你的Java程序、Go服务可以照常运行,Docker容器、Kubernetes调度也可以一如既往。应用层对它毫无感知,它默默地工作在内核层,如同一个无形的守护者。
一个生动的比喻
想象一下你在一座现代化的办公楼里工作:
- TEE(如Intel SGX) 像是大楼里设置的一个个保险柜:你有重要文件需要存放,必须亲自走过去、输入密码、存入文件、上锁。安全性很高,但流程繁琐,你的工作方式必须随之改变。
- HAOC 则像是为整栋大楼升级了一套智能安保系统:你照常打卡上班、进出工位,一切如旧。但电梯需要刷卡才能使用,走廊安装了全天候监控,最重要的机房则加装了厚重的物理隔离门。即使有坏人混入了大厅,他也根本无法接近董事长的办公室或核心数据中心。
HAOC为Linux内核提供的,正是这套“大楼级”的智能安保体系。
核心工作原理:三步构建防线

第一步:划定“核心禁区”
HAOC首先在Linux内核的地址空间内,划出了一块受保护的“禁区”。这块区域内存放着系统最核心、最敏感的数据:
- 页表:记录虚拟内存到物理内存映射关系的“地图”。
- 进程权限凭证:标识进程身份(如是否为root)的“身份证”。
- 系统密钥:用于加密等关键操作的“万能钥匙”。
第二步:利用硬件“上锁”
它利用现代CPU普遍支持的虚拟化扩展能力(如Intel VT-x、AMD-V、ARM PAN),为这块“禁区”加上物理级别的硬件隔离:
- 普通的内核模块代码无法直接读写禁区内的内存。
- 任何对敏感数据的操作,必须通过预设的安全门进行。
- 任何试图绕过安全门的非法访问,都会立即触发硬件异常,被系统捕获。
第三步:建立“受控访问”通道
当内核其他部分需要操作这些敏感数据时(例如创建一个新进程),流程变为:
- 普通内核代码发起请求。
- 请求通过“安全门”进入一个名为 IEE 的隔离执行环境。
- 所有敏感操作(如修改凭证)在 IEE 内部完成。
- 操作完成后,IEE 将结果返回,并退出隔离环境。
整个过程类似于去银行办理业务:作为客户(普通内核代码),你无法进入金库,只能在柜台提交申请;由银行柜员(IEE隔离环境)进入金库完成操作,再将结果交还给你。
实战验证:以CVE-2021-3490为例
这是一个真实存在的Linux内核漏洞。攻击者可以利用eBPF子系统的越界写漏洞,直接修改进程的权限凭证,从而将普通用户提升为root。
-
在传统系统上:
- 攻击者触发eBPF漏洞。
- 直接向存储进程凭证的
cred结构体写入数据。
- 进程的
uid被改为0,获得root权限。
- 系统完全被控制。
-
在启用HAOC的系统上:
- 攻击者同样触发了eBPF漏洞。
- 但当其试图修改
cred结构体时,发现它已被锁在IEE隔离的禁区内。
- 硬件机制直接阻止了这次非法写入,并触发保护。
- 攻击失败,进程权限保持不变。
关键区别在于:漏洞本身依然存在(eBPF的代码问题未被修复),但利用漏洞的路径被彻底切断了。这正是HAOC设计哲学的体现——承认漏洞难以根除,但致力于让漏洞变得极难被成功利用。
核心架构:三层纵深防御体系

将这套“安保系统”拆解来看,HAOC将内核划分为三个层级,实施纵深防御:
| 层级 |
内容 |
保护方式 |
| 中枢核心层 |
页表、权限凭证、系统密钥 |
IEE硬件隔离,最高保护级别 |
| 普通模块层 |
调度器、内存管理、文件系统 |
地址随机化等,提高攻击门槛 |
| 高风险模块层 |
第三方驱动、内核扩展 |
单独隔离域,限制破坏范围 |
其背后依赖三个关键技术模块:
- IEE:基于CPU虚拟化扩展实现的硬件隔离执行环境。
- PTP:页表保护,专门防止攻击者篡改内存映射关系。
- CREDP:凭证保护,确保进程权限不被非法修改。
从 openEuler 24.03 LTS 版本开始,这些模块已被默认集成并启用,用户无需进行额外配置。
HAOC vs TEE:定位不同,互为补充

你可能会问,那现有的TEE(可信执行环境)技术,如Intel SGX、ARM TrustZone呢?它们与HAOC有何不同?
| 特性 |
HAOC |
Intel SGX |
ARM TrustZone |
| 隔离对象 |
内核内部模块 |
应用级敏感代码 |
整个“安全世界” |
| 应用要改吗 |
完全不用 |
需要重构代码,使用SDK |
需要适配特定API |
| 保护重点 |
内核自身安全 |
应用数据机密性 |
系统级安全服务 |
| 性能开销 |
5-15% |
通常较大 |
中等 |

可以用一句话来区分它们的核心理念:
- TEE 是 应用主动进入保险柜——需要你将敏感的代码和数据主动放入Enclave或Secure World中进行保护。
- HAOC 是 内核被动构建隔离墙——内核自身加固,为不同模块划分边界,上层应用无需感知。
它们并不冲突,反而高度互补:HAOC保护内核不被攻破,防止攻击者获取系统最高权限;TEE则保护应用的关键数据不被窃取或篡改。一个负责“筑高墙”,一个负责“设金库”。
如何启用与验证?
对于应用开发者
你几乎不需要做任何事情。 你的业务代码、Dockerfile、部署脚本都无需更改。HAOC是内核层面的增强,对应用透明。不过,你可以向运维团队建议:“这项技术能有效防御内核提权攻击,或许值得评估。”
对于运维/系统管理员
主要工作是确认环境已支持并启用。如果你使用的是 openEuler 24.03 LTS 或更新版本,HAOC默认已开启。
检查命令如下:
# 1. 检查系统版本(需要 openEuler 24.03 LTS+)
cat /etc/os-release | grep VERSION
# 2. 检查内核编译配置,确认HAOC相关模块已启用
grep -E "CONFIG_IEE|CONFIG_PTP|CONFIG_CREDP" /boot/config-$(uname -r)
# 预期输出应包含:
# CONFIG_IEE=y
# CONFIG_PTP=y
# CONFIG_CREDP=y
# 3. 查看系统启动日志,确认HAOC初始化成功
dmesg | grep -i haoc
如果是自行编译内核,需要在配置菜单中启用相关选项:
Security options
-> HAOC (Hardware-assisted OS Compartmentalization)
-> Isolated Execution Environment (IEE)
-> Page Table Protection (PTP)
-> Credentials Protection (CREDP)
如果你想测试效果
可以利用Linux Test Project测试套件进行基础验证:
dnf install ltp
cd /opt/ltp
./runltp -f syscalls -s "cve" 2>&1 | tee haoc-test.log
发展现状与未来展望
HAOC技术自2024年6月开始进入 openEuler 社区,至今已迭代了三个主要版本:
- 1.0版:首先在ARM架构上落地,验证了技术路线的可行性。
- 2.0版:扩展支持x86架构,增强了对驱动程序的隔离能力,并优化了约20%的性能。
- 3.0版:随 openEuler 25.03 版本发布,已成为发行版的默认组件,真正做到开箱即用。
它已不再是实验室的原型,开始在一些对安全要求极高的基础设施场景中投入应用。当然,作为一个较新的技术,其生态和社区支持仍在快速发展中,文档和排错资源可能不如 Docker、K8s 等成熟技术丰富,深入使用可能需要查阅开源社区的源码或参与讨论。
需要注意的考量与挑战
- 性能开销:5-15% 的性能损耗是客观存在的。对于延迟极度敏感的业务(如高频交易),需要进行充分的测试和权衡。
- 调试复杂性增加:内核调试本就复杂,引入隔离域后,一个问题可能涉及多个隔离域之间的交互,排查起来如同“侦破跨部门案件”,对运维人员提出了更高要求。
- 非万能解决方案:HAOC主要防御内核层的提权攻击和横向移动。它无法防护应用层漏洞、社会工程学攻击或内部威胁。它更适合金融、政务、关键信息基础设施等高安全需求场景;对于个人博客或测试环境,可能就有些“杀鸡用牛刀”了。
结语
操作系统安全,某种程度上类似于购买保险——在风平浪静的日子里,你几乎感觉不到它的存在;但当真正的风暴来袭时,它的价值便无可替代。
HAOC所代表的“隔离舱”思路,我个人认为非常务实:不再追求消灭所有漏洞(这几乎不可能),而是致力于让漏洞难以被成功利用。面对数千万行、持续演进的Linux内核代码,承认漏洞的不可避免性,转而构建强健的隔离和 containment 机制,无疑是提升系统整体韧性的有效路径。
如果你负责关键业务的底层基础设施,或是对操作系统与系统安全有浓厚的兴趣,不妨多关注一下 openEuler 社区及HAOC的进展。这项由中国开源社区主导推动的技术,正在为全球的Linux内核安全探索一条新的道路。也欢迎大家在云栈社区交流更多关于系统安全与内核技术的实践与思考。