Amazon SES и подтверждение DKIM в разных панелях управления

Amazon Simple Email ServicesВсё началось с того, что надо было подключить к Amazon Simple Email Service (Amazon SES) подпись DKIM. Но панель управления DNS отказалась проходить такую верификацию.

Amazon SES нам выдали записи для подтверждения владением доменом:
"Record name","Record type","Record Value"
52djzcnmdacecxkbgzwxsfxpmnhfa57k._domainkey.artemka45.ru","CNAME","52djzcnmdacecxkbgzwxsfxpmnhfa57k.dkim.amazonses.com
"mrxcednnqdhzyaf6725wxcnwdc3p7yaf._domainkey.artemka45.ru","CNAME","mrxcednnqdhzyaf6725wxcnwdc3p7yaf.dkim.amazonses.com"
"srmtzrxn7rr43o2erisj3jpqc3u4ej7b._domainkey.artemka45.ru","CNAME","srmtzrxn7rr43o2erisj3jpqc3u4ej7b.dkim.amazonses.com"



Подробности

CVE-2011-1764: Уязвимость Exim DKIM Signatures Remote Format String

Пару минут назад я заметил, этот твит Джошуа Дж. Дрейк (ака jduck). Это действительно интересная уязвимость Exim MTA. Так что, как мы можем прочитать в отчете об ошибке, проблема о которой сообщил Джон Р. Левин, как неправильное толкование DKIM подписи. Более пристальный взгляд в src/dkim.c показывает, что это был классическая уязвимость форматной строки.

void dkim_exim_verify_finish(void) {
   pdkim_signature *sig = NULL;
   int dkim_signers_size = 0;
   int dkim_signers_ptr = 0;
   dkim_signers = NULL;
 
   /* Delete eventual previous signature chain */
   dkim_signatures = NULL;
 ...
     /* Log a line for each signature */
     uschar *logmsg = string_append(NULL, &size, &ptr, 5,
 
      string_sprintf( "DKIM: d=%s s=%s c=%s/%s a=%s ",
                      sig->domain,
                      sig->selector,
                      (sig->canon_headers == PDKIM_CANON_SIMPLE)?"simple":"relaxed",
                      (sig->canon_body    == PDKIM_CANON_SIMPLE)?"simple":"relaxed",
                      (sig->algo          == PDKIM_ALGO_RSA_SHA256)?"rsa-sha256":"rsa-sha1"
                    ),
 ...
    logmsg[ptr] = '\0';
    log_write(0, LOG_MAIN, (char *)logmsg);
 ...
  }
}

Как вы можете ясно видеть, буфер (logmsg) передается log_write() получается из (partially) контролируемой пользователем данных. Поскольку не существует спецификатора форматной строки в log_write(), пользователь получает возможность инициировать общюю уязвимость форматной строки с использованием таких указателей. Исправление было совершенно очевидно…

-    log_write(0, LOG_MAIN, (char *)logmsg);
+    log_write(0, LOG_MAIN, "DKIM: %s", logmsg);


Кроме того, поскольку «DKIM:» строка была перенесена в log_write() он был удален из исходного string_sprint(), показанный ранее…
-      string_sprintf( "DKIM: d=%s s=%s c=%s/%s a=%s ",
+      string_sprintf( "d=%s s=%s c=%s/%s a=%s ",


6 мая, 2011 года
перевод гуглом с xorl.wordpress.com/2011/05/06/exim-dkim-signatures-remote-format-string/