Skip to content

Commit ad2099a

Browse files
committed
netfilter: nf_conntrack_h323: Add protection for bmp length out of range
jira LE-3201 cve CVE-2024-26851 Rebuild_History Non-Buildable kernel-rt-4.18.0-553.27.1.rt7.368.el8_10 commit-author Lena Wang <[email protected]> commit 7671466 UBSAN load reports an exception of BRK#5515 SHIFT_ISSUE:Bitwise shifts that are out of bounds for their data type. vmlinux get_bitmap(b=75) + 712 <net/netfilter/nf_conntrack_h323_asn1.c:0> vmlinux decode_seq(bs=0xFFFFFFD008037000, f=0xFFFFFFD008037018, level=134443100) + 1956 <net/netfilter/nf_conntrack_h323_asn1.c:592> vmlinux decode_choice(base=0xFFFFFFD0080370F0, level=23843636) + 1216 <net/netfilter/nf_conntrack_h323_asn1.c:814> vmlinux decode_seq(f=0xFFFFFFD0080371A8, level=134443500) + 812 <net/netfilter/nf_conntrack_h323_asn1.c:576> vmlinux decode_choice(base=0xFFFFFFD008037280, level=0) + 1216 <net/netfilter/nf_conntrack_h323_asn1.c:814> vmlinux DecodeRasMessage() + 304 <net/netfilter/nf_conntrack_h323_asn1.c:833> vmlinux ras_help() + 684 <net/netfilter/nf_conntrack_h323_main.c:1728> vmlinux nf_confirm() + 188 <net/netfilter/nf_conntrack_proto.c:137> Due to abnormal data in skb->data, the extension bitmap length exceeds 32 when decoding ras message then uses the length to make a shift operation. It will change into negative after several loop. UBSAN load could detect a negative shift as an undefined behaviour and reports exception. So we add the protection to avoid the length exceeding 32. Or else it will return out of range error and stop decoding. Fixes: 5e35941 ("[NETFILTER]: Add H.323 conntrack/NAT helper") Signed-off-by: Lena Wang <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]> (cherry picked from commit 7671466) Signed-off-by: Jonathan Maple <[email protected]>
1 parent 533da7f commit ad2099a

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

net/netfilter/nf_conntrack_h323_asn1.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,8 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
536536
/* Get fields bitmap */
537537
if (nf_h323_error_boundary(bs, 0, f->sz))
538538
return H323_ERROR_BOUND;
539+
if (f->sz > 32)
540+
return H323_ERROR_RANGE;
539541
bmp = get_bitmap(bs, f->sz);
540542
if (base)
541543
*(unsigned int *)base = bmp;
@@ -592,6 +594,8 @@ static int decode_seq(struct bitstr *bs, const struct field_t *f,
592594
bmp2_len = get_bits(bs, 7) + 1;
593595
if (nf_h323_error_boundary(bs, 0, bmp2_len))
594596
return H323_ERROR_BOUND;
597+
if (bmp2_len > 32)
598+
return H323_ERROR_RANGE;
595599
bmp2 = get_bitmap(bs, bmp2_len);
596600
bmp |= bmp2 >> f->sz;
597601
if (base)

0 commit comments

Comments
 (0)