On 3/5/21 2:42 PM, Pavel Machek wrote: > Hi! > >> From: Lee Duncan <lduncan@suse.com> >> >> commit 688e8128b7a92df982709a4137ea4588d16f24aa upstream. >> >> Protect the iSCSI transport handle, available in sysfs, by requiring >> CAP_SYS_ADMIN to read it. Also protect the netlink socket by restricting >> reception of messages to ones sent with CAP_SYS_ADMIN. This disables >> normal users from being able to end arbitrary iSCSI sessions. > > Should not normal filesystem permissions be used? > >> +++ b/drivers/scsi/scsi_transport_iscsi.c >> @@ -132,6 +132,9 @@ show_transport_handle(struct device *dev >> char *buf) >> { >> struct iscsi_internal *priv = dev_to_iscsi_internal(dev); >> + >> + if (!capable(CAP_SYS_ADMIN)) >> + return -EACCES; >> return sprintf(buf, "%llu\n", (unsigned long long)iscsi_handle(priv->iscsi_transport)); >> } >> static DEVICE_ATTR(handle, S_IRUGO, show_transport_handle, NULL); > > AFAICT we make the file 0444 (world readable) and then fail the read > with capability check. If the file is not supposed to be > world-readable, it should have 0400 permissions, right? > > Best regards, > Pavel > I am ok with changing file permissions, but there's nothing wrong with checking capabilities upon entry, as well, since capability checks are a higher degree of security than ACLs.
--- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c @@ -132,6 +132,9 @@ show_transport_handle(struct device *dev char *buf) { struct iscsi_internal *priv = dev_to_iscsi_internal(dev); + + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; return sprintf(buf, "%llu\n", (unsigned long long)iscsi_handle(priv->iscsi_transport)); } static DEVICE_ATTR(handle, S_IRUGO, show_transport_handle, NULL); @@ -3624,6 +3627,9 @@ iscsi_if_recv_msg(struct sk_buff *skb, s struct iscsi_cls_conn *conn; struct iscsi_endpoint *ep = NULL; + if (!netlink_capable(skb, CAP_SYS_ADMIN)) + return -EPERM; + if (nlh->nlmsg_type == ISCSI_UEVENT_PATH_UPDATE) *group = ISCSI_NL_GRP_UIP; else