Note: This bug is displayed in read-only format because the product is no longer active in Red Hat Bugzilla.
RHEL Engineering is moving the tracking of its product development work on RHEL 6 through RHEL 9 to Red Hat Jira (issues.redhat.com). If you're a Red Hat customer, please continue to file support cases via the Red Hat customer portal. If you're not, please head to the "RHEL project" in Red Hat Jira and file new tickets here. Individual Bugzilla bugs in the statuses "NEW", "ASSIGNED", and "POST" are being migrated throughout September 2023. Bugs of Red Hat partners with an assigned Engineering Partner Manager (EPM) are migrated in late September as per pre-agreed dates. Bugs against components "kernel", "kernel-rt", and "kpatch" are only migrated if still in "NEW" or "ASSIGNED". If you cannot log in to RH Jira, please consult article #7032570. That failing, please send an e-mail to the RH Jira admins at rh-issues@redhat.com to troubleshoot your issue as a user management inquiry. The email creates a ServiceNow ticket with Red Hat. Individual Bugzilla bugs that are migrated will be moved to status "CLOSED", resolution "MIGRATED", and set with "MigratedToJIRA" in "Keywords". The link to the successor Jira issue will be found under "Links", have a little "two-footprint" icon next to it, and direct you to the "RHEL project" in Red Hat Jira (issue links are of type "https://issues.redhat.com/browse/RHEL-XXXX", where "X" is a digit). This same link will be available in a blue banner at the top of the page informing you that that bug has been migrated.

Bug 1186431

Summary: Using access() is racy and makes it hard for setuid programs to use libsemanage
Product: Red Hat Enterprise Linux 7 Reporter: Jakub Hrozek <jhrozek>
Component: libsemanageAssignee: Petr Lautrbach <plautrba>
Status: CLOSED ERRATA QA Contact: Jan Zarsky <jzarsky>
Severity: unspecified Docs Contact:
Priority: unspecified    
Version: 7.1CC: dpal, dwalsh, jhrozek, jzarsky, lvrabec, mgrepl, mmalik, plautrba, pvrabec, ssekidde
Target Milestone: rc   
Target Release: ---   
Hardware: All   
OS: Linux   
Whiteboard:
Fixed In Version: libsemanage-2.5-8.el7 Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2017-08-01 22:54:12 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On:    
Bug Blocks: 1377248    
Attachments:
Description Flags
Reproducer
none
Reproducer for semanage_begin_transaction() none

Description Jakub Hrozek 2015-01-27 16:22:46 UTC
Description of problem:
Sometimes libsemanage does access checks with access(2) and acts upon the results. That is racy, because there is no guarantee that the file stays the same between the access() check and open(). Moreover, access() uses the real UID and not effective for access checks, which makes it hard for setuid programs (helpers) to use libsemanage.

Steps to Reproduce:
1. call libsemanage from a setuid helper
2.
3.

Actual results:


Expected results:


Additional info:
Better solution is to just attempt the IO operation and fail gracefully if EACCESS or EPERM is returned.

Comment 4 Petr Lautrbach 2017-02-14 15:20:48 UTC
Jakub, would you please share your concerns in the discussion about your report at https://marc.info/?l=selinux&m=148708503828211&w=2

Comment 5 Jakub Hrozek 2017-02-15 13:32:35 UTC
(In reply to Petr Lautrbach from comment #4)
> Jakub, would you please share your concerns in the discussion about your
> report at https://marc.info/?l=selinux&m=148708503828211&w=2

I hope it's OK to reply here since I'm not on the selinux list.

I think the reason why I filed the bug back then was https://fedorahosted.org/sssd/ticket/2564

In general I don't think the bug is a big deal to us and if upstream is reluctant to this change, just close the bug. I just found it odd to check if a file exists before acting on it instead of just trying to work with the file and failing on errors..the current approach seems a bit racy to me.

About the question in the thread that asks why do we use the selinux libraries in a setuid library..the reason is that in order to pass certain certifications, no code in SSSD that deals with network connections should run as root. Therefore, the SSSD itself runs as a nonprivileged user and for actions that require root privileges (like setting a selinux context for a user) we fork our a setgid helper that actually does the work.

Comment 6 Petr Lautrbach 2017-03-06 09:42:42 UTC
https://marc.info/?l=selinux&m=148821948710851&w=2

Comment 7 Vit Mojzis 2017-03-09 11:15:27 UTC
Created attachment 1261511 [details]
Reproducer

Usage:
# gcc access.c -lsemanage
# sudo chown root a.out
# sudo chmod +s a.out

In the following configuration
UID: 1000, EIUD: 0
semanage_connect should work (fixed by patch), but semanage_access_check fails.

Comment 10 Jan Zarsky 2017-03-15 14:40:34 UTC
Created attachment 1263348 [details]
Reproducer for semanage_begin_transaction()

semanage_connect() works, but semanage_begin_transaction() fails

Steps to reproduce:
$ gcc test.c -o test -lsemanage
$ sudo chown root test
$ sudo chmod +s test
$ ./test
UID: 1000, EUID: 0
Connected
  creating seuser key
  querying seuser root
Can't begin transaction

Expected results:
$ ./test
UID: 0, EUID: 0
Connected
  creating seuser key
  querying seuser root
In transaction
  modifying local seuser
  deleting local seuser

Comment 18 errata-xmlrpc 2017-08-01 22:54:12 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory, and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://access.redhat.com/errata/RHBA-2017:2112