diff options
author | Lin Ma <linma@zju.edu.cn> | 2021-11-16 23:26:52 +0800 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2021-11-17 20:17:05 -0800 |
commit | 3e3b5dfcd16a3e254aab61bd1e8c417dd4503102 (patch) | |
tree | 2bce4d573c08ee62f5eaf3abe970e1ba9cb3d533 /net/nfc/nci/core.c | |
parent | 86cdf8e38792545161dbe3350a7eced558ba4d15 (diff) | |
download | linux-3e3b5dfcd16a3e254aab61bd1e8c417dd4503102.tar.gz linux-3e3b5dfcd16a3e254aab61bd1e8c417dd4503102.tar.bz2 linux-3e3b5dfcd16a3e254aab61bd1e8c417dd4503102.zip |
NFC: reorder the logic in nfc_{un,}register_device
There is a potential UAF between the unregistration routine and the NFC
netlink operations.
The race that cause that UAF can be shown as below:
(FREE) | (USE)
nfcmrvl_nci_unregister_dev | nfc_genl_dev_up
nci_close_device |
nci_unregister_device | nfc_get_device
nfc_unregister_device | nfc_dev_up
rfkill_destory |
device_del | rfkill_blocked
... | ...
The root cause for this race is concluded below:
1. The rfkill_blocked (USE) in nfc_dev_up is supposed to be placed after
the device_is_registered check.
2. Since the netlink operations are possible just after the device_add
in nfc_register_device, the nfc_dev_up() can happen anywhere during the
rfkill creation process, which leads to data race.
This patch reorder these actions to permit
1. Once device_del is finished, the nfc_dev_up cannot dereference the
rfkill object.
2. The rfkill_register need to be placed after the device_add of nfc_dev
because the parent device need to be created first. So this patch keeps
the order but inject device_lock to prevent the data race.
Signed-off-by: Lin Ma <linma@zju.edu.cn>
Fixes: be055b2f89b5 ("NFC: RFKILL support")
Reviewed-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Link: https://lore.kernel.org/r/20211116152652.19217-1-linma@zju.edu.cn
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'net/nfc/nci/core.c')
0 files changed, 0 insertions, 0 deletions