Merge support for mac_check_vnode_link(), a MAC framework/policy entry

point that instruments the creation of hard links.  Policy implementations
to follow.

Obtained from:	TrustedBSD Project
Sponsored by:	DARPA, Network Associates Laboratories
This commit is contained in:
rwatson 2002-10-05 18:11:36 +00:00
parent d273cfe761
commit abda58cc1e
15 changed files with 294 additions and 2 deletions

View File

@ -799,6 +799,10 @@ mac_policy_register(struct mac_policy_conf *mpc)
mpc->mpc_ops->mpo_check_vnode_getextattr =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LINK:
mpc->mpc_ops->mpo_check_vnode_link =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LOOKUP:
mpc->mpc_ops->mpo_check_vnode_lookup =
mpe->mpe_function;
@ -1831,6 +1835,32 @@ mac_check_vnode_getextattr(struct ucred *cred, struct vnode *vp,
return (error);
}
int
mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
struct vnode *vp, struct componentname *cnp)
{
int error;
ASSERT_VOP_LOCKED(dvp, "mac_check_vnode_link");
ASSERT_VOP_LOCKED(vp, "mac_check_vnode_link");
if (!mac_enforce_fs)
return (0);
error = vn_refreshlabel(dvp, cred);
if (error)
return (error);
error = vn_refreshlabel(vp, cred);
if (error)
return (error);
MAC_CHECK(check_vnode_link, cred, dvp, &dvp->v_label, vp,
&vp->v_label, cnp);
return (error);
}
int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)

View File

@ -1031,7 +1031,12 @@ kern_link(struct thread *td, char *path, char *link, enum uio_seg segflg)
== 0) {
VOP_LEASE(nd.ni_dvp, td, td->td_ucred, LEASE_WRITE);
VOP_LEASE(vp, td, td->td_ucred, LEASE_WRITE);
error = VOP_LINK(nd.ni_dvp, vp, &nd.ni_cnd);
#ifdef MAC
error = mac_check_vnode_link(td->td_ucred, nd.ni_dvp,
vp, &nd.ni_cnd);
if (error == 0)
#endif
error = VOP_LINK(nd.ni_dvp, vp, &nd.ni_cnd);
VOP_UNLOCK(vp, 0, td);
}
NDFREE(&nd, NDF_ONLY_PNBUF);

View File

@ -1031,7 +1031,12 @@ kern_link(struct thread *td, char *path, char *link, enum uio_seg segflg)
== 0) {
VOP_LEASE(nd.ni_dvp, td, td->td_ucred, LEASE_WRITE);
VOP_LEASE(vp, td, td->td_ucred, LEASE_WRITE);
error = VOP_LINK(nd.ni_dvp, vp, &nd.ni_cnd);
#ifdef MAC
error = mac_check_vnode_link(td->td_ucred, nd.ni_dvp,
vp, &nd.ni_cnd);
if (error == 0)
#endif
error = VOP_LINK(nd.ni_dvp, vp, &nd.ni_cnd);
VOP_UNLOCK(vp, 0, td);
}
NDFREE(&nd, NDF_ONLY_PNBUF);

View File

@ -799,6 +799,10 @@ mac_policy_register(struct mac_policy_conf *mpc)
mpc->mpc_ops->mpo_check_vnode_getextattr =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LINK:
mpc->mpc_ops->mpo_check_vnode_link =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LOOKUP:
mpc->mpc_ops->mpo_check_vnode_lookup =
mpe->mpe_function;
@ -1831,6 +1835,32 @@ mac_check_vnode_getextattr(struct ucred *cred, struct vnode *vp,
return (error);
}
int
mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
struct vnode *vp, struct componentname *cnp)
{
int error;
ASSERT_VOP_LOCKED(dvp, "mac_check_vnode_link");
ASSERT_VOP_LOCKED(vp, "mac_check_vnode_link");
if (!mac_enforce_fs)
return (0);
error = vn_refreshlabel(dvp, cred);
if (error)
return (error);
error = vn_refreshlabel(vp, cred);
if (error)
return (error);
MAC_CHECK(check_vnode_link, cred, dvp, &dvp->v_label, vp,
&vp->v_label, cnp);
return (error);
}
int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)

View File

@ -333,6 +333,8 @@ int mac_check_vnode_getacl(struct ucred *cred, struct vnode *vp,
acl_type_t type);
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_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp);
/* XXX This u_char should be vm_prot_t! */

View File

@ -799,6 +799,10 @@ mac_policy_register(struct mac_policy_conf *mpc)
mpc->mpc_ops->mpo_check_vnode_getextattr =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LINK:
mpc->mpc_ops->mpo_check_vnode_link =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LOOKUP:
mpc->mpc_ops->mpo_check_vnode_lookup =
mpe->mpe_function;
@ -1831,6 +1835,32 @@ mac_check_vnode_getextattr(struct ucred *cred, struct vnode *vp,
return (error);
}
int
mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
struct vnode *vp, struct componentname *cnp)
{
int error;
ASSERT_VOP_LOCKED(dvp, "mac_check_vnode_link");
ASSERT_VOP_LOCKED(vp, "mac_check_vnode_link");
if (!mac_enforce_fs)
return (0);
error = vn_refreshlabel(dvp, cred);
if (error)
return (error);
error = vn_refreshlabel(vp, cred);
if (error)
return (error);
MAC_CHECK(check_vnode_link, cred, dvp, &dvp->v_label, vp,
&vp->v_label, cnp);
return (error);
}
int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)

View File

@ -799,6 +799,10 @@ mac_policy_register(struct mac_policy_conf *mpc)
mpc->mpc_ops->mpo_check_vnode_getextattr =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LINK:
mpc->mpc_ops->mpo_check_vnode_link =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LOOKUP:
mpc->mpc_ops->mpo_check_vnode_lookup =
mpe->mpe_function;
@ -1831,6 +1835,32 @@ mac_check_vnode_getextattr(struct ucred *cred, struct vnode *vp,
return (error);
}
int
mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
struct vnode *vp, struct componentname *cnp)
{
int error;
ASSERT_VOP_LOCKED(dvp, "mac_check_vnode_link");
ASSERT_VOP_LOCKED(vp, "mac_check_vnode_link");
if (!mac_enforce_fs)
return (0);
error = vn_refreshlabel(dvp, cred);
if (error)
return (error);
error = vn_refreshlabel(vp, cred);
if (error)
return (error);
MAC_CHECK(check_vnode_link, cred, dvp, &dvp->v_label, vp,
&vp->v_label, cnp);
return (error);
}
int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)

View File

@ -799,6 +799,10 @@ mac_policy_register(struct mac_policy_conf *mpc)
mpc->mpc_ops->mpo_check_vnode_getextattr =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LINK:
mpc->mpc_ops->mpo_check_vnode_link =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LOOKUP:
mpc->mpc_ops->mpo_check_vnode_lookup =
mpe->mpe_function;
@ -1831,6 +1835,32 @@ mac_check_vnode_getextattr(struct ucred *cred, struct vnode *vp,
return (error);
}
int
mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
struct vnode *vp, struct componentname *cnp)
{
int error;
ASSERT_VOP_LOCKED(dvp, "mac_check_vnode_link");
ASSERT_VOP_LOCKED(vp, "mac_check_vnode_link");
if (!mac_enforce_fs)
return (0);
error = vn_refreshlabel(dvp, cred);
if (error)
return (error);
error = vn_refreshlabel(vp, cred);
if (error)
return (error);
MAC_CHECK(check_vnode_link, cred, dvp, &dvp->v_label, vp,
&vp->v_label, cnp);
return (error);
}
int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)

View File

@ -294,6 +294,9 @@ struct mac_policy_ops {
int (*mpo_check_vnode_getextattr)(struct ucred *cred,
struct vnode *vp, struct label *label, int attrnamespace,
const char *name, struct uio *uio);
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_lookup)(struct ucred *cred,
struct vnode *dvp, struct label *dlabel,
struct componentname *cnp);
@ -454,6 +457,7 @@ enum mac_op_constant {
MAC_CHECK_VNODE_EXEC,
MAC_CHECK_VNODE_GETACL,
MAC_CHECK_VNODE_GETEXTATTR,
MAC_CHECK_VNODE_LINK,
MAC_CHECK_VNODE_LOOKUP,
MAC_CHECK_VNODE_MMAP_PERMS,
MAC_CHECK_VNODE_OPEN,

View File

@ -799,6 +799,10 @@ mac_policy_register(struct mac_policy_conf *mpc)
mpc->mpc_ops->mpo_check_vnode_getextattr =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LINK:
mpc->mpc_ops->mpo_check_vnode_link =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LOOKUP:
mpc->mpc_ops->mpo_check_vnode_lookup =
mpe->mpe_function;
@ -1831,6 +1835,32 @@ mac_check_vnode_getextattr(struct ucred *cred, struct vnode *vp,
return (error);
}
int
mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
struct vnode *vp, struct componentname *cnp)
{
int error;
ASSERT_VOP_LOCKED(dvp, "mac_check_vnode_link");
ASSERT_VOP_LOCKED(vp, "mac_check_vnode_link");
if (!mac_enforce_fs)
return (0);
error = vn_refreshlabel(dvp, cred);
if (error)
return (error);
error = vn_refreshlabel(vp, cred);
if (error)
return (error);
MAC_CHECK(check_vnode_link, cred, dvp, &dvp->v_label, vp,
&vp->v_label, cnp);
return (error);
}
int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)

View File

@ -799,6 +799,10 @@ mac_policy_register(struct mac_policy_conf *mpc)
mpc->mpc_ops->mpo_check_vnode_getextattr =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LINK:
mpc->mpc_ops->mpo_check_vnode_link =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LOOKUP:
mpc->mpc_ops->mpo_check_vnode_lookup =
mpe->mpe_function;
@ -1831,6 +1835,32 @@ mac_check_vnode_getextattr(struct ucred *cred, struct vnode *vp,
return (error);
}
int
mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
struct vnode *vp, struct componentname *cnp)
{
int error;
ASSERT_VOP_LOCKED(dvp, "mac_check_vnode_link");
ASSERT_VOP_LOCKED(vp, "mac_check_vnode_link");
if (!mac_enforce_fs)
return (0);
error = vn_refreshlabel(dvp, cred);
if (error)
return (error);
error = vn_refreshlabel(vp, cred);
if (error)
return (error);
MAC_CHECK(check_vnode_link, cred, dvp, &dvp->v_label, vp,
&vp->v_label, cnp);
return (error);
}
int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)

View File

@ -799,6 +799,10 @@ mac_policy_register(struct mac_policy_conf *mpc)
mpc->mpc_ops->mpo_check_vnode_getextattr =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LINK:
mpc->mpc_ops->mpo_check_vnode_link =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LOOKUP:
mpc->mpc_ops->mpo_check_vnode_lookup =
mpe->mpe_function;
@ -1831,6 +1835,32 @@ mac_check_vnode_getextattr(struct ucred *cred, struct vnode *vp,
return (error);
}
int
mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
struct vnode *vp, struct componentname *cnp)
{
int error;
ASSERT_VOP_LOCKED(dvp, "mac_check_vnode_link");
ASSERT_VOP_LOCKED(vp, "mac_check_vnode_link");
if (!mac_enforce_fs)
return (0);
error = vn_refreshlabel(dvp, cred);
if (error)
return (error);
error = vn_refreshlabel(vp, cred);
if (error)
return (error);
MAC_CHECK(check_vnode_link, cred, dvp, &dvp->v_label, vp,
&vp->v_label, cnp);
return (error);
}
int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)

View File

@ -799,6 +799,10 @@ mac_policy_register(struct mac_policy_conf *mpc)
mpc->mpc_ops->mpo_check_vnode_getextattr =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LINK:
mpc->mpc_ops->mpo_check_vnode_link =
mpe->mpe_function;
break;
case MAC_CHECK_VNODE_LOOKUP:
mpc->mpc_ops->mpo_check_vnode_lookup =
mpe->mpe_function;
@ -1831,6 +1835,32 @@ mac_check_vnode_getextattr(struct ucred *cred, struct vnode *vp,
return (error);
}
int
mac_check_vnode_link(struct ucred *cred, struct vnode *dvp,
struct vnode *vp, struct componentname *cnp)
{
int error;
ASSERT_VOP_LOCKED(dvp, "mac_check_vnode_link");
ASSERT_VOP_LOCKED(vp, "mac_check_vnode_link");
if (!mac_enforce_fs)
return (0);
error = vn_refreshlabel(dvp, cred);
if (error)
return (error);
error = vn_refreshlabel(vp, cred);
if (error)
return (error);
MAC_CHECK(check_vnode_link, cred, dvp, &dvp->v_label, vp,
&vp->v_label, cnp);
return (error);
}
int
mac_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp)

View File

@ -333,6 +333,8 @@ int mac_check_vnode_getacl(struct ucred *cred, struct vnode *vp,
acl_type_t type);
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_lookup(struct ucred *cred, struct vnode *dvp,
struct componentname *cnp);
/* XXX This u_char should be vm_prot_t! */

View File

@ -294,6 +294,9 @@ struct mac_policy_ops {
int (*mpo_check_vnode_getextattr)(struct ucred *cred,
struct vnode *vp, struct label *label, int attrnamespace,
const char *name, struct uio *uio);
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_lookup)(struct ucred *cred,
struct vnode *dvp, struct label *dlabel,
struct componentname *cnp);
@ -454,6 +457,7 @@ enum mac_op_constant {
MAC_CHECK_VNODE_EXEC,
MAC_CHECK_VNODE_GETACL,
MAC_CHECK_VNODE_GETEXTATTR,
MAC_CHECK_VNODE_LINK,
MAC_CHECK_VNODE_LOOKUP,
MAC_CHECK_VNODE_MMAP_PERMS,
MAC_CHECK_VNODE_OPEN,