笔者在复现nf_tables的相关漏洞的时候被这个nested_attr折磨了😭,因此今天总结一下😀
nla_for_each_nested
先考虑nla_for_each_nested
这个宏:
首先看这个这个宏的定义:https://elixir.bootlin.com/linux/v5.10/source/include/net/netlink.h#L1931
此外看一下nla_ok
和nla_next
这两个函数:
这里的nla_len
看起来是要包括头部的长度的?🤔:
NLA_ALIGN的含义就是关于4的倍数向上取整:
拆成for循环之后是这个样子的
nla_parse_nested_deprecated
例子在这里:https://elixir.bootlin.com/linux/v5.10/source/net/netfilter/nf_tables_api.c#L5167
下面来看具体函数:
对于传进nla_parse_nested_deprecated
函数的attr
首先被拆解出data传进去__nla_parse
,然后还是走了nla_for_each_attr
这个宏:(其实nla_parse_nested_deprecated
代替了nla_for_each_nested
来拆解🤔)
交互代码
看这个函数:(从这里attr->nla_len
的赋值也可以看出来在nested_attr中nla_len是包含头部4字节的)
似乎就是从我们传入的attr这个地址开始,部署一个子attr在这里,然后返回新的空白地址;