LWN: 允许非root用户访问bpf

Linux内核编译指南:从环境准备到性能优化 Linux内核作为操作系统的核心组件,其编译过程是系统管理员和开发者的重要技能。内核编译技术涉及工具链配置、源码获取、选项定制等关键环节,通过合理配置可以显著提升硬件兼容性和系统性能。在云计算和嵌入式领域,内核定制能优化资源利用率,例如针对特定CPU架构的调度器调优可带来5%以上的性能提升。实践中常见场景包括驱动开发(如WiFi6网卡支持)、实时系统构建(CONFIG_PREEMPT_RT配置)以及安全加固。Ubuntu等发行版虽然提供预编译内核,但手动编译能解决硬件兼容性问题,如Intel Arc显卡支持 阅读详情
640点击上方蓝色字关注我们~



Providing wider access to bpf()

By Jonathan Corbet
June 27, 2019


bpf()系统调用,可以供user space调用来加载BPF program到kernel进行执行,修改BPF map,以及其他一些BPF相关的功能。BPF program都是验证过的并且隔离在沙盒环境,不过客观来说这些program仍是运行在特权上下文,并且根据所加载的不同类型的program,能导致各种类型的担忧。因此,绝大多数BPF操作(包括加载各种类型的BPF program)都严格限制只有CAP_SYS_ADMIN权限的进程可以调用,通常也就意味着需要root权限。BPF program在很多场景下面都会有帮助,因此人们其实一直希望能有更多自由来使用bpf()。其中一个方向就是Song Liu提出的,在kernel里增加一个与众不同的安全策略。


这个方案描述起来很简单,就是创建了一个新的设备节点 /dev/bpf,核心想法是只要进程有权限打开/dev/bpf文件,就能使用sys_bpf()提供的绝大多数功能,不过作者所说的“绝大多数”一直没有详细解释。如果不是root用户,假如需要进行一些BPF操作,例如创建一个map、或者加载program,都需要首先打开这个/dev/bpf文件。然后通过ioctl()调用(BPF_DEV_IOCTL_GET_PERM)来对进程授权允许进行bpf()调用。今后可以通过调用BPF_DEV_IOCTL_PUT_PERM ioctl()来关闭这个授权。


在kernel内部对此功能的实现方式是在task_struct结构里面增加了一个新的bpf_flags。这个bit被置1就意味着允许使用BPF。不过这个patch的这部分实现还是可能会改变的,因为正如Daniel Borkmann指出,为了一个bit的信息来增加一个unsigned long成员变量,不是一个合理的方案。后面应该会改到其他地方来记录这个bit信息。


下一步就是增加一点逻辑来确定当前的进程是否能够进行BPF操作:


当前的kernel是通过检查CAP_SYS_ADMIN或者CAP_NET_ADMIN来判断是否有权限调用BPF功能的,在此patch合入之后就可以改为使用bpf_capable()来判断了。patch里面一开始说的用来管控“绝大多数”BPF功能,不过代码里面看来是把kernel/bpf下面的所有capable()调用都给替换成bpf_capable()了。

这样改动之后,系统管理员就能够创建一个新的名叫bpf的组,配置这个bpf group作为/dev/bpf文件的属主。后续/dev/bpf的访问权限会被配置成允许组成员进行读操作(使用ioctl()并不需要写操作权限),这样只要进程属于bpf group,就能够使用bpf()系统调用了。


需要注意的是,BPF能做到的事情可不仅仅局限在BPF虚拟机而已。例如,在tracepoint里面挂载一个BPF program,也需要tracing部分代码的配合;利用BPF来监控网络,也需要网络子系统的配合。这些子系统里面也会有一些权限检查,例如tracepoint的访问会需要有perf_event_open()权限,在某些系统上可能会控制得很严格。这组patch set没有修改这些权限检查代码,只有一个例外:在允许BPF访问的时候,会把BPF socket-filter program相关的限制去掉。


总之,这个patch在做的事情就是增加一个新的capability bit,并独立于Linux通常的capability check机制之外,允许任何能读/dev/bpf的进程打开或者关闭这个权限。这个新的capability主要用于BPF子系统,还有networking代码里的一处地方也有用到,很有可能今后会需要扩展到kernel的其他子系统里的相关部分。目前的实现还是跟kernel security model安全模型有点不太一致。

没有增加一个新的capability bit(例如CAP_SYS_BPF),是有客观原因的。目前的capability处理程序不知道这个新bit的含义,因此可能无法正确处理。不过,目前还不清楚这种采用另一种方法来实现capability bit的做法是不是真的有好处。

总有一天人们会需要能对BPF的功能有一些更细粒度的访问控制。好消息Linux security module (LSM)里面已经有了一些hook,适合实现这方面的底层支持。既然现在LSM有了越来越多的应用,加强了系统管理员在kernel的security policy方面的管控,那么为什么不利用基于LSM的方式来实现这个管控呢?对这方面做一些探索,可能可以更好的帮助这个patch set更加通用,不局限于BPF部分,从而得到更好的review。


全文完

LWN文章遵循CC BY-SA 4.0许可协议。

极度欢迎将文章分享到朋友圈 
热烈欢迎转载以及基于现有协议上的修改再创作~


长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~


640?wx_fmt=jpeg

BPF初探 - Android中BPF运用实例 本文主要介绍在Android中对BPF的使用及其解析,参考Android 7.1源码 注:阅读本文需要一定的网络协议基础 参考文章:https://www.freebsd.org/cgi/man.cgi?query=bpf&sektion=4&manpath=FreeBSD+4.7-RELEASE 什么是BPF   伯克利包过滤器(Berkeley Pack... 阅读详情

相关推荐

K8s认证文件丢失的应急处理与恢复策略

本文详细介绍了Kubernetes(K8s)认证文件丢失时的应急处理与恢复策略。从快速诊断问题范围到不同场景的临时解决方案,再到深度恢复方案(无损重建、部分重置、完全重建),提供了全面的操作指南。同时强调了生产环境中的防丢失设计、高可用集群的特殊处理以及日常运维建议,帮助运维人员有效应对认证文件丢失的紧急情况。

weixin_33743248的博客 327

深入理解 BPF map 实现机制

在 BPF 程序中可以通过声明 `struct bpf_map_def` 结构完成创建,这其实带给我们一种错觉,感觉这和普通的 C 语言变量没有区别,然而事实真的是这样的吗? 事情远没有这么简单,读完本文以后相信你会有更大的惊喜。

dwh0403的专栏 2222

钣金件设计规范

为保证折弯 强度,钣金折弯钣金应大于材料的最小折弯半径。在设计U型弯曲件时,两弯曲边最好长度相等,以免弯曲时产品偏 移而产生废品,如果因为结构设计不允许两边一样长,为保证产品在模 具中准确定位,应预先在设计时添加工艺定位孔,特别是多次折弯成 形的零件,必须设计工艺孔为定位基准,以减少累计误差,保证产品 质量,如图2-11所示。凸包是依靠材料的延伸使钣金件形成局部凹陷或凸起的冲压工序凸包与拉深是完全不同的冲压工艺,凸包中材料厚度的改变为费意图性 的,即厚度的少量改变是变形过程中形成的,不是设计指定的要求。

制冷技术咨询与服务的博客 7319

《TCP/IP详解卷2:实现》笔记--BPF:BSD 分组过滤程序

BSD分组过滤程序(BPF)是一种软件设备,用于过滤网络接口的数据流,即给网络接口加上开关。应用进程打开/dev/bpf0、 /dev/bpf1等等后,可以读取BPF设备,每个应用进程一次只能打开一个BPF设备。 通过若干ioctl命令,可以配置BPF设备,把它与某个网络接口相关联,并安装过滤程序,从而能够选择性地接收输入的分组。 BPF设备打开后,应用进程通过读写设备来接收分组,或将分组放

TODD911的专栏 3715

metahuman 下载材质 脸部灰白 脸部过亮

metahuman 下载材质 脸部灰白 脸部过亮

jacke121的专栏 243

Dify之八添加各种在线大模型

Dify之八添加各种在线大模型

yilvyangguang520的博客 938

ebpf分析

用户态可以通过调用 sys_bpf() 系统调用把 eBPF 程序加载到内核,而 sys_bpf() 系统调用会通过调用 bpf_prog_load() 内核函数加载 eBPF 程序。由于 eBPF 程序运行在内核态,所为了安全,eBPF 程序中不能随意调用内核函数,只能调用 eBPF 提供的辅助函数(helper functions)。上述指定的函数(BPF_FUNC_trace_printk)需要重定向要内核函数。用户态 -> 系统调用 -> sys_bpf -> bpf_prog_load。

u014448419的博客 455

基于Cesium实现,动态水面+大坝排水动画

一、绘制面状水域,使用水波纹理,进行渲染,水体透明,可以看到底色。三、使用粒子系统,将喷泉改变方向,加上重力设置,实现排水动画。二、绘制线状三维体,用作模拟大坝拦截效果。四、最后,模拟水位上升,进行淹没分析,

一醉千秋的专栏 1418

bpf系统调用及示例

BPF系统调用是Linux内核中用于操作eBPF子系统的统一接口,支持创建映射、加载程序、附加程序等多种操作。它通过cmd参数指定具体功能,使用bpf_attr联合体传递参数,成功时返回文件描述符或状态值。BPF广泛用于网络编程、系统监控、安全审计等领域,通常配合libbpf库或bpftool等工具使用,直接调用较为复杂。

悟空看八戒烤熟了没的专栏c)4Upqt4SeVk 1440

学Simulink——基于Simulink的输入-输出线性化精确转矩控制

本文详细介绍了基于Simulink的永磁同步电机(PMSM)输入-输出线性化(IOL)精确转矩控制方法。针对传统解耦控制在非线性转矩特性下的局限性,提出通过精确反馈线性化实现转矩指令与实际转矩的严格线性关系。文章系统阐述了IOL原理、PMSM控制器推导过程,并提供了完整的Simulink建模步骤,包括电机模型搭建、IOL控制器实现和闭环系统构建。通过仿真对比验证了IOL方法在转矩跟踪精度、动态响应和参数鲁棒性方面的显著优势,最后讨论了工程实现要点和扩展应用方向。该方法为高性能伺服系统开发提供了有效解决方案。

amy_mhd的博客 59

026:vue+threeJS 设置地面铺砖的效果

BoxGeometry 是 Three.js 中用于创建立方体或长方体的几何体类。它允许你指定立方体的宽度、高度、深度以及这三个方向上的分段数,从而控制立方体的细分程度。width: 立方体的宽度(沿 x 轴方向)。height: 立方体的高度(沿 y 轴方向)。depth: 立方体的深度(沿 z 轴方向)。widthSegments: 可选参数,指定立方体在 x 轴方向上的分段数,默认值为 1。heightSegments: 可选参数,指定立方体在 y 轴方向上的分段数,默认值为 1。

大剑师兰特的GIS世界 645

iptrace占用/dev/bpf0导致tcpdump报 BIOCSETIF: en1: Do not specify an existing file

iptrace占用/dev/bpf0导致tcpdump无法访问/dev/bpf0而报错。 在aix下可以用truss tcpdump看见在访问/dev/bpf0时报errno=EEXIST #define EEXIST  17      /* File exists                          */ 用下面2步解决问题:1)找到iptrace的pi

zlhg的专栏 4453

把 SAP 配置当成一张地图:用 IMG 把实施、变更与治理串成一条清晰的路

摘要 SAP IMG(Implementation Guide)是SAP实施的核心导航体系,它将客户需求转化为系统配置,提供结构化路径和文档化支持。IMG不是简单的菜单树,而是包含业务落地路径、标准化配置活动和文档化知识的实施语言。通过三种视图(Reference、Enterprise、Project)解决不同管理问题,其中Project IMG尤其重要,可管理项目范围、分工和进度。实际工作中应通过SPRO事务码访问IMG,将探索与执行分开管理。案例显示,跨国企业通过Project IMG可有效控制组织架构

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 228

LWN:若干新增的capability!

关注了就能看到更多这么棒的文章哦~A crop of new capabilitiesByJonathan CorbetJune 8, 2020原文来自:https://lwn.net...

Linux News搬运工 1112

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

LWN: 配置lockdown security module

点击上方蓝色字关注我们~Lockdown as a security moduleByJonathan CorbetJune 24, 2019像UEFI secure ...

Linux News搬运工 1063

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LWN: 名为 Sequoia 的 seq_file 漏洞!

关注了就能看到更多这么棒的文章哦~The Sequoia seq_file vulnerabilityBy Jake EdgeJuly 21, 2021DeepL assisted tra...

Linux News搬运工 310

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Mac平台scapy安装遇到的坑——找不到/dev/pbf*

遇到了一个问题,说是找不到/dev/bpf文件,仔细搜索,网络上方法千千万,分享一下避免大家踩坑。 正确的方法是先去看看/dev文件夹下是否有bpf文件,也许是bpf1、bpf2等,然后 sudo chgrp admin /dev/bpf* sudo chmod g+rw /dev/bpf* 然后就可以了,猜测估计是权限不足导致读取不到。...

qq_34319090的博客 2305

mount远程目录并让本地非root用户可读可写

远程与本地是两台linux机器,要实现如题效果,传统的nfs的mount方式虽然简单方便却不行 nfs的方式: sudo mount -t nfs  -o rw 192.168.0.xx:/path  /mnt/test 在本地你会发现/mnt/test下的文件用户为nobody,普通用户可以读,但是非root用户写不了(不用sudo不用su), 有的人想通过改/etc/fstab 或者远

zmlovelx(帅得不敢出门 程序员群31843264) 2万+

QNX系统上用Berkeley Packet Filter直接进行原始数据的收发

这次我们讲的是在QNX系统上直接操作网络的数据链路层进行原始数据包收发的过程,即通过Berkeley Packet Filter我们可以绕过TCP/IP并且收发自己定义的协议。 在QNX系统的帮助文档上,很明确的写到:即伯克利包过滤语言通过网络接口提供数据链路层的数据的访问通道,具体实现步骤为: 1、打开 BPF 设备(即向系统声明使用BPF设备)/* using BPF device */ ch...

zjy900507的博客 1540

操作系统实验三:基于BPF机制的系统跟踪与探测

eBPF 的基本原理——它所有的接口都是通过 BPF 系统调用来跟内核进行交互,eBPF 程序通过 LVM 和 Cline 进行编译,产生 eBPF 的字节码,通过 BPF 系统调用,加载到内核,验证代码的安全性,从而通过 JIT 实时的转化成 Native 的 X86 的指令。Kernel Module的主要目的就是让用户可以通过这种机制,实现对内核的“赋能”,动态添加一些内核本身不支持的功能,比如硬件的驱动能力,新的文件系统或是系统调用。eBPF 是一个在内核中运行的虚拟机,它可以去运行用户。

XLYcmy的博客 1595

bpf的加载流程分析

分析load_bpf_file函数

大草的博客 3521

BPF自己写过滤包程序

BPF:Berkeley Packet Filter  Linux下过滤程序如何编写,以及网络封包结构温习

maeom的专栏 1万+

可以在函数中间打点了,以分析bpf_prog_load函数为例

可以在函数中间打点了, sudo stap -L 'process("./test").statement("func@test.c:10")' //12.10更新 查看我内核中 bpf_prog_load 到底是位于哪一行,那么执行: sudo sta -L 'kernel.statement("bpf_prog_load")',可以得到: kernel.statem...

weixin_30590285的博客 863

BPF虚拟文件系统是干什么的,以及它的作用

BPF最基本的的特征是基于文件描述符的映射,这意味着,当文件描述符关闭之后,这个map中的其他信息都会丢失。BPF的map是用于很短暂的隔离程序,他们不会share信息。随着时间的发展,开发人员需要保存Map中的信息,即使是相关的文件描述符已经关闭了。kenerl4.4引入了两个syscall,允许bpf程序从虚拟文件系统固定和获取map。固定到此文件系统的Maps和BPF程序将在创建它们的程序终止后仍然保留在内存中。 BPF默认的虚拟文件路径是在/sys/fs/bpf下,陪你可以使用下面的命令挂载虚拟文件

zhjwang的博客 5190

揭秘 BPF map 前生今世

1. 前言众所周知,map 可用于内核 BPF 程序和用户应用程序之间实现双向的数据交换, 为 BPF 技术中的重要基础数据结构。在 BPF 程序中可以通过声明 struct bpf_ma...

云原生实验室 691

ebfp编程常用API介绍

目录 1 用户态API 1.1 加载prog 1.2 查询prog的信息 1.3 prog绑定到固定的dev上 1.4 创建MAP 1.5查询MAP 1.6 Object Pinning(钉住对象) 2 内核态API 2.1 内核总体API 2.2 bpf 加载 2.2.1 prog 加载 2.3 bpf map 操作 2.3.1 map 创建 2.3.2 map 查找 2.3.3BPF_FUNC_map_lookup_elem 2.4 obj pin(盯住对象) 2...

魏言华的博客 2834
上一篇: LWN: 最新的I/O带宽仲裁算法io.weight
下一篇: LWN:OpenPGP certificate flooding攻击
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值