LeonOS 4 安全审查报告
范围
对固定 Git 提交进行标准仓库安全审计;重点覆盖 Ring-3 到 Ring-0、认证、网络、HTTP 和浏览器路径。
| 字段 | 值 |
|---|---|
| 扫描模式 | 仓库 |
| 目标类型 | Git 提交 |
| 目标标识 | target_sha256_c9ce7b7efe8039b8499cc5fa37622a227599978aa656347d6d67d7c6a1718fd7 |
| 审计提交 | 461f4d72e75346eea3a25379c206d411f6e7f8aa |
| 清单策略 | 仓库 |
| 纳入路径 | . |
| 排除路径 | 无 |
| 运行时或测试状态 | 未执行破坏性 PoC、持久镜像操作或真实网络注入。 |
| 已审阅产物 | threat_model.md、work_ledger.jsonl、validation_summary.md、attack_path_summary.md |
| 扫描上下文 | 威胁模型由本次扫描生成;原工作区未提交改动未纳入固定提交审计。 |
限制与排除项:
- 132 个运行时、构建或宿主工具文件明确延期。
- 未在隔离 VM 或隔离网络中做动态确认。
- 本报告已将原先未归档的详细技术说明合并到各发现条目中;下文结论均以固定审计提交的静态源码证据为基础。
扫描摘要
| 字段 | 值 |
|---|---|
| 可报告发现 | 10 |
| 严重性分布 | 严重:1;中等:4;低:5 |
| 置信度分布 | 高:8;中等:2 |
| 覆盖率 | 部分覆盖 |
| 验证方式 | 静态源码追踪与精确算术检查。 |
规范审计产物为 scan-manifest.json、findings.json 和 coverage.json。本报告是这些产物的确定性投影;它不是运行时漏洞复现报告。
威胁模型
LeonOS 4 的关键边界包括 Ring-3 到内核系统调用、受信任桌面代理、持久化配置、认证会话和不受信任网络输入。
资产
- 内核内存与调度器状态
- 认证会话与管理角色
- 系统配置和用户数据
- 网络流量与浏览器凭据
信任边界
- Ring-3 到 Ring-0 系统调用
- 客户端到桌面/系统服务请求
- 二层/三层网络到协议状态机
- HTTPS/HTTP 与浏览器认证状态
攻击者能力
- 低权限本机程序可调用公开系统接口
- 同一二层网络节点可发送网络帧
- 远程端点可提供 HTTP 响应和重定向
安全目标
- 防止用户态破坏内核内存
- 确保特权操作有明确授权
- 保持下载和凭据的传输完整性
- 验证网络状态转换
假设
- 固件、物理磁盘篡改和构建签名者不在本次常规应用威胁边界内。
- 隔离 VM 和网络动态验证留待后续。
发现
| 发现 | 严重性 | 置信度 | 技术说明 |
|---|---|---|---|
| GUI 几何参数整数回绕导致内核越界写 | 严重 | 高 | 已内联到本报告 |
| 浏览器 Basic 凭据作用域未包含传输方案 | 中等 | 中等 | 已内联到本报告 |
| HTTPS 下载允许降级重定向到 HTTP | 中等 | 高 | 已内联到本报告 |
| HTTP 分块解码整数回绕导致越界读取 | 中等 | 高 | 已内联到本报告 |
| DHCP ACK 未绑定已选择的服务器 | 中等 | 高 | 已内联到本报告 |
| TCP RST 在缺少序号验证时关闭连接 | 低 | 高 | 已内联到本报告 |
| 电源控制 IOCTL 缺少授权检查 | 低 | 高 | 已内联到本报告 |
| 登录认证缺少失败限速和锁定 | 低 | 中等 | 已内联到本报告 |
| ARP 缓存接受未关联的发送者映射 | 低 | 高 | 已内联到本报告 |
| 显示请求可驱动受信任桌面持久化配置 | 低 | 高 | 已内联到本报告 |
置信度分级
| 标签 | 含义 |
|---|---|
| 高 | 直接证据支持该发现,且不存在实质性未解决阻碍。 |
| 中等 | 证据支持存在合理问题,但仍缺少实质运行时或可达性证明。 |
| 低 | 证据不完整,仅保留为明确的后续检查项。 |
<a id="finding-1"></a>
[1] GUI 几何参数整数回绕导致内核越界写
| 字段 | 值 |
|---|---|
| 严重性 | 严重 |
| 置信度 | 高 |
| 置信度依据 | 已审查固定提交的静态源码控制流、边界和影响链;未进行破坏性 VM 或网络注入验证。 |
| 类别 | 内核内存安全 |
| CWE | CWE-190、CWE-787 |
| 受影响行 | kernel/ntclks/gui_ipc.c:207-222、kernel/ntclks/syscall.c:2842 |
摘要
LEONOS_GUI_IOCTL_PRESENT_WINDOW 接收用户态提交的窗口宽度和高度,并最终调用 ensure_window_buffer。该函数以 uint64_t 计算 width height sizeof(uint32_t),但随后将页数窄化为 uint32_t:pages = (uint32_t)((bytes + 4095ULL) / 4096ULL)。固定审计提交未限制几何尺寸、未检查乘法和页数转换,也未拒绝零页或超出分配器上限的结果。
当攻击者选择使字节数或页数发生回绕/截断的尺寸时,mm_alloc_pages(pages) 可能分配少于后续绘制循环实际需要的缓冲区。gui_ipc_present_window 随后按攻击者提供的 width 和 height 写入 dst[(uint64_t)y * width + x],从而可越过实际分配的内核窗口缓冲区。
验证
在提交 461f4d72e75346eea3a25379c206d411f6e7f8aa 中,kernel/ntclks/gui_ipc.c:207-212 可见未受约束的页数窄化及 mm_alloc_pages(pages) 调用;kernel/ntclks/syscall.c:2842 的呈现 IOCTL 路径会将用户提供的几何参数传入该链路。审计未执行会破坏内核内存的 PoC,因此这里证明的是静态可达的越界写前提,而不是已在 VM 中复现的利用结果。
数据流
用户态 struct gui_present_window_user 的 width、height 和 stride 经 LEONOS_GUI_IOCTL_PRESENT_WINDOW 进入 gui_ipc_present_window,再进入 ensure_window_buffer。分配尺寸由被窄化的 pages 决定,而复制循环仍以原始 width、height 为上界,形成“分配大小”和“写入范围”使用不同、且未一致验证的数值表示。
可达性
该 IOCTL 分支检查了用户指针和基本的非零/步长关系,却不像窗口轮询路径那样调用 require_window_server()。因此,能够调用公开 GUI 系统调用的低权限本机进程可直接提交畸形几何参数。
严重性
问题发生在内核维护的窗口像素缓冲区中。受控尺寸可造成内核越界写,影响范围包括内核崩溃、内存破坏,以及在额外布局条件满足时进一步扩大本地权限的可能性。由于未进行破坏性运行时验证,报告不声称已有可靠的提权利用链,但内核写越界本身足以评定为严重。
修复建议
在任何窄化前使用经检查的 64 位乘加计算总字节数和页数;拒绝乘法溢出、页数为零、超过 UINT32_MAX 或超过窗口缓冲区/物理分配器最大值的请求。再为宽度、高度和步长设置显式上限,并在复制前验证源用户缓冲区范围。分配的字节数、复制上界和持久化窗口几何应使用同一组已验证的值。
<a id="finding-2"></a>
[2] 浏览器 Basic 凭据作用域未包含传输方案
| 字段 | 值 |
|---|---|
| 严重性 | 中等 |
| 置信度 | 中等 |
| 置信度依据 | 已审查固定提交的静态源码控制流、边界和影响链;未进行破坏性 VM 或网络注入验证。 |
| 类别 | 凭据传输保护不足 |
| CWE | CWE-523 |
| 受影响行 | userland/apps/browser/auth.c:71-83、userland/apps/browser/cookies.c:750 |
摘要
浏览器的 Basic 认证条目仅以主机名和端口作为键。auth_entry_for(const char *host, uint32_t port) 忽略 URL 方案,而 browser_auth_append_header 对每次请求解析 URL 后,以 parsed.host 和 parsed.port 查找缓存条目并追加 Authorization 头。于是同一主机和端口上的 https:// 与 http:// 不再是彼此隔离的凭据作用域。
验证
固定提交中,userland/apps/browser/auth.c:60-68 的查找函数只有 host 与 port 比较;第 79 行以同样两个字段取回条目,第 80-83 行无条件追加已有认证头。userland/apps/browser/cookies.c:742 在构造 HTTP 请求头时调用该函数。审计未对真实端点发送凭据,且未在隔离网络中跟踪请求,因此置信度保留为中等。
数据流
认证挑战路径解析 URL 并将 Basic Authorization 值保存到浏览器认证条目;后续请求由浏览器请求头构造代码调用 browser_auth_append_header。若后续 URL 的主机和端口相同但方案不同,缓存的 HTTPS Basic 认证头会进入 HTTP 请求头。
可达性
攻击前提是用户已经向一个 HTTPS 端点提供了 Basic 凭据,之后浏览器访问、跳转或被链接引导到同一主机和端口的 HTTP URL。常规默认端口不同会降低触发概率,但显式端口、非默认服务端口或共享端口部署会满足该条件。
严重性
Basic 凭据在 HTTP 上以可逆编码的请求头传输。方案混淆可使原本仅在 TLS 连接中使用的凭据暴露给链路攻击者或不安全端点;影响取决于站点部署、用户是否已认证和导航路径,因此评定为中等。
修复建议
将 URL 方案纳入认证条目的键,并在重定向或导航发生方案变化时重新计算权限范围。HTTPS 产生的 Basic 凭据不得自动附加到 HTTP 请求;同时应将认证域(realm)和端口按规范纳入明确的保护空间规则。
<a id="finding-3"></a>
[3] HTTPS 下载允许降级重定向到 HTTP
| 字段 | 值 |
|---|---|
| 严重性 | 中等 |
| 置信度 | 高 |
| 置信度依据 | 已审查固定提交的静态源码控制流、边界和影响链;未进行破坏性 VM 或网络注入验证。 |
| 类别 | 传输安全降级 |
| CWE | CWE-319 |
| 受影响行 | userland/libc/src/libc.c:2837-2844、userland/apps/downloadmgr/main.c:302 |
摘要
leonos_http_request 收到重定向后调用 leonos_http_resolve_url 解析 Location,然后直接把 next_url 复制到 current_url。固定提交没有比较旧 URL 和新 URL 的方案,因此可信 HTTPS 响应可将下载流程重定向到 HTTP,后续内容不再受 TLS 保护。
验证
userland/libc/src/libc.c:2825-2844 显示重定向条件、URL 解析以及无条件的 http_copy_text(current_url, sizeof(current_url), next_url);该分支前后没有 https:// 到 http:// 的降级拒绝逻辑。下载管理器在 userland/apps/downloadmgr/main.c:293-304 接受 HTTPS URL 并调用 leonos_http_get,因而使用了该通用重定向路径。
数据流
用户提供的初始 HTTPS URL 进入下载管理器,后者调用 leonos_http_get。远程服务返回带 Location 的 3xx 响应,HTTP 库解析该位置并更新当前 URL;下一个请求可使用 HTTP 获取最终文件。下载管理器只检查请求是否成功,不区分最初方案和最终方案。
可达性
拥有初始 HTTPS 端点控制权、能够控制其重定向响应,或能够影响该响应的攻击者均可提供 HTTP 目标。HTTP 连接建立后,同一链路上的攻击者可以替换下载内容。该路径不需要本机提权或损坏内存。
严重性
该缺陷破坏了用户从 HTTPS 下载时对传输完整性的合理预期,可能导致安装包、更新包或普通文件被替换。是否会产生代码执行还取决于下载内容的后续处理和签名验证,故评定为中等。
修复建议
在接受重定向前解析源和目标 URL;当当前 URL 为 https:// 且目标为 http:// 时拒绝重定向,并向调用方返回明确的降级错误。将最终方案暴露给调用方以便显示,并为 HTTP 客户端和下载管理器加入覆盖该不变量的回归测试。
<a id="finding-4"></a>
[4] HTTP 分块解码整数回绕导致越界读取
| 字段 | 值 |
|---|---|
| 严重性 | 中等 |
| 置信度 | 高 |
| 置信度依据 | 已审查固定提交的静态源码控制流、边界和影响链;未进行破坏性 VM 或网络注入验证。 |
| 类别 | HTTP 解析内存安全 |
| CWE | CWE-190、CWE-125 |
| 受影响行 | userland/libc/src/libc.c:2509-2541、userland/libc/src/libc.c:2766 |
摘要
http_decode_chunked 使用 32 位 chunk_size 逐位解析十六进制分块长度:chunk_size = chunk_size * 16U + http_hex_value(buffer[src])。该运算没有检测乘法或加法回绕,随后边界检查使用同样可回绕的 src + chunk_size > raw_len。恶意 HTTP 响应可以让声明长度和检查表达式发生回绕,使读取循环按错误范围访问 buffer[src + i]。
验证
固定提交的 userland/libc/src/libc.c:2504-2513 显示未检查的长度累积;第 2526 行使用加法形式进行边界检查;第 2532-2541 行从 buffer[src + i] 复制数据并更新 src。目标缓冲区有容量检查,但该检查不能约束源索引,因此不能消除越界读取风险。
数据流
远程 HTTP 响应的分块长度文本进入 http_decode_chunked,逐个十六进制字符累积为 chunk_size。经过可能失效的 src + chunk_size 比较后,循环使用攻击者影响的长度从原始响应缓冲区读取,并将数据压缩复制到同一响应缓冲区前部。
可达性
任何能向系统 HTTP 客户端提供分块响应的远程端点都可控制长度文本。受影响解码器由 HTTP 响应处理路径调用,审计未针对网络栈、堆布局或可泄露内容执行动态实验。
严重性
该问题可导致用户态进程崩溃或读取其响应缓冲区边界外的数据。由于本次静态审计未证明稳定信息泄露或任意写原语,影响评定为中等而非严重。
修复建议
在解析每个十六进制数字前检查 chunk_size 的乘法和加法是否会超过允许上限;使用更宽的受检查整数保存中间结果。将加法型边界检查替换为在 src <= raw_len 前提下的 chunk_size > raw_len - src,并为超长分块行、回绕边界和截断响应加入单元测试或模糊测试。
<a id="finding-5"></a>
[5] DHCP ACK 未绑定已选择的服务器
| 字段 | 值 |
|---|---|
| 严重性 | 中等 |
| 置信度 | 高 |
| 置信度依据 | 已审查固定提交的静态源码控制流、边界和影响链;未进行破坏性 VM 或网络注入验证。 |
| 类别 | 网络配置身份验证不足 |
| CWE | CWE-345 |
| 受影响行 | kernel/ntclks/net.c:1224-1302 |
摘要
DHCP 客户端接受 OFFER 后,会以 OFFER 中的 yiaddr 和 server_ip 发送 REQUEST;但等待 ACK 时,net_dhcp_wait 只校验事务 ID 和消息类型。它既不要求 ACK 的 server identifier 等于已选择 OFFER 的服务器,也不验证 ACK 的租约地址与已请求地址一致,随后 net_apply_dhcp_offer 直接应用 ACK 内容。
验证
在固定提交中,kernel/ntclks/net.c:1224-1250 的 net_dhcp_wait 仅以 xid、期望消息类型和 NET_DHCP_NAK 作决定。net_dhcp_request 在第 1284 行使用 OFFER 发送 REQUEST,却在第 1290 行以同一未绑定的 net_dhcp_wait(xid, timeout_ms, NET_DHCP_ACK, &offer) 接受 ACK,并在第 1298 行应用结果。
数据流
广播 DISCOVER 产生一个 xid,收到的 OFFER 保存为 offer。REQUEST 将 OFFER 的服务器标识带出,但 ACK 接收函数只从任意满足 xid 的响应重填 offer。最终路由器、DNS、租期及地址均来自最后被接受的 ACK,而不是已选择的 OFFER。
可达性
攻击者需要位于同一二层网络,能够观察或预测 DHCP 事务并在合法 ACK 前发送匹配事务 ID 的 ACK。该限制比远程 HTTP 攻击更强,但家庭网络、共享交换网络和恶意热点均可能提供所需位置。
严重性
攻击者可将客户端网络配置绑定到非预期网关或 DNS,造成流量重定向、拒绝服务或辅助中间人攻击。DHCP 本身缺少强加密认证并不免除此处的状态绑定要求,因此评定为中等。
修复建议
将已选择的 server_ip 和已请求的 yiaddr 作为预期值传入 ACK 等待/解析路径;仅接受同时匹配事务 ID、消息类型、server identifier 和地址的 ACK。对不匹配包继续等待合法 ACK,并记录被拒绝的身份不一致响应以支持诊断。
<a id="finding-6"></a>
[6] TCP RST 在缺少序号验证时关闭连接
| 字段 | 值 |
|---|---|
| 严重性 | 低 |
| 置信度 | 高 |
| 置信度依据 | 已审查固定提交的静态源码控制流、边界和影响链;未进行破坏性 VM 或网络注入验证。 |
| 类别 | TCP 状态机验证不足 |
| CWE | CWE-345 |
| 受影响行 | kernel/ntclks/net.c:1015-1034 |
摘要
net_socket_handle_tcp 在按远端 IP、远端端口和本地端口匹配到套接字后,只要 TCP 标志中包含 RST,便立即调用 net_socket_mark_closed。该分支没有把报文 seq 与套接字当前接收序号或接收窗口比较。
验证
固定提交的 kernel/ntclks/net.c:1015-1024 显示套接字按四元组匹配;第 1031-1034 行无条件关闭匹配套接字。尽管函数接收 seq 参数,RST 分支没有使用该参数进行序号可接受性判断。
数据流
入站 TCP 包解析得到源地址、端口、序号和标志位后进入 net_socket_handle_tcp。匹配到现有套接字后,TCP_FLAG_RST 直接控制连接状态转换为 LEONOS_NET_TCP_CLOSED,并将状态置为 LEONOS_NET_STATUS_TCP_RESET。
可达性
攻击者需要能够向目标伪造与活动连接四元组相符的 TCP 包,或位于能够观察该连接的位置。网络路径与套接字匹配信息限制了攻击面,但没有序号验证使伪造 RST 无需满足 TCP 状态机的关键条件。
严重性
影响主要是中断现有连接及其上的下载、浏览或其他网络操作。固定提交中未发现 RST 路径直接产生内存破坏或权限提升,因此评定为低。
修复建议
仅当 RST 序号落在当前可接受接收窗口内时关闭已建立连接;对不同 TCP 状态分别实现适用的 ACK/序号验证规则。为窗口边界、旧序号和伪造 RST 建立协议状态机回归测试。
<a id="finding-7"></a>
[7] 电源控制 IOCTL 缺少授权检查
| 字段 | 值 |
|---|---|
| 严重性 | 低 |
| 置信度 | 高 |
| 置信度依据 | 已审查固定提交的静态源码控制流、边界和影响链;未进行破坏性 VM 或网络注入验证。 |
| 类别 | 授权绕过 |
| CWE | CWE-862 |
| 受影响行 | kernel/ntclks/syscall.c:3062-3068 |
摘要
内核在 LEONOS_GUI_IOCTL_REBOOT 和 LEONOS_GUI_IOCTL_SHUTDOWN 分支中分别直接调用 power_reboot() 与 power_shutdown()。这两个分支没有调用 authz_check、require_window_server 或等价的调用者角色检查。
验证
固定提交的 kernel/ntclks/syscall.c:3062-3068 包含两个无条件电源调用。相邻的任务终止分支在第 3044 行使用 authz_check_path,显示该系统调用层具备授权模式,但电源分支未使用它。未调用真正的重启或关机操作进行验证。
数据流
低权限进程可将 IOCTL 请求号传入系统调用;请求号匹配后,内核不读取或验证调用者身份,直接调用平台电源控制例程。该数据流没有桌面服务或管理员确认作为中介。
可达性
能够调用公开系统调用接口的本机进程即可触发该分支,不需要拥有桌面窗口、管理员账户或对目标进程的控制权。
严重性
后果是全系统重启或关机,主要为本机拒绝服务。该路径不直接授予持久权限或读取敏感数据,因此评定为低,但应在多用户系统中优先修复。
修复建议
将电源操作纳入统一授权策略:仅允许授权的系统服务或明确获得管理员批准的调用者执行。通过受信任桌面代理发起时,内核仍应验证代理身份和请求来源,而不应把公开 IOCTL 本身视为授权。
<a id="finding-8"></a>
[8] 登录认证缺少失败限速和锁定
| 字段 | 值 |
|---|---|
| 严重性 | 低 |
| 置信度 | 中等 |
| 置信度依据 | 已审查固定提交的静态源码控制流、边界和影响链;未进行破坏性 VM 或网络注入验证。 |
| 类别 | 不充分的认证保护 |
| CWE | CWE-307 |
| 受影响行 | middlelayer/osmlayer/runtime.c:1690-1718、kernel/ntclks/syscall.c:905 |
摘要
osmlayer_auth_login 每次调用都会加载账户、哈希用户提供的密码并立即返回成功或 -13。固定提交没有记录失败次数、退避时间、锁定状态、重试延迟或成功后的失败计数清除逻辑。
验证
middlelayer/osmlayer/runtime.c:1690-1718 中可见输入验证、账户查找、哈希比较和返回路径;函数体中不存在失败状态更新或等待操作。审计无法从静态代码确定所有登录入口的物理访问条件、账户策略和密码强度,故可达性影响的置信度为中等。
数据流
登录请求中的用户名和密码进入认证运行时,账户表被读取后执行密码哈希比较。比较失败直接返回错误,下一次请求不会继承任何失败状态。因此同一账户可连续接收任意次数的猜测。
可达性
能访问登录 API 的本机或未来远程登录入口可重复提交认证请求。实际攻击成本还取决于登录界面、账户可枚举性、密码策略和攻击者可获得的时间窗口。
严重性
缺乏节流降低了口令猜测成本,可能导致弱口令账户被接管;但报告没有证明远程暴露、可并行尝试或特定弱口令,因此评定为低且置信度为中等。
修复建议
按账户至少记录失败次数和下一次允许尝试时间,采用指数退避及有限期锁定,并在成功登录后安全清除计数。若登录 API 具备可用的可信来源标识,可额外按来源限速;错误消息应避免泄露账户是否存在。
<a id="finding-9"></a>
[9] ARP 缓存接受未关联的发送者映射
| 字段 | 值 |
|---|---|
| 严重性 | 低 |
| 置信度 | 高 |
| 置信度依据 | 已审查固定提交的静态源码控制流、边界和影响链;未进行破坏性 VM 或网络注入验证。 |
| 类别 | 网络邻居验证不足 |
| CWE | CWE-345 |
| 受影响行 | kernel/ntclks/net.c:630-655 |
摘要
net_handle_arp 仅做基本 ARP 格式检查后,便在判断请求/回复类型和等待中的查询之前调用 net_arp_cache_store(sender_ip, sender_mac)。任意格式正确的入站 ARP 包均可更新缓存,不要求其对应正在等待的查询,也未在该位置验证以太网源地址与 ARP 发送者 MAC 的一致性。
验证
固定提交的 kernel/ntclks/net.c:637-647 显示格式检查、发送者字段提取和无条件缓存写入;只有第 652-655 行才将 ARP 回复与 arp_wait->ip 关联。缓存写入先于该关联检查,证明非关联映射也能进入缓存。
数据流
局域网 ARP 帧中的 sender_ip 和 sender_mac 经解析直接传入缓存存储函数。之后网络栈在解析网关或远端 MAC 时可能使用该缓存项,将后续帧交给攻击者声明的 MAC 地址。
可达性
攻击者需处于同一二层广播域并能发送 ARP 帧。这不是互联网远程攻击面,但在共享有线网络、公共 Wi-Fi 或受入侵局域网中可行。
严重性
攻击者可造成拒绝服务或为中间人流量重定向创造条件。由于还受二层位置、交换机策略及上层协议保护限制,且未验证完整的端到端利用链,评定为低。
修复建议
仅在收到与未完成 ARP 查询相匹配的回复时更新缓存,并验证以太网源 MAC 与 ARP 发送者 MAC 一致。为缓存项设置过期和替换策略;对未经请求的更新采用拒绝、隔离或严格的可信网络策略。
<a id="finding-10"></a>
[10] 显示请求可驱动受信任桌面持久化配置
| 字段 | 值 |
|---|---|
| 严重性 | 低 |
| 置信度 | 高 |
| 置信度依据 | 已审查固定提交的静态源码控制流、边界和影响链;未进行破坏性 VM 或网络注入验证。 |
| 类别 | 混淆代理/授权绕过 |
| CWE | CWE-441、CWE-862 |
| 受影响行 | kernel/ntclks/syscall.c:3077-3082 |
摘要
LEONOS_GUI_IOCTL_DISPLAY_REQUEST 仅验证用户态结构体范围,随后调用 gui_ipc_request_display。该函数把请求复制到全局 display_request 并标记其待处理;只有受信任窗口服务器可轮询该请求。请求中未携带已验证的调用者身份,内核也未检查请求者是否被授权更改显示设置。
验证
固定提交的 kernel/ntclks/syscall.c:3077-3082 没有 require_window_server 或授权检查;相比之下第 3084-3093 行仅限制轮询者为窗口服务器。gui_ipc_request_display 将参数直接保存为共享挂起请求,这使受信任桌面可以代表任意发起者处理并持久化显示配置。
数据流
任意进程提交 struct gui_ipc_display_request 后,内核把它放入全局单槽请求状态。桌面服务以自己的受信任身份取出请求,再将其作为显示/持久化配置变更处理。原始调用者身份在进入共享请求状态前丢失,形成混淆代理。
可达性
能够调用 GUI IOCTL 的本机进程可提交请求;桌面服务正常运行并轮询请求时即会消费它。该问题影响的是显示配置完整性,而不是直接的内核内存安全。
严重性
恶意进程可诱导受信任桌面替其修改显示或持久化配置,并可能覆盖用户预期设置。影响范围主要是配置完整性和可用性,因此评定为低。
修复建议
在内核中将调用者 PID、UID 和请求来源与请求一起保存,并在桌面服务中按来源和允许字段执行策略。更稳妥的设计是将持久化设置变更限制为受信任设置应用或显式用户确认的操作;不要把无来源的全局 GUI 请求直接视为授权。
结构性加固建议
这些建议由全部发现归纳而来,用于说明可选的系统性改进和取舍;它们不表示任何发现已经修复。
| 加固方向 | 覆盖发现 | 建议 |
|---|---|---|
| 统一特权边界 | 1、7、10 | 为所有特权 IOCTL 采用单一调用者身份和授权检查层。将调用者 PID、UID、角色和请求来源随 GUI/系统服务请求传递,避免依赖无来源的全局状态。 |
| 受检查的资源计算 | 1、4 | 建立可复用的尺寸、页数和协议长度检查函数;先验证乘加和上限,再分配、复制或更新状态。禁止在验证前把 64 位结果窄化到 32 位。 |
| 明确的网络状态绑定 | 2、3、5、6、9 | 以完整端点身份、已选 DHCP 服务器、ARP 查询状态和 TCP 序号窗口约束状态转换。每个来自网络的状态更新都应证明其属于现有事务。 |
| 认证抗自动化 | 8 | 为账户认证引入持久化或可靠存储的失败计数、退避和暂时锁定;将用户可见错误与内部审计记录分离。 |
| 回归验证 | 全部 | 保留 tools/test_security_regressions.py 作为只读源码门禁,并在修复后以 --strict 运行。对 GUI 算术、HTTP 解析和网络状态机补充边界单元测试、模糊测试以及隔离 VM/网络验证。 |
已审查的表面
| 表面 | 风险区域 | 结果 | 说明 |
|---|---|---|---|
| 内核 GUI、系统控制与认证 | Ring-3 到 Ring-0 和身份边界 | 已报告 | 报告 4 项:GUI 内存安全、电源控制、显示代理和登录节流。证据:artifacts/05_findings/CAND-RANK1-001/candidate_ledger.jsonl、artifacts/05_findings/CAND-RANK1-002/candidate_ledger.jsonl、artifacts/05_findings/CAND-RANK1-003/candidate_ledger.jsonl、artifacts/05_findings/LEONOS4-CAND-LOGIN-BRUTE-FORCE-001/candidate_ledger.jsonl |
| 网络栈、HTTP 与浏览器 | 远程网络数据和凭据边界 | 已报告 | 报告 6 项:HTTP、HTTPS 重定向、ARP、DHCP、TCP RST 和 Basic 凭据作用域。证据:artifacts/05_findings/R3-01/candidate_ledger.jsonl、artifacts/05_findings/R3-02/candidate_ledger.jsonl、artifacts/05_findings/R3-03/candidate_ledger.jsonl、artifacts/05_findings/R3-04/candidate_ledger.jsonl、artifacts/05_findings/R3-05/candidate_ledger.jsonl、artifacts/05_findings/LEONOS4-CAND-BROWSER-BASIC-AUTH-DOWNGRADE-001/candidate_ledger.jsonl |
| 已审查的启动、存储、驱动和头文件样本 | 启动链、存储和设备输入 | 未发现问题 | 33 个高优先级运行时或基础文件完成审查,未有其他候选存活。证据:artifacts/02_discovery/file_reviews/rank_1.md、artifacts/02_discovery/file_reviews/rank_2.md、artifacts/02_discovery/file_reviews/rank_3.md、artifacts/02_discovery/file_reviews/batch_01.md、artifacts/02_discovery/file_reviews/batch_02.md |
| 延期的运行时、构建工具与应用代码 | 未逐文件完成的系统运行时和宿主工具 | 需要后续审查 | 132 项明确延期,原因是本轮优先完成特权、认证、网络和浏览器路径;其余清单保存在工作台账。证据:artifacts/02_discovery/work_ledger.jsonl、artifacts/03_coverage/repository_coverage_ledger.md |
| 声明头文件和静态测试页面 | 非独立运行时入口 | 不适用 | 76 项仅为声明、ABI 或静态样本,未发现独立可达安全汇聚点。证据:artifacts/03_coverage/repository_coverage_ledger.md |
开放问题与后续工作
- GUI 几何修复后,是否在隔离 VM 对内存安全回归进行动态验证?
- 后续提示:审查提交
461f4d72e75346eea3a25379c206d411f6e7f8aa中kernel/ntclks/gui_ipc.c的已修复几何校验,并只运行非破坏性边界测试。 - 是否需要完成 132 个延期文件的后续审计?
- 后续提示:以提交
461f4d72e75346eea3a25379c206d411f6e7f8aa为基线,先审计userland/apps/installer、userland/apps/settings、userland/libc/src/tar.c和kernel/ntclks/arch。 - 为优先完成高影响内核、认证、网络、HTTP 和浏览器链路,132 个文件尚未取得完整人工逐文件回执。
- 后续提示:审查延期单元
deferred-132-runtime-and-tool-files并补足其声明的证据缺口。路径:drivers/、kernel/ntclks/arch/、userland/apps/、userland/libc/src/、los2w/、tools/。审查表面:deferred-runtime-and-tools。