已开启
[安全问题]: 【白细胞AI辅助分析】【安全】【IPC反序列化边界检查缺失】file.c存在IPC反序列化边界检查缺失 #25
King of Harmony创建于 6月1日
6月1日 添加了label:SIG_Security
openharmony_ci
6月1日 评论:
6月1日 评论:
感谢提交Issue!关于Issue的交互操作,请访问OpenHarmony社区支持命令清单。如果有问题,请联系 [@peterli](https://gitcode.com/peterli) [@heyanhong](https://gitcode.com/heyanhong) [@sjtugjy](https://gitcode.com/sjtugjy) 。如果需要调整订阅PR、Issue的变更状态,请访问链接。
Thanks for submitting the issue. For more commands, please visit OpenHarmony Command List. If you have any questions, please refer to committer gitcode for help. If you need to change the subscription of a Pull Request or Issue, please visit the link.


6月1日 添加了label:waiting_for_assign
7月27日 关联了pull request:fix: 修复不可信输入校验问题
感谢对OpenHarmony社区的支持与关注,欢迎反馈安全问题。
漏洞编号:
漏洞归属组件
漏洞归属版本
CVSS V3.0分值
Attack Vector(AV): Local(L) Attack Complexity(AC): Low(L) Privileges Required(PR): Low(L) User Interaction(UI): Not Required(N) Scope(S): Unchanged(U) Confidentiality Impact(C): Medium(M) Integrity Impact(I): Medium(M) Availability Impact(A): Medium(M) CVSS Base Score: 5.5
漏洞简述
在 chcore_file_read (file.c:905) 函数中,处理 IPC 返回的读取数据时,未对返回的数据长度进行边界校验。在 line 939 处,如果直接将 IPC 消息中反序列化出的数据拷贝至用户缓冲区 buf,而没有校验其大小是否小于等于请求的 count,恶意或被攻陷的 FS 服务端可以返回超长的数据,导致客户端发生缓冲区溢出。
【攻击链分析】
利用难度: medium
Prover验证: CONFIRMED (置信度: 0.95)
攻击场景:
攻击者首先攻陷微内核系统中的文件系统(FS)服务进程,随后当特权客户端进程通过 IPC 调用 read 读取文件时,恶意 FS 服务返回超长的数据长度和精心构造的 payload。客户端在 chcore_file_read 中未校验返回长度直接执行 memcpy,导致缓冲区溢出,从而劫持客户端控制流实现跨进程权限提升。
攻击步骤:
PoC 概念验证:
修改 FS 服务端的 FS_REQ_READ 处理逻辑,当收到客户端读取请求时,将 IPC 返回值 ret 设置为远大于请求长度 cnt 的值(例如 0x2000),同时在 IPC 共享内存数据区填充包含恶意栈布局(如 ROP chain)的 payload,使得客户端在处理响应时发生栈溢出。
前置条件:
入口点: unknown — chcore_file_read() @ /home/treffen/OpenHarmony_code/base/tee/tee_os_kernel/user/system-services/chcore-libc/libchcore/porting/overrides/src/chcore-port/file.c:939
影响类型: memory_corruption (high) — chcore_file_read() @ /home/treffen/OpenHarmony_code/base/tee/tee_os_kernel/user/system-services/chcore-libc/libchcore/porting/overrides/src/chcore-port/file.c:939
影响性分析说明
原理分析
受影响版本
规避方案或消减措施
修改建议: 在 chcore_file_read 的 memcpy 调用前增加严格的边界校验,确保 IPC 返回的数据长度 ret 不超过本次请求的长度 cnt(即 if (ret > 0 && ret <= cnt)),若 ret > cnt 则截断为 cnt 或直接返回错误码 EBADF/EFBIG。