CVE-2022-32250
漏洞分析
完整的表达式析构过程 / nft_set_binding
一些规则可以与集合绑定, 但其实真正绑定的是表达式和集合, 这类表达式有nft_lookup, nft_dynset, nft_objref.
代表这一关系的结构是nft_set_binding.
1 | /** |
一些规则可以与集合绑定, 但其实真正绑定的是表达式和集合, 这类表达式有nft_lookup, nft_dynset, nft_objref.
代表这一关系的结构是nft_set_binding.
1 | /** |
在nft_set_elem_init函数中, 有几处使用memcpy的地方让人眼前一亮.
众所周知审溢出就是审读写时使用的大小是否小于等于分配内存时使用的大小.
但这几处分配空间使用的是tmpl->len, 而写入的长度是(set->klen + set->klen + set->dlen) (对应属性都存在的情况下), 这促使我们向上回溯看看这些值之间是否存在上述小于等于的关系.
1 | void *nft_set_elem_init(const struct nft_set *set, |
在nf_tables中, 还有一个set的概念. 虽然nf_tables没有使用iptables的match-action的概念, 但作为filter就少不了match的过程. set充当一个数据库, 而nft_lookup等指令用来在数据库中进行查找.
比如想要拦截192.168.1.4, 192.168.1.5等ip的包, 则可以通过如下方式创建命名集合(当然就有匿名集合)blackhole, 并向其中添加ip, 之后的rule即可直接使用这个set.
1 | nft add set filter blackhole { type ipv4_addr\;} |
源码版本为v5.17-rc7.
非常明显且诡异地存在了8年的一个漏洞: 状态机的regs没有初始化.攻击者可以通过该漏洞泄露内核基址.
作者的评价:
I have no idea how this survived for eight and a half years, because to me it stuck out like a sore thumb.
1 | unsigned int |
xtables? iptables? nf_tables !
源码版本为v5.8或v5.11
根据作用及协议族, 在netfilter中分成不同的table., 每个table只能看到自己所属协议族的包.
每个table在其有的每一个hook点上有一条chain. 用户也可以添加自定义的chain, 但由于没有对应的hook点, 只能从内置的chain的rule中跳转到(其实从自定义的chain跳转到也行, 前提是前者能被触发). 实际上之前内置chain的说法并不准确, 不同于iptables, nft并不存在预定义的chain, 需要创建nft_base_chain并将其注册到hook点上.
多条rule可能在同一个hook点触发, 即属于同一条chain.
处理一条rule的过程实际是对rule中包含的expr求值(eval).
(看源码看得最难受的一集)
阅读更多...KSM指Kernel SamePage Merging,即内核同页合并,用于合
并内容相同的页面。KSM的出现是为了优化虚拟化中产生的冗余页面,
因为虚拟化的实际应用中在同一台主机上会有许多相同的操作系统和
应用程序,许多内存页面的内容可能是相同的,所以它们可以合并,
从而释放内存供其他应用程序使用。KSM允许合并同一个进程或不同进程之间内容相同的匿名页面,这
对应用程序来说是不可见的。把这些相同的页面合并成一个只读的页
面,从而释放出多余的物理页面,当应用程序需要改变页面内容时,
会发生写时复制。
只是做lab时的记录, 笔者并不认为文中的代码部分有什么阅读的价值
阅读更多...ps: 在BuddySystem中所说的”page”指的是order-n的pages.
以Linux v5.0分析.
注意参数或变量中的pgd,pud指的是表项, 为表示区分, 在分析过程中使用大写表示表, 小写表示表项.(如PGD表示全局页目录表.pgd表示全局目录表中的表项)
请我喝杯咖啡吧~