Skip to content

fix(starry-kernel): support IPv4 ping syscall paths - #1896

Merged
ZR233 merged 3 commits into
rcore-os:devfrom
yueneiqi:fix/starry-syscall-compat-20260806
Aug 9, 2026
Merged

fix(starry-kernel): support IPv4 ping syscall paths#1896
ZR233 merged 3 commits into
rcore-os:devfrom
yueneiqi:fix/starry-syscall-compat-20260806

Conversation

@yueneiqi

@yueneiqi yueneiqi commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

问题

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_GETROUTE dump 请求。
  • 返回 IPv4 主路由表中的默认路由。
  • 编码 RTA_GATEWAYRTA_OIFRTA_PRIORITYRTA_PREFSRC 属性。
  • 使用 multipart 响应并以 NLMSG_DONE 结束。

ICMP ping socket

  • 为 raw socket 后端增加独立的 ICMP datagram 模式。
  • SO_TYPE 对 ping socket 返回 SOCK_DGRAM
  • 接收时去除 IPv4 头,仅向用户态交付 ICMP 数据。
  • 支持 IP_RECVTTL,并通过 recvmsg 返回类型为 IP_TTL 的 32 位控制消息。
  • 当前 StarryOS 尚未建模 ping_group_range,因此暂时沿用现有 CAP_NET_RAW 权限边界,避免无条件放宽 ICMP socket 权限。

KEEP_CAPS 凭据语义

  • 在每线程凭据中保存 keep-caps 状态。
  • 实现 PR_GET_KEEPCAPSPR_SET_KEEPCAPS
  • PR_SET_KEEPCAPS 仅更新调用线程的凭据,不向同进程 sibling 线程传播。
  • 进程范围 setxid 同步时,每个目标线程从自己的旧凭据派生 capability transition,保留各自线程私有的 keep-caps 状态。
  • setuid 离开 root UID 时,在启用 keep-caps 的情况下保留 permitted capabilities,同时清空 effective 和 ambient capabilities。
  • exec 成功跨过不可回退点后清除 keep-caps;exec 失败时保持调用者状态不变。

实现逻辑

路由消息在 StarryOS 的 netlink 层生成;ICMP 数据面能力放在可复用的 ax-net socket 后端,syscall 层只负责 Linux ABI 编解码;KEEP_CAPS 状态与 UID/capability 转换集中在凭据对象中,并由 prctl、setuid 和 exec 路径调用。其中 prctl 使用明确的线程局部凭据更新入口;setuid 等进程凭据 syscall 仍同步统一的 UID/GID,但会对每个目标线程分别读取旧凭据并应用 capability 规则,避免复用调用线程的 keep-caps 快照。

验证

原始功能提交已完成:

  • cargo fmt --all -- --check
  • cargo xtask clippy --package ax-net
  • cargo xtask clippy --package starry-kernel
  • cargo xtask sync-lint --since upstream/dev
  • cargo xtask starry test qemu --arch aarch64 -c qemu/system/bugfix-bug-prctl-keepcaps
  • cargo xtask starry test qemu --arch aarch64 -c qemu/system/c-regression-test-icmp-ping-socket
  • cargo xtask starry test qemu --arch aarch64 -c qemu/system/c-regression-test-netlink-rtnetlink

#1907 合并后,本分支已继续重放到最新 dev343d47f4),并追加 review 修复,当前 head 为 4edabbd13。重放时保留了最新的网络 socket 选项、凭据、地址空间切换及后续基础分支改动,并完成:

  • pinned nightly-2026-07-15 rustfmt 检查(全部 10 个 Rust 改动文件)
  • 无冲突标记与 git diff --check 检查
  • GitHub Git tree/parent/16 个改动文件及统计校验
  • 与上一版重放结果的 stable patch ID 一致
  • 上一轮组织 CI中,四个 StarryOS QEMU 架构、clippy、格式、sync-lint 与 std 测试均通过;Axvisor aarch64 axtest 的 touch_preserves_content_and_updates_times 失败与未修改的基础提交 CI 完全相同,均为 35 通过、1 失败,不是本 PR 引入
  • 重放后的组织 CI已全部通过

针对第一轮 review 提出的线程局部设置语义问题:

  • 修复前运行 cargo xtask starry test qemu --arch aarch64 -c qemu/system/bugfix-bug-prctl-keepcaps,新增 sibling-thread 回归稳定失败:sibling 读到 keepcaps=1,结果为 10 通过、1 失败。
  • 修复后运行同一命令,sibling 的 PR_GET_KEEPCAPS 保持为 0,且其 setuid capability transition 不受调用线程影响,结果为 11 通过、0 失败。
  • cargo xtask clippy --package starry-kernel:25/25 个配置通过,0 失败。
  • 本轮组织 CI:37 项成功、37 项按条件跳过;Starry 四架构 QEMU、clippy、std、格式与 lint 全部通过。唯一失败为未修改的 Axvisor ovmf-acpi-vmx 在 guest 启动后等待 600 秒超时;上一轮相同 job 已通过。

针对第二轮 review 指出的跨线程 setuid 覆盖 keep-caps 问题:

  • 修复前运行同一 StarryOS QEMU 用例,新增“A 设置、B setuid、A 仍读到 1”的断言稳定失败:控制线程读到 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 -- --checkgit diff --check 通过。

@yueneiqi
yueneiqi force-pushed the fix/starry-syscall-compat-20260806 branch 3 times, most recently from cb138a9 to 3a2541e Compare August 7, 2026 08:20
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.
@yueneiqi
yueneiqi force-pushed the fix/starry-syscall-compat-20260806 branch from 3a2541e to c4a2242 Compare August 7, 2026 09:37
@yueneiqi
yueneiqi marked this pull request as ready for review August 7, 2026 12:01

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本 PR 为 StarryOS 增加 IPv4 ICMP ping SOCK_DGRAMIP_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);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

严重性:阻塞。PR_SET_KEEPCAPS 的 keep-caps 标志按 Linux prctl(2) 语义是线程私有的;这里却调用了会遍历进程全部线程的 Thread::set_cred。因此线程 A 设置该标志会改变线程 B 后续 setuid 时是否保留 permitted capabilities,形成错误的跨线程权限状态传播。请改用仅替换当前线程凭据的路径,并补充多线程回归用例验证兄弟线程的标志不受影响。

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本 PR 为 StarryOS 补充 IPv4 ICMP SOCK_DGRAMIP_RECVTTLRTM_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-reviewgit 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 {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

严重性:阻塞。这里的 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”的回归用例。

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本 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_FAILEDfail_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 --checkgit 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

@ZR233
ZR233 merged commit 908517c into rcore-os:dev Aug 9, 2026
75 checks passed
This was referenced Aug 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants