CVE:CVE-2007-1365
CNNVD:CNNVD-200703-308
OpenBSD是一款开放源代码Unix类操作系统。
OpenBSD在处理畸形IPv6协议报文时存在漏洞，远程攻击者可能利用此漏洞导致拒绝服务或执行任意指令。
如果远程攻击者向OpenBSD发送了特制的碎片ICMPv6报文的话，就可以触发mbuf内核内存管理结构中的堆溢出，导致执行任意内核态代码或拒绝服务。被溢出的结构在/sys/mbuf.h中定义如下：
struct mbuf {
  struct  m_hdr m_hdr;
  union {
  struct {
  struct  pkthdr MH_pkthdr;       /* M_PKTHDR set */
  union {
  struct  m_ext MH_ext;   /* M_EXT set */
  char    MH_databuf[MHLEN];
  } MH_dat;
  } MH;
  char    M_databuf[MLEN];                /* !M_PKTHDR, !M_EXT */
  } M_dat;
  };
可见mbuf包含有另一个m_ext类型结构(/sys/mbuf.h)：
/* description of external storage mapped into mbuf, valid if M_EXT set */
  struct m_ext {
  caddr_t ext_buf;                /* start of buffer */
  /* free routine if not the usual */
  void    (*ext_free)(caddr_t, u_int, void *);
  void    *ext_arg;               /* argument for ext_free */
  u_int   ext_size;               /* size of buffer, for ext_free */
  int     ext_type;
  struct mbuf *ext_nextref;
  struct mbuf *ext_prevref;
  #ifdef DEBUG
  const char *ext_ofile;
  const char *ext_nfile;
  int ext_oline;
  int ext_nline;
  #endif
  };
第二个结构中包含有ext_free变量，这是在释放mbuf时所调用的函数指针。如果使用特制的精心构造的分片IPv6报文覆盖了mbuf的话，攻击者就可以在系统调用m_freem()函数时控制OpenBSD内核的执行流。
此外，由于mbuf存储在了链表中，另一种攻击方式就是覆盖ext_nextref和ext_prevref指针，导致向内核内存的可控制区写入32位数据，类似于用户态堆覆盖攻击。
solution:Upgrade openbsd openbsd to a higher version than 3.9,4.0,and avoid the version 3.9,4.0