Exim4 crypteq com pesquisa MySQL sempre falha

3

Eu tenho um servidor Exim 4.80 no Ubuntu 14.04. Eu quero mudar de Dovecot Auth para MySQL. As senhas são armazenadas como cripta (com sha256, começando com $ 5 $). A expansão é assim:

server_condition = ${if crypteq{$3}{${lookup mysql{SELECT password FROM accounts LEFT JOIN domains ON accounts.domain=domains.id AND domains.domain='${quote_mysql:${domain:$2}}' WHERE accounts.name='${quote_mysql:${local_part:$2}}'}}}{yes}{no}}

Quando ligo o registro de depuração, obtenho algo assim:

10 subject=$5$fBzbQG0FRF1Lt2QI$Nhmrw5gKq62vmHDD8Eov9WCoGRPkk-----REDACTED----

10 crypted=$5$fBzbQG0FRF1Lt2QI$Nhmrw5gKq62vmHDD8Eov9WCoGRPkk-----REDACTED----

Ambos os REDACTED são exatamente iguais. Então acontece o seguinte:

10 expanded string: no

Eu procurei no código-fonte do Exim e descobri que o código a seguir é responsável pela mensagem de depuração e o resultado do crypteq

  #define STR(s) # s
  #define XSTR(s) STR(s)
  DEBUG(D_auth) debug_printf("crypteq: using %s()\n"
    "  subject=%s\n  crypted=%s\n",
    (which == 0)? XSTR(DEFAULT_CRYPT) : (which == 1)? "crypt" : "crypt16",
    coded, sub[1]);
  #undef STR
  #undef XSTR

  /* If the encrypted string contains fewer than two characters (for the
  salt), force failure. Otherwise we get false positives: with an empty
  string the yield of crypt() is an empty string! */

  tempcond = (Ustrlen(sub[1]) < 2)? FALSE :
    (Ustrcmp(coded, sub[1]) == 0);
  }

Portanto subject = é a variável codificada, que é gerada pela função crypt, enquanto crypted = é o sub [1]. Estes são os mesmos. O sucesso do operador depende apenas do tempo sub [1] é maior do que dois caracteres (o que aparentemente é verdade) e eles são os mesmos (o que também deve ser verdade).

Alguém sabe por que isso acontece?

Edit: Isso não acontece se eu colocar um hash diretamente entre parênteses sem pesquisa no MySQL. Parece haver uma falha de expansão com o MySQL.

    
por Lorenz 26.06.2014 / 23:17

1 resposta

1

Ok, então, para qualquer um que tropeçar nesse problema: A expansão do MySQL de alguma forma adiciona espaços em branco (mesmo que no banco de dados sejam claramente nenhum). Para resolver o problema, encapsule sua expansão do MySQL dentro de um substr com o comprimento de seus hashes. Um exemplo para os hashes sha256-crypt seria:

${substr{0}{63}{${lookup mysql{

Então deve funcionar.

    
por 26.06.2014 / 23:46