exim4 4.94へのDebianのアップグレードは、汚染された変数と呼ばれる新しい問題をもたらしました。
私のeximが処理するダミードメインが複数あるので、変数拡張を使用してDKIMドメイン、セレクタ、キーを取得します。私の場合は000_localmacros
次のようになります。
DKIM_CANON = relaxed
# Get the domain from the outgoing mail.
DKIM_DOMAIN = ${sg{${lc:${domain_data:$h_from:}}}{^www\.}{}}
DKIM_SELECTOR = ${lookup{DKIM_DOMAIN}lsearch{/etc/exim4/dkim/selector.map}}
# The file is based on the outgoing domain-name in the from-header.
DKIM_FILE = /etc/exim4/dkim/DKIM_DOMAIN/DKIM_SELECTOR/private.key
# If key exists then use it, if not don't.
DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}
(これらの変数はDebianのデフォルトファイルで使用されますtransport/30_exim4-config_remote_smtp
)。
残念ながら、これは次のようになります。
2021-09-10 07:13:27.625 [28932] 1mOYqk-0007WN-8p Warning: Tainted filename '/etc/exim4/dkim/example.com/n201711/private.key'
$domain
文書で提案されているように、すでに交換していますが、$domain_data
役に立ちませんでした。
allow_insecure_tainted_data = yes
請求が削除されるようにこの問題を解決するにはどうすればよいですか?
答え1
あなたの開会会社が好きです。
同様の問題があり、基本設定セクションで次のマクロを使用しました。
DKIM_DOMAIN = ${lc:${domain_data:$h_from:}}
DKIM_SELECTOR = ${lookup{$dkim_domain} lsearch {/etc/exim4/dkim/tags} {$value} {defaultdkimtag}}
添付/etc/exim4/dkim/tags
文書は次のとおりです。
mydomain.org: sometag
myotherdomain.org: 12345
しかし、DKIM_DOMAIN
結果は$h_from
(潜在的な)攻撃者が設定したため、「汚染」された。これを消去するには、安全であることが知られている照会に置き換える必要があります。
私がする方法は次のとおりです。
DKIM_DOMAIN = ${lookup{${lc:${domain:$h_from:}}} lsearch,ret=key {/etc/exim4/dkim/tags}}
- (汚染された)から
$h_from
... - 抽出フィールドを使用してください
${domain:...}
。これはまだ汚染されます。 - 強制的に小文字にします
${lc:...}
。ただので。まだ汚染されている - 小文字で汚染されたドメインを見つけるには、タグファイルでlsearchを使用してください。ここでは
ret=key
、以下を意味するオプションを使用しました。ライター見つかった値は次のとおりです。「照会キーを汚染されていないバージョンに交換してください」 - したがって、今度は汚染されていないので、他のマクロなどのその後の使用を汚染しません。
あなたの構成は
DKIM_DOMAIN = ${sg{${lc:${domain_data:$h_from:}}}{^www\.}{}}
間違っているようです${domain_data:$h_from:}
-${domain_data:...}
リストにはありません文字列拡張。$domain_data
は有効な変数ですが、ここではそうしたいものではありません。私のようにここからドメインを抽出しようとしているようです$h_from
。だからここで使うべきだと思います。${domain:$h_from:}
(また終わりにあるコロンが何なのかよくわかりませんが、皆さんにお任せします。)
次に、次の操作を行います。
DKIM_DOMAIN = ${sg{${lc:${domain:$h_from:}}}{^www\.}{}}
ただし、ファイルパスに外部から提供される値を許可するため、これは依然として汚染されています。
だから私は次の解決策を提案します。
FROM_DOMAIN_WITHOUT_WWW = ${sg{${lc:${domain:$h_from:}}}{^www\.}{}}
DKIM_DOMAIN = ${lookup{FROM_DOMAIN_WITHOUT_WWW} lsearch,ret=key {/etc/exim4/dkim/selector.map}}
または追加のマクロが気に入らない場合:
DKIM_DOMAIN = ${lookup{${sg{${lc:${domain:$h_from:}}}{^www\.}{}}} lsearch,ret=key {/etc/exim4/dkim/selector.map}}
答え2
私は解決策を見つけましたが、入れ子になったディレクトリで動作しているかどうかわかりません。
次のように変更しましたDKIM_PRIVATE_KEY
。
DKIM_PRIVATE_KEY = ${lookup {DKIM_SELECTOR.DKIM_DOMAIN.key} dsearch,ret=full {/etc/exim4/dkim}}
代わりに、キーはフラットディレクトリにselector.domainname.key
。