mirror of
https://git.yoctoproject.org/poky
synced 2026-10-22 19:18:18 +00:00
libpcap: Fix CVE-2026-6554
NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-6554 Upstream-commit: https://github.com/the-tcpdump-group/libpcap/commit/ff3c83475ac303c6b681c52ad0b6e14795a8e0ce (From OE-Core rev: 97da4c723262d570d42ef66d281f7add017c72f5) Signed-off-by: Jaipaul Cheernam <jaipaul.cheernam@est.tech> Signed-off-by: Yoann Congal <yoann.congal@smile.fr> Signed-off-by: Paul Barker <paul@pbarker.dev>
This commit is contained in:
1 parent
02a3c6e9ff
commit
b4a184a4b7
2 files changed
+93
No files matched your search
@@ -0,0 +1,92 @@
|
|||||||
|
From ff3c83475ac303c6b681c52ad0b6e14795a8e0ce Mon Sep 17 00:00:00 2001
|
||||||
|
From: Denis Ovsienko <denis@ovsienko.info>
|
||||||
|
Date: Thu, 30 Jul 2026 13:34:33 +0100
|
||||||
|
Subject: [PATCH] CVE-2026-6554: Limit "ja L" looping in pcap_offline_filter().
|
||||||
|
|
||||||
|
This vulnerability has been discovered by Kaixuan LI.
|
||||||
|
|
||||||
|
The current revision of pcapint_filter_with_aux_data() assumes that any
|
||||||
|
"ja L" instruction in a filter program does not jump to itself or to a
|
||||||
|
prior instruction that is guaranteed to reach the same "ja L" again.
|
||||||
|
This holds for programs that have been generated by libpcap.
|
||||||
|
|
||||||
|
However, this does not necessarily hold for programs that come from an
|
||||||
|
external source via pcap_offline_filter() or [deprecated] bpf_filter().
|
||||||
|
If the interpreter executes such a program, upon reaching such an
|
||||||
|
instruction it will begin looping infinitely.
|
||||||
|
|
||||||
|
To mitigate this problem, in pcapint_filter_with_aux_data() enforce a
|
||||||
|
hard-coded limit on the number of backward jumps per packet. Ibid., and
|
||||||
|
in pcapint_validate_filter() as well, reject the only immediately
|
||||||
|
detectable case of an infinite loop.
|
||||||
|
|
||||||
|
(backported from commit 63c005c25aeabf1404968add49fc885da3e127e0)
|
||||||
|
|
||||||
|
(cherry picked from commit ff3c83475ac303c6b681c52ad0b6e14795a8e0ce)
|
||||||
|
|
||||||
|
Notes on backporting to 1.10.4:
|
||||||
|
- Adapted to the 1.10.4 pcap_filter*() names (renamed to pcapint_*()
|
||||||
|
after 1.10.4).
|
||||||
|
- The upstream CHANGES/changelog hunk is not backported.
|
||||||
|
|
||||||
|
Upstream-Status: Backport [https://github.com/the-tcpdump-group/libpcap/commit/ff3c83475ac303c6b681c52ad0b6e14795a8e0ce]
|
||||||
|
CVE: CVE-2026-6554
|
||||||
|
Signed-off-by: Jaipaul Cheernam <jaipaul.cheernam@est.tech>
|
||||||
|
---
|
||||||
|
diff --git a/bpf_filter.c b/bpf_filter.c
|
||||||
|
index df92c433..ae8a3a36 100644
|
||||||
|
--- a/bpf_filter.c
|
||||||
|
+++ b/bpf_filter.c
|
||||||
|
@@ -72,6 +72,8 @@ enum {
|
||||||
|
BPF_S_ANC_VLAN_TAG_PRESENT,
|
||||||
|
};
|
||||||
|
|
||||||
|
+#define MAX_BACKWARD_JUMPS 64U
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Kernel BPF implementations tend to define BPF_MAXINSNS to 512 or 4096, the
|
||||||
|
* userland interpreter in libpcap is meant to support much longer filter
|
||||||
|
@@ -146,6 +148,7 @@ pcap_filter_with_aux_data(const struct bpf_insn *pc, const u_int proglen,
|
||||||
|
A = 0;
|
||||||
|
X = 0;
|
||||||
|
const struct bpf_insn *pc0 = pc;
|
||||||
|
+ unsigned backward_jumps = 0;
|
||||||
|
--pc;
|
||||||
|
for (;;) {
|
||||||
|
++pc;
|
||||||
|
@@ -320,6 +323,17 @@ DIAG_ON_DEFAULT_ONLY_SWITCH
|
||||||
|
*/
|
||||||
|
if ((bpf_u_int32)(pc - pc0) + 1 + pc->k >= proglen)
|
||||||
|
return 0;
|
||||||
|
+ /*
|
||||||
|
+ * Terminate the program if this is a non-forward jump
|
||||||
|
+ * and is:
|
||||||
|
+ * - a guaranteed infinite loop because it jumps to
|
||||||
|
+ * itself (exactly the same as in the validator), or
|
||||||
|
+ * - a backward jump after many enough backward jumps
|
||||||
|
+ * already made for this packet.
|
||||||
|
+ */
|
||||||
|
+ if ((bpf_int32)pc->k < 0 && ((bpf_int32)pc->k == -1 ||
|
||||||
|
+ backward_jumps++ >= MAX_BACKWARD_JUMPS))
|
||||||
|
+ return 0;
|
||||||
|
/*
|
||||||
|
* XXX - we currently implement "ip6 protochain"
|
||||||
|
* with backward jumps, so sign-extend pc->k.
|
||||||
|
@@ -607,6 +621,17 @@ pcap_validate_filter(const struct bpf_insn *f, int len)
|
||||||
|
*/
|
||||||
|
if (from + p->k >= (u_int)len)
|
||||||
|
return 0;
|
||||||
|
+ /*
|
||||||
|
+ * The only type of infinite loop that can be
|
||||||
|
+ * detected in this function is a "ja L" that
|
||||||
|
+ * jumps to itself. For this only k == -1
|
||||||
|
+ * needs to be tested because the check above
|
||||||
|
+ * has already rejected all other values that
|
||||||
|
+ * would wrap the pointer equivalently on
|
||||||
|
+ * 32-bit architectures.
|
||||||
|
+ */
|
||||||
|
+ if ((bpf_int32)p->k == -1)
|
||||||
|
+ return 0;
|
||||||
|
break;
|
||||||
|
case BPF_JEQ:
|
||||||
|
case BPF_JGT:
|
||||||
@@ -21,6 +21,7 @@ SRC_URI = "https://www.tcpdump.org/release/${BP}.tar.gz \
|
|||||||
file://02-CVE-2026-31912.patch \
|
file://02-CVE-2026-31912.patch \
|
||||||
file://03-CVE-2026-31911.patch \
|
file://03-CVE-2026-31911.patch \
|
||||||
file://04-CVE-2026-6244.patch \
|
file://04-CVE-2026-6244.patch \
|
||||||
|
file://05-CVE-2026-6554.patch \
|
||||||
"
|
"
|
||||||
|
|
||||||
SRC_URI[sha256sum] = "ed19a0383fad72e3ad435fd239d7cd80d64916b87269550159d20e47160ebe5f"
|
SRC_URI[sha256sum] = "ed19a0383fad72e3ad435fd239d7cd80d64916b87269550159d20e47160ebe5f"
|
||||||
|
|||||||
Reference in new issue
Block a user