CVE-2022-1972


前言

这是笔者静态分析出来的第一个nday内核漏洞,特此纪念一下,😊!

也希望自己能够早点挖出0day,😊!

环境搭建

和前面一样,直接用CVE-2022-25636的环境;(巧了,笔者当时分析也是5.15的源码,可能正是有感分析的)

version:v5.15.0

commit:

config为defconfig+:

CONFIG_USER_NS=y
CONFIG_SECURITY_SELINUX_DISABLE=y
# for debug
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_DEBUG_INFO_DWARF4=y
# for msg_msg copy
CONFIG_CHECKPOINT_RESTORE=y
# for syzkaller image
CONFIG_CONFIGFS_FS=y
CONFIG_SECURITYFS=y

CONFIG_SLAB_FREELIST_RANDOM=n
CONFIG_SLAB_FREELIST_HARDENED=n
CONFIG_SHUFFLE_PAGE_ALLOCATOR=n
CONFIG_HARDENED_USERCOPY=n
CONFIG_FORTIFY_SOURCE=n
CONFIG_STATIC_USERMODEHELPER=n
CONFIG_DEBUG_INFO_NONE=n
CONFIG_RANDOMIZE_BASE=n

CONFIG_DEBUG_INFO=y #调试

CONFIG_NF_TABLES=y
CONFIG_NFT_DUP_NETDEV=y
CONFIG_NF_DUP_NETDEV=y #漏洞模块
CONFIG_SECURITY=y #才会释放 msg_msg->security 指针
CONFIG_BINFMT_MISC=y #否则启动VM时报错
CONFIG_USER_NS=y

CONFIG_E1000=y
CONFIG_E1000E=y

CONFIG_NF_TABLES_NETDEV=y #初始化chain_type
CONFIG_NF_TABLES_INET=y #初始化chain_type

源码分析

相关数据结构

代码回溯

整个代码回溯放在这里:

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
nf_tables_set_desc_parse
nft_set_desc_concat
nft_set_desc_concat_parse

首先是源码分析,根据特征匹配发现这里有一个数组赋值很可疑,有可能发生数组越界:

然后就回溯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还是我们传进来的数字,只不过有数值上的限制,但是已经很好了,😊,怎么会有这么好的洞🤔

漏洞触发

参考


文章作者: q1ming
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 q1ming !
  目录