- Fix ipset module to use larger domain name buffers, and
check buffer lengths. Thanks to Qifan Zhang, Palo Alto
Networks for the report.
+ - Fix PROXYv2 header read and consume, it checks the header
+ size. Thanks to Qifan Zhang, Palo Alto Networks for
+ the report.
3 June 2026: Yorgos
- Fix const as reported by newest compiler warnings.
{
struct sockaddr_in* addr =
(struct sockaddr_in*)&rep->client_addr;
+ if(ntohs(header->len) < PP2_HEADER_LEN_INET) {
+ verbose(VERB_OPS, "proxy_protocol: header too short for IPv4 address");
+ return 0;
+ }
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = header->addr.addr4.src_addr;
addr->sin_port = header->addr.addr4.src_port;
{
struct sockaddr_in6* addr =
(struct sockaddr_in6*)&rep->client_addr;
+ if(ntohs(header->len) < PP2_HEADER_LEN_INET6) {
+ verbose(VERB_OPS, "proxy_protocol: header too short for IPv6 address");
+ return 0;
+ }
memset(addr, 0, sizeof(*addr));
addr->sin6_family = AF_INET6;
memcpy(&addr->sin6_addr,
(header->ver_cmd & 0xF) != PP2_CMD_PROXY) {
return PP_PARSE_UNKNOWN_CMD;
}
- /* Check for supported family and protocol */
- if(header->fam_prot != PP2_UNSPEC_UNSPEC &&
- header->fam_prot != PP2_INET_STREAM &&
- header->fam_prot != PP2_INET_DGRAM &&
- header->fam_prot != PP2_INET6_STREAM &&
- header->fam_prot != PP2_INET6_DGRAM &&
- header->fam_prot != PP2_UNIX_STREAM &&
- header->fam_prot != PP2_UNIX_DGRAM) {
+ /* Check for supported family and protocol, and that len covers
+ * the per-family address block (proxy-protocol.txt s2.2). */
+ switch(header->fam_prot) {
+ case PP2_UNSPEC_UNSPEC:
+ break;
+ case PP2_INET_STREAM:
+ case PP2_INET_DGRAM:
+ if(ntohs(header->len) < PP2_HEADER_LEN_INET)
+ return PP_PARSE_SIZE;
+ break;
+ case PP2_INET6_STREAM:
+ case PP2_INET6_DGRAM:
+ if(ntohs(header->len) < PP2_HEADER_LEN_INET6)
+ return PP_PARSE_SIZE;
+ break;
+ default:
+ /* PP2_UNIX_STREAM, PP2_UNIX_DGRAM, others. */
return PP_PARSE_UNKNOWN_FAM_PROT;
}
/* We have a correct header */
/** PROXYv2 version (protocol value) */
#define PP2_VERSION 0x2
+/** PROXYv2 minimum header.len value for TCP/UDP over IPv4 */
+#define PP2_HEADER_LEN_INET 12
+
+/** PROXYv2 minimum header.len value for TCP/UDP over IPv6 */
+#define PP2_HEADER_LEN_INET6 36
+
+/** PROXYv2 minimum header.len value for TCP/UDP over AF_UNIX */
+#define PP2_HEADER_LEN_UNIX 216
+
/**
* PROXYv2 command (protocol value).
*/