]> xenbits.xensource.com Git - libvirt.git/commitdiff
Fix off-by-one error in udevListInterfacesByStatus
authorMartin Kletzander <mkletzan@redhat.com>
Tue, 27 Feb 2024 15:20:12 +0000 (16:20 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Fri, 1 Mar 2024 10:52:27 +0000 (11:52 +0100)
Ever since this function was introduced in 2012 it could've tried
filling in an extra interface name.  That was made worse in 2019 when
the caller functions started accepting NULL arrays of size 0.

This is assigned CVE-2024-1441.

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
Reported-by: Alexander Kuznetsov <kuznetsovam@altlinux.org>
Fixes: 5a33366f5c0b18c93d161bd144f9f079de4ac8ca
Fixes: d6064e2759a24e0802f363e3a810dc5a7d7ebb15
Reviewed-by: Ján Tomko <jtomko@redhat.com>
NEWS.rst
src/interface/interface_backend_udev.c

index ac64cf6974357a44b65d7472baa0138bcdcbc6ab..69258880d2d36f1caec295016c8150d7948a5f64 100644 (file)
--- a/NEWS.rst
+++ b/NEWS.rst
@@ -13,6 +13,21 @@ v10.1.0 (unreleased)
 
 * **Security**
 
+  * ``CVE-2024-1441``: Fix off-by-one error leading to a crash
+
+    In **libvirt-1.0.0** there were couple of interface listing APIs
+    introduced which had an off-by-one error.  That error could lead to a
+    very rare crash if an array was passed to those functions which did
+    not fit all the interfaces.
+
+    In **libvirt-5.10** a check for non-NULL arrays has been adjusted to
+    allow for NULL arrays with size 0 instead of rejecting all NULL
+    arrays.  However that made the above issue significantly worse since
+    that off-by-one error now did not write beyond an array, but
+    dereferenced said NULL pointer making the crash certain in a
+    specific scenario in which a NULL array of size 0 was passed to the
+    aforementioned functions.
+
 * **Removed features**
 
 * **New features**
index fb6799ed9406fcef68084cb64ab4c4eef94f52cb..40914830604eeb4f880fa35b28ec50983bd2b0d3 100644 (file)
@@ -222,7 +222,7 @@ udevListInterfacesByStatus(virConnectPtr conn,
         g_autoptr(virInterfaceDef) def = NULL;
 
         /* Ensure we won't exceed the size of our array */
-        if (count > names_len)
+        if (count >= names_len)
             break;
 
         path = udev_list_entry_get_name(dev_entry);