文章预览
简介 阅读本篇文章前,读者需要了解nf_tables中的虚拟机构成和执行过程。 漏洞存在于nf_tables模块的byteorder表达式执行过程,可导致栈溢出。 内核版本5.19.10、编译选项选中nf_tables相关选项。不要开启KASAN,会影响栈的布局。 内核启动后先insmod安装libcrc32c.ko再安装nf_tables.ko。 漏洞分析 下面是 nft_byteorder_eval 代码。这个函数实现了端序的转换。 首先可以看到s和d指针指向一个union,这个union的实际大小由u32而非u16决定。 void nft_byteorder_eval ( const struct nft_expr *expr, struct nft_regs *regs, const struct nft_pktinfo *pkt) { const struct nft_byteorder * priv = nft_expr_priv(expr); u32 *src = >data[priv->sreg]; u32 *dst = >data[priv->dreg]; union { u32 u32; u16 u16; } *s, *d; unsigned int i; 在下面case2的情况中,代码会迭代访问s,长度由 priv->len / 2 决定。 假如传入了8个字
………………………………