|
Message-ID: <20231105172713.GA21489@openwall.com> Date: Sun, 5 Nov 2023 18:27:13 +0100 From: Solar Designer <solar@...nwall.com> To: oss-security@...ts.openwall.com Cc: Pietro Borrello <borrello@...g.uniroma1.it> Subject: CVE-2023-1078: Linux: rds_rm_zerocopy_callback() bugs Hi, There was a thread on linux-distros in February, where Pietro brought up multiple Linux kernel issues at once. Some of these were already on oss-security by the time (as indicated below), four others were brought to oss-security on March 1st: https://www.openwall.com/lists/oss-security/2023/03/01/ However, it looks like one CVE corresponding to two bugs was not, so I am correcting this now. The missed CVE was assigned as follows: > CVE-2023-1078 - Heap OOB Write in rds_rm_zerocopy_callback() > patch: > https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=f753a68980cf4b59a80fe677619da2b1804f526d > > CVE-2023-1078 - Resource leak (leading to memory exhaustion) in rds_rm_zerocopy_callback() > patch: > https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=68762148d1b011d47bc2ceed7321739b5aea1e63 Ubuntu security advisories describe it as: > It was discovered that the Reliable Datagram Sockets (RDS) protocol > implementation in the Linux kernel contained a type confusion vulnerability > in some situations. An attacker could use this to cause a denial of service > (system crash). (CVE-2023-1078) You can see Pietro's own more detailed descriptions of the two bugs by searching the message below for mentions of rds_rm_zerocopy_callback(). Alexander ----- Forwarded message from Pietro Borrello <borrello@...g.uniroma1.it> ----- From: Pietro Borrello <borrello@...g.uniroma1.it> Subject: Re: [vs-plain] CVE Request CC: linux-distros Date: Wed, 22 Feb 2023 20:13:29 +0100 Attached the more detailed report. - Type Confusion in hid_validate_values() patch: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=b12fece4c64857e5fab4290bf01b2e0317a88456 oss-security: https://www.openwall.com/lists/oss-security/2023/01/17/3 attack-type: physical impact: memory corruption -> privilege escalation details: hid_validate_values fails to properly check the shape of USB reports, causing type confusion if a malicious device advertises invalid reports. On default configuration the type confusion results in the function failing due to field alignment, but any non-default configuration including structure layout randomization or having different struct field layout would incur in memory corruption. - Type Confusion in bigben_probe() patch: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=c7bf714f875531f227f2ef1fdcc8f4d44e7c7d9d oss-security: https://www.openwall.com/lists/oss-security/2023/01/17/3 attack-type: physical impact: memory corruption -> privilege escalation details: bigben_probe() fails to properly check the shape of USB reports, causing type confusion if a malicious device advertises invalid reports. On default configuration the type confusion results in the function failing due to field alignment, but any non-default configuration including structure layout randomization or having different struct field layout would incur in memory corruption. - NULL Ptr Deref in hid_betopff_play() patch: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=3782c0d6edf658b71354a64d60aa7a296188fc90 oss-security: https://www.openwall.com/lists/oss-security/2023/01/18/3 attack-type: physical impact: DOS/privilege escalation details: betopff_init does not properly check the shape of USB report, causing a NULL ptr dereference in hid_betopff_play() on default configuration. NULL pointer dereferences may be exploited to achieve LPE (e.g., see https://googleprojectzero.blogspot.com/2023/01/exploiting-null-dereferences-in-linux.html). On non default configuration, as the NULL deref is caused by a type confusion, a different field layout may cause further memory corruption. - KASLR Leak in inet_diag_msg_sctpasoc_fill() patch: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=458e279f861d3f61796894cd158b780765a1569f oss-security: https://www.openwall.com/lists/oss-security/2023/01/23/1 attack-type: local impact: information disclosure details: a type confusion in inet_diag_msg_sctpasoc_fill() in net/sctp/diag.c, uses a type confused pointer to return information to userspace when issuing a list_entry() on asoc->base.bind_addr.address_list.next when the list is empty. The impact of the type confusion is a KASLR leak since the `laddr.v6.sin6_addr` is returned from the type confused pointer, which overlaps with `struct sctp_endpoint *ep` of the `struct sctp_association`. - Type Confusion in tls_is_tx_ready() patch: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=ffe2a22562444720b05bdfeb999c03e810d84cbb attack-type: local impact: information disclosure details: tls_is_tx_ready() incorrectly checks for list emptyness, potentially accessing a type confused entry to the list_head, leaking the last byte of the confused field that overlaps with rec->tx_ready. - Incorrect UID assigned to tun/tap sockets patch (tap): https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=66b2c338adce580dfce2199591e65e2bab889cff patch (tun): https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=a096ccca6e503a5c575717ff8a36ace27510ab0a attack-type: local impact: filtering/routing bypass for virtual sockets details: tun/tap sockets have their socket UID hardcoded to 0 due to a type confusion in their initialization function. While it will be often correct, as tuntap devices require CAP_NET_ADMIN, it may not always be the case, e.g., a non-root user only having that capability. This would make tun/tap sockets being incorrectly treated in filtering/routing decisions, possibly bypassing network filters. - Type confusion in pick_next_rt_entity() patch: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=7c4a5b89a0b5a57a64b601775b296abf77a9fe97 attack-type: local impact: memory corruption -> privilege escalation details: pick_next_rt_entity() may return a type confused entry, not detected by the BUG_ON condition, as the confused entry will not be NULL, but list_head. The buggy error condition would lead to a type confused entry with the list head, which would then be used as a type confused sched_rt_entity, causing memory corruption. - Heap OOB Write in rds_rm_zerocopy_callback() patch: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=f753a68980cf4b59a80fe677619da2b1804f526d attack-type: local impact: memory corruption -> privilege escalation details: The rds_rm_zerocopy_callback() issues a list_entry() on the actual head of a list, instead of calling list_first_entry(). This causes a type confusion and the `struct rds_msg_zcopy_info *info` actually points to `&q->zcookie_head`. In rds_zcookie_add(), `info->zcookies` is used, which if type confused overlaps with `spinlock_t lock` in `struct rds_msg_zcopy_queue`. The function writes `cookie`, which is completely controlled by userspace, to `ck->cookies[ncookies]`. `ncookies` is read from `ck->num` which overlaps with the `lock` counter, and is then incremented, also corrupting the `lock`. This effectively results in a controlled OOB write from `struct rds_msg_zcopy_queue` embedded at the end of `struct rds_sock`. The value is completely controlled, while the index depends on the `lock` state, being 1 by default, which I suspect can be controlled too. - Type Confusion in sctp_sock_filter() *removed from the request as not security relevant in default configurations* - Resource leak (leading to memory exhaustion) in rds_rm_zerocopy_callback() patch: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=68762148d1b011d47bc2ceed7321739b5aea1e63 attack-type: local impact: DOS details: rds_rm_zerocopy_callback() uses list_add_tail() with swapped arguments. This links the list head with the new entry, losing the references to the remaining part of the list, and causing the resource leak of the allocated entries. Repeating the leak may cause resource exhaustion. - Use After Free in asus_remove() patch: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=4ab3a086d10eeec1424f2e8a968827a6336203df attack-type: physical impact: memory corruption -> privilege escalation details: Similarly to CVE-2023-25012 , in asus devices, the work_struct may be scheduled by the LED controller while the device is disconnecting, triggering a use-after-free on the struct asus_kbd_leds *led structure. A malicious USB device may exploit the issue to cause memory corruption with controlled data. - Heap OOB Write in bigben_worker() patch: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=b94335f899542a0da5fafc38af8edcaf90195843 attack-type: local impact: memory corruption -> privilege escalation details: bigben_probe() does not validate that the output report has the needed report values in the first field. A malicious device registering a report with one field and a single value causes an heap OOB write in bigben_worker() when accessing report_field->value[1] to report_field->value[7], with partially user-controlled values. Best regards, Pietro Borrello ----- End forwarded message -----
Powered by blists - more mailing lists
Please check out the Open Source Software Security Wiki, which is counterpart to this mailing list.
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.