前言
这是笔者静态分析出来的第一个nday内核漏洞,特此纪念一下,😊!
也希望自己能够早点挖出0day,😊!
环境搭建
和前面一样,直接用CVE-2022-25636的环境;(巧了,笔者当时分析也是5.15的源码,可能正是有感分析的)
version:v5.15.0
commit:
config为defconfig+:
CONFIG_USER_NS=y |
源码分析
相关数据结构
代码回溯
整个代码回溯放在这里:
https://elixir.bootlin.com/linux/v5.15/source/net/netfilter/nf_tables_api.c#L4233
https://elixir.bootlin.com/linux/v5.15/source/net/netfilter/nf_tables_api.c#L4318
https://elixir.bootlin.com/linux/v5.15/source/net/netfilter/nf_tables_api.c#L4200
https://elixir.bootlin.com/linux/v5.15/source/net/netfilter/nf_tables_api.c#L4168
https://elixir.bootlin.com/linux/v5.15/source/net/netfilter/nf_tables_api.c#L4178
https://elixir.bootlin.com/linux/v5.15/source/net/netfilter/nf_tables_api.c#L2453
nf_tables_newset |
首先是源码分析,根据特征匹配发现这里有一个数组赋值很可疑,有可能发生数组越界:
然后就回溯desc的field_len和field_count;
一路回溯发现desc是nf_tables_newset
函数中创建的局部变量:https://elixir.bootlin.com/linux/v5.15/source/net/netfilter/nf_tables_api.c#L4215
最开始初始化为0:
然后就走到这里了:
整个过程中没有其他的额外操作,似乎就是field_count在开始的时候为0,field_len则是固定的16字节,只要反复调用到这个地方就能实现越界写;
而越界写的这个len还是我们传进来的数字,只不过有数值上的限制,但是已经很好了,😊,怎么会有这么好的洞🤔