IPcomp是一款IP有效载荷压缩协议,为IP层提供无损耗压缩。源自NetBSD/KAME的IPComp实现,未压缩负载的注入其代码类似如下: algo = ipcomp_algorithm_lookup(cpi); /* ... */ error = (*algo->decompress)(m, m->m_next, &newlen); /* ... */ if (nxt != IPPROTO_DONE) { if ((inetsw[ip_protox[nxt]].pr_flags & PR_LASTHDR) != 0 && ipsec4_in_reject(m, NULL)) { IPSEC_STATINC(IPSEC_STAT_IN_POLVIO); goto fail; } (*inetsw[ip_protox[nxt]].pr_input)(m, off, nxt); } else m_freem(m); /* ... */这里的inetsw[]包含的是其所支持的协议,nxt是协议号,一般相关于ip->ip_p (查看http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml),但是在这个情况却来自ipcomp->comp_nxt,m是用于调整未压缩有效负载指向的mbuf结构。未压缩报文分派到ipcomp协议处理器所提供的相应的协议处理程序,这个递归实现没有正确检查栈溢出,因此可触发一个远程未验证内核内存破坏漏洞。NetBSD/KAME网络栈用于多个操作系统,如Xnu, FTOS,嵌入设备和网络应用设备,早期的FreeBSD/OpenBSD版本。
NetBSD系统用户可参考如下供应商提供安全补丁:http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/netinet6/ipcomp_input.c?rev=1.36&content-type=text/x-cvsweb-markup&only_with_tag=MAIN