exim 업그레이드 후 DKIM 구성의 오염을 제거하는 방법은 무엇입니까?

exim 업그레이드 후 DKIM 구성의 오염을 제거하는 방법은 무엇입니까?

exim4 4.94로의 데비안 업그레이드는 오염된 변수라는 새로운 문제를 가져왔습니다.

내 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}}

(이러한 변수는 데비안의 기본 파일에서 사용됩니다 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.

관련 정보