Exim의 ${run{...}} 확장에서 공백으로 인한 매개변수 손상을 방지하는 방법은 무엇입니까?

Exim의 ${run{...}} 확장에서 공백으로 인한 매개변수 손상을 방지하는 방법은 무엇입니까?

/usr/local/bin/rt_queue_exists매개변수가 필요한 프로그램이 있습니다 . 인수가 양호하면 프로그램은 상태 0으로 종료됩니다. 그렇지 않으면 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)로 구성된 세 개의 문자열로 대체한 다음 그렇지 않으면 문제를 일으킬 수 있는 두 개의 16진수 문자 값을 추가합니다. 예를 들어 "eat $%!&"라는 문자열이 있는 경우 문제를 일으키는 두 문자는 공백과 퍼센트이므로 인코딩 후에는 exim Space가 없는 "eat%20$%35!&"를 얻게 됩니다. 질식한다. 원래 문자열을 되찾기 위해 반대쪽에서 프로세스를 반대로 진행합니다. 언급된 두 개의 특수 문자만 처리하는 문자열을 인코딩 및 디코딩하기 위해 다음 두 개의 sed 스크립트를 포함했습니다.

s/%/%35/g
s/ /%20/g

s/%20/ /g
s/%35/%/g

인코딩 중에는 백분율이 먼저 인코딩되고 디코딩 중에는 백분율이 마지막으로 디코딩됩니다.

관련 정보