BPF技术:程序验证、类型格式、尾调用及映射操作详解
1. BPF验证器
在Linux内核中允许任意代码执行听起来风险极高,而BPF验证器则是保障安全的关键。内核网络维护者Dave S. Miller曾说:“eBPF程序与毁灭性深渊之间的唯一屏障就是eBPF验证器”。过去,安全研究人员发现验证器存在一些漏洞,攻击者可借此访问内核随机内存,如CVE - 2017 - 16995就描述了用户绕过验证器读写内核内存的情况。
验证器主要进行两项检查:
- 静态代码分析 :
- 创建有向无环图(DAG),将每条指令作为图中的节点,节点间按指令顺序相连。
- 进行深度优先搜索(DFS),确保程序能正常结束且无危险路径,避免递归循环。
- 若程序存在以下情况,验证器会拒绝代码:
- 包含控制循环:为避免无限循环,当前不允许控制循环,虽有允许循环的提议但尚未采纳。
- 尝试执行超过内核允许的最大指令数:目前最大指令数为4096条,防止程序无限运行。
- 包含不可达指令:如永远不会执行的条件或函数,避免加载无效代码导致程序终止延迟。
- 尝试跳出程序边界。
- BPF程序预运行 :
- 分析程序将执行的每条指令,确保无无效指令。
- 检查内存指针的访问和引用是否正确。
- 记录所有访问过的分支路径,避免重复访问,确保程序最终能到达BPF_EXIT指令。
通过这两项检查后,程序才被认为可安全执行。使用bpf系统调用加载程序时,可设置属性使验证器输出操作日志:
超级会员免费看
订阅专栏 解锁全文
16

被折叠的 条评论
为什么被折叠?



