subprocess.call(..., user=xx, group=xxx) is not able to gain privileges
Offen
Dieses Issue hat noch niemand übernommen.
stdlib
topic-subprocess
type-bug
- Vorherrschende Sprache
- Python
- Sterne
- 77.2k
- Forks
- 36k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
#!/usr/bin/python3
from os import getresuid, initgroups, setresgid, setresuid
from pwd import getpwnam
from subprocess import check_call
def drop_permissions():
user = 'nobody'
info = getpwnam(user)
uid = info.pw_uid
gid = info.pw_gid
assert uid
assert gid
initgroups(user, gid)
setresgid(gid, gid, gid)
setresuid(uid, uid, 0)
def run_privileged_proc():
def restore():
setresuid(0, 0, 0)
setresgid(0, 0, 0)
initgroups('root', 0)
check_call(['id'], preexec_fn=restore)
def main():
assert getresuid() == (0, 0, 0)
# This on works (dropping permissions in child process)
check_call(['id'], user=65534, group=65534)
drop_permissions()
# This one works:
run_privileged_proc()
# This does not:
check_call(['id'], user=0, group=0)
main()
for the last subprocess, strace of child process:
set_robust_list(0x7eff7bfaea20, 24) = 0
close(7) = 0
close(9) = 0
close(11) = 0
dup2(6, 0) = 0
dup2(8, 1) = 1
dup2(10, 2) = 2
rt_sigaction(SIGPIPE, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_ONSTACK, sa_restorer=0x7eff7b83ea30}, {sa
rt_sigaction(SIGXFSZ, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER|SA_ONSTACK, sa_restorer=0x7eff7b83ea30}, {sa
setgroups(0, []) = -1 EPERM (Операция не позволена)
write(12, "OSError:", 8) = 8
write(12, "1", 1) = 1
write(12, ":", 1) = 1
write(12, "noexec", 6) = 6
exit_group(255) = ?
+++ exited with 255 +++
Python 3.10.7
Linked PRs
- gh-134400
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginnen Sie mit den Aufrufen von subprocess.check_call unter Verwendung von user, group und preexec_fn und vergleichen Sie anschließend deren Verhalten beim Erzeugen von Kindprozessen mit der bereitgestellten strace-Ausgabe. Als abgeschlossen gilt die Aufgabe, wenn der abschließende privilegierte Subprozess nach dem Entzug der Berechtigungen erfolgreich ausgeführt werden kann; der Issue führt außerdem den verknüpften PR gh-134400 auf.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- operating-systems
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Muss geklärt werden
- Anfängerfreundlichkeit
- 25/100