4

procmailを介して開始するbashスクリプトがあります。Procmailは、bashスクリプトへの引数として、電子メールの件名fromフィールドを渡します。これらの値はどのような方法でもサニタイズされていないため、誰かが利用できるbashのインジェクションの脆弱性があるかどうか、もしそうなら、これらから保護するために私ができることを見つけようとしています。何が起こっているのかを説明するためのサンプルコードを次に示します。

#!/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

このbashスクリプトは、次のような.procmailrcスクリプトを使用してprocmailによって呼び出されます。

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

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

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

インジェクションの脆弱性について疑問に思っている2つの領域は、スクリプトのインスタンス化です。

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

スクリプト内の変数の使用法。

/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

興味があれば、この質問を思いついた実際のユースケースを次に示します。

4

3 に答える 3

0

インジェクションの問題を回避するために、stdin からメッセージを読み取り、関心のあるヘッダーをネイティブに解析するスクリプトを使用して、関心のあるアドレスにすべてのメッセージをパイプすることもできます。

次に、選択したスクリプト言語で利用可能なライブラリを使用して、ローカルで実行されているメール サーバーに SMTP を送信できます。

このように、コマンドの実行はなく、サニタイズされていない入力がプログラムへの引数として使用されることを心配する必要もありません。

于 2011-01-04T00:30:08.823 に答える
0

私はセキュリティの専門家ではありませんが、サニタイズされていないユーザー入力にはインジェクションの脆弱性が存在します。特に、特権アクセスを持つ可能性のあるシステム コマンドに生の入力を送信している場合はなおさらです。それを行う前に、常に入力を確認してください。

メールシステムに送信する前に、印刷可能な文字のみが含まれていること、および 1000 文字未満などの妥当な長さであることを確認してください$1$2

これはそれほど難しいことではなく、未知のエクスプロイトから攻撃を受けるのを防ぎます.

私が Perl で気に入っている点の 1 つは、最初にデータをクリーンアップしない限り、このようなことを実行できないようにする汚染モードです。

于 2011-01-03T21:06:24.543 に答える
0

シェルスクリプト自体はかなり安全です。メールの最も脆弱な部分はヘッダーであり、メールの送信者がその内容を変更することを許可しません。

スクリプトで私が目にする唯一の方法は、誰かが 1 行でドットを渡すことができ、メールが途中で終了する可能性があるということです。また、次のように uuencode を使用して添付ファイルを埋め込む場合もあります。

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

.procmailrc引用のルールがわからないのでの行が気になります。これは、攻撃者がコードを挿入できるポイントになる可能性があるため、マニュアルでルールを調べてテストする必要があります。テストする必要のある文字には、、、、$改行があります。"\

于 2011-01-03T22:04:00.917 に答える