Was gibt es, wenn überhaupt, Schwachstellen in der Injektion in Bash und wie kann ich vor ihnen schützen?

StackOverflow https://stackoverflow.com/questions/4587509

  •  14-10-2019
  •  | 
  •  

Frage

Ich habe ein Bash -Drehbuch, das ich über Procmail starte. Procmail passt in die Thema und aus Feld aus einer E -Mail als Argumente an das Bash -Skript. Da diese Werte in irgendeiner Weise unitanitiert sind, versuche ich herauszufinden, ob es in den Schwachstellen in Einspritzung in Bash gibt, die jemand nutzen könnte, und wenn ja, was ich tun kann, um vor diesen zu schützen. Hier ist ein Beispielcode, um zu veranschaulichen, was los ist:

#!/bin/bash
/usr/sbin/sendmail -t <<EOF
From: "myhost Administrator" <admin@myhost.example.com>
To: john_doe@gmail.com
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 von Procmail mit einem .procmailrc -Skript wie folgt aufgerufen:

: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, für die ich mich über Schwachstellen in den Injektionen wundere, sind 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" <admin@myhost.example.com>
To: john_doe@gmail.com
Subject: An email subject

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

Wenn du neugierig bist, Hier ist der tatsächliche Anwendungsfall, der diese Frage in meinen Sinn brachte

War es hilfreich?

Lösung

Um die Injektionsprobleme zu vermeiden, können Sie auch alle Nachrichten an die Adresse leiten, die Sie durch ein Skript, das die Nachricht von Stdin liest, und die Header, die Sie interessieren, nativ analysiert.

Sie können dann Bibliotheken verwenden, die in der Skriptsprache verfügbar sind, die Sie für SMTP mit Ihrem lokal ausgeführten Mailserver ausgewählt haben.

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

Andere Tipps

Ich bin kein Sicherheitsexperte, aber es gibt Injektions Schwachstellen in nicht-sanitierten Benutzereingaben-insbesondere wenn Sie diese Roheingabe an Systembefehle senden, die möglicherweise einen privilegierten Zugriff haben. Überprüfen Sie immer Ihre Eingabe, bevor Sie dies tun.

Prüfen $1 und $2 Um sicherzustellen, dass sie nur druckbare Zeichen enthalten und eine angemessene Länge haben, wie unter 1000 Zeichen, bevor Sie sie an Ihr Mail -System senden.

Das ist nicht allzu schwierig und verhindert, dass Sie von einem unbekannten Exploit getroffen werden.

Eines der Dinge, die ich an Perl mag, ist das Taint -Modus Dies hindert Sie daran, solche Dinge zu tun, es sei denn, Sie haben die Daten zuerst aufgeräumt.

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

Die einzige Möglichkeit, wie ich im Skript sehe, besteht darin, dass jemand einen Punkt in einer einzigen Zeile übergeben könnte, die die Mail vorzeitig beenden würde. Und es kann sein, dass die Anhänge mit uuEcode wie folgt einbetten:

Subject: subject
From: sender@example.com
To: receiver@example.com

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 Zitierregeln nicht kenne. Dies könnte ein Punkt sein, an dem ein Angreifer Code injizieren könnte, sodass Sie die Regeln im Handbuch nachschlagen und diese testen müssen, um sicher zu sein. Einige Charaktere, die Sie testen sollten, sind $, ", \, Newlines.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top