diff options
author | Eric Paris <eparis@redhat.com> | 2009-11-03 00:35:32 -0500 |
---|---|---|
committer | James Morris <jmorris@namei.org> | 2009-11-09 17:33:46 -0500 |
commit | dd8dbf2e6880e30c00b18600c962d0cb5a03c555 (patch) | |
tree | 24835aaf40cec5ceb2aeecccde9240ee173f70f1 /security | |
parent | 6e65f92ff0d6f18580737321718d09035085a3fb (diff) |
security: report the module name to security_module_request
For SELinux to do better filtering in userspace we send the name of the
module along with the AVC denial when a program is denied module_request.
Example output:
type=SYSCALL msg=audit(11/03/2009 10:59:43.510:9) : arch=x86_64 syscall=write success=yes exit=2 a0=3 a1=7fc28c0d56c0 a2=2 a3=7fffca0d7440 items=0 ppid=1727 pid=1729 auid=unset uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=unset comm=rpc.nfsd exe=/usr/sbin/rpc.nfsd subj=system_u:system_r:nfsd_t:s0 key=(null)
type=AVC msg=audit(11/03/2009 10:59:43.510:9) : avc: denied { module_request } for pid=1729 comm=rpc.nfsd kmod="net-pf-10" scontext=system_u:system_r:nfsd_t:s0 tcontext=system_u:system_r:kernel_t:s0 tclass=system
Signed-off-by: Eric Paris <eparis@redhat.com>
Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'security')
-rw-r--r-- | security/capability.c | 2 | ||||
-rw-r--r-- | security/lsm_audit.c | 4 | ||||
-rw-r--r-- | security/security.c | 4 | ||||
-rw-r--r-- | security/selinux/hooks.c | 13 |
4 files changed, 18 insertions, 5 deletions
diff --git a/security/capability.c b/security/capability.c index 4f3ab476937f..5c700e1a4fd3 100644 --- a/security/capability.c +++ b/security/capability.c | |||
@@ -421,7 +421,7 @@ static int cap_kernel_create_files_as(struct cred *new, struct inode *inode) | |||
421 | return 0; | 421 | return 0; |
422 | } | 422 | } |
423 | 423 | ||
424 | static int cap_kernel_module_request(void) | 424 | static int cap_kernel_module_request(char *kmod_name) |
425 | { | 425 | { |
426 | return 0; | 426 | return 0; |
427 | } | 427 | } |
diff --git a/security/lsm_audit.c b/security/lsm_audit.c index 3bb90b6f1dd3..51bd0fd9c9f0 100644 --- a/security/lsm_audit.c +++ b/security/lsm_audit.c | |||
@@ -354,6 +354,10 @@ static void dump_common_audit_data(struct audit_buffer *ab, | |||
354 | } | 354 | } |
355 | break; | 355 | break; |
356 | #endif | 356 | #endif |
357 | case LSM_AUDIT_DATA_KMOD: | ||
358 | audit_log_format(ab, " kmod="); | ||
359 | audit_log_untrustedstring(ab, a->u.kmod_name); | ||
360 | break; | ||
357 | } /* switch (a->type) */ | 361 | } /* switch (a->type) */ |
358 | } | 362 | } |
359 | 363 | ||
diff --git a/security/security.c b/security/security.c index aad71b2ca195..24e060be9fa5 100644 --- a/security/security.c +++ b/security/security.c | |||
@@ -764,9 +764,9 @@ int security_kernel_create_files_as(struct cred *new, struct inode *inode) | |||
764 | return security_ops->kernel_create_files_as(new, inode); | 764 | return security_ops->kernel_create_files_as(new, inode); |
765 | } | 765 | } |
766 | 766 | ||
767 | int security_kernel_module_request(void) | 767 | int security_kernel_module_request(char *kmod_name) |
768 | { | 768 | { |
769 | return security_ops->kernel_module_request(); | 769 | return security_ops->kernel_module_request(kmod_name); |
770 | } | 770 | } |
771 | 771 | ||
772 | int security_task_setuid(uid_t id0, uid_t id1, uid_t id2, int flags) | 772 | int security_task_setuid(uid_t id0, uid_t id1, uid_t id2, int flags) |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index a29d6612a328..c96d63ec4753 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -3337,9 +3337,18 @@ static int selinux_kernel_create_files_as(struct cred *new, struct inode *inode) | |||
3337 | return 0; | 3337 | return 0; |
3338 | } | 3338 | } |
3339 | 3339 | ||
3340 | static int selinux_kernel_module_request(void) | 3340 | static int selinux_kernel_module_request(char *kmod_name) |
3341 | { | 3341 | { |
3342 | return task_has_system(current, SYSTEM__MODULE_REQUEST); | 3342 | u32 sid; |
3343 | struct common_audit_data ad; | ||
3344 | |||
3345 | sid = task_sid(current); | ||
3346 | |||
3347 | COMMON_AUDIT_DATA_INIT(&ad, KMOD); | ||
3348 | ad.u.kmod_name = kmod_name; | ||
3349 | |||
3350 | return avc_has_perm(sid, SECINITSID_KERNEL, SECCLASS_SYSTEM, | ||
3351 | SYSTEM__MODULE_REQUEST, &ad); | ||
3343 | } | 3352 | } |
3344 | 3353 | ||
3345 | static int selinux_task_setpgid(struct task_struct *p, pid_t pgid) | 3354 | static int selinux_task_setpgid(struct task_struct *p, pid_t pgid) |