]> Git Repo - linux.git/commitdiff
ntb: ntb_hw_switchtec: Fix use after free vulnerability in switchtec_ntb_remove due...
authorKaixin Wang <[email protected]>
Mon, 9 Sep 2024 17:20:07 +0000 (01:20 +0800)
committerJon Mason <[email protected]>
Fri, 20 Sep 2024 14:50:38 +0000 (10:50 -0400)
In the switchtec_ntb_add function, it can call switchtec_ntb_init_sndev
function, then &sndev->check_link_status_work is bound with
check_link_status_work. switchtec_ntb_link_notification may be called
to start the work.

If we remove the module which will call switchtec_ntb_remove to make
cleanup, it will free sndev through kfree(sndev), while the work
mentioned above will be used. The sequence of operations that may lead
to a UAF bug is as follows:

CPU0                                 CPU1

                        | check_link_status_work
switchtec_ntb_remove    |
kfree(sndev);           |
                        | if (sndev->link_force_down)
                        | // use sndev

Fix it by ensuring that the work is canceled before proceeding with
the cleanup in switchtec_ntb_remove.

Signed-off-by: Kaixin Wang <[email protected]>
Reviewed-by: Logan Gunthorpe <[email protected]>
Signed-off-by: Jon Mason <[email protected]>
drivers/ntb/hw/mscc/ntb_hw_switchtec.c

index 31946387badf0e1dbdcbe0be71c3077b5abc6dd0..ad1786be2554b34c5abe08f96b8b62dd98012c26 100644 (file)
@@ -1554,6 +1554,7 @@ static void switchtec_ntb_remove(struct device *dev)
        switchtec_ntb_deinit_db_msg_irq(sndev);
        switchtec_ntb_deinit_shared_mw(sndev);
        switchtec_ntb_deinit_crosslink(sndev);
+       cancel_work_sync(&sndev->check_link_status_work);
        kfree(sndev);
        dev_info(dev, "ntb device unregistered\n");
 }
This page took 0.056099 seconds and 4 git commands to generate.