Re: Re: probably bug in rsbac_sources

Javier Juan Martínez Cabezón <[email protected]>
Newsgroups gmane.linux.gentoo.hardened
Message-ID <CAD98N_GJzVvHQ+ngTz2fiQskRVxchkD=+NZJVm-t0S9m=18jGw@mail.gmail.com>
It's rsbac ebuild made by Anthony Basile, its related with this:

http://www.gossamer-threads.com/lists/gentoo/hardened/263114

In the thread appears the fixation Patch I made. In concrete, This.

diff -rupN '--exclude=*.rej' '--exclude=*.orig'
linuxnopax-3.4.1/0000_README linux-3.4.1/0000_README
--- linuxnopax-3.4.1/0000_README	1970-01-01 01:00:00.000000000 +0100
+++ linux-3.4.1/0000_README	2012-08-29 21:46:21.000000000 +0200
@@ -0,0 +1,12 @@
+README
+-----------------------------------------------------------------------------
+
+Individual Patch Descriptions:
+-----------------------------------------------------------------------------
+Patch:	4500_patch-linux-3.4.1-rsbac-1.4.6.diff
+From:	Amon Ott <[email protected]>
+Desc:	RSBAC patch from http://www.rsbac.org/
+
+Patch:  4520_pax-linux-3.4-test7.patch
+From:	pipacs <[email protected]>
+Desc:	http://grsecurity.net/test.php
diff -rupN '--exclude=*.rej' '--exclude=*.orig'
linuxnopax-3.4.1/fs/aio.c linux-3.4.1/fs/aio.c
--- linuxnopax-3.4.1/fs/aio.c	2012-12-03 17:36:16.000000000 +0100
+++ linux-3.4.1/fs/aio.c	2012-08-29 22:08:45.000000000 +0200
@@ -1440,21 +1440,26 @@ static ssize_t aio_fsync(struct kiocb *i
 static ssize_t aio_setup_vectored_rw(int type, struct kiocb *kiocb,
bool compat)
 {
 	ssize_t ret;
+	struct iovec iovstack;

 #ifdef CONFIG_COMPAT
 	if (compat)
 		ret = compat_rw_copy_check_uvector(type,
 				(struct compat_iovec __user *)kiocb->ki_buf,
-				kiocb->ki_nbytes, 1, &kiocb->ki_inline_vec,
-				&kiocb->ki_iovec, 1);
+kiocb->ki_nbytes, 1, &iovstack, &kiocb->ki_iovec, 1);
+				
 	else
 #endif
 		ret = rw_copy_check_uvector(type,
 				(struct iovec __user *)kiocb->ki_buf,
-				kiocb->ki_nbytes, 1, &kiocb->ki_inline_vec,
+				kiocb->ki_nbytes, 1, &iovstack,
 				&kiocb->ki_iovec, 1);
 	if (ret < 0)
 		goto out;
+	if (kiocb->ki_iovec == &iovstack) {
+		kiocb->ki_inline_vec = iovstack;
+		kiocb->ki_iovec = &kiocb->ki_inline_vec;
+	}

 	ret = rw_verify_area(type, kiocb->ki_filp, &kiocb->ki_pos, ret);
 	if (ret < 0)
diff -rupN '--exclude=*.rej' '--exclude=*.orig'
linuxnopax-3.4.1/fs/namei.c linux-3.4.1/fs/namei.c
--- linuxnopax-3.4.1/fs/namei.c	2012-12-03 17:36:16.000000000 +0100
+++ linux-3.4.1/fs/namei.c	2012-08-29 23:23:38.000000000 +0200
@@ -4198,8 +4198,15 @@ int vfs_readlink(struct dentry *dentry,
 	}
 	else
 #endif
-	if (copy_to_user(buffer, link, len))
-		len = -EFAULT;
+	
+	if (len < sizeof(tmpbuf)) {
+		memcpy(tmpbuf, link, len);
+		newlink = tmpbuf;
+	} else
+		newlink = link;
+
+	if (copy_to_user(buffer, newlink, len))
+ 		len = -EFAULT;
 out:
 	return len;
 }
diff -rupN '--exclude=*.rej' '--exclude=*.orig'
linuxnopax-3.4.1/fs/pipe.c linux-3.4.1/fs/pipe.c
--- linuxnopax-3.4.1/fs/pipe.c	2012-12-03 17:36:16.000000000 +0100
+++ linux-3.4.1/fs/pipe.c	2012-08-29 23:19:39.000000000 +0200
@@ -816,19 +816,15 @@ static int
 pipe_release(struct inode *inode, int decr, int decw)
 {
 	struct pipe_inode_info *pipe;
-
 	mutex_lock(&inode->i_mutex);
 	pipe = inode->i_pipe;
-	pipe->readers -= decr;
-	pipe->writers -= decw;
-
-	if (!pipe->readers && !pipe->writers) {
-
+	atomic_sub(decr, &pipe->readers);
+	atomic_sub(decw, &pipe->writers);
+	if (!atomic_read(&pipe->readers) && !atomic_read(&pipe->writers)) {	
 #ifdef CONFIG_RSBAC
-		union rsbac_target_id_t rsbac_target_id;
+	union rsbac_target_id_t rsbac_target_id;
 #endif
-
-		free_pipe_info(inode);
+	free_pipe_info(inode);

 #ifdef CONFIG_RSBAC
 		rsbac_pr_debug(aef, "calling ACI remove_target()\n");
@@ -836,7 +832,7 @@ pipe_release(struct inode *inode, int de
 		rsbac_target_id.ipc.id.id_nr  = inode->i_ino;
 		rsbac_remove_target(T_IPC, rsbac_target_id);
 #endif
-
+		
 	} else {
 		wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLOUT |
POLLRDNORM | POLLWRNORM | POLLERR | POLLHUP);
 		kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
diff -rupN '--exclude=*.rej' '--exclude=*.orig'
linuxnopax-3.4.1/init/do_mounts.c linux-3.4.1/init/do_mounts.c
--- linuxnopax-3.4.1/init/do_mounts.c	2012-12-03 17:36:16.000000000 +0100
+++ linux-3.4.1/init/do_mounts.c	2012-08-29 22:00:26.000000000 +0200
@@ -563,8 +563,8 @@ void __init prepare_namespace(void)
 	mount_root();
 out:
 	devtmpfs_mount("dev");
-	sys_mount(".", "/", NULL, MS_MOVE, NULL);
-	sys_chroot((const char __user __force *)".");
+	sys_mount((char __force_user *)".", (char __force_user *)"/", NULL,
MS_MOVE, NULL);
+	sys_chroot((const char __force_user *)".");

 #ifdef CONFIG_RSBAC
 #ifdef CONFIG_RSBAC_INIT_DELAY
diff -rupN '--exclude=*.rej' '--exclude=*.orig'
linuxnopax-3.4.1/mm/mempolicy.c linux-3.4.1/mm/mempolicy.c
--- linuxnopax-3.4.1/mm/mempolicy.c	2012-12-03 17:36:16.000000000 +0100
+++ linux-3.4.1/mm/mempolicy.c	2012-08-29 21:55:27.000000000 +0200
@@ -1109,6 +1109,17 @@ static long do_mbind(unsigned long start

 	if (end < start)
 		return -EINVAL;
+
+#ifdef CONFIG_PAX_SEGMEXEC
+	if (mm->pax_flags & MF_PAX_SEGMEXEC) {
+		if (end > SEGMEXEC_TASK_SIZE)
+			return -EINVAL;
+	} else
+#endif
+
+	if (end > TASK_SIZE)
+		return -EINVAL;
+
 	if (end == start)
 		return 0;

diff -rupN '--exclude=*.rej' '--exclude=*.orig'
linuxnopax-3.4.1/mm/mprotect.c linux-3.4.1/mm/mprotect.c
--- linuxnopax-3.4.1/mm/mprotect.c	2012-12-03 17:36:16.000000000 +0100
+++ linux-3.4.1/mm/mprotect.c	2012-08-29 21:51:37.000000000 +0200
@@ -28,7 +28,11 @@
 #include <asm/cacheflush.h>
 #include <asm/tlbflush.h>
 #include <rsbac/hooks.h>
-
+#ifdef CONFIG_PAX_MPROTECT
+#include <linux/elf.h>
+#include <linux/binfmts.h>
+#endif
+#include <asm/mmu_context.h>
 #ifndef pgprot_modify
 static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot)
 {




2013/7/16 Jens Kasten <[email protected]>

> Hi,
>
> first which rsbac version you are using.
> Appears this bug also when you try the rsbac-sources without pax?
>
> Jens
>
> Am 2013-07-15 03:07, schrieb Javier Juan Martínez Cabezón:
>
>  I send related PaX .config if you need it:
>>
>> #
>> # PaX
>> #
>> CONFIG_ARCH_TRACK_EXEC_LIMIT=y
>> CONFIG_PAX_PER_CPU_PGD=y
>> CONFIG_PAX=y
>>
>> #
>> # PaX Control
>> #
>> CONFIG_PAX_SOFTMODE=y
>> # CONFIG_PAX_EI_PAX is not set
>>  CONFIG_PAX_PT_PAX_FLAGS=y
>> # CONFIG_PAX_XATTR_PAX_FLAGS is not set
>> # CONFIG_PAX_NO_ACL_FLAGS is not set
>> CONFIG_PAX_HAVE_ACL_FLAGS=y
>> # CONFIG_PAX_HOOK_ACL_FLAGS is not set
>>
>> #
>> # Non-executable pages
>> #
>>  CONFIG_PAX_NOEXEC=y
>> CONFIG_PAX_PAGEEXEC=y
>> # CONFIG_PAX_SEGMEXEC is not set
>> CONFIG_PAX_EMUTRAMP=y
>> CONFIG_PAX_MPROTECT=y
>> # CONFIG_PAX_ELFRELOCS is not set
>> CONFIG_PAX_KERNEXEC=y
>> CONFIG_PAX_KERNEXEC_PLUGIN_**METHOD=""
>>
>> #
>> # Address Space Layout Randomization
>> #
>> CONFIG_PAX_ASLR=y
>> CONFIG_PAX_RANDKSTACK=y
>> CONFIG_PAX_RANDUSTACK=y
>> CONFIG_PAX_RANDMMAP=y
>>
>> #
>> # Miscellaneous hardening features
>> #
>> # CONFIG_PAX_MEMORY_SANITIZE is not set
>>  # CONFIG_PAX_MEMORY_STACKLEAK is not set
>> # CONFIG_PAX_MEMORY_UDEREF is not set
>> CONFIG_PAX_REFCOUNT=y
>> # CONFIG_PAX_USERCOPY is not set
>> # CONFIG_PAX_CONSTIFY_PLUGIN is not set
>> # CONFIG_PAX_SIZE_OVERFLOW is not set
>>  # CONFIG_KEYS is not set
>> CONFIG_SECURITY_DMESG_**RESTRICT=y
>> # CONFIG_SECURITY is not set
>> # CONFIG_SECURITYFS is not set
>> CONFIG_DEFAULT_SECURITY_DAC=y
>> CONFIG_DEFAULT_SECURITY=""
>> CONFIG_XOR_BLOCKS=y
>>  CONFIG_ASYNC_CORE=y
>> CONFIG_ASYNC_MEMCPY=y
>> CONFIG_ASYNC_XOR=y
>> CONFIG_ASYNC_PQ=y
>> CONFIG_ASYNC_RAID6_RECOV=y
>> CONFIG_CRYPTO=y
>>
>> #
>>
>> 2013/7/15 Javier Juan Martínez Cabezón <[email protected]>
>>
>>  Hi all
>>>
>>> I'm with this several months and I still without knowing if it was
>>> mistake from me while patching  PaX with rsbac at hand or is a
>>> kernel bug, or it's from VirtualBox (the behaviour is horrible,
>>> sorry):
>>>
>>> After the bug hits system guest gets unusable, hard reset is
>>> required, every command executed gets segfaulted from there.
>>>
>>> I can reproduce it easily, using backup_all (a shell script that
>>> makes the sec policy backup (as in this case)) or with ./configure
>>> when compiling (as emerge does something), so emerge usually does
>>> seg fault. The EIP is always at the same, strnlen+0x6/0x18
>>>
>>> Jul 13 22:50:02 orion kernel: BUG: unable to handle kernel paging
>>> request at 00001033
>>> Jul 13 22:50:02 orion kernel: IP: [<001aa8e2>] strnlen+0x6/0x18
>>> Jul 13 22:50:02 orion kernel: *pdpt = 000000000e965001 *pde =
>>> 0000000000000000
>>> Jul 13 22:50:02 orion kernel: Oops: 0000 [#1]
>>> Jul 13 22:50:02 orion kernel:
>>> Jul 13 22:50:02 orion kernel: Pid: 4147, comm: bash Not tainted
>>> 3.4.0-rsbac #9 innotek GmbH VirtualBox
>>> Jul 13 22:50:02 orion kernel: EIP: 0060:[<001aa8e2>] EFLAGS:
>>> 00010217 CPU: 0
>>> Jul 13 22:50:02 orion kernel: EIP is at strnlen+0x6/0x18
>>> Jul 13 22:50:02 orion kernel: EAX: 00001033 EBX: ce9c0069 ECX:
>>> 00001033 EDX: 0000000e
>>> Jul 13 22:50:02 orion kernel: ESI: 00001033 EDI: ce9c0069 EBP:
>>> ce9c07f5 ESP: c66d3b38
>>> Jul 13 22:50:02 orion kernel: DS: 0068 ES: 0068 FS: 0000 GS: 0000
>>> SS: 0068
>>> Jul 13 22:50:02 orion kernel: CR0: 8005003b CR2: 00001033 CR3:
>>> 01415000 CR4: 000006f0
>>> Jul 13 22:50:02 orion kernel: DR0: 00000000 DR1: 00000000 DR2:
>>> 00000000 DR3: 00000000
>>> Jul 13 22:50:02 orion kernel: DR6: ffff0ff0 DR7: 00000400
>>> Jul 13 22:50:02 orion kernel: Process bash (pid: 4147, ti=e738ee3c
>>> task=e738ebd0 task.ti=e738ee3c)
>>> Jul 13 22:50:02 orion kernel: Stack:
>>> Jul 13 22:50:02 orion kernel: 001a884b c66d3bb4 c66d3bb0 c66d3bb4
>>> ce9c0069 ce9c0069 001a916e 000fff00
>>> Jul 13 22:50:02 orion kernel: 000fffff 0000000f ce9c07f5 ce9c000b
>>> c1514bcb 000007ea ff0a0004 000fffff
>>> Jul 13 22:50:02 orion kernel: ce9c0000 c66d3bdc c66d3bac c66d3bdc
>>> 0004dfc6 c66d3ba8 e702a4c0 c66d3bdc
>>> Jul 13 22:50:02 orion kernel: Call Trace:
>>> Jul 13 22:50:02 orion kernel: [<001a884b>] ?
>>> string.isra.1+0x25/0x8c
>>> Jul 13 22:50:02 orion kernel: [<001a916e>] ? vsnprintf+0x139/0x257
>>> Jul 13 22:50:02 orion kernel: [<000fff00>] ? bio_map_user+0x13/0x25
>>> Jul 13 22:50:02 orion kernel: [<000fffff>] ? bio_map_kern+0xb0/0xd9
>>> Jul 13 22:50:02 orion kernel: [<000fffff>] ? bio_map_kern+0xb0/0xd9
>>> Jul 13 22:50:02 orion kernel: [<0004dfc6>] ? rsbac_printk+0x52/0x18e
>>> Jul 13 22:50:02 orion kernel: [<0007d3ee>] ?
>>> rsbac_adf_set_attr_cap+0x680/**0x9a6
>>> Jul 13 22:50:02 orion kernel: [<00038a00>] ?
>>> smp_apic_timer_interrupt+0x62/**0x6a
>>> Jul 13 22:50:02 orion kernel: [<00407f91>] ?
>>> resume_userspace_sig+0x1b/0x2a
>>> Jul 13 22:50:02 orion kernel: [<0007148e>] ?
>>> rsbac_adf_set_attr+0x45f/**0x12b3
>>> Jul 13 22:50:02 orion kernel: [<00800001>] ? 0x800000
>>> Jul 13 22:50:02 orion kernel: [<0009fa4f>] ? do_adjtimex+0x2ab/0x550
>>> Jul 13 22:50:02 orion kernel: [<000e85ec>] ?
>>> do_path_lookup+0x17/0x4a
>>> Jul 13 22:50:02 orion kernel: [<000e8963>] ?
>>> user_path_at_empty+0x4b/0x69
>>> Jul 13 22:50:02 orion kernel: [<000e8963>] ?
>>> user_path_at_empty+0x4b/0x69
>>> Jul 13 22:50:02 orion kernel: [<000c6a52>] ? __do_fault+0x357/0x389
>>> Jul 13 22:50:02 orion kernel: [<0002cc9e>] ?
>>> free_thread_xstate+0x17/0x23
>>> Jul 13 22:50:02 orion kernel: [<00110c60>] ?
>>> load_elf_binary+0xf05/0xfbf
>>> Jul 13 22:50:02 orion kernel: [<00110c60>] ?
>>> load_elf_binary+0xf05/0xfbf
>>> Jul 13 22:50:02 orion kernel: [<00030502>] ?
>>> x86_pmu_event_init+0x23c/0x2d1
>>> Jul 13 22:50:02 orion kernel: [<000e2f53>] ?
>>> do_execve_common+0x363/0x45e
>>> Jul 13 22:50:02 orion kernel: [<00800001>] ? 0x800000
>>> Jul 13 22:50:02 orion kernel: [<0009fa4f>] ? do_adjtimex+0x2ab/0x550
>>> Jul 13 22:50:02 orion kernel: [<000e85ec>] ?
>>> do_path_lookup+0x17/0x4a
>>> Jul 13 22:50:02 orion kernel: [<000e8963>] ?
>>> user_path_at_empty+0x4b/0x69
>>> Jul 13 22:50:02 orion kernel: [<000e8963>] ?
>>> user_path_at_empty+0x4b/0x69
>>> Jul 13 22:50:02 orion kernel: [<000c6a52>] ? __do_fault+0x357/0x389
>>> Jul 13 22:50:02 orion kernel: [<00800001>] ? 0x800000
>>> Jul 13 22:50:02 orion kernel: [<0009fa4f>] ?
>>> do_adjtimex+0x2ab/0x550
>>> Jul 13 22:50:02 orion kernel: [<00800001>] ? 0x800000
>>> Jul 13 22:50:02 orion kernel: [<0009fa4f>] ? do_adjtimex+0x2ab/0x550
>>> Jul 13 22:50:02 orion kernel: [<000e85ec>] ?
>>> do_path_lookup+0x17/0x4a
>>> Jul 13 22:50:02 orion kernel: [<000e8963>] ?
>>> user_path_at_empty+0x4b/0x69
>>> Jul 13 22:50:02 orion kernel: [<000e8963>] ?
>>> user_path_at_empty+0x4b/0x69
>>> Jul 13 22:50:02 orion kernel: [<00800001>] ? 0x800000
>>> Jul 13 22:50:02 orion kernel: [<0009fa4f>] ?
>>> do_adjtimex+0x2ab/0x550
>>> Jul 13 22:50:02 orion kernel: [<000c6a52>] ? __do_fault+0x357/0x389
>>> Jul 13 22:50:02 orion kernel: [<000e626c>] ? getname_flags+0x1b/0xbf
>>> Jul 13 22:50:02 orion kernel: [<000e3057>] ? do_execve+0x9/0xb
>>> Jul 13 22:50:02 orion kernel: [<0002d0f1>] ? sys_execve+0x2c/0x50
>>> Jul 13 22:50:02 orion kernel: [<004087f2>] ? ptregs_execve+0x12/0x20
>>> Jul 13 22:50:02 orion kernel: [<00408009>] ? syscall_call+0x7/0xb
>>> Jul 13 22:50:02 orion kernel: [<00408024>] ? restore_all_pax+0x7/0x7
>>> Jul 13 22:50:02 orion kernel: [<000290d5>] ?
>>> math_state_restore+0x96/0x96
>>> Jul 13 22:50:02 orion kernel: [<00010206>] ?
>>> kvm_arch_vcpu_ioctl_run+0x79a/**0xbdc
>>> Jul 13 22:50:02 orion kernel: [<0003c0a9>] ?
>>> vmalloc_sync_all+0x1/0x1
>>> Jul 13 22:50:02 orion kernel: [<00408024>] ? restore_all_pax+0x7/0x7
>>> Jul 13 22:50:02 orion kernel: [<0040007b>] ?
>>> pcnet32_remove_one+0x22/0xe3
>>> Jul 13 22:50:02 orion kernel: [<0001007b>] ?
>>> kvm_arch_vcpu_ioctl_run+0x60f/**0xbdc
>>> Jul 13 22:50:02 orion kernel: [<0003c0a9>] ?
>>> vmalloc_sync_all+0x1/0x1
>>> Jul 13 22:50:02 orion kernel: [<00010287>] ?
>>> kvm_arch_vcpu_ioctl_run+0x81b/**0xbdc
>>> Jul 13 22:50:02 orion kernel: Code: d0 f2 ae 74 05 bf 01 00 00 00 4f
>>> eb 02 31 ff 89 f8 5f c3 85 c9 57 89 c7 74 07 89 d0 f2 ae 75 01 4f 89
>>> f8 5f c3 89 c1 89 c8 eb 06 <80> 38 00 74 07 40 4a 83 fa ff 75 f4 29
>>> c8 c3 90 90 90 57 83 c9
>>> Jul 13 22:50:02 orion kernel: EIP: [<001aa8e2>] strnlen+0x6/0x18
>>> SS:ESP 0068:c66d3b38
>>> Jul 13 22:50:02 orion kernel: CR2: 0000000000001033
>>> Jul 13 22:50:02 orion kernel: ---[ end trace 4a7d8fa933a5d5dd ]---
>>>
>>> Jul 13 22:59:01 orion kernel: BUG: unable to handle kernel paging
>>> request at 000010a1
>>> Jul 13 22:59:01 orion kernel: IP: [<001aa8e2>] strnlen+0x6/0x18
>>> Jul 13 22:59:01 orion kernel: *pdpt = 000000000df00001 *pde =
>>> 0000000000000000
>>> Jul 13 22:59:01 orion kernel: Oops: 0000 [#2]
>>> Jul 13 22:59:01 orion kernel:
>>> Jul 13 22:59:01 orion kernel: Pid: 4257, comm: bash Tainted:
>>> G      D      3.4.0-rsbac #9 innotek GmbH VirtualBox
>>> Jul 13 22:59:01 orion kernel: EIP: 0060:[<001aa8e2>] EFLAGS:
>>> 00010217 CPU: 0
>>> Jul 13 22:59:01 orion kernel: EIP is at strnlen+0x6/0x18
>>> Jul 13 22:59:01 orion kernel: EAX: 000010a1 EBX: ce9c0869 ECX:
>>> 000010a1 EDX: 0000000e
>>> Jul 13 22:59:01 orion kernel: ESI: 000010a1 EDI: ce9c0869 EBP:
>>> ce9c0ff5 ESP: c66cfb48
>>> Jul 13 22:59:01 orion kernel: DS: 0068 ES: 0068 FS: 0000 GS: 0000
>>> SS: 0068
>>> Jul 13 22:59:01 orion kernel: CR0: 8005003b CR2: 000010a1 CR3:
>>> 01415000 CR4: 000006f0
>>> Jul 13 22:59:01 orion kernel: DR0: 00000000 DR1: 00000000 DR2:
>>> 00000000 DR3: 00000000
>>> Jul 13 22:59:01 orion kernel: DR6: ffff0ff0 DR7: 00000400
>>> Jul 13 22:59:01 orion kernel: Process bash (pid: 4257, ti=e738ee3c
>>> task=e738ebd0 task.ti=e738ee3c)
>>>
>>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.