Re: Test to trace NFS unlabeled bug

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

 



On Wed, Feb 19, 2020 at 06:03:02PM +0000, Richard Haines wrote:
> I've been building selinux-testsuite tests for various filesystems and
> have come across an unlabeled issue when testing. Stephen thinks that
> this is a bug sometimes seen with labeled NFS, where the top-level
> mounted directory shows up with unlabeled_t initially, then later gets
> refreshed to a valid context.
> 
> I've put together a test script, policy module and mount prog to
> facilitate debugging this issue. I've set out how I tested this on a
> Fedora 31 system below, if any problems let me know. 

Thanks!  Adding the nfs group to the cc.

I seem to recall a report of a similar bug in the Red Hat bugzilla, that
I spent a little time investigating and couldn't pin down.  I'll see if
I can dig that up.

--b.

> 
> The nfs.sh script:
> MOUNT=`stat --print %m .`
> TESTDIR=`pwd`
> systemctl start nfs-server
> exportfs -orw,no_root_squash,security_label localhost:$MOUNT
> mkdir -p /mnt/selinux-testsuite
> runcon -t test_nfs_unlabeled_bug ./mount -f nfs4 -s localhost:$TESTDIR
> -t /mnt/selinux-testsuite -o
> "nfsvers=4.2,proto=tcp,clientaddr=127.0.0.1,addr=127.0.0.1" -v
> umount /mnt/selinux-testsuite
> exportfs -u localhost:$MOUNT
> systemctl stop nfs-server
> 
> Install mount.c, unlabeled_bug.te and nfs.sh
> 
> Build mount prog:
> cc mount.c -o mount -Wall
> Then:
> chcon -t bin_t ./mount
> 
> Build policy module and install:
> make -f /usr/share/selinux/devel/Makefile unlabeled_bug.pp
> semodule -i unlabeled_bug.pp
> 
> Clean audit log:
> > /var/log/audit/audit.log
> 
> run ./nfs.sh
> 
> Check audit log:
> audit2allow -p /etc/selinux/targeted/policy/policy.31 <
> /var/log/audit/audit.log
> 
> Should see:
> #============= test_nfs_unlabeled_bug ==============
> allow test_nfs_unlabeled_bug unlabeled_t:dir search;
> 
> Once done:
> semodule -r unlabeled_bug

> /* cc mount.c -o mount -Wall */
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <unistd.h>
> #include <errno.h>
> #include <stdbool.h>
> #include <sys/mount.h>
> 
> static void print_usage(char *progname)
> {
> 	fprintf(stderr,
> 		"usage:  %s [-s src] -t tgt [-f fs_type] [-o options]\n"
> 		"Where:\n\t"
> 		"-s  Source path\n\t"
> 		"-t  Target path\n\t"
> 		"-f  Filesystem type\n\t"
> 		"-o  Options list (comma separated list)\n\t"
> 		"-v  Print information.\n", progname);
> 	exit(-1);
> }
> 
> int main(int argc, char *argv[])
> {
> 	int opt, result, save_err, flags = 0;
> 	char *src = NULL, *tgt = NULL, *fs_type = NULL, *opts = NULL;
> 	bool verbose = false;
> 
> 	while ((opt = getopt(argc, argv, "s:t:f:o:v")) != -1) {
> 		switch (opt) {
> 		case 's':
> 			src = optarg;
> 			break;
> 		case 't':
> 			tgt = optarg;
> 			break;
> 		case 'f':
> 			fs_type = optarg;
> 			break;
> 		case 'o':
> 			opts = optarg;
> 			break;
> 		case 'v':
> 			verbose = true;
> 			break;
> 		default:
> 			print_usage(argv[0]);
> 		}
> 	}
> 
> 	if (!tgt)
> 		print_usage(argv[0]);
> 
> 	if (verbose)
> 		printf("Mounting\n\tsrc: %s\n\ttgt: %s\n\tfs_type: %s flags: 0x%x\n\topts: %s\n",
> 		       src, tgt, fs_type, flags, opts);
> 
> 	result = mount(src, tgt, fs_type, flags, opts);
> 	save_err = errno;
> 	if (result < 0) {
> 		fprintf(stderr, "Failed mount(2): %s\n", strerror(errno));
> 		return save_err;
> 	}
> 
> 	return 0;
> }


> 
> policy_module(unlabeled_bug, 1.0)
> 
> require {
> 	role unconfined_r;
> 	type bin_t,user_devpts_t,nfs_t,kernel_t;
> 	class file { entrypoint execute read };
> 	class capability { sys_admin };
> 	class system { module_request };
> 	class chr_file { append getattr read write };
> 	class dir { search };
> 	class filesystem { mount };
> }
> 
> #============= test_nfs_unlabeled_bug ==============
> type test_nfs_unlabeled_bug;
> role unconfined_r types test_nfs_unlabeled_bug;
> files_type(test_nfs_unlabeled_bug)
> domain_type(test_nfs_unlabeled_bug)
> allow test_nfs_unlabeled_bug bin_t:file { entrypoint execute read };
> files_mounton_default(test_nfs_unlabeled_bug)
> allow test_nfs_unlabeled_bug bin_t:file map;
> allow test_nfs_unlabeled_bug default_t:dir mounton;
> allow test_nfs_unlabeled_bug self:capability sys_admin;
> allow test_nfs_unlabeled_bug kernel_t:system module_request;
> allow test_nfs_unlabeled_bug nfs_t:dir search;
> allow test_nfs_unlabeled_bug nfs_t:filesystem mount;
> allow test_nfs_unlabeled_bug user_devpts_t:chr_file { append getattr read write };
> 
> #allow test_nfs_unlabeled_bug unlabeled_t:dir search;
> 




[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux