untrusted comment: signature from openbsd 5.6 base private key
RWR0EANmo9nqhhm2X+GICNqJi4Csmn/M9avdfLb8M1ja/3HBZ5I3V1oBO5VXNKHh4phDYZKHX3Mp1k9CwFL6jlPPCoWpVlLxiAY=

OpenBSD 5.6 errata 10, Dec 5, 2014:

Several bugs were fixed that allowed a crash from remote when an active pipex
session exists.

Apply patch using:

   signify -Vep /etc/signify/openbsd-56-base.pub -x 010_pipex.patch.sig \
       -m - | (cd /usr/src && patch -p0)

Then build and install a new kernel.

Index: sys/net/pipex.c
===================================================================
RCS file: /cvs/src/sys/net/pipex.c,v
retrieving revision 1.55
retrieving revision 1.55.4.1
diff -u -p -u -r1.55 -r1.55.4.1
--- sys/net/pipex.c     22 Jul 2014 11:06:10 -0000      1.55
+++ sys/net/pipex.c     1 Dec 2014 06:57:33 -0000       1.55.4.1
@@ -1037,6 +1037,7 @@ pipex_ppp_input(struct mbuf *m0, struct
       struct m_tag *mtag;
       struct pipex_tag *tag;

+       KASSERT(m0->m_pkthdr.len >= PIPEX_PPPMINLEN);
       proto = pipex_ppp_proto(m0, session, 0, &hlen);
#ifdef PIPEX_MPPE
       if (proto == PPP_COMP) {
@@ -1294,7 +1295,8 @@ pipex_common_input(struct pipex_session
       int proto, ppphlen;
       u_char code;

-       if (m0->m_pkthdr.len < hlen + PIPEX_PPPMINLEN)
+       if ((m0->m_pkthdr.len < hlen + PIPEX_PPPMINLEN) ||
+           (plen < PIPEX_PPPMINLEN))
               goto drop;

       proto = pipex_ppp_proto(m0, session, hlen, &ppphlen);
@@ -1358,6 +1360,7 @@ pipex_ppp_proto(struct mbuf *m0, struct
       int proto;
       u_char *cp, pktbuf[4];

+       KASSERT(m0->m_pkthdr.len > sizeof(pktbuf));
       m_copydata(m0, off, sizeof(pktbuf), pktbuf);
       cp = pktbuf;

@@ -1621,6 +1624,13 @@ pipex_pptp_lookup_session(struct mbuf *m
               goto not_ours;
       }

+       /* flag check */
+       if ((flags & PIPEX_GRE_UNUSEDFLAGS) != 0) {
+               PIPEX_DBG((NULL, LOG_DEBUG,
+                   "<%s> gre header has unused flags at pptp.", __func__));
+               goto not_ours;
+       }
+
       /* lookup pipex session table */
       id = ntohs(gre.call_id);
       session = pipex_lookup_by_session_id(PIPEX_PROTO_PPTP, id);
@@ -2575,6 +2585,8 @@ pipex_mppe_input(struct mbuf *m0, struct
               mppe->coher_cnt++;
               mppe->coher_cnt &= PIPEX_COHERENCY_CNT_MASK;
       }
+       if (m0->m_pkthdr.len < PIPEX_PPPMINLEN)
+               goto drop;

       pipex_ppp_input(m0, session, 1);

Index: sys/net/pipex_local.h
===================================================================
RCS file: /cvs/src/sys/net/pipex_local.h,v
retrieving revision 1.19
retrieving revision 1.19.8.1
diff -u -p -u -r1.19 -r1.19.8.1
--- sys/net/pipex_local.h       20 Apr 2013 07:54:28 -0000      1.19
+++ sys/net/pipex_local.h       1 Dec 2014 06:57:33 -0000       1.19.8.1
@@ -217,7 +217,8 @@ struct pipex_gre_header {
#define PIPEX_GRE_SFLAG                        0x1000  /* seq present */
#define PIPEX_GRE_AFLAG                        0x0080  /* ack present */
#define PIPEX_GRE_VER                  0x0001  /* gre version code */
-#define PIPEX_GRE_VERMASK              0x0003  /* gre version mask */
+#define PIPEX_GRE_VERMASK              0x0007  /* gre version mask */
+#define PIPEX_GRE_UNUSEDFLAGS          0xcf78  /* unused at pptp. set 0 in rfc2637 */

       uint16_t type;
#define PIPEX_GRE_PROTO_PPP            0x880b  /* gre/ppp */