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:
parent
d273cfe761
commit
abda58cc1e
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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! */
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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! */
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user