在 Ubuntu 24.04 上使用 Codex CLI 时,可能会看到如下提示:
1 | ⚠ Codex's Linux sandbox uses bubblewrap and needs access to create user namespaces. |
系统中已经安装了 bubblewrap,但进一步测试:
1 | which bwrap |
仍会出现错误:
1 | bwrap: loopback: Failed RTM_NEWADDR: Operation not permitted |
原因
Codex 在 Linux 上优先使用系统的 /usr/bin/bwrap。
Ubuntu 24.04 默认启用了 AppArmor 针对 unprivileged user namespaces 的限制策略,而 bwrap 在创建 sandbox 时需要完成 namespace 与 loopback 相关初始化,因此会在该阶段失败。
不建议采用的处理方式
一个直接的办法是关闭全局限制:
1 | sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 |
这样虽然可能立即恢复正常,但代价是将整台机器这一层防护一并关闭。对单个 CLI 工具而言,这种处理方式并不合适。
较为稳妥的处理方式
更合理的做法,是为 bwrap 配置专用的 AppArmor profile:bwrap-userns-restrict。
可直接执行以下命令:
1 | sudo apt update |
如果最后一条命令执行成功,问题通常已经解决。
验证
可以通过以下命令确认当前状态:
1 | which bwrap |
若 which bwrap 输出为 /usr/bin/bwrap,对应 profile 已加载,且 codex sandbox linux /bin/true 可以正常执行,说明配置已经生效。
额外加固
另一个相关参数是:
1 | kernel.apparmor_restrict_unprivileged_unconfined |
一些系统上的默认值是 0。
这个参数与本文中的 Codex 报错没有直接关系,因此不调整也可以完成修复。
若希望进一步增强限制策略,可以设为 1:
1 | echo "kernel.apparmor_restrict_unprivileged_unconfined=1" | sudo tee /etc/sysctl.d/10-apparmor-hardening.conf |
此操作属于额外的加固,并非本次修复所必需。
可能的其他影响
加载 bwrap-userns-restrict 后,系统上所有经由 /usr/bin/bwrap 启动的程序都会受其约束——最常见的就是 Flatpak 应用。apparmor_parser -r 重载 profile 后,已经在运行的 Flatpak 进程不会自动应用新策略,建议重启受影响的应用。
unpriv_bwrap 子 profile 的 audit deny capability 拒绝了所有 Linux capabilities。除了上述提到 Flatpak 保存问题外,其他 Flatpak 应用如果在沙箱内需要特定 capability,也可能出现功能异常且无明显报错。
排查方式:
1 | sudo dmesg | grep -i apparmor | tail -20 |
若有对应的 deny 记录,在 /etc/apparmor.d/local/unpriv_bwrap 中补上所需的 capability 并重载即可。