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

Beitrag lesen

Hallo Forum,

mehr aus Spaß habe ich ein Perlprogramm geschrieben, welches auf einem bestimmten TCP-Port Verbindungen entgegen nimmt und beantwortet. (Es handelt sich dabei um einen sehr rudimentären Webserver, aber das tut nichts zur Sache.) Da Port 80 bei Unix und Linux normalerweise root vorbehalten ist, habe ich mit exec(3pl) und sudo(8) experimentiert. Mein Programm prüft nun die Portnummer und gegebenenfalls an Hand der Umgebungsvariablen USER, ob es mit root-Rechten ausgeführt wird. Falls dies nicht zutrifft, ruft sich das Programm selbst via sudo erneut auf. Meine Versuche auf der Konsole haben so funktioniert, wie ich mir das vorstelle.

Die Frage ist allerdings, welche weiteren Sicherheitslücken ich noch übersehen habe. Fällt euch etwas auf:

#! /usr/bin/perl -Tw  
  
$ENV{'PATH'} = '/usr/bin';      # sicherer path  
  
use strict;  
use IO::Socket;  
  
my $port        = ($ARGV[0] || 2999);   # Port  
my $app;  
  
# untainting $0 and @ARGV:  
if ($0 =~ /^(\.\/[[:alpha:]]+)/) {      # lasse nur lokale Dateien zu  
        $app = $1  
}  
else {  
        $app = './WebServer.pl'         # Standard Skriptname  
}  
$ARGV[0] = $1 if ($ARGV[0] =~ /^([1-9]{1}[0-9]*)$/);  
  
if ($port < 1024 && $ENV{'USER'} ne 'root') {  
        print 'sudo benoetigt um auf Port ', $port, " zuzugreifen\n";  
        exec 'sudo', './WebServer.pl', @ARGV  
                # schlaegt fehl falls @ARGV nicht untainted werden konnte  
}  
  
my $socket = new IO::Socket::INET (  
        Listen          => 5,  
        LocalPort       => $port,  
        Proto           => 'tcp',  
        Reuse           => 1,  
        );  
die $! unless $socket;  
  
print STDERR 'Socket erzeugt fuer Port ', $port,  
        ' (als Benutzer ', $ENV{'USER'}, ").\n"

Viele Grüße,
Robert