Seitenanfang

Perl Taint mode: Vergiftete Daten

(SQL) Injection ist immer wieder für Bugs gut, vor allem bei Webanwendungen, aber auch andere Stellen können ganz leicht sehr gefährlich werden. PHP hat das lange Zeit in eindrucksvoller Weise demonstriert - dazu reichte schon ein sehr simples index.php:

secure_perl.jpg<?php
require("header.php");
require($_GET['page']);
require("footer.php");
?>

Dieses Script wird wohl normalerweise mit ?page=main.php als Parameter aufgerufen, würde aber anstandslos auch ?page=/etc/passwd akzeptieren (was seit der weit verbreiteten Verwendung von Shadow-Passwortdateien natürlich massiv an Schrecken verloren hat).

Auch Perl ist für diese Art von schlechtem Sourcecode anfällig:

#!/usr/bin/perl
require 'header.pl';
require $ENV{QUERY_STRING};
require 'footer.pl';

Allerdings bietet Perl mit dem taint mode ein wirksames Mittel gegen diese Art von Problemen. Wird dieser aktiviert (bei obigem Script durch den Parameter -T in der ersten Zeile), bricht das Script in Zeile 3 mit einer Fehlermeldung ab:

Insecure dependency in require while running with -T switch at index.pl line 3.

Mit dieser Meldung verhindert Perl, dass einer unsicheren Variable zu viel Macht übertragen wird.

Vergiftete Daten

Alle Werte, die von außen zu einem Perl-Script gelangen, werden im Taint mode als vergiftet markiert. Dazu gehören alle Kommandozeilenparameter, Umgebungsvariablen, Ergebnisse verschiedener Syscalls (wie readdir, readlink, etc.) und alle Werte, die aus Dateien gelesen werden.

Wichtig ist dabei, dass die Daten selbst und nicht etwa einzelne Variablen als vergiftet angesehen werden, so würde folgender Workaround nicht funktionieren und zur gleichen Fehlermeldung führen:

#!/usr/bin/perl
require 'header.pl';
my $page = $ENV{QUERY_STRING};
require $page;
require 'footer.pl';

Da $page vergiftete Daten erhalten hat, wird jeder potentiell sicherheitskritische Zugriff darauf ebenfalls unterbunden.

Im nächsten Teil geht es darum, wie vergiftete Daten gesäubert und dadurch doch noch für sicherheitskritische Operationen verwendet werden können.

 

Noch keine Kommentare. Schreib was dazu

Schreib was dazu

Die folgenden HTML-Tags sind erlaubt:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>