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 - Using access() is racy and makes it hard for setuid programs to use libsemanage
Summary: Using access() is racy and makes it hard for setuid programs to use libsemanage
Keywords:
Status: CLOSED ERRATA
Alias: None
Product: Red Hat Enterprise Linux 7
Classification: Red Hat
Component: libsemanage
Version: 7.1
Hardware: All
OS: Linux
unspecified
unspecified
Target Milestone: rc
: ---
Assignee: Petr Lautrbach
QA Contact: Jan Zarsky
URL:
Whiteboard:
Depends On:
Blocks: 1377248
TreeView+ depends on / blocked
 
Reported: 2015-01-27 16:22 UTC by Jakub Hrozek
Modified: 2017-08-01 22:54 UTC (History)
10 users (show)

Fixed In Version: libsemanage-2.5-8.el7
Doc Type: If docs needed, set a value
Doc Text:
Clone Of:
Environment:
Last Closed: 2017-08-01 22:54:12 UTC
Target Upstream Version:
Embargoed:


Attachments (Terms of Use)
Reproducer (1.70 KB, text/x-csrc)
2017-03-09 11:15 UTC, Vit Mojzis
no flags Details
Reproducer for semanage_begin_transaction() (1.65 KB, text/x-csrc)
2017-03-15 14:40 UTC, Jan Zarsky
no flags Details


Links
System ID Private Priority Status Summary Last Updated
Red Hat Product Errata RHBA-2017:2112 0 normal SHIPPED_LIVE libsemanage bug fix update 2017-08-01 19:37:13 UTC

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


Note You need to log in before you can comment on or make changes to this bug.