All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Selinux/hooks.c: Fix a NULL pointer dereference caused by semop()
@ 2015-01-20  9:18 ` Ethan Zhao
  0 siblings, 0 replies; 35+ messages in thread
From: Ethan Zhao @ 2015-01-20  9:18 UTC (permalink / raw)
  To: james.l.morris, serge, eparis, sds, paul
  Cc: selinux, linux-security-module, linux-kernel, ethan.kernel, Ethan Zhao

A NULL pointer dereference was observed as following panic:

BUG: unable to handle kernel NULL pointer dereference at (null)
IP: [<ffffffff812735eb>] ipc_has_perm+0x4b/0x60
...
Process opcmon (pid: 30712, threadinfo ffff880237f2a000,
task ffff88022ac70e40)
Stack:
ffff880237f2bc04 ffffffff01020953 ffff880237f2bce8
ffffffff8125818e
0000000000000001 0000000037f78004 ffff880237f2bcd8
ffffffff81273619
ffff880237f2bce8 ffffffff8126e3e6 ffff880237f2bf68
ffffffff8125c206
Call Trace:
[<ffffffff8125818e>] ? ipcperms+0xae/0x110
[<ffffffff81273619>] selinux_sem_semop+0x19/0x20
[<ffffffff8126e3e6>] security_sem_semop+0x16/0x20
[<ffffffff8125c206>] sys_semtimedop+0x346/0x750
[<ffffffff81188c0c>] ? handle_pte_fault+0x1dc/0x200
[<ffffffff8161d830>] ? __do_page_fault+0x280/0x500
[<ffffffff810d97d0>] ? __lock_release+0x90/0x1b0
[<ffffffff8161d830>] ? __do_page_fault+0x280/0x500
[<ffffffff8109a763>] ? up_read+0x23/0x40
[<ffffffff8161d830>] ? __do_page_fault+0x280/0x500
[<ffffffff81182f1c>] ? might_fault+0x5c/0xb0
[<ffffffff81081f96>] ? sys_newuname+0x66/0xf0
[<ffffffff810d97d0>] ? __lock_release+0x90/0x1b0
[<ffffffff81081f96>] ? sys_newuname+0x66/0xf0
[<ffffffff81622f45>] ? sysret_check+0x22/0x5d
[<ffffffff8125c620>] sys_semop+0x10/0x20
[<ffffffff81622f19>] system_call_fastpath+0x16/0x1b
Code: b8 00 00 48 8b 80 48 06 00 00 41 8b 54 24 40 4c 8d
45 d0 89 d9 45 31 c9 48 8b 40 70 8b 78 04 49 8b 44 24 60 c6 45 d0 04 89 55 d8
<0f> b7 10 8b 70 04 e8 0a dc ff ff 48 83 c4 20 5b 41 5c c9 c3 90
RIP  [<ffffffff812735eb>] ipc_has_perm+0x4b/0x60
RSP <ffff880237f2bc98>
CR2: 0000000000000000

The root cause is semtimedop() was called after semget() without checking its
return value in process opcmon. and semget() failed to check permission in
function avc_has_perm() then sem_perm->security was freed shown as following:

     sys_semget()
     ->newary()
	   ->security_sem_alloc()
	     ->sem_alloc_security()
		   selinux_sem_alloc_security()
		   ->ipc_alloc_security() {
		     ->rc = avc_has_perm()
				if (rc) {
					ipc_free_security(&sma->sem_perm);
					return rc;

     So ipc_perms->security was NULL, then semtimedop() was called as
     following:

	  sys_semtimedop() / semop()
	  ->selinux_sem_semop()
	   ->ipc_has_perm()
	     ->avc_has_perm(sid, isec->sid, isec->sclass, perms, &ad);
  	                                    ^- NULL pointer dereference happens

The test kernel was running on VMware.
This patch use to fix this serious security issue could be triggered by user space.
This patch was tested with v3.19-rc5.

Signed-off-by: Ethan Zhao <ethan.zhao@oracle.com>
---
 security/selinux/hooks.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index 6da7532..bbe76f5 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -5129,6 +5129,8 @@ static int ipc_has_perm(struct kern_ipc_perm *ipc_perms,
 	u32 sid = current_sid();
 
 	isec = ipc_perms->security;
+	if (!isec)
+		return -EACCES;
 
 	ad.type = LSM_AUDIT_DATA_IPC;
 	ad.u.ipc_id = ipc_perms->key;
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 35+ messages in thread

end of thread, other threads:[~2015-01-23 15:30 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-20  9:18 [PATCH] Selinux/hooks.c: Fix a NULL pointer dereference caused by semop() Ethan Zhao
2015-01-20  9:18 ` Ethan Zhao
2015-01-20 14:10 ` Stephen Smalley
2015-01-20 14:10   ` Stephen Smalley
2015-01-20 18:49   ` Manfred Spraul
2015-01-20 18:49     ` Manfred Spraul
2015-01-20 21:01     ` Stephen Smalley
2015-01-20 21:06       ` Eric Paris
2015-01-20 21:06         ` Eric Paris
2015-01-20 21:09         ` Stephen Smalley
2015-01-20 21:09           ` Stephen Smalley
2015-01-21  1:30     ` ethan zhao
2015-01-21  1:30       ` ethan zhao
2015-01-21  3:53   ` Ethan Zhao
2015-01-21  3:53     ` Ethan Zhao
2015-01-21  5:30     ` Manfred Spraul
2015-01-21  5:30       ` Manfred Spraul
2015-01-22  2:44       ` Ethan Zhao
2015-01-22  2:44         ` Ethan Zhao
2015-01-22 18:15         ` Manfred Spraul
2015-01-22 18:15           ` Manfred Spraul
2015-01-23  2:00           ` ethan zhao
2015-01-23  2:00             ` ethan zhao
2015-01-22 19:05         ` Stephen Smalley
2015-01-22 19:05           ` Stephen Smalley
2015-01-22 20:48           ` Davidlohr Bueso
2015-01-22 20:48             ` Davidlohr Bueso
2015-01-23  2:38             ` ethan zhao
2015-01-23  2:38               ` ethan zhao
2015-01-23  2:19           ` ethan zhao
2015-01-23  2:19             ` ethan zhao
2015-01-23  3:30             ` Davidlohr Bueso
2015-01-23  3:30               ` Davidlohr Bueso
2015-01-23 15:30               ` Ethan Zhao
2015-01-23 15:30                 ` Ethan Zhao

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.