2011-01-03 3 views
4

Ich habe ein Bash-Skript, das ich über procmail starte. Procmail geht im Thema und aus Feld aus einer E-Mail als Argument für den Bash-Skript. Da diese Werte in keiner Weise unmanipuliert sind, versuche ich herauszufinden, ob es in der bash irgendwelche Sicherheitslücken gibt, die jemand ausnutzen könnte, und wenn ja, was ich dagegen tun kann. Hier ist ein Beispielcode zu veranschaulichen, was los ist:Was, wenn überhaupt, Injektionsschwachstellen gibt es in bash und wie kann ich vor ihnen schützen?

#!/bin/bash 
/usr/sbin/sendmail -t <<EOF 
From: "myhost Administrator" <[email protected]> 
To: [email protected] 
Subject: An email subject 

You've received a new email. 
It has a subject of "$2" 
It was sent from "$1". 
EOF 

Dieses Bash-Skript würde durch procmail mit einem .procmailrc Skript wie folgt aufgerufen werden:

:0 
* ^From:\s*\/.* 
{ 
FROM = "$MATCH" 
} 

:0 
* ^Subject:\s*\/.* 
{ 
SUBJECT = "$MATCH" 
} 

:0 c: 
* ^To:.*@example.com 
| /home/john_doe/examplescript.bash "$FROM" "$SUBJECT" 

Die beiden Bereiche, die ich frage mich, über Injection-Schwachstellen für in der Instanziierung des Skripts:

/home/john_doe/examplescript.bash "$FROM" "$SUBJECT" 

und die Verwendung der Variablen im Skript.

/usr/sbin/sendmail -t <<EOF 
From: "myhost Administrator" <[email protected]> 
To: [email protected] 
Subject: An email subject 

You've received a new email. 
It has a subject of "$2" 
It was sent from "$1". 
EOF 

Wenn Ihr neugierig, here is the actual use case that brought this question to my mind

Antwort

0

Um die Probleme der Injektion zu vermeiden, könnten Sie auch alle Nachrichten an die Adresse, die Sie interessieren, über ein Skript, das die Nachricht aus stdin liest und nativ analysiert die Header, die Sie interessieren.

Sie könnten dann Bibliotheken in der Skriptsprache von Ihnen gewählten SMTP auf Ihren lokal laufenden Mail-Server zu sprechen.

Auf diese Weise gibt es keine Befehlsausführung, und Sie müssen sich keine Sorgen darüber machen, dass unsanitisierte Eingaben als Argumente für ein Programm verwendet werden.

+0

Das klingt wie eine gute ganzheitliche Lösung, die alle möglichen Schwachstellen anspricht. Es ist mehr Arbeit, aber ich denke, Sie haben Recht, dass es Injektionsprobleme vermeiden wird. Vielen Dank! –

0

Ich bin kein Sicherheitsexperte, aber Injection-Schwachstellen existieren in jedem Nicht-hygienisiert Benutzereingaben - vor allem, wenn Sie senden, dass rohe Eingabe an System-Befehle, kann privilegierten Zugang haben. Überprüfen Sie Ihre Eingabe immer, bevor Sie das tun.

Überprüfen Sie $1 und $2, um sicherzustellen, dass sie nur druckbare Zeichen enthalten und eine angemessene Länge von weniger als 1000 Zeichen aufweisen, bevor Sie sie an Ihr Mailsystem senden.

Das ist nicht zu schwierig ist, zu tun, und es verhindert, dass Sie von einem unbekannten getroffen zu nutzen.

Eines der Dinge, die ich an Perl mag, ist die Taint-Modus, die Sie davon abhält, solche Dinge zu tun, wenn Sie die Daten zuerst bereinigt haben.

+0

Gute Ideen, Strippen der Zeichen zu druckbaren Zeichen und Einstellen einer maximalen Länge. Ich kann das innerhalb des Skripts erzwingen, aber bei der Ausführung des Skripts bin ich mir nicht sicher, ob ich in der Lage wäre, die Zeichenfolgen in procmail zu bereinigen. Ich werde das untersuchen. –

+0

@gene_wood Sie können sowohl die Variablen begrenzen als auch die nicht druckbaren Daten nativ über die Parametererweiterung entfernen. Zum Beispiel: '$ {1 :: 10}' begrenzt den ersten Eingabeparameter auf eine Länge von 10 Zeichen. Um alle nicht druckbaren Dateien zu entfernen, würden Sie '$ {1 // [^ [: print:]] /}' machen. Also alles zusammen: 'oneLen = $ {1 :: 10}; oneClean = $ {oneLen // [^ [: print:]] /}'. Mann 'tr', wenn Sie eine komplette Liste von Charakterklassen haben möchten, die Sie verwenden können wie' [: alnum:] 'oder' [: digit:] 'usw. – SiegeX

0

Das Shell-Skript an sich ist ziemlich sicher. Der am meisten gefährdete Teil einer Mail ist der Header, und Sie erlauben dem Mail-Absender nicht, etwas darin zu ändern.

Die einzige Art, wie ich im Skript sehen ist, dass jemand einen Punkt auf einer einzigen Linie passieren könnte, die die E-Mail vorzeitig beenden würde. Und es kann der Fall sein, Anhänge der Einbettung wie dies mit uuencode:

Subject: subject 
From: [email protected] 
To: [email protected] 

text line 1 
text line 2 

begin 644 file-containing-abc 
$86)C"G]_ 
` 
end 

Ich mache mir Sorgen um die Linie in der .procmailrc, da ich die zitierte Regeln nicht kennen. Dies könnte ein Punkt sein, an dem ein Angreifer Code injizieren könnte. Daher müssen Sie die Regeln im Handbuch nachschlagen und sie testen, um sicher zu gehen. Einige Zeichen, die Sie testen sollten, sind $, ", \, Zeilenumbrüche.

+0

Roland, gute Ideen. Ich werde ein paar Tests gegen gängige Charaktere durchführen, die das Zitieren und Kommentieren mit dem, was ich finde, umgehen könnten. –

Verwandte Themen