Aber linux ist doch sicher, oder?

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?)

3 Antworten zu “Aber linux ist doch sicher, oder?

  1. (Warum eigentlich?)

    Weil es geht. D. h., das auszuführende Programm wird bei execve als eigener Parameter path angegeben. Dass der Name auch als argv[0] an das aufgerufene Programm weitergegeben wird, ist zwar gebräuchlich, aber nicht verpflichtend.

    Du kannst es in der Shell ausprobieren:

    sh -c 'echo "$0" "$@"' name arg1 arg2

    Da kann man einen beliebigen name für $0 übergeben. Allerdings bietet bash für $0 einen Default, wenn man keinen Namen angibt, hier sh.

    man execve enthält folgende Passage:

    Early proposals required that the value of argc passed to main() be „one or greater“. This was driven by the same requirement in drafts of the ISO C standard. In fact, historical implementations have passed a value of zero when no arguments are supplied to the caller of the exec functions. This requirement was removed from the ISO C standard and subsequently removed from this volume of POSIX.1‐2017 as well. The wording, in particular the use of the word should, requires a Strictly Conforming POSIX Application to pass at least one argument to the exec function, thus guaranteeing that argc be one or greater when invoked by such an application. In fact, this is good practice, since many existing applications reference argv[0] without first checking the value of argc.

    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 wie pkexec…“

      • Nein, Explot mittels Shell geht nicht, weil dann immer noch argc &gt 0 ist. Stattdessen ein kleines C-Programm schreiben, das execve direkt aufruft.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.