Como posso evitar a confusão de argumentos com espaços na expansão $ {run {…}} do Exim?

1

Eu tenho um programa, /usr/local/bin/rt_queue_exists , que leva um argumento. Se o argumento cheirar bem, o programa sai com o status 0; diferente de zero. Eu quero um roteador que aceita mensagens somente se a parte local cheirar bem, de acordo com este programa.

Além disso, este programa conta com um arquivo de configuração que é legível somente pelo root e www-data, então eu pensei em configurar o sudo para permitir que rt_queue_exists fosse invocado como www-data pelo Exim.

Assim, eu criei isso nas minhas opções de roteador:

condition = ${run{/usr/bin/sudo -u www-data /usr/local/bin/rt_queue_exists $local_part}{yes}{no}}

Funciona, normalmente, exceto quando há um espaço na parte local ( sim permitido ) . Quando há um espaço na parte local, rt_queue_exists é invocado com dois argumentos.

Isso é ruim porque:

  • alguns nomes de minhas filas possuem espaços neles
  • se eu puder alterar o comando com espaços, posso executar ataques de injeção mais sérios?

Existe um problema semelhante no bash:

cat $file   # BAD! NO!
cat "$file" # good!

Qual é a solução análoga no exim?

    
por Phil Frost 21.11.2013 / 21:34

1 resposta

0

Embora esta não seja uma solução direta para o seu problema, eu evito o exim. É uma solução geral para a classe de problemas de envio de caracteres que são manipulados especialmente através de um canal de dados que não é oito bits limpo, sem disparar o especial significados no canal de dados.

Codifique todos os caracteres especiais. Nesse caso, o caractere que está causando problemas é o espaço com um valor de 0x20, para que você possa criar uma codificação de finalidade especial ou encontrar uma codificação de ações que funcione. Eu recomendaria a codificação de url porque é simples, bem documentada, projetada para lidar com uma classe de problemas similar (CGI), tem múltiplas implementações prontamente disponíveis, e um subconjunto simples que captura o problema observado pode ser implementado com expressões regulares vem com bash. para um breve resumo da codificação de url, todos os caracteres que apresentam problemas são substituídos por uma cadeia de três caracteres, que consiste em % (0x25), seguida pelos dois caracteres hexadecimais do valor que, de outro modo, causaria problemas. por exemplo, se tivéssemos a string "eat $%! &" os dois caracteres que dariam problemas são o espaço e a porcentagem, então, após a codificação, teríamos "comemos% 20 $% 35! &" que não tem espaços para o exim se engasgar. nós magreza reverter o processo do outro lado, para voltar a seqüência original. Eu incluí os dois scripts sed seguintes para codificar e decodificar a string manipulando apenas os dois caracteres especiais mencionados.

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

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

observe que durante a codificação a porcentagem foi codificada primeiro e que durante a decodificação ela foi decodificada por último.

    
por 21.11.2013 / 22:57