bpftrace "cannot open kprobe" 的 kernel.yama.ptrace_scope 与权限

发布时间 - 2026-01-31 00:00:00    点击率:
bpftrace报cannot open kprobe主因是yama.ptrace_scope限制非特权进程追踪内核符号;其值0-3逐级收紧权限,默认1仅允父子trace,而kprobe attach依赖perf_event_open等被yama拦截的机制。

为什么 bpftrace 报 cannot open kprobe 且跟 yama.ptrace_scope 有关

bpftrace 在 attach kprobe 时失败,核心原因是内核拒绝了对 kernel symbol 的动态追踪权限。这不是 bpftrace 自身 bug,而是 Yama LSM 模块通过 yama.ptrace_scope 限制了非特权进程对内核的 ptrace-style 访问——而 kprobe attach 底层依赖 ptrace(PTRACE_ATTACH) 或类似机制(如 perf_event_open 对 kernel text 的访问),会被该参数拦截。

yama.ptrace_scope 的四个取值和实际影响

该 sysctl 值控制谁可以 trace/attach 到其他进程或内核符号:

  • 0:经典模式,任何用户可 ptrace 同用户进程;但 仍禁止 attach kprobe/kretprobe(因涉及 kernel text)
  • 1(默认值):仅允许父进程 trace 子进程;bpftrace 启动后无法 attach 到任意 kernel function
  • 2:仅允许 CAP_SYS_PTRACE 权限的进程做 ptrace;普通用户运行 bpftrace 必然失败
  • 3:完全禁用所有 ptrace(包括 strace),kprobe 肯定不可用

注意:bpftrace 即使以 root 运行,在 ptrace_scope=1 下仍可能失败——因为它的 probe attach 不走传统 ptrace 流程,而是通过 perf_event_open + PROG_TYPE_KPROBE,而该路径在较新内核中也被 yama 拦截。

绕过限制的实操方式(按推荐顺序)

优先使用最小权

限方案,避免全局降级安全策略:

  • 临时放宽(调试用):sudo sysctl -w kernel.yama.ptrace_scope=0
  • 更安全的替代:用 sudo setcap cap_sys_ptrace+ep /usr/bin/bpftrace,再设 ptrace_scope=12,部分内核版本可生效(取决于 perf_event 和 bpf 权限联动逻辑)
  • 检查是否已启用 CONFIG_SECURITY_YAMAzcat /proc/config.gz | grep YAMA 或查 /boot/config-$(uname -r);若未启用,问题根源不在 yama
  • 确认 bpftrace 是否用了 --unsafe 模式:bpftrace --unsafe -e 'kprobe:do_sys_open { printf("hit\n"); }';某些发行版默认禁用 unsafe 操作

容易被忽略的兼容性细节

不同内核版本对 yama 和 bpf 的交互处理不一致:

  • Linux 5.8+ 引入了 bpf_kprobe_multi,部分绕过传统 kprobe 权限检查,但 bpftrace 默认不用它
  • Ubuntu/Debian 默认启用了 yama,CentOS/RHEL 7/8 默认也启用,但 RHEL 9+ 改为 opt-in(security=yama 需显式加到 kernel cmdline)
  • ptrace_scope=0 并不能解决所有 kprobe 失败——如果内核编译时关了 CONFIG_KPROBESCONFIG_BPF_KPROBE_OVERRIDE,照样报错

真正要确认是否是 yama 导致的问题,最直接的方法是:sudo sysctl kernel.yama.ptrace_scope 查当前值,再配合 dmesg -T | tail -10 看是否有 yama_ptrace_access_check 拒绝日志。


# linux  # centos  # access  # ubuntu  # ai  # 为什么  # printf  # symbol  # function  # bug  # debian  # 用了  # 这不是  # 中也  # 并不能  # 报错  # 不走  # 用它  # 关了  # 普通用户  # 不可用 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何确保FTP站点访问权限与数据传输安全?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  如何在万网主机上快速搭建网站?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  BootStrap整体框架之基础布局组件  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  网站制作价目表怎么做,珍爱网婚介费用多少?  Bootstrap整体框架之CSS12栅格系统  Laravel怎么清理缓存_Laravel optimize clear命令详解  如何快速完成中国万网建站详细流程?  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  如何在阿里云完成域名注册与建站?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  利用python获取某年中每个月的第一天和最后一天  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Laravel如何使用Service Container和依赖注入?(代码示例)  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  JS去除重复并统计数量的实现方法  在centOS 7安装mysql 5.7的详细教程  佛山企业网站制作公司有哪些,沟通100网上服务官网?  微信小程序 配置文件详细介绍  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  微信推文制作网站有哪些,怎么做微信推文,急?  高端企业智能建站程序:SEO优化与响应式模板定制开发  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  大学网站设计制作软件有哪些,如何将网站制作成自己app?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  android nfc常用标签读取总结  iOS验证手机号的正则表达式  Python文本处理实践_日志清洗解析【指导】  JavaScript如何实现路由_前端路由原理是什么  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  iOS正则表达式验证手机号、邮箱、身份证号等  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  长沙做网站要多少钱,长沙国安网络怎么样?  python中快速进行多个字符替换的方法小结  如何在阿里云购买域名并搭建网站?  Laravel如何实现事件和监听器?(Event & Listener实战)  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  如何用虚拟主机快速搭建网站?详细步骤解析  JavaScript Ajax实现异步通信  如何在阿里云虚拟服务器快速搭建网站?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  青岛网站建设如何选择本地服务器?