Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
selinux denials due to race conditions? [solved]
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index Networking & Security
View previous topic :: View next topic  
Author Message
vaxbrat
Guru
Guru


Joined: 05 Oct 2005
Posts: 372
Location: DC Burbs

PostPosted: Mon Jun 18, 2007 4:07 am    Post subject: selinux denials due to race conditions? [solved] Reply with quote

I just joined the hardened-gentoo mailing list but thought I might give this a shot here too. I'm on the 2006.1 unstable profile for selinux and think I may have a race condition that results in avc denials before selinux has finished labeling things like /dev. For example, the first denial below appears to be where /etc/hotplug.d/default/default.hotplug is peeking and poking around with /dev/null. The denial has it as a system_u:object_r:file_t, but when I look at it from a running system I see it as a system_u:object_r:null_device_t. Can the hardened folk chime in about whether I'm missing something blatantly obvious? Should I be messing around in /etc/runlevels/boot to put dependencies in various scripts (although selinux isn't a script so how would I make it a dependency?)

snippet from a dmesg:


Code:
security:  5 users, 5 roles, 1376 types, 81 bools
security:  59 classes, 61906 rules
security:  class dccp_socket not defined in policy
security:  permission dccp_recv in class node not defined in policy
security:  permission dccp_send in class node not defined in policy
security:  permission dccp_recv in class netif not defined in policy
security:  permission dccp_send in class netif not defined in policy
SELinux:  Completing initialization.
SELinux:  Setting up existing superblocks.
SELinux: initialized (dev sda5, type ext3), uses xattr
inode_doinit_with_dentry:  context_to_sid(unlabeled) returned 22 for dev=sda5 ino=1938273
audit(1182137416.171:2): avc:  denied  { ioctl } for  pid=884 comm="default.hotplug" name="null" dev=sda5 ino=733068 scontext=system_u:system_r:kernel_t tcontext=system_u:object_r:file_t tclass=chr_file
audit(1182137416.203:3): avc:  denied  { read } for  pid=889 comm="env" name="urandom" dev=sda5 ino=732962 scontext=system_u:system_r:kernel_t tcontext=system_u:object_r:file_t tclass=chr_file
audit(1182137416.204:4): avc:  denied  { read } for  pid=884 comm="default.hotplug" name="default.hotplug" dev=sda5 ino=1356280 scontext=system_u:system_r:kernel_t tcontext=system_u:object_r:sbin_t tclass=file
audit(1182137416.206:5): avc:  denied  { search } for  pid=884 comm="default.hotplug" name="var" dev=sda5 ino=1254177 scontext=system_u:system_r:kernel_t tcontext=system_u:object_r:var_t tclass=dir
audit(1182137416.221:6): avc:  denied  { search } for  pid=884 comm="default.hotplug" name="log" dev=sda5 ino=1255669 scontext=system_u:system_r:kernel_t tcontext=system_u:object_r:var_log_t tclass=dir
SELinux: initialized (dev usbfs, type usbfs), uses genfs_contexts
SELinux: initialized (dev selinuxfs, type selinuxfs), uses genfs_contexts
SELinux: initialized (dev mqueue, type mqueue), uses transition SIDs
SELinux: initialized (dev hugetlbfs, type hugetlbfs), uses genfs_contexts
SELinux: initialized (dev devpts, type devpts), uses transition SIDs
SELinux: initialized (dev eventpollfs, type eventpollfs), uses task SIDs
SELinux: initialized (dev inotifyfs, type inotifyfs), uses genfs_contexts
SELinux: initialized (dev tmpfs, type tmpfs), uses transition SIDs
SELinux: initialized (dev futexfs, type futexfs), uses genfs_contexts
SELinux: initialized (dev pipefs, type pipefs), uses task SIDs
SELinux: initialized (dev sockfs, type sockfs), uses task SIDs
SELinux: initialized (dev proc, type proc), uses genfs_contexts
SELinux: initialized (dev bdev, type bdev), uses genfs_contexts
SELinux: initialized (dev rootfs, type rootfs), uses genfs_contexts
SELinux: initialized (dev sysfs, type sysfs), uses genfs_contexts
audit(1182137416.259:7): policy loaded auid=4294967295
audit(1182137416.261:8): avc:  denied  { read write } for  pid=1 comm="init" name="console" dev=sda5 ino=734292 scontext=system_u:system_r:init_t tcontext=system_u:object_r:file_t tclass=chr_file
audit(1182137416.275:9): avc:  denied  { ioctl } for  pid=1 comm="init" name="tty0" dev=sda5 ino=735467 scontext=system_u:system_r:init_t tcontext=system_u:object_r:file_t tclass=chr_file
audit(1182137416.277:10): avc:  denied  { read } for  pid=891 comm="hotplug" name="urandom" dev=sda5 ino=732962 scontext=system_u:system_r:hotplug_t tcontext=system_u:object_r:file_t tclass=chr_file
audit(1182137416.279:11): avc:  denied  { write } for  pid=891 comm="hotplug" name="tty" dev=sda5 ino=734192 scontext=system_u:system_r:hotplug_t tcontext=system_u:object_r:file_t tclass=chr_file
audit(1182137416.296:12): avc:  denied  { ioctl } for  pid=893 comm="default.hotplug" name="null" dev=sda5 ino=733068 scontext=system_u:system_r:hotplug_t tcontext=system_u:object_r:file_t tclass=chr_file
audit(1182137416.758:13): avc:  denied  { read write } for  pid=970 comm="rc" name="console" dev=sda5 ino=734292 scontext=system_u:system_r:initrc_t tcontext=system_u:object_r:file_t tclass=chr_file
audit(1182137417.033:14): avc:  denied  { read write } for  pid=994 comm="consoletype" name="console" dev=sda5 ino=734292 scontext=system_u:system_r:consoletype_t tcontext=system_u:object_r:file_t tclass=chr_file
audit(1182137417.034:15): avc:  denied  { search } for  pid=994 comm="consoletype" name="dev" dev=sda5 ino=732961 scontext=system_u:system_r:consoletype_t tcontext=system_u:object_r:file_t tclass=dir
audit(1182137417.034:16): avc:  denied  { getattr } for  pid=994 comm="consoletype" name="console" dev=sda5 ino=734292 scontext=system_u:system_r:consoletype_t tcontext=system_u:object_r:file_t tclass=chr_file
audit(1182137417.035:17): avc:  denied  { ioctl } for  pid=994 comm="consoletype" name="console" dev=sda5 ino=734292 scontext=system_u:system_r:consoletype_t tcontext=system_u:object_r:file_t tclass=chr_file
audit(1182137417.082:18): avc:  denied  { ioctl } for  pid=997 comm="stty" name="console" dev=sda5 ino=734292 scontext=system_u:system_r:initrc_t tcontext=system_u:object_r:file_t tclass=chr_file
audit(1182137417.172:19): avc:  denied  { getattr } for  pid=970 comm="bash" name="null" dev=sda5 ino=733068 scontext=system_u:system_r:initrc_t tcontext=system_u:object_r:file_t tclass=chr_file
audit(1182137417.196:20): avc:  denied  { read write } for  pid=1001 comm="dmesg" name="console" dev=sda5 ino=734292 scontext=system_u:system_r:dmesg_t tcontext=system_u:object_r:file_t tclass=chr_file
audit(1182137417.220:21): avc:  denied  { read write } for  pid=1004 comm="mount" name="console" dev=sda5 ino=734292 scontext=system_u:system_r:mount_t tcontext=system_u:object_r:file_t tclass=chr_file
SELinux: initialized (dev tmpfs, type tmpfs), uses transition SIDs
audit(1182137417.478:22): avc:  denied  { read write } for  pid=1038 comm="restorecon" name="console" dev=sda5 ino=734292 scontext=system_u:system_r:restorecon_t tcontext=system_u:object_r:file_t tclass=chr_file
audit(1182137417.716:23): avc:  denied  { write } for  pid=1042 comm="bash" name="null" dev=tmpfs ino=2106 scontext=system_u:system_r:initrc_t tcontext=system_u:object_r:device_t tclass=chr_file
audit(1182137417.875:24): avc:  denied  { read write } for  pid=1062 comm="udevd" name="console" dev=sda5 ino=734292 scontext=system_u:system_r:udev_t tcontext=system_u:object_r:file_t tclass=chr_file
audit(1182137418.770:25): avc:  denied  { read } for  pid=1194 comm="modprobe" name="console" dev=tmpfs ino=2100 scontext=system_u:system_r:insmod_t tcontext=system_u:object_r:device_t tclass=chr_file
audit(1182137424.374:26): avc:  denied  { getattr } for  pid=2059 comm="modprobe.sh" name="modprobe.conf" dev=sda5 ino=1515100 scontext=system_u:system_r:udev_t tcontext=root:object_r:modules_conf_t tclass=file
audit(1182137424.376:27): avc:  denied  { read } for  pid=2112 comm="grep" name="modprobe.conf" dev=sda5 ino=1515100 scontext=system_u:system_r:udev_t tcontext=root:object_r:modules_conf_t tclass=file


Last edited by vaxbrat on Fri Jun 22, 2007 3:21 am; edited 1 time in total
Back to top
View user's profile Send private message
vaxbrat
Guru
Guru


Joined: 05 Oct 2005
Posts: 372
Location: DC Burbs

PostPosted: Thu Jun 21, 2007 3:00 am    Post subject: It is a race Reply with quote

Got confirmed that it is indeed a race condition. However I noticed that udev really has taken over everything from hotplug so that it's no longer needed. That got rid of a good number of denials since udev doesn't get around to doing its thing until later and thus avoids the race.
Back to top
View user's profile Send private message
vaxbrat
Guru
Guru


Joined: 05 Oct 2005
Posts: 372
Location: DC Burbs

PostPosted: Fri Jun 22, 2007 3:20 am    Post subject: Need to label the static /dev Reply with quote

Here's the detailed story for the race condition. Until udev has finished doing its thing and mounted its own /dev, the system is using the primordial static /dev from your root's filesystem. Selinux gets /selinux up and running and is still at work doing the genfs context labeling of /dev, /tmp and company when the init process gets kicked. So init initially gets busy using the static nodes. Unfortunately these all have the default labeling of file_t and don't get picked up later by relabeling since udev now overlays the /dev directory with its own.

In order to relabel the static /dev you need to get a bit sneaky by "remounting" your root filesystem somewhere else. Let's say /mnt/rawroot

Code:
# mkdir /mnt/rawroot
# mount --bind / /mnt/rawroot


The --bind option remounts the filesystem to a different directory but doesn't apply all of the submounts. Thus the udev version of /dev is left behind to unconver the static /dev as /mnt/rawroot/dev. Now we can use setfilecon to manually relabel contexts. For example, the init process was getting denied access to /dev/console:

audit(1182137416.261:8): avc: denied { read write } for pid=1 comm="init" name="console" dev=sda5 ino=734292 scontext=system_u:system_r:init_t tcontext=system_u:object_r:file_t tclass=chr_file

In a running system, the /dev/console device is labeled as system_u:object_r:console_device_t. To label the static console properly I did:

Code:
# cd /mnt/rawroot/dev
# setfilecon system_u:object_r:console_device_t console


Some of the other device nodes that were getting hit too early include /dev/tty0 (tty_device_t) and /dev/urandom (urandom_device_t)
Back to top
View user's profile Send private message
vaxbrat
Guru
Guru


Joined: 05 Oct 2005
Posts: 372
Location: DC Burbs

PostPosted: Mon Jun 25, 2007 12:52 am    Post subject: more for the pot Reply with quote

Can't seem to stay away from this thread for some reason :P

Here's a couple more things in the rawroot that need proper labeling:

Code:
# cd /mnt/rawroot2
# setfilecon system_u:object_r:device_t dev
# setfilecon system_u_object_r_security_t security


The label for security removes a mount denial warning when /selinux is mounted. Sort of a "chicken and egg" thing.
Back to top
View user's profile Send private message
R. Bosch
Apprentice
Apprentice


Joined: 07 Jun 2004
Posts: 184
Location: NL

PostPosted: Tue Jun 26, 2007 10:57 am    Post subject: Re: more for the pot Reply with quote

vaxbrat wrote:
Can't seem to stay away from this thread for some reason :P
Code:
# cd /mnt/rawroot2
# setfilecon system_u:object_r:device_t dev
# setfilecon system_u_object_r_security_t security


The label for security removes a mount denial warning when /selinux is mounted. Sort of a "chicken and egg" thing.


I'm not sure what you mean with the last line, nor with /mnt/rawroot2. For instance I don't see the file /security.
_________________
Greetings / Met vriendelijke groet,

R. Bosch
Back to top
View user's profile Send private message
vaxbrat
Guru
Guru


Joined: 05 Oct 2005
Posts: 372
Location: DC Burbs

PostPosted: Tue Jun 26, 2007 11:37 pm    Post subject: whoops Reply with quote

This:

Code:
# cd /mnt/rawroot2
# setfilecon system_u:object_r:device_t dev
# setfilecon system_u_object_r_security_t security


Should be

Code:
# cd /mnt/rawroot
# setfilecon system_u:object_r:device_t dev
# setfilecon system_u_object_r_security_t selinux

That's what I get for not directly cutting and pasting from the server I was working on. The /mnt/rawroot refers to the remount that I had done in an earlier part of the thread.
Back to top
View user's profile Send private message
R. Bosch
Apprentice
Apprentice


Joined: 07 Jun 2004
Posts: 184
Location: NL

PostPosted: Wed Jun 27, 2007 8:59 am    Post subject: Reply with quote

Thought of that, but failed:
command:
setfilecon:  setfilecon(selinux,system_u_object_r_security_t) failed
Even if I run it from an other installment of selinux (my second try).
It did accept the device type 8O
When listed in root the context looks like it should, but not when I take a look under /mnt/rawroot.
This is how it is listed atm:
Code:
drwxr-xr-x  root root system_u:object_r:device_t       selinux
I also tried unmounting /selinux in case there was a lock. Then tried to change, both of them (under / and /mnt/rawroot), to no effect :(
I don't understand what would block the change of context. Even in a new build, it won't accept.
Also passing on the context to mkdir doesn't help.

My status:
ReboliLaptop ~ # sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          permissive
Policy version:                 21
Policy from config file:        strict


Thanks for sharing this thread :)
_________________
Greetings / Met vriendelijke groet,

R. Bosch
Back to top
View user's profile Send private message
vaxbrat
Guru
Guru


Joined: 05 Oct 2005
Posts: 372
Location: DC Burbs

PostPosted: Thu Jun 28, 2007 3:49 am    Post subject: device_t? Reply with quote

So if you do

Code:
# cd /mnt/rawroot
# ls -Z | grep security


You see device_t and not file_t or security_t? That's bizarre. What type of filesystem is root (ext3 I hope)?

Also realize that I'm working with the unstable 2006.1 profile and the 20070329 security policy (refpolicy). I haven't looked at the "example" policy and the 2005.1? stable profile in a while but may set up an example at work sometime soon.

One thing that bit me on another server I was playing with is reiserfs. Even though I thought from the kernel filesystem options that it would include extended attribute support, it turned out not to work right for selinux labeling. After my first attempt at labeling, everything came up as nfs_t or something like that after a reboot. Then when I looked at the dmesg log, I noticed selinux mentioning that it was labeling using genfscontexts instead of xattrs. I'm going to have to move that server's root to somewhere else and convert to ext3 I guess.

If I recall, only ext3 and xfs had selinux xattr labeling support.
Back to top
View user's profile Send private message
R. Bosch
Apprentice
Apprentice


Joined: 07 Jun 2004
Posts: 184
Location: NL

PostPosted: Thu Jun 28, 2007 8:16 am    Post subject: Reply with quote

Yes, but the thing is; I can't repeat this. I removed /selinux and ran mkdir /selinux to see if it would make any difference, but the system still refuses to set the context correctly.
Code:
ReboliLaptop ~ # ls -lZ /
drwxr-xr-x  root root system_u:object_r:bin_t          bin
drwxr-xr-x  root root system_u:object_r:boot_t         boot
drwxr-xr-x  root root system_u:object_r:device_t       dev
drwxr-xr-x  root root system_u:object_r:etc_t          etc
drwxr-xr-x  root root system_u:object_r:home_root_t    home
drwxr-xr-x  root root system_u:object_r:lib_t          lib
drwx------  root root system_u:object_r:lost_found_t   lost+found
drwxr-xr-x  root root system_u:object_r:mnt_t          media
drwxr-xr-x  root root system_u:object_r:mnt_t          mnt
drwxr-xr-x  root root system_u:object_r:usr_t          opt
dr-xr-xr-x  root root system_u:object_r:proc_t         proc
drwx------  root root root:object_r:sysadm_home_dir_t  root
drwxr-xr-x  root root system_u:object_r:bin_t          sbin
drwxr-xr-x  root root user_u:object_r:root_t           selinux
drwxr-xr-x  root root system_u:object_r:sysfs_t        sys
drwxrwxrwt  root root system_u:object_r:tmp_t          tmp
drwxr-xr-x  root root system_u:object_r:usr_t          usr
drwxr-xr-x  root root system_u:object_r:var_t          var


Even tried making such directory in root's homedir:
Code:
ReboliLaptop ~ # mkdir -Z system_u_object_r_security_t selinux
Sorry, cannot set default context to system_u_object_r_security_t.


My system::
ReboliLaptop ~ # ls /etc/make.profile -ld
lrwxrwxrwx 1 root root 40 Jun 19 10:48 /etc/make.profile -> /usr/portage/profiles/selinux/x86/2006.1

software:
libselinux-1.34.0
libsemanage-1.10.0
libsepol-1.16.3
selinux-base-policy-20070329
checkpolicy-1.34.0
policycoreutils-1.34.1

ReboliLaptop ~ # sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          permissive
Policy version:                 21
Policy from config file:        strict

ReboliLaptop ~ # mount 
/dev/hda2 on / type ext3 (rw,noatime)

Linux version 2.6.21-suspend2-r6 (root@ReboliLaptop) (gcc version 4.1.2 (Gentoo 4.1.2)) #2 Sun Jun 24 23:05:35 CEST 2007


What could prevent me from setting the context in permissive mode? :?
_________________
Greetings / Met vriendelijke groet,

R. Bosch
Back to top
View user's profile Send private message
vaxbrat
Guru
Guru


Joined: 05 Oct 2005
Posts: 372
Location: DC Burbs

PostPosted: Fri Jun 29, 2007 5:19 am    Post subject: role? Reply with quote

What role are you in when you try to label? Even in permissive mode, I wonder if context labeling wants you to be a sysadm_t before doing its thing.

It's interesting that the security_t type may only be on the /selinux mount point and the security filesystem itself. I don't see a file labeling rule for security_t in /etc/selinux/strict/contexts/files/file_contexts. It must be hard coded somewhere.
Back to top
View user's profile Send private message
R. Bosch
Apprentice
Apprentice


Joined: 07 Jun 2004
Posts: 184
Location: NL

PostPosted: Sun Jul 22, 2007 11:50 am    Post subject: Reply with quote

Did not matter... root admin or root the user. Both incapable. A way around it is to compile the kernel with security labels but without selinux support. I use this kernel to install the base system before reboot.

Did any of this made it in any documentation yet?
_________________
Greetings / Met vriendelijke groet,

R. Bosch
Back to top
View user's profile Send private message
seventhguardian
Apprentice
Apprentice


Joined: 10 May 2004
Posts: 261
Location: Portugal

PostPosted: Wed Aug 22, 2007 6:29 pm    Post subject: Reply with quote

R. Bosch wrote:

Even tried making such directory in root's homedir:
Code:
ReboliLaptop ~ # mkdir -Z system_u_object_r_security_t selinux
Sorry, cannot set default context to system_u_object_r_security_t.


(...)

What could prevent me from setting the context in permissive mode? :?


You are repeating vaxbrat's type errors! lol.. note what you are using:
Code:
system_u_object_r_security_t

It should be:
Code:
system_u:object_r:security_t
Back to top
View user's profile Send private message
DeathStar
n00b
n00b


Joined: 01 Mar 2007
Posts: 3

PostPosted: Fri Jun 20, 2008 9:29 pm    Post subject: Reply with quote

An easier way to fix this along with all other labels is to:

Boot into Permissive mode, then do the following:

mount -o bind / /mnt/rawroot
chroot /mnt/rawroot /bin/bash

env-update && source /etc/profile

rlpkg -avr

This will relabel all files on the system, including all dev devices back to what they should be for SELinux.
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Networking & Security All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum