Robert Bienert: /Sicherheit: Untaint my Vars und per sudo Ausführen

Beitrag lesen

Moin Alexander,

vielen Dank für die ausführliche und lehrreiche Kritik!

Starte einen Prozess, der Port 80 als Server öffnet, mit Root-Rechten. Werfe in dem Prozess alle Rechte weg und werde zu nobody / www / wwwrun. Ersetze den Prozess durch einen anderen, der den noch offenen Port bedient.

Nobody ist keine gute Idee. Wenn du (zu) viele Dienste unter diesem Benutzer ausführst, wird der Nutzer selbst sehr mächtig. Am Besten ist ein eigener Nutzer für jeden Dienst.

Lektüre: http://cr.yp.to/ucspi-tcp.html, insbesondere http://cr.yp.to/ucspi-tcp/tcpserver.html, das fast genauso arbeitet. Allerdingss wird dort erst die fertig aufgebaute Client-Verbindung weitergereicht, nicht schon der offene Server-Port.

Wo finde ich denn den Quellcode der Programme? Dieser Ansatz ist sinnvoller.

Warum anhand von $ENV{'USER'}? Lies bitte mal in perlvar nach, was $< und $> bedeuten.

$ perl -e 'print $<, " ", $>, "\n"'
501 501

$ sudo perl -e 'print $<, " ", $>, "\n"'
0 0

Alles klar, kannte ich vorher nicht.

Und an dieser Stelle braucht gar nicht mehr weiter diskutiert zu werden, weil das IMHO das Killerargument gegen den von mir skizzierten Entwurf ist:

Wenn der User sudo ausführen darf, dann soll er das bitte explizit machen, damit er sich bewußt bleibt, dass er mehr Rechte als normal hat.

Hiermit fällt dann nämlich auch das Problem mit den Pfaden und Dateinamen weg. (BTW: Wie bekomme ich denn unter Unix/Linux den kompletten Pfad eines ausgeführten Programms? $0 oder argv[0] in C enthalten nur den Namen, wie er auf der Konsole eingegeben wird.)

--

Der Vollständigkeit halber die weiteren Bugs:

untainting $0 and @ARGV:

if ($0 =~ /^(./[[:alpha:]]+)/) {      # lasse nur lokale Dateien zu
        $app = $1


>   
> Was genau läßt Du hier zu?  
  
Oha, da fehlte noch ein $:  
  
^(\.\/[[:alpha:]]+)$  
  
  

> >                 # schlaegt fehl falls @ARGV nicht untainted werden konnte  
>   
> Und im Fehlerfall ignorierst Du den Fehler komplett  
  
Mein perl 5.8.8 terminiert ein Skript bei der unzulässigen Verwendung einer tainted var. Etwas Anderes wäre an dieser Stelle auch von mir aus nicht sinnvoll.  
  
Vielen Dank und viele Grüße,  
Robert