Re: [PATCH v2] selinux: restrict kernel module loading

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sunday, April 03, 2016 02:57:00 PM Jeff Vander Stoep wrote:
> Utilize existing kernel_read_file hook on kernel module load.
> Add module_load permission to the system class.
> 
> Enforces restrictions on kernel module origin when calling the
> finit_module syscall. The hook checks that source type has
> permission module_load for the target type.
> Example for finit_module:
> 
> allow foo bar_file:system module_load;
> 
> Similarly restrictions are enforced on kernel module loading when
> calling the init_module syscall. The hook checks that source
> type has permission module_load with itself as the target object
> because the kernel module is sourced from the calling process.
> Example for init_module:
> 
> allow foo foo:system module_load;
> 
> Signed-off-by: Jeff Vander Stoep <jeffv@xxxxxxxxxx>
> ---
> v2: The target type for init_module changed from SECINITSID_KERNEL
> to the same type as the source.
> 
>  security/selinux/hooks.c            | 52
> +++++++++++++++++++++++++++++++++++++ security/selinux/include/classmap.h |
>  2 +-
>  2 files changed, 53 insertions(+), 1 deletion(-)
> 
> diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
> index 3fa3ca5..f870c4d 100644
> --- a/security/selinux/hooks.c
> +++ b/security/selinux/hooks.c
> @@ -3719,6 +3719,57 @@ static int selinux_kernel_module_request(char
> *kmod_name) SYSTEM__MODULE_REQUEST, &ad);
>  }
> 
> +static int selinux_kernel_module_from_file(struct file *file)
> +{
> +	struct common_audit_data ad;
> +	struct inode_security_struct *isec;
> +	struct file_security_struct *fsec;
> +	struct inode *inode;
> +	u32 sid = current_sid();
> +	int rc;
> +
> +	/* init_module */
> +	if (file == NULL) {
> +		rc = avc_has_perm(sid, sid, SECCLASS_SYSTEM,
> +					SYSTEM__MODULE_LOAD, NULL);
> +		goto out;

The real comment is below, this isn't the reason for rejecting the patch, but 
since we need one more change it would be nice to return directly instead of 
jumping to "out", example:

	if (file == NULL)
		return avc_has_perm(...);

> +	}
> +
> +	/* finit_module */
> +	ad.type = LSM_AUDIT_DATA_PATH;
> +	ad.u.path = file->f_path;
> +
> +	inode = file_inode(file);
> +	isec = inode->i_security;
> +	fsec = file->f_security;

I should have caught this on the v1 patch, but I missed it ... instead of 
looking up the isec directly from the inode, we should use one of the 
inode_security_*() functions to ensure the inode's label is revalidated if 
necessary.

We may also need to add a ss_initialized check at the top, but I can add that 
in later if needed; I'm working on related stuff right now so it's easy for me 
to test/patch later if you don't want to deal with that.

> +	if (sid != fsec->sid) {
> +		rc = avc_has_perm(sid, fsec->sid, SECCLASS_FD, FD__USE, &ad);
> +		if (rc)
> +			goto out;

Once again, just return, don't jump.

> +	}
> +
> +	rc = avc_has_perm(sid, isec->sid, SECCLASS_SYSTEM,
> +				SYSTEM__MODULE_LOAD, &ad);
> +out:
> +	return rc;
> +}

-- 
paul moore
www.paul-moore.com

_______________________________________________
Selinux mailing list
Selinux@xxxxxxxxxxxxx
To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.



[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux