On Tue, Aug 18, 2026 at 11:05:17PM +0530, Nilay Shroff wrote:
> Hi,
> 
> On powernv platform we have been observing following UAF warning during 
> system boot in IPMI
> driver code.
> 
> ========================================================================================
> 
> ipmi-powernv ibm,opal:ipmi: IPMI message handler: Unable to get the device 
> id: -5
> ipmi-powernv ibm,opal:ipmi: IPMI SMI registration failed (-5)
> ipmi-powernv ibm,opal:ipmi: probe with driver ipmi-powernv failed with error 
> -5
> ------------[ cut here ]------------
> refcount_t: addition on 0; use-after-free.
> WARNING: lib/refcount.c:25 at refcount_warn_saturate+0x194/0x230, CPU#24: 
> kworker/24:2/1498
> Modules linked in: ipmi_powernv ipmi_devintf ipmi_msghandler dm_multipath 
> usbhid scsi_dh_rdac scsi_dh_alua fuse autofs4
> CPU: 24 UID: 0 PID: 1498 Comm: kworker/24:2 Not tainted 7.2.0 #18 PREEMPTLAZY
> Hardware name: 8335-GTC POWER9 0x4e1203 
> opal:v7.1-150-g06912e3ba-root-dirty-87f12a4 PowerNV
> Workqueue: events smi_work [ipmi_msghandler]
> [...]
> [...]
> NIP [c0000000008f1364] refcount_warn_saturate+0x194/0x230
> LR [c0000000008f1360] refcount_warn_saturate+0x190/0x230
> Call Trace:
>        refcount_warn_saturate+0x190/0x230 (unreliable)
>        smi_work+0x550/0x560 [ipmi_msghandler]
>        process_one_work+0x19c/0x4d0
>        worker_thread+0x1ec/0x3e0
>        kthread+0x194/0x1b0
>        start_kernel_thread+0x14/0x18
> ---[ end trace 0000000000000000 ]---
> ------------[ cut here ]------------
> refcount_t: underflow; use-after-free.
> WARNING: lib/refcount.c:28 at refcount_warn_saturate+0x214/0x230, CPU#24: 
> kworker/24:2/1498
> Modules linked in: ipmi_powernv ipmi_devintf ipmi_msghandler dm_multipath 
> usbhid scsi_dh_rdac scsi_dh_alua fuse autofs4
> CPU: 24 UID: 0 PID: 1498 Comm: kworker/24:2 Tainted: G        W           
> 7.2.0 #18 PREEMPTLAZY
> Tainted: [W]=WARN
> Hardware name: 8335-GTC POWER9 0x4e1203 
> opal:v7.1-150-g06912e3ba-root-dirty-87f12a4 PowerNV
> Workqueue: events smi_work [ipmi_msghandler]
> NIP:  c0000000008f13e4 LR: c0000000008f13e0 CTR: 0000000000000000
> REGS: c00000006bd1fb10 TRAP: 0700   Tainted: G        W            (7.2.0)
> [...]
> [...]
> NIP [c0000000008f13e4] refcount_warn_saturate+0x214/0x230
> LR [c0000000008f13e0] refcount_warn_saturate+0x210/0x230
> Call Trace:
>        refcount_warn_saturate+0x210/0x230 (unreliable)
>        smi_work+0x524/0x560 [ipmi_msghandler]
>        process_one_work+0x19c/0x4d0
>        worker_thread+0x1ec/0x3e0
>        kthread+0x194/0x1b0
>        start_kernel_thread+0x14/0x18
> ---[ end trace 0000000000000000 ]---
> ====================================================================================================
> 
> Bisecting the code point us towards commit 62cd145453d5 ("ipmi:msghandler: 
> Handle error
> returns from the SMI sender").

Yes, that's an issue.

Can you try the following?

diff --git a/drivers/char/ipmi/ipmi_msghandler.c 
b/drivers/char/ipmi/ipmi_msghandler.c
index 7634dff99f41..c73e9def59a6 100644
--- a/drivers/char/ipmi/ipmi_msghandler.c
+++ b/drivers/char/ipmi/ipmi_msghandler.c
@@ -3766,6 +3766,7 @@ int ipmi_add_smi(struct module         *owner,
        list_del(&intf->link);
        mutex_unlock(&ipmi_interfaces_mutex);
        mutex_unlock(&smi_watchers_mutex);
+       cancel_work_sync(&intf->smi_work);
        kref_put(&intf->refcount, intf_free);

        return rv;


> 
> Further analyzing the above commit 62cd145453d5, it seems that it correctly 
> propagates
> an error returned by the SMI sender, but its error path unconditionally 
> queues intf->smi_work.
> If the sender fails during SMI registration (on powernv it actually does), the
> propagated error causes registration to abort and the struct ipmi_smi to be 
> freed while
> the queued work can still execute (after ipmi_smi is freed), resulting in a 
> use-after-free.
> 
> One possible way to address the lifetime issue may be to take a reference on 
> intf before
> queuing smi_work() and release it when the work completes, although I'm not 
> familiar
> enough with the intended lifetime rules of struct ipmi_smi to say whether 
> that is the
> appropriate fix.
> 
> Please let me know if you need any further information or if there are 
> additional
> tests/debugging that I could help run on the powernv platform.
> 
> Thanks,
> --Nilay


_______________________________________________
Openipmi-developer mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openipmi-developer

Reply via email to