aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCy Schubert <cy@FreeBSD.org>2026-05-29 06:17:39 +0000
committerCy Schubert <cy@FreeBSD.org>2026-06-08 13:51:24 +0000
commit37e9d3641ba0e0da0d2bbaa26a59ee56a8cf3ee6 (patch)
treebbc84bb41adbcf1513c9c6c3fd79ef1208351e81
parent035e87247f845500b4672e10efb8f47fd2c0f2a2 (diff)
ipfilter: Fix ip_pptp_pxy (PPTP proxy) length underflow
A PPTP client sending a specially crafted PPTP message with a length smaller than the already processed fixed header can panic the system. This resultes in a negative remaining length (a large unsigned 16-bit number). Reported by: Yuxiang Yang, Yizhou Zhao, Ao Wang, Xuewei Feng, Qi Li, and Ke Xu from Tsinghua University using GLM-5.1 from Z.ai MFC after: 3 days Differential Revision: https://reviews.freebsd.org/D57383
-rw-r--r--sys/netpfil/ipfilter/netinet/ip_pptp_pxy.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/sys/netpfil/ipfilter/netinet/ip_pptp_pxy.c b/sys/netpfil/ipfilter/netinet/ip_pptp_pxy.c
index dc4c67dc14f0..95eaf78bd575 100644
--- a/sys/netpfil/ipfilter/netinet/ip_pptp_pxy.c
+++ b/sys/netpfil/ipfilter/netinet/ip_pptp_pxy.c
@@ -318,7 +318,9 @@ ipf_p_pptp_nextmessage(fr_info_t *fin, nat_t *nat, pptp_pxy_t *pptp, int rev)
* it should match 1a2b3c4d. Byte order is ignored,
* deliberately, when printing out the error.
*/
- len = MIN(8 - pptps->pptps_bytes, dlen);
+ if (pptps->pptps_bytes >= 8)
+ return (-1);
+ len = MIN((size_t)(8 - pptps->pptps_bytes), dlen);
COPYDATA(fin->fin_m, off, len, pptps->pptps_wptr);
pptps->pptps_bytes += len;
pptps->pptps_wptr += len;
@@ -361,7 +363,9 @@ ipf_p_pptp_nextmessage(fr_info_t *fin, nat_t *nat, pptp_pxy_t *pptp, int rev)
}
}
- len = MIN(pptps->pptps_len - pptps->pptps_bytes, dlen);
+ if (pptps->pptps_len <= pptps->pptps_bytes)
+ return (-1);
+ len = MIN((size_t)(pptps->pptps_len - pptps->pptps_bytes), dlen);
COPYDATA(fin->fin_m, off, len, pptps->pptps_wptr);
pptps->pptps_bytes += len;
pptps->pptps_wptr += len;