fix(starry-kernel): support IPv4 ping syscall paths - #1896
Conversation
cb138a9 to
3a2541e
Compare
Add IPv4 default-route dumps, ICMP datagram ping sockets, and IP_RECVTTL ancillary data required by Linux ping tooling. Implement PR_SET_KEEPCAPS credential transitions and exec reset semantics, with deterministic StarryOS QEMU regressions for each syscall path.
3a2541e to
c4a2242
Compare
There was a problem hiding this comment.
本 PR 为 StarryOS 增加 IPv4 ICMP ping SOCK_DGRAM、IP_RECVTTL、RTM_GETROUTE 回复,以及 PR_{GET,SET}_KEEPCAPS 与对应的 QEMU 回归用例。网络 socket 与 netlink 改动主要隔离在 ax-net/Starry syscall 边界;但 keep-caps 的线程语义会影响同一进程内的权限状态,当前仍有一个阻塞问题。
验证:组织当前 head 的 CI 为 completed 75 项(success 38、skipped 37、failure 0),其中 Starry QEMU、格式和 clippy 已通过;按要求未重复本地 QEMU。本地执行 git diff --check origin/dev...HEAD 通过,并确认 system 根 CMake 会发现新增 C 子用例、失败包装器会返回非零。未发现既有 review/issue 评论;检查的 base 实现未含相同功能,未发现明确的开放 PR 重叠证据。
book/guideline/feature-development.md 适用:这是共享的 Starry syscall/网络能力扩展;PR 描述了用户场景、实现分层和验证,但下述 ABI 偏差必须先修复。新增测试已位于 test-suit/starryos/qemu/system,可由现有 grouped runner 选择并安装;不过 keepcaps 测试缺少可发现线程范围错误的多线程断言。
未解决问题见行内评论。修复后请补充 sibling-thread 场景,验证线程 A 的 PR_SET_KEEPCAPS 不改变线程 B 的 PR_GET_KEEPCAPS 或其 setuid capability transition。
Powered by gpt-5.6-terra
| let thread = thread_ref.as_thread(); | ||
| let mut new = (*thread.cred()).clone(); | ||
| new.set_keep_capabilities(arg2 != 0); | ||
| thread.set_cred(new); |
There was a problem hiding this comment.
严重性:阻塞。PR_SET_KEEPCAPS 的 keep-caps 标志按 Linux prctl(2) 语义是线程私有的;这里却调用了会遍历进程全部线程的 Thread::set_cred。因此线程 A 设置该标志会改变线程 B 后续 setuid 时是否保留 permitted capabilities,形成错误的跨线程权限状态传播。请改用仅替换当前线程凭据的路径,并补充多线程回归用例验证兄弟线程的标志不受影响。
There was a problem hiding this comment.
本 PR 为 StarryOS 补充 IPv4 ICMP SOCK_DGRAM、IP_RECVTTL、RTM_GETROUTE,以及 PR_{GET,SET}_KEEPCAPS 与 system QEMU 回归用例。网络数据面位于 ax-net,syscall 层负责编解码,整体分层清楚;但 keep-caps 与进程范围 setxid 同步的组合仍会破坏线程私有状态,因此不能合入。
feature-development.md 适用:这是共享的 Starry syscall/网络 ABI 扩展。base 未包含等价实现;以 ICMP、keepcaps、RTM_GETROUTE 搜索开放 PR 仅命中本 PR,未发现重复或依赖冲突。影响面主要是 StarryOS 的 raw/ping socket、rtnetlink 和凭据转换,网络实现与其他 socket 类型基本隔离,但凭据错误会影响多线程进程的权限语义。
验证:当前 head 的组织 CI 共 75 项,37 成功、37 按矩阵条件跳过、1 项 Axvisor OVMF 超时;该失败不触及本 PR 的 Starry 网络/凭据路径,PR 描述也给出同 job 的波动证据。Starry QEMU、格式和 clippy 的相关 CI 已通过,按要求未重复运行 QEMU/clippy。本地 prepare-review、git diff --check origin/dev...HEAD 均通过;以 system 根 CMake 选择两个新增 subcase 配置和构建通过,确认目录布局可由 grouped runner 发现。
上一轮针对 PR_SET_KEEPCAPS 直接调用进程范围 set_cred 的评论是合理的;本 head 使用 set_thread_cred 修复了“设置动作立即传播给 sibling”的问题,也加入了 sibling 测试。但现有测试没有覆盖 sibling 执行 setuid 后是否仍保留控制线程的线程私有标志,故仍有以下未解决阻塞问题。
请先修复行内问题并补充跨线程 setuid 回归。除该问题外,未发现额外的测试布局、发现或失败传播缺口。
Powered by gpt-5.6-terra
| if old_all_root && new_all_nonroot { | ||
| self.cap_permitted = 0; | ||
| self.cap_effective = 0; | ||
| if old_has_root && new_all_nonroot { |
There was a problem hiding this comment.
严重性:阻塞。这里的 capability transition 仍只基于发起 setuid 线程的 old.keep_capabilities 计算一个 Cred,随后 Thread::set_cred 将同一个快照写入进程全部线程。因而线程 A 设置 PR_SET_KEEPCAPS=1 后,线程 B(标志为 0)执行 setuid 会把 A 的标志也静默清为 0;反向场景则会错误保留。PR_SET_KEEPCAPS 的设置是线程私有的,不能随进程范围的 setxid 同步被覆盖。请按每个目标线程原有的 keep-caps 状态分别派生凭据,或将该状态移出共享的 setxid 快照;并补充“A 设置、B setuid、A 仍读到 1”的回归用例。
There was a problem hiding this comment.
本 PR 为 StarryOS 补充 IPv4 ICMP SOCK_DGRAM ping、IP_RECVTTL 辅助数据、RTM_GETROUTE 默认路由 dump,以及 PR_{GET,SET}_KEEPCAPS 的凭据转换与回归覆盖。实现将 ping/raw 数据面放在 ax-net,syscall 层负责 Linux ABI 编解码;setxid 按每个线程原有 keep-caps 状态派生凭据,避免覆盖线程私有标志,改动与现有 socket/credential 边界一致。
book/guideline/feature-development.md 适用:这是共享的 Starry syscall/网络 ABI 扩展;PR 描述了目标场景和分层,风险集中在网络 ABI 与多线程凭据语义。影响面为 Starry raw/ping socket、rtnetlink 和 capability transition;未见不相关层的契约变化。新增 system 用例位于根 CMake 可发现的标准布局,已确认会构建并安装;组级 STARRY_GROUPED_TEST_FAILED 与 fail_regex 保持失败传播。
已核对两条历史阻塞意见:当前 head 使用 set_thread_cred 保持 PR_SET_KEEPCAPS 的线程私有性,且 update_process_creds 对每个线程的旧凭据独立应用 setxid capability 规则;新增多线程 QEMU 回归覆盖 sibling 读取与 sibling setuid 后控制线程状态,意见已解决。
验证:组织当前 head CI 75 项均已完成(success 38、按条件 skipped 37、failure 0),相关 Starry QEMU、clippy、格式和 lint 均成功;按要求未重复完整本地 CI/QEMU。局部执行 cargo fmt --check、git diff --check origin/dev...HEAD、review helper 验证均通过;以根 CMakeLists.txt 选择三个受影响 system 子例并完成 CMake 编译通过。未引入 [patch.crates-io]。基线未含等价功能;以 ax-net raw、Starry netlink、keepcaps 等关键词检索开放 PR,未发现重复、依赖或冲突。
无未解决阻塞问题、测试布局缺口或已知环境限制,批准合入。
Powered by gpt-5.6-terra
问题
StarryOS 尚未完整实现常见 IPv4 路由与 ping 工具依赖的 Linux syscall ABI:
NETLINK_ROUTE不处理RTM_GETROUTE默认路由转储。socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP)缺少 ping socket 语义,无法正确报告SO_TYPE,也不能通过IP_RECVTTL返回 TTL 控制消息。PR_GET_KEEPCAPS/PR_SET_KEEPCAPS,setuid 与 exec 路径也缺少对应的 capability 转换。这些缺口会使依赖标准 Linux ABI 的路由查询和 ICMP 工具无法正常工作。
改动
rtnetlink 默认路由
RTM_GETROUTEdump 请求。RTA_GATEWAY、RTA_OIF、RTA_PRIORITY和RTA_PREFSRC属性。NLMSG_DONE结束。ICMP ping socket
SO_TYPE对 ping socket 返回SOCK_DGRAM。IP_RECVTTL,并通过recvmsg返回类型为IP_TTL的 32 位控制消息。ping_group_range,因此暂时沿用现有CAP_NET_RAW权限边界,避免无条件放宽 ICMP socket 权限。KEEP_CAPS 凭据语义
PR_GET_KEEPCAPS和PR_SET_KEEPCAPS。PR_SET_KEEPCAPS仅更新调用线程的凭据,不向同进程 sibling 线程传播。实现逻辑
路由消息在 StarryOS 的 netlink 层生成;ICMP 数据面能力放在可复用的
ax-netsocket 后端,syscall 层只负责 Linux ABI 编解码;KEEP_CAPS 状态与 UID/capability 转换集中在凭据对象中,并由 prctl、setuid 和 exec 路径调用。其中 prctl 使用明确的线程局部凭据更新入口;setuid 等进程凭据 syscall 仍同步统一的 UID/GID,但会对每个目标线程分别读取旧凭据并应用 capability 规则,避免复用调用线程的 keep-caps 快照。验证
原始功能提交已完成:
cargo fmt --all -- --checkcargo xtask clippy --package ax-netcargo xtask clippy --package starry-kernelcargo xtask sync-lint --since upstream/devcargo xtask starry test qemu --arch aarch64 -c qemu/system/bugfix-bug-prctl-keepcapscargo xtask starry test qemu --arch aarch64 -c qemu/system/c-regression-test-icmp-ping-socketcargo xtask starry test qemu --arch aarch64 -c qemu/system/c-regression-test-netlink-rtnetlink#1907 合并后,本分支已继续重放到最新
dev(343d47f4),并追加 review 修复,当前 head 为4edabbd13。重放时保留了最新的网络 socket 选项、凭据、地址空间切换及后续基础分支改动,并完成:nightly-2026-07-15rustfmt 检查(全部 10 个 Rust 改动文件)git diff --check检查touch_preserves_content_and_updates_times失败与未修改的基础提交 CI 完全相同,均为 35 通过、1 失败,不是本 PR 引入针对第一轮 review 提出的线程局部设置语义问题:
cargo xtask starry test qemu --arch aarch64 -c qemu/system/bugfix-bug-prctl-keepcaps,新增 sibling-thread 回归稳定失败:sibling 读到keepcaps=1,结果为 10 通过、1 失败。PR_GET_KEEPCAPS保持为 0,且其setuidcapability transition 不受调用线程影响,结果为 11 通过、0 失败。cargo xtask clippy --package starry-kernel:25/25 个配置通过,0 失败。ovmf-acpi-vmx在 guest 启动后等待 600 秒超时;上一轮相同 job 已通过。针对第二轮 review 指出的跨线程 setuid 覆盖 keep-caps 问题:
keepcaps=0,结果为 10 通过、1 失败。PR_GET_KEEPCAPS保持为 1,permitted capabilities 保持不变,effective capabilities 按 setuid 规则清零;结果为 11 通过、0 失败。cargo xtask clippy --package starry-kernel:25/25 个配置通过,0 失败。cargo fmt --package starry-kernel -- --check与git diff --check通过。