Blame SOURCES/CVE-2023-3611.patch

d28903
From d899fb6f8a4b6370576e3a009e959bc98ee03c16 Mon Sep 17 00:00:00 2001
d28903
From: Ryan Sullivan <rysulliv@redhat.com>
d28903
Date: Mon, 16 Oct 2023 14:08:36 -0400
d28903
Subject: [KPATCH CVE-2023-3611] kpatch fixes for CVE-2023-3611
d28903
d28903
Kernels:
d28903
3.10.0-1160.90.1.el7
d28903
3.10.0-1160.92.1.el7
d28903
3.10.0-1160.95.1.el7
d28903
3.10.0-1160.99.1.el7
d28903
3.10.0-1160.102.1.el7
d28903
d28903
d28903
Kpatch-MR: https://gitlab.com/redhat/prdsc/rhel/src/kpatch/rhel-7/-/merge_requests/60
d28903
Approved-by: Joe Lawrence (@joe.lawrence)
d28903
Approved-by: Yannick Cote (@ycote1)
d28903
Changes since last build:
d28903
arches: x86_64 ppc64le
d28903
cls_fw.o: changed function: fw_change
d28903
cls_fw.o: changed function: fw_set_parms
d28903
cls_route.o: changed function: route4_change
d28903
cls_u32.o: changed function: u32_change
d28903
sch_qfq.o: changed function: qfq_enqueue
d28903
---------------------------
d28903
d28903
Modifications: none
d28903
d28903
commit 726e9f3d88c729cdae09768c94e588deebdb9d52
d28903
Author: Marcelo Tosatti <mtosatti@redhat.com>
d28903
Date:   Mon Jan 23 17:17:17 2023 -0300
d28903
d28903
    KVM: x86: rename argument to kvm_set_tsc_khz
d28903
d28903
    commit 4941b8cb3746f09bb102f7a5d64d878e96a0c6cd
d28903
    Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2152838
d28903
    JIRA: https://issues.redhat.com/browse/RHELPLAN-141963
d28903
    Testing: Tested by QE
d28903
d28903
    This refers to the desired (scaled) frequency, which is called
d28903
    user_tsc_khz in the rest of the file.
d28903
d28903
    Reviewed-by: Marcelo Tosatti <mtosatti@redhat.com>
d28903
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
d28903
    Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
d28903
d28903
commit 866faa0e99083ee93d04d3c37065cf8dbfc51a34
d28903
Author: Marcelo Tosatti <mtosatti@redhat.com>
d28903
Date:   Mon Jan 23 17:24:19 2023 -0300
d28903
d28903
    KVM: x86: rewrite handling of scaled TSC for kvmclock
d28903
d28903
    commit 78db6a5037965429c04d708281f35a6e5562d31b
d28903
    Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2152838
d28903
    Testing: Tested by QE
d28903
    JIRA: https://issues.redhat.com/browse/RHELPLAN-141963
d28903
d28903
    This is the same as before:
d28903
d28903
        kvm_scale_tsc(tgt_tsc_khz)
d28903
            = tgt_tsc_khz * ratio
d28903
            = tgt_tsc_khz * user_tsc_khz / tsc_khz   (see set_tsc_khz)
d28903
            = user_tsc_khz                           (see kvm_guest_time_update)
d28903
            = vcpu->arch.virtual_tsc_khz             (see kvm_set_tsc_khz)
d28903
d28903
    However, computing it through kvm_scale_tsc will make it possible
d28903
    to include the NTP correction in tgt_tsc_khz.
d28903
d28903
    Reviewed-by: Marcelo Tosatti <mtosatti@redhat.com>
d28903
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
d28903
    Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
d28903
d28903
commit bde6eebb5708ecd38db0023e657d38058e0d962f
d28903
Author: Marcelo Tosatti <mtosatti@redhat.com>
d28903
Date:   Wed Jan 25 16:07:18 2023 -0300
d28903
d28903
    KVM: x86: add bit to indicate correct tsc_shift
d28903
d28903
    Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2152838
d28903
    Testing: Tested by QE
d28903
    Upstream Status: RHEL7 only
d28903
    JIRA: https://issues.redhat.com/browse/RHELPLAN-141963
d28903
d28903
    This changeset is unique to RHEL-7 since it was decided
d28903
    it is not necessary upstream:
d28903
d28903
    "I don't think it's justifiable to further complicate the userspace API for a
d28903
    bug that's been fixed six years ago.  I'd be very surprised if any combination
d28903
    of modern upstream {QEMU,kernel} is going to do a successful migration from
d28903
    such an old {QEMU,kernel}.  RHEL/CentOS are able to do so because *specific
d28903
    pairs* have been tested, but as far as upstream is concerned this adds
d28903
    complexity that absolutely no one will use."
d28903
d28903
    Before commit 78db6a5037965429c04d708281f35a6e5562d31b,
d28903
    kvm_guest_time_update() would use vcpu->virtual_tsc_khz to calculate
d28903
    tsc_shift value in the vcpus pvclock structure written to guest memory.
d28903
d28903
    For those kernels, if vcpu->virtual_tsc_khz != tsc_khz (which can be the
d28903
    case when guest state is restored via migration, or if tsc-khz option is
d28903
    passed to QEMU), and TSC scaling is not enabled (which happens if the
d28903
    difference between the frequency requested via KVM_SET_TSC_KHZ and the
d28903
    host TSC KHZ is smaller than 250ppm), then there can be a difference
d28903
    between what KVM_GET_CLOCK would return and what the guest reads as
d28903
    kvmclock value.
d28903
d28903
    When KVM_SET_CLOCK'ing what is read with KVM_GET_CLOCK, the
d28903
    guest can observe a forward or backwards time jump.
d28903
d28903
    Advertise to userspace that current kernel contains
d28903
    this fix, so QEMU can workaround the problem by reading
d28903
    pvclock via guest memory directly otherwise.
d28903
d28903
    Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
d28903
d28903
commit 9dbd3713d82f45c9781f2dc6dd49dc3ee07ba980
d28903
Author: Davide Caratti <dcaratti@redhat.com>
d28903
Date:   Tue Aug 8 12:55:43 2023 +0200
d28903
d28903
    net/sched: sch_qfq: account for stab overhead in qfq_enqueue
d28903
d28903
    Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2225555
d28903
    CVE: CVE-2023-3611
d28903
    Upstream Status: net.git commit 3e337087c3b5
d28903
    Conflicts:
d28903
     - we don't have QFQ_MAX_LMAX defined in rhel-7 because of
d28903
       missing upstream commit 25369891fcef ("net/sched: sch_qfq:
d28903
       refactor parsing of netlink parameters"): use its value in
d28903
       the test inside qfq_change_agg()
d28903
d28903
    commit 3e337087c3b5805fe0b8a46ba622a962880b5d64
d28903
    Author: Pedro Tammela <pctammela@mojatatu.com>
d28903
    Date:   Tue Jul 11 18:01:02 2023 -0300
d28903
d28903
        net/sched: sch_qfq: account for stab overhead in qfq_enqueue
d28903
d28903
        Lion says:
d28903
        -------
d28903
        In the QFQ scheduler a similar issue to CVE-2023-31436
d28903
        persists.
d28903
d28903
        Consider the following code in net/sched/sch_qfq.c:
d28903
d28903
        static int qfq_enqueue(struct sk_buff *skb, struct Qdisc *sch,
d28903
                        struct sk_buff **to_free)
d28903
        {
d28903
             unsigned int len = qdisc_pkt_len(skb), gso_segs;
d28903
d28903
            // ...
d28903
d28903
             if (unlikely(cl->agg->lmax < len)) {
d28903
                 pr_debug("qfq: increasing maxpkt from %u to %u for class %u",
d28903
                      cl->agg->lmax, len, cl->common.classid);
d28903
                 err = qfq_change_agg(sch, cl, cl->agg->class_weight, len);
d28903
                 if (err) {
d28903
                     cl->qstats.drops++;
d28903
                     return qdisc_drop(skb, sch, to_free);
d28903
                 }
d28903
d28903
            // ...
d28903
d28903
             }
d28903
d28903
        Similarly to CVE-2023-31436, "lmax" is increased without any bounds
d28903
        checks according to the packet length "len". Usually this would not
d28903
        impose a problem because packet sizes are naturally limited.
d28903
d28903
        This is however not the actual packet length, rather the
d28903
        "qdisc_pkt_len(skb)" which might apply size transformations according to
d28903
        "struct qdisc_size_table" as created by "qdisc_get_stab()" in
d28903
        net/sched/sch_api.c if the TCA_STAB option was set when modifying the qdisc.
d28903
d28903
        A user may choose virtually any size using such a table.
d28903
d28903
        As a result the same issue as in CVE-2023-31436 can occur, allowing heap
d28903
        out-of-bounds read / writes in the kmalloc-8192 cache.
d28903
        -------
d28903
d28903
        We can create the issue with the following commands:
d28903
d28903
        tc qdisc add dev $DEV root handle 1: stab mtu 2048 tsize 512 mpu 0 \
d28903
        overhead 999999999 linklayer ethernet qfq
d28903
        tc class add dev $DEV parent 1: classid 1:1 htb rate 6mbit burst 15k
d28903
        tc filter add dev $DEV parent 1: matchall classid 1:1
d28903
        ping -I $DEV 1.1.1.2
d28903
d28903
        This is caused by incorrectly assuming that qdisc_pkt_len() returns a
d28903
        length within the QFQ_MIN_LMAX < len < QFQ_MAX_LMAX.
d28903
d28903
        Fixes: 462dbc9101ac ("pkt_sched: QFQ Plus: fair-queueing service at DRR cost")
d28903
        Reported-by: Lion <nnamrec@gmail.com>
d28903
        Reviewed-by: Eric Dumazet <edumazet@google.com>
d28903
        Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
d28903
        Signed-off-by: Pedro Tammela <pctammela@mojatatu.com>
d28903
        Reviewed-by: Simon Horman <simon.horman@corigine.com>
d28903
        Signed-off-by: Paolo Abeni <pabeni@redhat.com>
d28903
d28903
    Signed-off-by: Davide Caratti <dcaratti@redhat.com>
d28903
d28903
Signed-off-by: Ryan Sullivan <rysulliv@redhat.com>
d28903
---
d28903
 net/sched/sch_qfq.c | 7 ++++++-
d28903
 1 file changed, 6 insertions(+), 1 deletion(-)
d28903
d28903
diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c
d28903
index a36b3ec3271a..ca8c79456c80 100644
d28903
--- a/net/sched/sch_qfq.c
d28903
+++ b/net/sched/sch_qfq.c
d28903
@@ -387,8 +387,13 @@ static int qfq_change_agg(struct Qdisc *sch, struct qfq_class *cl, u32 weight,
d28903
 			   u32 lmax)
d28903
 {
d28903
 	struct qfq_sched *q = qdisc_priv(sch);
d28903
-	struct qfq_aggregate *new_agg = qfq_find_agg(q, lmax, weight);
d28903
+	struct qfq_aggregate *new_agg;
d28903
 
d28903
+	/* 'lmax' can range from [QFQ_MIN_LMAX, pktlen + stab overhead] */
d28903
+	if (lmax > (1UL << QFQ_MTU_SHIFT))
d28903
+		return -EINVAL;
d28903
+
d28903
+	new_agg = qfq_find_agg(q, lmax, weight);
d28903
 	if (new_agg == NULL) { /* create new aggregate */
d28903
 		new_agg = kzalloc(sizeof(*new_agg), GFP_ATOMIC);
d28903
 		if (new_agg == NULL)
d28903
-- 
d28903
2.41.0
d28903
d28903