记(寄)录

写 15445 的时候发现 clang-14 以上编译 fmt 会报错(arch 包太新了导致的),因此在 debian12 的 docker 中挂载 host 文件夹开发。用 lldb debug 时在出现 exception 或 signal后 lldb 会报错 A packet returned an error 8 并退出进程,导致无法 backtrace,但是 gdb 没事。
原因是因为 lldb debug 用的 syscall ptrace 在 docker 中被限制了,解决方法是在 docker run 时加上 --cap-add=SYS_PTRACE --security-opt seccomp=unconfined 参数。
Problem on stack overflow

Docker 小知识

  • Linux capabilities: Docker 关于 Linux capabilities 的章节。这个是用来限制容器权限的,可以看到默认情况下 "SYS_PTRACE Trace arbitrary processes using ptrace(2)."是被禁用的,然后 lldb 就寄了(
  • Secure computing mode(Seccomp): 这是 Linux 内核的一个 feature,用于控制计算时的行为安全。Docker 默认的 profile 禁用了大约 44 个 syscall, ptrace 位列其中。通过 --security-opt seccomp=unconfined 来关闭这个 profile(图省事的不安全做法),正确的是改默认 profile 来自定义一个profile。然而我懒,就这样了。

ptrace 怎么不安全了

Docker 官方文档:

  • Blocked in Linux kernel versions before 4.8 to avoid seccomp bypass.
  • Tracing/profiling arbitrary processes is already blocked by dropping CAP_SYS_PTRACE, because it could leak a lot of information on the host.

上 NVD 搜了一圈,好多文档都写的禁止使用 ptrace, debugger 和 strace(used to trace syscal),但是没说为啥。cgroup 和 namespace 不是已经隔离了吗,等哪天有空查到再研究下。

为什么 GDB 没事

TODO: 找了半天资料没找到,gdb internals 偏偏这一章是咕咕的,先洗洗睡了。