LWN: 对BPF tracing进行类型检测

libbpf 开发指南:获取bpf_object 关联的 BTF(BPF Type Format)信息与文件描述符 做最好的bpf教程 阅读详情

点击上方蓝色“Linux News搬运工”关注我们~

Type checking for BPF tracing

By Jonathan Corbet
October 28, 2019

原文来自:https://lwn.net/Articles/803258/

译者注:

  1. LWN评论中有一位SystemTap的忠实拥簇在抱怨新的这些tracing工具都不能很好的支持user space tracing。

  2. 一位评论者说:所以kernel真的在做一个自己专有的编程语言了?Cyberax回复说:“是的没错,只要加上无限循环的支持,就能跟javascript相媲美了”。。。

BPF在内核里的虚拟机(The BPF in-kernel virtual machine)给内核中其他很多功能模块带来了不少新功能,尤其是对于tracing模块来说。BPF program运行在kernel里,因此需要采取多种措施来确保别导致系统运行中出错,因此BPF verifier会检查每个BPF program的方方面面来确保可以信赖它在kernel运行,不过这里仍有一个漏洞。最近Alexei Starovoitov提出了一组名为“变革bpf tracing”的patch,希望能补上漏洞,消除一类广泛使用的BPF program中的潜在问题。

BPF在tracing应用程序中有密集的使用,目的是从kernel中取得有价值的信息,并且在kernel space来进行data aggregation(数据聚合)。主要有两种变种:如果在kernel里我们关注的位置本身已经有了一个tracepoint,那么可以直接把BPF program挂在这个位置;另外一种情况,就是需要把kprobe放在kernel中任意的位置(仍有例外)用来触发BPF program。在这两种情况下,目前的BPF verifier都对传递给BPF program的数据具体是什么所知甚少。

那么我们考虑这么一种情况,假如有一个trace_kfree_skb tracepoint放在了net_tx_action()中,当这个tracepoint触发的时候,会有两个指针传递给被触发的处理函数(例如BPF program),一个指针是sk_buff结构,放置着所关心的网络数据包,另一个指针指向正在释放这个数据包的函数。这两个指针具体是什么类型的,这个信息并没有得到传递,BPF program只能看到是两个64-bit unsigned int类型的数字。要想访问kernel的对应数据,就先要把整型数字转成相应类型的指针,然后利用bpf_probe_read()之类的helper函数来把指针指向的数据读取出来。可能需要多次调用bpf_probe_read()来把数据结构内部的感兴趣数据读取出来,供tracing program使用。

这里有个问题,BPF program可以把这两个数字直接转换成任意类型,并不一定真是这两个指针的真正类型。如果转错了,BPF program就可能访问了不该访问的东西。最坏情况下,有可能访问到一个memory-mapped I/O区域,导致硬件损坏。通常不认为这是一个安全风险(security issue),因为tracing需要由特权用户才能发起,不过这是一个安全问题(safety issue),这种问题就是BPF verifier希望解决的问题。

自从kernel支持把BPF program挂载在tracepoint和kprobe的第一天起,这个问题就存在了。同时,BPF开发者一直在调查另一个完全不同的问题:BPF program的二进制格式缺乏兼容性。这些program会在kernel里面访问各种数据结构,但是这些结构的位置、格式、内容会随着kernel的config的改变而改变,也会随着底层架构的区别而有不同。可能在某个kernel里面我们关心的数据在结构中的第8个byte,而另一个kernel里面变成了偏移8个byte的位置。如果没有办法能识别出这些偏移的话,BPF使用者只能针对每个不同的目标系统来重新编译BPF program。

因此大家都希望能做到“compile once run everywhere”(只编译一次,就能在任何情况下运行)。在过去几年经过很多努力之后,利用创建一类新的紧凑的、机器可读的内核数据结构描述信息,得到了解决。这个描述信息名为“BPF type format”(BTF),由kernel自己提供,会被user-space的支持库来调用,在加载BPF program程序二进制代码之前预先做一些调整,从而解决了绝大多数的binary portability(二进制兼容性)问题。不过人们发现BTF信息还可以有其他用处。

具体来说,可以用BTF信息来标注tracepoint,注明传给处理函数的数据的类型。这样就能让verifier利用这些信息确保BPF program运行时是在按照正确的数据类型进行访问。并且也能让C handler program能直接利用指针来访问数据。在编译生成BPF program并加载进入kernel的时候,verifier就能在有访问相关数据的时候直接替换成bpf_probe_read()调用,当然也会经过类型检查来确保安全。

最终,BPF tracepoint handler program就能更加安全了,更加不容易写出bug。至于是否能称之为“变革性”的改动,这个值得商榷,不过肯定也算是重大改进了。

不过,可以确定的是,kprobe handler关联的数据访问无法从中受益。因为kprobe可以设置在正在运行的kernel中的任意位置,并且在触发的时候,也会获得访问处理器寄存器内容的权限。目前来说,verifier还是没法知道这些寄存器里面放得是什么内容,因此没法做检查来保护之。也就是说,如果没法修改kernel在感兴趣的地方加上tracepoint,那么所用的BPF program就仍然没法进行类型检查,只能维持现状了。

不论如何,至少有了不少改善了,能够让现有的tracing代码更加安全。目前已经放入bpf-next tree了,除非有些什么最后时刻报出来的问题,否则的话应该能进入5.5 kernel了。

全文完

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

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

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

Libbpf-tools —— 让 Tracing 工具身轻如燕 本篇文章概述了 BPF 的主要应用,重点描述了 libbpf-tools 解决了哪些 BCC 痛点以及在 PingCAP 内部的相关实践。 BPF 最初代表 Berkeley Packet Filter,但在 Linux 中已扩展为通用内核执行引擎,能够运行新型的用户定义和内核模式应用程序。近几年来,BPF 子系统越发火热,迄至 Linux 5.8 内核,Linux 内核已经支持 30 种 eBPF 程序类型,遍布于内核各个角落,引起了广泛关注及热议,在 LWN 上甚至出现过 Why don’t we re 阅读详情

相关推荐

一篇讲解CPU性能指标提取及源码分析

这篇报告主要根据CPU性能指标——运行队列长度、调度延迟和平均负载,对系统的性能影响进行简单分析。当系统运行队列长度等于虚拟处理器的个数时,用户不会明显感觉到性能下降,当运行队列长度达到虚 拟处理器的4倍或更多时,系统的响应就非常迟缓了。如果在很长一段时间里,运行队列的长度一直都超过虚拟处理器个数的1倍,就需要关注了,只是暂时不需要立即采取行动。如果在很长一段时间里,运行队列的长度达到虚拟处理器个数的3~4倍或更高,则需要立即采取行动。

youzhangjing_的博客 1200

ebpf中的bpf_probe_read_kernel和pt_regs

对ebpf中的pt_regs以及相关函数作一定解释

qq_44927248的博客 3957

10、深入理解eBPF中的BTF与CO-RE技术

本文深入探讨了eBPF中的BTF(BPF Type Format)信息与CO-RE(Compile Once - Run Everywhere)技术的核心原理及其在实际开发中的应用。BTF为eBPF程序提供了类型信息,使得工具能够更有效地处理和展示数据,同时支持诸如BPF自旋锁等功能。CO-RE则通过利用BTF信息,使eBPF程序具备良好的可移植性,实现一次编译、多内核版本运行的能力。文章还详细介绍了如何生成BTF数据、编译和运行eBPF程序,并总结了BTF和CO-RE在系统监控、网络安全等领域的广泛应用。

svm4gardener的博客 178

BTF deduplication and Linux kernel BTF

BTF deduplication and Linux kernel BTF 目录 BPF and type information Algorithm Algorithm summary Pass #1: strings deduplication Pass #2: non-reference types deduplication Pass #3: reference type deduplication Pass #4: types compaction Pass #5: type

RToax 987

基于YOLO+DeepSeek的农作物病虫害检测系统

本系统是一个基于YOLO+DeepSeek的农作物病虫害检测系统。 可使用YOLOV1-YOLOV12的任意模型进行目标检测。可以实现检测图片、批量检测图片、视频检测、摄像头检测四种方式。

qq_51977316的博客 1809

从原理到应用:深入解析双编码器在机器人关节力矩感知中的实现

本文深入解析了双编码器方案在机器人关节力矩感知中的实现原理与应用。该方案通过在电机侧和输出侧分别安装编码器,利用两者位置差异间接高精度计算外力,克服了传统电流环精度不足和扭矩传感器成本高昂的缺点。它为实现协作机器人的丝滑拖动示教、灵敏碰撞检测以及足式机器人的动态平衡与柔顺控制提供了关键技术支撑,是目前高性能机器人力控的主流选择。

t8u9v0w1x的博客 661

LWN: Facebook使用BPF的情况以及其他

点击上方蓝色“Linux News搬运工”关注我们~BPF at Facebook (and beyond)ByJonathan CorbetKernel Recipe...

Linux News搬运工 695

【论文导读】ICDM2018|SASRec---基于自注意力机制的序列推荐(召回)

前言本次分享2018年发表在ICDM上的论文----「Self-Attentive Sequential Recommendation」。主要是应用self-attention机制来做一...

Blank_Space 8032

BPF Type Format (BTF) 技术解析:调试信息的新标准 [特殊字符]

BPF Type Format (BTF) 是 eBPF 生态系统中的一项革命性技术,它为内核调试和程序可移植性带来了全新的解决方案。作为调试信息的新标准,BTF 正在彻底改变我们开发和部署 eBPF 程序的方式。 ## 什么是 BTF?揭开神秘面纱 BPF Type Format (BTF) 是一种现代化的调试信息格式,专门为 eBPF 程序设计。它提供了完整的类型信息,使得 eBPF 程序

gitblog_01056的博客 943

C++学习(四六六)Multiple parse contexts are available for this file

Note: Multiple parse contexts are available for this file. Choose the preferred one from the editor menu 参考: "Multiple parse contexts" in Qt creator | Qt ForumHi Do you use sessions? https://bugreports.qt.io/browse/QTCREATORBUG-18521 Anyway, its not.

hankern的专栏 4609

国产FPGA开发实战:紫光同创编程软件中的约束文件详解与常见问题

本文详细解析了紫光同创FPGA编程软件中约束文件的关键配置技巧与常见问题。通过基础架构解析、时钟约束实践、物理约束调控及典型问题排查指南,帮助开发者高效掌握国产FPGA开发中的约束文件应用,提升开发效率与设计稳定性。

gin88的博客 904

Libbpf-tools: Tracing工具

本篇文章概述了 BPF 的主要应用,重点描述了 libbpf-tools 解决了哪些 BCC 痛点以及在 PingCAP 内部的相关实践。 目录 Libbpf-tools vs BCC Libbpf-tools 在 PingCAP 的应用 相关阅读 BPF 最初代表 Berkeley Packet Filter,但在 Linux 中已扩展为通用内核执行引擎,能够运行新型的用户定义和内核模式应用程序。近几年来,BPF 子系统越发火热,迄至 Linux 5.8 内核,Linux 内核已经支持 3.

RToax 889

matinal:SAP 采购中形成的差异

如果库存足够会影响到物料。

matinal 當冬夜漸暖 。公众号:matinal 819

LWN:kernel通用的ring buffer!

关注了就能看到更多这么棒的文章哦~A generic ring buffer for the kernelBy Jonathan CorbetJune 6, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/976836/内核的用户空间 ABI 中不乏环形缓冲区(ring buffer);在例如BPF、io_uring、perf和...

Linux News搬运工 1523

S32K324 Stack异常分析及解决方案

在项目开发过程中,在一次软件变更时,调整了task优先级之后导致应用层软件中的float数据经常性的变为NAN,导致应用层功能失效。本文记录下这个bug的分析及解决过程。该问题排查了好几天,最开始正向排查不出来,差点放弃了,ETAS OS也没有人支持,只能换一种思路,通过反向推,最终定位到问题,能完美解决,还是很欣慰的。遇到问题不可怕,Bug一直都会有,主要是在解决问题中的思路和方法,不断总结积累,总会越来越好的!

赞的博客 596

一文读懂 SAP ICF Services:从 SICF 激活到 ABAP OData V2/V4 安全与实战

本文系统化介绍了ABAP系统中ICF服务的关键概念及实践要点。主要内容包括:ICF服务的核心安全机制,需显式激活才能响应HTTP请求;在SICF中正确激活服务的操作步骤;OData V2/V4服务所需的不同ICF节点配置,如V4统一入口节点/sap/opu/odata4;典型问题如default_host未激活会导致HOST_INACTIVE错误;安全实践包括CSRF防护机制和权限对象(S_ICF_ADM)配置;以及实际案例分析和常见ICF服务节点的功能说明。文章为ABAP开发者与运维人员提供了ICF服务管

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

LWN: 5.17 合并窗口第一部分!

关注了就能看到更多这么棒的文章哦~5.16 Merge window, part 1By Jonathan CorbetNovember 4, 2021DeepL assisted tra...

Linux News搬运工 367

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TC工具后台模式_Libbpf-tools —— 让 Tracing 工具身轻如燕

本篇文章概述了 BPF 的主要应用,重点描述了 libbpf-tools 解决了哪些 BCC 痛点以及在 PingCAP 内部的相关实践。BPF 最初代表 Berkeley Packet Filter,但在 Linux 中已扩展为通用内核执行引擎,能够运行新型的用户定义和内核模式应用程序。近几年来,BPF 子系统越发火热,迄至 Linux 5.8 内核,Linux 内核已经支持 30 种 eBPF...

weixin_39629617的博客 440

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

eBPF与BPF Type Format (BTF):现代化调试技术的终极指南

在当今的Linux内核开发领域,**eBPF**(扩展伯克利包过滤器)已经成为系统调试和性能监控的革命性技术。而**BPF Type Format (BTF)**作为eBPF生态系统的重要组成部分,为开发者提供了前所未有的调试便利性。本文将深入探讨eBPF与BTF如何协同工作,为系统调试带来全新的可能性。 ## 🤔 什么是eBPF与BTF? **eBPF**是一种在内核中运行的虚拟机,允许开

gitblog_00426的博客 1097

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

BPF 之路:技术背景

BPF 之路

阿呆的隐秘角落 3023

透视Linux内核 神奇的BPF二

一 前言对于第一次BPF的介绍,只是简单介绍了BPF,写了一个没啥用的例子,如何利用BCC写一个有点用的程序以及BCC中有哪些牛逼的工具,是本篇需要介绍的。二 BPF程序开发一般流程再来回...

2085

BPF BTF 详细介绍

本文地址:https://www.ebpf.top/post/kernel_btf/ 英文文档:https://www.kernel.org/doc/html/latest/bpf/btf.html 1. 介绍 BTF(BPF 类型格式)是一种元数据格式,对与 BPF 程序 /map 有关的调试信息进行编码。BTF 这个名字最初是用来描述数据类型。后来,BTF 被扩展到包括已定义的子程序的函数信息和行信息。 调试信息可用于 map 的更好打印、函数签名等。函数签名能够更好地实现 bpf 程序/函数的内核符号

dwh0403的专栏 3793

BPF设计问答

BPF在网络,跟踪,Linux内核中的安全性以及BPF虚拟机的几种用户空间实现中的可扩展性和适用性导致对BPF实际上是什么存在许多误解。简短的质量检查旨在解决这一# 问题,并概述BPF长期发展的方向。 # 问题和解答问:BPF是类似于x64和arm64的通用指令集吗?问:BPF是通用虚拟机吗?问:为什么选择C调用约定?问:将来可以支持多个返回值吗?问:将来可以支持5个以上的函数参数吗?问:BPF程序可以访# 问指令指针或返回地址吗?问:BPF程序可以访# 问堆栈指针吗?问:C调用约定是否会减少可能的用例?问

攻城狮 1202

eBPF学习记录(三)使用BCC开发eBPF程序

上一节我们已经初步体验了 eBPF 程序的开发和执行过程,现在我们试试了解一下bpftrace使用方法。

jianjian的博客 7983

BPF类型格式BTF

@[TOC](BPF) 这是包含BPF(Berkeley Packet Filter)功能的文档,重点放在扩展的BPF版本(eBPF)上。 该内核方面的文档仍在开发中。 (出于历史原因)主要文本文档在Linux套接字过滤(又称为Berkeley数据包过滤器(BPF))中进行了描述。 该文档描述了经典BPF和扩展BPF指令集。 Cilium项目还维护着一个BPF和XDP参考指南,该指南对BPF体系结构有很深的技术深度。 bpf syscall的主要信息可在bpf(2)的手册页中找到。 BPF类型格式(BTF)

攻城狮 3015
上一篇: LWN:统一kernel tracing处理!
下一篇: LWN:利用机器学习来找出有bug的patch!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值