Skip to contentSkip to conversation

SELinux: do not check open on dir path walk

PATCH In review Eric Paris 2 participants 4 messages Oct 29, 2008 SELinux security module

lore
Share & tools
lore

Eric Paris

author
#0 lore raw

PATCH 1/2 SELinux: do not check open on dir path walk

Things like link_path_walk check for MAY_EXEC on directories as it walks path names. The open perms checking was actually checking open on these as well. This patch excludes checking open when the only requested permission on the dir was MAY_EXEC. open and opendir both still require open perms.

---

 security/selinux/hooks.c |    9 +++++----
 1 files changed, 5 insertions(+), 4 deletions(-)
security/selinux/hooks.c +5 -4
index 3e3fde7..188284f 100644
@@ -1707,11 +1707,12 @@ static inline u32 open_file_mask_to_av(int mode, int mask)
 			av |= BLK_FILE__OPEN;
 		else if (S_ISFIFO(mode))
 			av |= FIFO_FILE__OPEN;
-		else if (S_ISDIR(mode))
-			av |= DIR__OPEN;
-		else
+		else if (S_ISDIR(mode)) {
+			if (mask != MAY_EXEC)
+				av |= DIR__OPEN;
+		} else
 			printk(KERN_ERR "SELinux: WARNING: inside %s with "
-				"unknown mode:%x\n", __func__, mode);
+				"unknown mode:%o mask:%x\n", __func__, mode, mask);
 	}
 	return av;
 }

--
This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to [email protected] with the words "unsubscribe selinux" without quotes as the message.

#1 lore raw
Quoted 4 lines · Eric Paris

Things like link_path_walk check for MAY_EXEC on directories as it walks path names. The open perms checking was actually checking open on these as well. This patch excludes checking open when the only requested permission on the dir was MAY_EXEC. open and opendir both still require open perms.

Would these issues (both directory search and unix socket) have been avoided if you had put the open check in the dentry_open hook instead of the inode_permission hook?

Quoted 30 lines

---

 security/selinux/hooks.c |    9 +++++----
 1 files changed, 5 insertions(+), 4 deletions(-)
security/selinux/hooks.c +5 -4
index 3e3fde7..188284f 100644
@@ -1707,11 +1707,12 @@ static inline u32 open_file_mask_to_av(int mode, int mask)
 			av |= BLK_FILE__OPEN;
 		else if (S_ISFIFO(mode))
 			av |= FIFO_FILE__OPEN;
-		else if (S_ISDIR(mode))
-			av |= DIR__OPEN;
-		else
+		else if (S_ISDIR(mode)) {
+			if (mask != MAY_EXEC)
+				av |= DIR__OPEN;
+		} else
 			printk(KERN_ERR "SELinux: WARNING: inside %s with "
-				"unknown mode:%x\n", __func__, mode);
+				"unknown mode:%o mask:%x\n", __func__, mode, mask);
 	}
 	return av;
 }
Signature · 8 lines
Stephen Smalley
National Security Agency


--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to [email protected] with
the words "unsubscribe selinux" without quotes as the message.
author
#2 lore raw
Quoted 9 lines · Stephen Smalley
Quoted 4 lines · Eric Paris

Things like link_path_walk check for MAY_EXEC on directories as it walks path names. The open perms checking was actually checking open on these as well. This patch excludes checking open when the only requested permission on the dir was MAY_EXEC. open and opendir both still require open perms.

Would these issues (both directory search and unix socket) have been avoided if you had put the open check in the dentry_open hook instead of the inode_permission hook?

Both are the result of explicit calls to inode_permission so yes, they would have been avoided.

--
This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to [email protected] with the words "unsubscribe selinux" without quotes as the message.

#3 lore raw
Quoted 7 lines · Eric Paris
Quoted 6 lines · Stephen Smalley
Quoted 4 lines · Eric Paris

Things like link_path_walk check for MAY_EXEC on directories as it walks path names. The open perms checking was actually checking open on these as well. This patch excludes checking open when the only requested permission on the dir was MAY_EXEC. open and opendir both still require open perms.

Quoted 6 lines
Quoted 3 lines

Would these issues (both directory search and unix socket) have been avoided if you had put the open check in the dentry_open hook instead of the inode_permission hook?

Both are the result of explicit calls to inode_permission so yes, they would have been avoided.

Ok...so, would it make sense to move the open checks to selinux_dentry_open() and thus avoid having to special case the logic?

Signature · 8 lines
Stephen Smalley
National Security Agency


--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to [email protected] with
the words "unsubscribe selinux" without quotes as the message.