NFC: add necessary privilege flags in netlink layer
authorLin Ma <linma@zju.edu.cn>
Tue, 2 Nov 2021 08:10:21 +0000 (16:10 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 3 Nov 2021 11:15:18 +0000 (11:15 +0000)
The CAP_NET_ADMIN checks are needed to prevent attackers faking a
device under NCIUARTSETDRIVER and exploit privileged commands.

This patch add GENL_ADMIN_PERM flags in genl_ops to fulfill the check.
Except for commands like NFC_CMD_GET_DEVICE, NFC_CMD_GET_TARGET,
NFC_CMD_LLC_GET_PARAMS, and NFC_CMD_GET_SE, which are mainly information-
read operations.

Signed-off-by: Lin Ma <linma@zju.edu.cn>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/nfc/netlink.c

index 49089c5..334f63c 100644 (file)
@@ -1664,31 +1664,37 @@ static const struct genl_ops nfc_genl_ops[] = {
                .cmd = NFC_CMD_DEV_UP,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_dev_up,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_DEV_DOWN,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_dev_down,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_START_POLL,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_start_poll,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_STOP_POLL,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_stop_poll,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_DEP_LINK_UP,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_dep_link_up,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_DEP_LINK_DOWN,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_dep_link_down,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_GET_TARGET,
@@ -1706,26 +1712,31 @@ static const struct genl_ops nfc_genl_ops[] = {
                .cmd = NFC_CMD_LLC_SET_PARAMS,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_llc_set_params,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_LLC_SDREQ,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_llc_sdreq,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_FW_DOWNLOAD,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_fw_download,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_ENABLE_SE,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_enable_se,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_DISABLE_SE,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_disable_se,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_GET_SE,
@@ -1737,21 +1748,25 @@ static const struct genl_ops nfc_genl_ops[] = {
                .cmd = NFC_CMD_SE_IO,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_se_io,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_ACTIVATE_TARGET,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_activate_target,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_VENDOR,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_vendor_cmd,
+               .flags = GENL_ADMIN_PERM,
        },
        {
                .cmd = NFC_CMD_DEACTIVATE_TARGET,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nfc_genl_deactivate_target,
+               .flags = GENL_ADMIN_PERM,
        },
 };