问题描述
我正在阅读 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 (将#修改为@)