summaryrefslogtreecommitdiffstats
path: root/sys/security
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2003-08-21 13:53:01 +0000
committerrwatson <rwatson@FreeBSD.org>2003-08-21 13:53:01 +0000
commit6f522a9e5248d735aaee5f9fd322c6c758801149 (patch)
tree516e8cf5fae27c0606b263da692534ee28f2e34b /sys/security
parent1c5a183b7da9ef0273663eacb58ec473ec905d00 (diff)
downloadFreeBSD-src-6f522a9e5248d735aaee5f9fd322c6c758801149.zip
FreeBSD-src-6f522a9e5248d735aaee5f9fd322c6c758801149.tar.gz
Add mac_check_vnode_deleteextattr() and mac_check_vnode_listextattr():
explicit access control checks to delete and list extended attributes on a vnode, rather than implicitly combining with the setextattr and getextattr checks. This reflects EA API changes in the kernel made recently, including the move to explicit VOP's for both of these operations. Obtained from: TrustedBSD PRoject Sponsored by: DARPA, Network Associates Laboratories
Diffstat (limited to 'sys/security')
-rw-r--r--sys/security/mac/mac_framework.c32
-rw-r--r--sys/security/mac/mac_framework.h4
-rw-r--r--sys/security/mac/mac_internal.h32
-rw-r--r--sys/security/mac/mac_net.c32
-rw-r--r--sys/security/mac/mac_pipe.c32
-rw-r--r--sys/security/mac/mac_policy.h5
-rw-r--r--sys/security/mac/mac_process.c32
-rw-r--r--sys/security/mac/mac_syscalls.c32
-rw-r--r--sys/security/mac/mac_system.c32
-rw-r--r--sys/security/mac/mac_vfs.c32
10 files changed, 265 insertions, 0 deletions
diff --git a/sys/security/mac/mac_framework.c b/sys/security/mac/mac_framework.c
index f3cc2f8..dcd8831 100644
--- a/sys/security/mac/mac_framework.c
+++ b/sys/security/mac/mac_framework.c
@@ -1614,6 +1614,22 @@ mac_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp,
}
int
+mac_check_vnode_deleteextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace, const char *name)
+{
+ int error;
+
+ ASSERT_VOP_LOCKED(vp, "mac_check_vnode_deleteextattr");
+
+ if (!mac_enforce_fs)
+ return (0);
+
+ MAC_CHECK(check_vnode_deleteextattr, cred, vp, &vp->v_label,
+ attrnamespace, name);
+ return (error);
+}
+
+int
mac_check_vnode_exec(struct ucred *cred, struct vnode *vp,
struct image_params *imgp)
{
@@ -1678,6 +1694,22 @@ mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
}
int
+mac_check_vnode_listextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace)
+{
+ int error;
+
+ ASSERT_VOP_LOCKED(vp, "mac_check_vnode_listextattr");
+
+ if (!mac_enforce_fs)
+ return (0);
+
+ MAC_CHECK(check_vnode_listextattr, cred, vp, &vp->v_label,
+ attrnamespace);
+ return (error);
+}
+
+int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)
{
diff --git a/sys/security/mac/mac_framework.h b/sys/security/mac/mac_framework.h
index 2412f8b..046c2fc 100644
--- a/sys/security/mac/mac_framework.h
+++ b/sys/security/mac/mac_framework.h
@@ -279,6 +279,8 @@ int mac_check_vnode_delete(struct ucred *cred, struct vnode *dvp,
struct vnode *vp, struct componentname *cnp);
int mac_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp,
acl_type_t type);
+int mac_check_vnode_deleteextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace, const char *name);
int mac_check_vnode_exec(struct ucred *cred, struct vnode *vp,
struct image_params *imgp);
int mac_check_vnode_getacl(struct ucred *cred, struct vnode *vp,
@@ -287,6 +289,8 @@ int mac_check_vnode_getextattr(struct ucred *cred, struct vnode *vp,
int attrnamespace, const char *name, struct uio *uio);
int mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
struct vnode *vp, struct componentname *cnp);
+int mac_check_vnode_listextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace);
int mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp);
int mac_check_vnode_mmap(struct ucred *cred, struct vnode *vp,
diff --git a/sys/security/mac/mac_internal.h b/sys/security/mac/mac_internal.h
index f3cc2f8..dcd8831 100644
--- a/sys/security/mac/mac_internal.h
+++ b/sys/security/mac/mac_internal.h
@@ -1614,6 +1614,22 @@ mac_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp,
}
int
+mac_check_vnode_deleteextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace, const char *name)
+{
+ int error;
+
+ ASSERT_VOP_LOCKED(vp, "mac_check_vnode_deleteextattr");
+
+ if (!mac_enforce_fs)
+ return (0);
+
+ MAC_CHECK(check_vnode_deleteextattr, cred, vp, &vp->v_label,
+ attrnamespace, name);
+ return (error);
+}
+
+int
mac_check_vnode_exec(struct ucred *cred, struct vnode *vp,
struct image_params *imgp)
{
@@ -1678,6 +1694,22 @@ mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
}
int
+mac_check_vnode_listextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace)
+{
+ int error;
+
+ ASSERT_VOP_LOCKED(vp, "mac_check_vnode_listextattr");
+
+ if (!mac_enforce_fs)
+ return (0);
+
+ MAC_CHECK(check_vnode_listextattr, cred, vp, &vp->v_label,
+ attrnamespace);
+ return (error);
+}
+
+int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)
{
diff --git a/sys/security/mac/mac_net.c b/sys/security/mac/mac_net.c
index f3cc2f8..dcd8831 100644
--- a/sys/security/mac/mac_net.c
+++ b/sys/security/mac/mac_net.c
@@ -1614,6 +1614,22 @@ mac_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp,
}
int
+mac_check_vnode_deleteextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace, const char *name)
+{
+ int error;
+
+ ASSERT_VOP_LOCKED(vp, "mac_check_vnode_deleteextattr");
+
+ if (!mac_enforce_fs)
+ return (0);
+
+ MAC_CHECK(check_vnode_deleteextattr, cred, vp, &vp->v_label,
+ attrnamespace, name);
+ return (error);
+}
+
+int
mac_check_vnode_exec(struct ucred *cred, struct vnode *vp,
struct image_params *imgp)
{
@@ -1678,6 +1694,22 @@ mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
}
int
+mac_check_vnode_listextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace)
+{
+ int error;
+
+ ASSERT_VOP_LOCKED(vp, "mac_check_vnode_listextattr");
+
+ if (!mac_enforce_fs)
+ return (0);
+
+ MAC_CHECK(check_vnode_listextattr, cred, vp, &vp->v_label,
+ attrnamespace);
+ return (error);
+}
+
+int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)
{
diff --git a/sys/security/mac/mac_pipe.c b/sys/security/mac/mac_pipe.c
index f3cc2f8..dcd8831 100644
--- a/sys/security/mac/mac_pipe.c
+++ b/sys/security/mac/mac_pipe.c
@@ -1614,6 +1614,22 @@ mac_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp,
}
int
+mac_check_vnode_deleteextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace, const char *name)
+{
+ int error;
+
+ ASSERT_VOP_LOCKED(vp, "mac_check_vnode_deleteextattr");
+
+ if (!mac_enforce_fs)
+ return (0);
+
+ MAC_CHECK(check_vnode_deleteextattr, cred, vp, &vp->v_label,
+ attrnamespace, name);
+ return (error);
+}
+
+int
mac_check_vnode_exec(struct ucred *cred, struct vnode *vp,
struct image_params *imgp)
{
@@ -1678,6 +1694,22 @@ mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
}
int
+mac_check_vnode_listextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace)
+{
+ int error;
+
+ ASSERT_VOP_LOCKED(vp, "mac_check_vnode_listextattr");
+
+ if (!mac_enforce_fs)
+ return (0);
+
+ MAC_CHECK(check_vnode_listextattr, cred, vp, &vp->v_label,
+ attrnamespace);
+ return (error);
+}
+
+int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)
{
diff --git a/sys/security/mac/mac_policy.h b/sys/security/mac/mac_policy.h
index b1f7a43..d38efe4 100644
--- a/sys/security/mac/mac_policy.h
+++ b/sys/security/mac/mac_policy.h
@@ -359,6 +359,9 @@ struct mac_policy_ops {
struct componentname *cnp);
int (*mpo_check_vnode_deleteacl)(struct ucred *cred,
struct vnode *vp, struct label *label, acl_type_t type);
+ int (*mpo_check_vnode_deleteextattr)(struct ucred *cred,
+ struct vnode *vp, struct label *label, int attrnamespace,
+ const char *name);
int (*mpo_check_vnode_exec)(struct ucred *cred, struct vnode *vp,
struct label *label, struct image_params *imgp,
struct label *execlabel);
@@ -370,6 +373,8 @@ struct mac_policy_ops {
int (*mpo_check_vnode_link)(struct ucred *cred, struct vnode *dvp,
struct label *dlabel, struct vnode *vp,
struct label *label, struct componentname *cnp);
+ int (*mpo_check_vnode_listextattr)(struct ucred *cred,
+ struct vnode *vp, struct label *label, int attrnamespace);
int (*mpo_check_vnode_lookup)(struct ucred *cred,
struct vnode *dvp, struct label *dlabel,
struct componentname *cnp);
diff --git a/sys/security/mac/mac_process.c b/sys/security/mac/mac_process.c
index f3cc2f8..dcd8831 100644
--- a/sys/security/mac/mac_process.c
+++ b/sys/security/mac/mac_process.c
@@ -1614,6 +1614,22 @@ mac_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp,
}
int
+mac_check_vnode_deleteextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace, const char *name)
+{
+ int error;
+
+ ASSERT_VOP_LOCKED(vp, "mac_check_vnode_deleteextattr");
+
+ if (!mac_enforce_fs)
+ return (0);
+
+ MAC_CHECK(check_vnode_deleteextattr, cred, vp, &vp->v_label,
+ attrnamespace, name);
+ return (error);
+}
+
+int
mac_check_vnode_exec(struct ucred *cred, struct vnode *vp,
struct image_params *imgp)
{
@@ -1678,6 +1694,22 @@ mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
}
int
+mac_check_vnode_listextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace)
+{
+ int error;
+
+ ASSERT_VOP_LOCKED(vp, "mac_check_vnode_listextattr");
+
+ if (!mac_enforce_fs)
+ return (0);
+
+ MAC_CHECK(check_vnode_listextattr, cred, vp, &vp->v_label,
+ attrnamespace);
+ return (error);
+}
+
+int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)
{
diff --git a/sys/security/mac/mac_syscalls.c b/sys/security/mac/mac_syscalls.c
index f3cc2f8..dcd8831 100644
--- a/sys/security/mac/mac_syscalls.c
+++ b/sys/security/mac/mac_syscalls.c
@@ -1614,6 +1614,22 @@ mac_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp,
}
int
+mac_check_vnode_deleteextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace, const char *name)
+{
+ int error;
+
+ ASSERT_VOP_LOCKED(vp, "mac_check_vnode_deleteextattr");
+
+ if (!mac_enforce_fs)
+ return (0);
+
+ MAC_CHECK(check_vnode_deleteextattr, cred, vp, &vp->v_label,
+ attrnamespace, name);
+ return (error);
+}
+
+int
mac_check_vnode_exec(struct ucred *cred, struct vnode *vp,
struct image_params *imgp)
{
@@ -1678,6 +1694,22 @@ mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
}
int
+mac_check_vnode_listextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace)
+{
+ int error;
+
+ ASSERT_VOP_LOCKED(vp, "mac_check_vnode_listextattr");
+
+ if (!mac_enforce_fs)
+ return (0);
+
+ MAC_CHECK(check_vnode_listextattr, cred, vp, &vp->v_label,
+ attrnamespace);
+ return (error);
+}
+
+int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)
{
diff --git a/sys/security/mac/mac_system.c b/sys/security/mac/mac_system.c
index f3cc2f8..dcd8831 100644
--- a/sys/security/mac/mac_system.c
+++ b/sys/security/mac/mac_system.c
@@ -1614,6 +1614,22 @@ mac_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp,
}
int
+mac_check_vnode_deleteextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace, const char *name)
+{
+ int error;
+
+ ASSERT_VOP_LOCKED(vp, "mac_check_vnode_deleteextattr");
+
+ if (!mac_enforce_fs)
+ return (0);
+
+ MAC_CHECK(check_vnode_deleteextattr, cred, vp, &vp->v_label,
+ attrnamespace, name);
+ return (error);
+}
+
+int
mac_check_vnode_exec(struct ucred *cred, struct vnode *vp,
struct image_params *imgp)
{
@@ -1678,6 +1694,22 @@ mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
}
int
+mac_check_vnode_listextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace)
+{
+ int error;
+
+ ASSERT_VOP_LOCKED(vp, "mac_check_vnode_listextattr");
+
+ if (!mac_enforce_fs)
+ return (0);
+
+ MAC_CHECK(check_vnode_listextattr, cred, vp, &vp->v_label,
+ attrnamespace);
+ return (error);
+}
+
+int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)
{
diff --git a/sys/security/mac/mac_vfs.c b/sys/security/mac/mac_vfs.c
index f3cc2f8..dcd8831 100644
--- a/sys/security/mac/mac_vfs.c
+++ b/sys/security/mac/mac_vfs.c
@@ -1614,6 +1614,22 @@ mac_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp,
}
int
+mac_check_vnode_deleteextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace, const char *name)
+{
+ int error;
+
+ ASSERT_VOP_LOCKED(vp, "mac_check_vnode_deleteextattr");
+
+ if (!mac_enforce_fs)
+ return (0);
+
+ MAC_CHECK(check_vnode_deleteextattr, cred, vp, &vp->v_label,
+ attrnamespace, name);
+ return (error);
+}
+
+int
mac_check_vnode_exec(struct ucred *cred, struct vnode *vp,
struct image_params *imgp)
{
@@ -1678,6 +1694,22 @@ mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
}
int
+mac_check_vnode_listextattr(struct ucred *cred, struct vnode *vp,
+ int attrnamespace)
+{
+ int error;
+
+ ASSERT_VOP_LOCKED(vp, "mac_check_vnode_listextattr");
+
+ if (!mac_enforce_fs)
+ return (0);
+
+ MAC_CHECK(check_vnode_listextattr, cred, vp, &vp->v_label,
+ attrnamespace);
+ return (error);
+}
+
+int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)
{
OpenPOWER on IntegriCloud