ebpf:验证 LD_ABS 和 LD_IND 指令

问题描述

我正在阅读 verifier 代码,特别是验证 SELECT id FROM dbo.yourtable WHERE islab = 1 AND isschool = 1 GROUP BY id HAVING COUNT(CASE class WHEN 1 THEN 1 END) = 1 AND COUNT(CASE class WHEN 2 THEN 1 END) = 1; LD_ABS 指令(check_ld_abs())安全性的部分。正如评论所说,这些指令隐含地期望 LD_IND 寄存器中的输入,即我们必须在此处加载指向 r6 的指针。所以我验证了以下 __sk_buff 类型的程序会被验证者拒绝:

BPF_PROG_TYPE_SOCKET_FILTER

...

struct bpf_insn prog[] = {
    BPF_LD_ABS(BPF_B,offsetof(struct iphdr,protocol)),/* exit with value 0 */
    BPF_MOV64_IMM(BPF_REG_0,0),BPF_EXIT_INSN(),};

即它需要在>> 0: (30) r0 = *(u8 *)skb[9] R6 !read_ok 之前准备r6

LD_ABS

但是,评论中还提到了显式输入(在这种情况下,输入可以是任何寄存器)?是否仅由 BPF_MOV64_REG(BPF_REG_6,BPF_REG_1) 使用?与隐式模式有什么区别?

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)