Re: Impersonating a process for file creation purposes

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

 



On 04/27/2015 05:06 AM, Florian Weimer wrote:
> On 04/16/2015 02:18 PM, Stephen Smalley wrote:
> 
>> It could also compute the context in which the file would be created by
>> the zombie by calling security_compute_create() with the context of the
>> zombie process, the context of the directory into which it is writing
>> the core dump file, and string_to_security_class("file") as its
>> arguments, and then pass the resulting context returned by that call to
>> setfscreatecon() prior to creating the core dump file and then call
>> setfscreatecon(NULL) afterward; this will create the core dump file in
>> that context.  That seems more suited to your scenario.
> 
> We tried this, and strace shows a lot of activity behind the scenes:
> 
> 3449  open("/sys/fs/selinux/mls", O_RDONLY) = 4
> 3449  read(4, "1", 19)                  = 1
> 3449  close(4)                          = 0
> 3449  futex(0x7fefa9b34820, FUTEX_WAKE_PRIVATE, 2147483647) = 0
> 3449  socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC, 0) = 4
> 3449  connect(4, {sa_family=AF_LOCAL,
> sun_path="/var/run/setrans/.setrans-unix"}, 110) = -1 ENOENT (No such
> file or directory)
> 3449  close(4)                          = 0
> 3449  fgetxattr(3, "security.selinux",
> "unconfined_u:object_r:user_home_dir_t:s0", 255) = 41
> 3449  socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC, 0) = 4
> 3449  connect(4, {sa_family=AF_LOCAL,
> sun_path="/var/run/setrans/.setrans-unix"}, 110) = -1 ENOENT (No such
> file or directory)
> 3449  close(4)                          = 0
> 3449  stat("/sys/fs/selinux/class", {st_mode=S_IFDIR|0555, st_size=0,
> ...}) = 0
> 3449  futex(0x7fefa9b3375c, FUTEX_WAKE_PRIVATE, 2147483647) = 0
> 3449  open("/sys/fs/selinux/class/file/index", O_RDONLY) = 4
> 3449  read(4, "6", 19)                  = 1
> 3449  close(4)                          = 0
> 3449  openat(AT_FDCWD, "/sys/fs/selinux/class/file/perms",
> O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4
> 3449  getdents(4, /* 24 entries */, 32768) = 728
> 3449  open("/sys/fs/selinux/class/file/perms/.", O_RDONLY|O_CLOEXEC) = 5
> 3449  fstat(5, {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
> 3449  close(5)                          = 0
> 3449  open("/sys/fs/selinux/class/file/perms/..", O_RDONLY|O_CLOEXEC) = 5
> 3449  fstat(5, {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
> 3449  close(5)                          = 0
> 3449  open("/sys/fs/selinux/class/file/perms/audit_access",
> O_RDONLY|O_CLOEXEC) = 5
> 3449  fstat(5, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
> 3449  read(5, "22", 19)                 = 2
> 3449  close(5)                          = 0
> 3449  open("/sys/fs/selinux/class/file/perms/open", O_RDONLY|O_CLOEXEC) = 5
> 3449  fstat(5, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
> 3449  read(5, "21", 19)                 = 2
> 3449  close(5)                          = 0
> 
> And so on.
> 
> We use this code sequence:
> 
>     if (getpidcon(pid, &srccon) < 0)
>     {
>         perror_msg("getpidcon(%d)", pid);
>         return -1;
>     }
> 
>     if (fgetfilecon(dirfd(proc_cwd), &dstcon) < 0)
>     {
>         perror_msg("getfilecon(%s)", user_pwd);
>         return -1;
>     }
> 
>     if (security_compute_create(srccon, dstcon,
> string_to_security_class("file"), &newcon) < 0)
>     {
>         perror_msg("security_compute_create()");
>         return -1;
>     }
> 
>     if (setfscreatecon(newcon) < 0)
>     {
>         perror_msg("setfscreatecon(newcon)");
>         return -1;
>     }
> 
> This happens after switching to the other user ID (not root), and I
> think we should run the preparatory steps (everything before the call to
> setfscreatecon) as root.
> 
> Is there are supported way to get something leaner?  Is it really
> necessary to get setrans involved?  Can't we just copy the kernel
> context without translating it back and forth?

You can use the _raw interfaces to avoid the context translation.

_______________________________________________
Selinux mailing list
Selinux@xxxxxxxxxxxxx
To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.




[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux