Das kleine fehlerchen in polkit (früher als policykit bekannt), das eine beliebige ausweitung von benutzerrechten ermöglicht, liegt seit dem jahr 2009 für „kreative anwendungen“ offen:
Die Ausnutzung der entdeckten Lücke versetzt einen lokalen unprivilegierten User mit wenig Aufwand in der Lage, volle Root-Rechte auf einer Maschine zu erlangen. Dazu muss nicht einmal der Polkit-Daemon laufen. So schreibt denn auch der Entdecker Gordon ‘Fyodor’ Lyon, Schöpfer von Nmap, diese Lücke sei der »Traum eines jeden Angreifers«
Aber dafür ist der angriff auch nicht so schwierig, sondern eher eine übung für aufgeweckte kinder. Wer polkit auf BSD einsetzt, hat allerdings nichts zu befürchten, denn dort weigert sich der kernel, ein execve()
auszuführen, wenn argc
0 ist. Linux ist da leider ein bisschen flexibler… 🤭️
(Warum eigentlich?)
Weil es geht. D. h., das auszuführende Programm wird bei
execve
als eigener Parameterpath
angegeben. Dass der Name auch alsargv[0]
an das aufgerufene Programm weitergegeben wird, ist zwar gebräuchlich, aber nicht verpflichtend.Du kannst es in der Shell ausprobieren:
Da kann man einen beliebigen
name
für$0
übergeben. Allerdings bietetbash
für$0
einen Default, wenn man keinen Namen angibt, hiersh
.man execve
enthält folgende Passage:Ich stelle mir gerade vor, dass ein Hacker den letzten Satz gelesen hat und sich dachte, „without checking, ja? Schauen wir doch mal bei einem
setuid root
-Programm wiepkexec
…“Den Exploit müsste man in der
bash
mittelsausprobieren können.
Nein, Explot mittels Shell geht nicht, weil dann immer noch
argc > 0
ist. Stattdessen ein kleines C-Programm schreiben, dasexecve
direkt aufruft.