/usr/local/bin/rt_queue_exists
パラメータが必要なプログラムがあります。引数が良好な場合、プログラムは状態0で終了します。それ以外の場合はゼロではありません。プログラムによると、ローカル部分で良い匂いがする場合にのみメッセージを受け入れるルーターが欲しい。
rt_queue_exists
さらに、このプログラムはルートとwww-dataだけが読み取ることができる設定ファイルに依存しているため、Eximがwww-dataとして呼び出されるようにsudoを設定する必要があると思いました。
だからこれをルーターオプションに入れました。
condition = ${run{/usr/bin/sudo -u www-data /usr/local/bin/rt_queue_exists $local_part}{yes}{no}}
通常、ローカル部分にスペース(はい、許可されています)。ローカル部分にスペースがある場合にrt_queue_exists
呼び出されます。二つ議論。
これは、次の理由で良くありません。
- 私のキュー名の一部にスペースがあります。
- 空白でコマンドを変更できる場合は、より深刻な注入攻撃を実行できますか?
Bashにも同様の問題があります。
cat $file # BAD! NO!
cat "$file" # good!
eximの同様の解決策は何ですか?
答え1
これはあなたの問題に対する直接的な解決策ではありませんが、eximを使用しません。これは、オクテットではなくクリーンなデータチャネルを介して特別に処理され、データに特別な意味を引き起こさない文字クラスを送信する問題に対する一般的な解決策です。チャンネル。
すべての特殊文字をエンコードします。この場合、問題を引き起こす文字は0x20の値を持つスペースであるため、特別な目的のエンコーディングを作成したり、うまく機能するストックエンコーディングを見つけることができます。 URLエンコーディングは単純でよく文書化されており、同様の問題(CGI)を処理するように設計されており、すぐに利用可能ないくつかの実装があり、bashに付属する観察された問題の単純なサブセクションをキャプチャするために正規表現を使用して実装できるためURLエンコーディングをお勧めします。 URLエンコーディングをすばやく要約するために、問題のあるすべての文字を%
(0x25)で構成された3つの文字列に置き換え、それ以外の場合は問題を引き起こす可能性がある2つの16進文字値を追加します。たとえば、文字列 "eat $%!&" がある場合、問題を引き起こす 2 つの文字はスペースとパーセントであるため、エンコード後に exim Space がない "eat%20$%35!&" が得られます。窒息する。元の文字列を取り戻すために、反対側からプロセスを逆にします。上記の2つの特殊文字のみを処理する文字列をエンコードおよびデコードするために、次の2つのsedスクリプトが含まれています。
s/%/%35/g
s/ /%20/g
s/%20/ /g
s/%35/%/g
エンコーディング中はパーセントが最初にエンコードされ、デコード中はパーセントが最後にデコードされます。