[MASOCH-L] proposta de modificação na política de SPF

Danton Nunes danton.nunes at inexo.com.br
Mon Jul 23 16:26:33 BRT 2012


Caros,

postei isto inicialmente na SPAM-L, mas não tive retorno. Imagino que 
todos os assinantes da SPAM-L a filtrem por se parecer com spam ;)

vejam que interessante:

$ spfquery -ip=ff02::2 -sender=ze at comunicativoz.com.br 
-helo=comunicativoz.com.br
pass

spfquery: domain of comunicativoz.com.br designates ff02::2 as permitted sender
Received-SPF: pass (spfquery: domain of comunicativoz.com.br designates ff02::2 
as permitted sender) client-ip=ff02::2; envelope-from=ze at comunicativoz.com.br; 
helo=comunicativoz.com.br;

Ora, ff02::2 é o endereço IPv6 multicast 'all routers' e nunca, jamais, poderia 
ser autorizado a enviar email. O que acontece é que o cara tem um registro SPF 
extremamente permissivo:

$ host -t txt comunicativoz.com.br
comunicativoz.com.br text "v=spf1 ip4:184.164.153.66/29 all"

Outros endereços poderiam ser usados nesse teste, por exemplo, do próprio 
servidor que está recebendo a mensagem, desde que ele não envie pelo domínio do 
remetente, ou algum endereço tipo 198.162.x.y, enfim, qualquer coisa que 
sabidamente não pode mandar email serve.

Notei que há outros domínios de spammers que tem registros SPF com +all ou 
arranjos que funcionam como tal.

Para barrá-los proponho uma alteração na política de verificação do SPF, 
verificando antes de tudo se o registro permite que um endereço IP absurdo 
(como o all-routers do exemplo acima) é permitido. Se for, retorna SPF_FAIL 
pois ou bem a lista de controle de acesso está errada ou se trata de um 
spammer.

Fiz o seguinte patch no spfmilter.c (do spfmilter-0.97 do Jeff Poskanzer) 
que implementa a política. Aviso: AINDA NÃO TESTEI EXTENSIVAMENTE, publico 
aqui só para comentários ou para os corajosos se atreverem a testá-lo. 
Compilando com DHACK definido ativa minha modificação. Funciona só com 
libspf2!

--- spfmilter.c	2005-06-20 22:28:57.000000000 -0300
+++ spfmilter-danton.c	2012-07-23 12:19:00.000000000 -0300
@@ -2076,6 +2076,10 @@
  lib_do_check( lib_data_t* ld, const char* from )
      {
      int r;
+#ifdef DHACK
+	SPF_config_t hack;
+	SPF_output_t hack_output;
+#endif

      /* Find a resolver to use. */
      r  = find_resolver();
@@ -2083,6 +2087,19 @@
  	return 0;

      /* Do the SPF lookup. */
+#ifdef DHACK
+/* Danton: I want to check here if this SPF ACL give a 'pass' for a clearly illegal IP address
+   in order to sort out too permissive SPF records, e.g. +all, wich some spammers semm to like. */
+	hack=SPF_dup_config(ld->spfcid);		// clone source specification.
+	SPF_set_ipv6_str(hack,"ff02::2");		// a clearly illegal IP address (all-routers!)
+	hack_output = SPF_result( hack, get_resolver(r));
+	if (hack_output.result == SPF_RESULT_PASS) {	// passed! it's a fraud!
+		ld->output.result=SPF_RESULT_FAIL;
+		ld->output.smtp_comment="Your SPF access list is too permissive.";
+		free_resolver( r );
+		return 1;
+	}
+#endif
      ld->output = SPF_result( ld->spfcid, get_resolver( r ) );
      ld->got_output = 1;

-- Danton


More information about the masoch-l mailing list