[Postfixbuch-users] policyd-weight und BOGUS_MX

Robert Felber robtone at ek-muc.de
Fr Apr 1 15:58:23 CEST 2011


On Fri, Apr 01, 2011 at 03:13:38PM +0200, Lars Heide wrote:
> Hi,
> 
> ich hab mal einen Patch gemacht (policyd-weight.patch gegen Version
> 0.1.14.17, policyd-weight-15.patch gegen Version 0.1.15.1 ), welcher das
> Verhalten wie oben besprochen ändert (und ein paar andere kleinere
> Änderungen macht).
> 
> Änderungen im Verhalten:
> 
> 1. "list.dsbl.org" entfernt, wie Robert richtig anmerkte ist diese Liste
> seit 2 Jahren nicht mehr in Betrieb, der Check erzeugt daher nur
> Wartezeit (bei version 0.1.14.17).

Ist ja in 0.1.15.1 (aktuell) draussen.

> 2. Wenn gültige MX-Einträge für die FROM Domain gefunden werden, wird
> nicht mehr nach A-Records gesucht.
> 3. In die Variable $addresses fliessen jetzt nur noch IPs aus der
> HELO-Domain, nicht mehr welche aus der FROM Domain. Unterschied ist das
> damit der check HELO_IP_IN_CL_SUBNET nicht mehr gegen IPs aus der FROM
> Domain läuft, wenn er läuft.

Hier entsteht das Problem, dass es schon oefters vorgegkommen ist, dass
die Client IP/24 /16 nicht zum Helo passte, wohl aber zu den MX/A records im
Sender.


> 4. Falsche MX sind jetzt auch 0.0.0.0/8 und 255.255.255.255.
> 5. Die Abfrage gegen das DNS fragt jetzt nicht mehr expliziet nach 'A'
> Records (oder 'AAAA' bei 01.1.15), weil sonst nie PTRs zurück geliefert
> werden und ein Check weiter unten nie erfüllt werden kann. Ohne 'A' ist
> der Check der Perl Library impliziet ein 'A' wenn es einen Hostnamen
> erkennt und liefert 'PTR' zurück wenn es eine IP ist.
> 
> Da sind noch 2 andere kleinere Änderungen, die beeinflussen aber das
> Verhalten nicht und bügeln nur Gemecker von Perl aus.
> 
> Eine Frage die sich mir aufwirft bei der Betrachtung von policyd-weight
> ist, das wenn die client IP ein MX der FROM Domain ist, wird der HELO
> nicht dahingehend überprüft ob die HELO Domain irgendwelche IPs liefert,

Der initiale Gedanke war "Spoofed Sender" zu minimieren. Bzw spoofing
im Generellen. Wenn der Client ein MX ist, interessiert eigentlich
nur noch das RBL-Listing von wegen UCE.


> die mit der clientIP oder dem Subnet übereinstimmt. (wenn clientIP im
> DNS der FROM Domain auftaucht wird der HELO nicht mehr betrachtet). Der
> Patch bildet dieses Verhalten nach indem er eine andere Variable
> abfragt, persönlich würde ich das nicht so durchgehen lassen.
> 
> Kurios ist das z.B. bei dieser Kombination von Parametern (in echt so
> gesehen):
> 
> helo_name=.
> sender=english at ublove.com
> client_address=119.205.209.108
> 
> 
> Orginal: policyd-weight
> NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5
> DSBL_ORG=SKIP(0) HELO_IP_IN_CL_SUBNET=-1.2 (check from: .ublove. - helo:
> ... - helo-domain: ..)  FROM/MX_MATCHES_NOT_HELO(DOMAIN)=1;
> <client=119.205.209.108> <helo=.> <from=english at ublove.com> <to=>; rate:
> -4.7
> 
> wenn man die client_address wirklich durch die MX-IP der FROM Domain
> ersetzt (119.205.209.104) , sieht das Bild sogar noch rosiger aus:
> 
> NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5
> CL_IP_EQ_FROM_MX=-3.1 <helo_ips:  . 119.205.209.104>;
> <instance=119.205.209.104english at ublove.com> <client=119.205.209.104>
> <helo=.> <from=english at ublove.com> <to=>; rate: -7.6

Dies ist auch der Wert der aktuellen Version (0.1.15.1).

> Wenn man die HELO-IPs einbezieht fliegt das ganze raus:
> 
> NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5
> CL_IP_NE_HELO=1.5 RESOLVED_IP_IS_NOT_HELO=1.5 (check from: .ublove. -
> helo: ... - helo-domain: ..)  FROM_NOT_FAILED_HELO(DOMAIN)=3 <helo_ips:
> .>; <instance=119.205.209.108english at ublove.com>
> <client=119.205.209.108> <helo=.> <from=english at ublove.com> <to=>; rate: 1.5

Das ergaebe ein richtiges Gejammer. :)
Um diesen Effekt zu haben nimmt man postfix' reject_unknown_helo_hostname.



> (für diesen Effekt die Zeile 2204: last if $is_mx; in der gepatchten
> Version entfernen)
> 
> Lars
> 
> --
> IT- Services
> Forschungszentrum Jülich GmbH
> Tel.: +49 2461 61 9237                  Email: l.heide at fz-juelich.de
> Fax: +49 2461 61 9209                   Internet: www.fz-juelich.de/its
> 
> 
> ------------------------------------------------------------------------------------------------
> ------------------------------------------------------------------------------------------------
> Forschungszentrum Juelich GmbH
> 52425 Juelich
> Sitz der Gesellschaft: Juelich
> Eingetragen im Handelsregister des Amtsgerichts Dueren Nr. HR B 3498
> Vorsitzender des Aufsichtsrats: MinDirig Dr. Karl Eugen Huthmacher
> Geschaeftsfuehrung: Prof. Dr. Achim Bachem (Vorsitzender),
> Dr. Ulrich Krafft (stellv. Vorsitzender), Prof. Dr.-Ing. Harald Bolt,
> Prof. Dr. Sebastian M. Schmidt
> ------------------------------------------------------------------------------------------------
> ------------------------------------------------------------------------------------------------
> 
> Besuchen Sie uns auf unserem neuen Webauftritt unter www.fz-juelich.de

> --- policyd-weight.orig	2011-03-31 12:21:14.000000000 +0200
> +++ policyd-weight	2011-04-01 14:34:18.000000000 +0200
> @@ -374,7 +374,6 @@
>      'sbl-xbl.spamhaus.org',   4.35,       -1.5,        'SBL_XBL_SPAMHAUS',
>      'bl.spamcop.net',         3.75,       -1.5,        'SPAMCOP',
>      'dnsbl.njabl.org',        4.25,       -1.5,        'BL_NJABL',
> -    'list.dsbl.org',          4.35,          0,        'DSBL_ORG',
>      'ix.dnsbl.manitu.net',    4.35,          0,        'IX_MANITU'
>  );
>  
> @@ -2011,6 +2010,7 @@
>          if($tmpcnt == 1)
>          { 
>              $MATCH_TYPE = 'HELO'; 
> +            $found = 0;  ## reset $found to look for IPs of the HELO Domain
>          } 
>          else 
>          { 
> @@ -2074,9 +2074,12 @@
>                              if($tmpcnt == 0)
>                              {
>                                  $from_addresses .= ' '.$mxvar->address;
> +                                $found = 1;   ### if there is a valid MX entry, thats enough.. don't look for A records..
> +                            }
> +                            else
> +                            {
> +                                $addresses .= ' '.$mxvar->address;
>                              }
> -
> -                            $addresses .= ' '.$mxvar->address;
>  
>                              if ($ip eq $mxvar->address)
>                              {
> @@ -2102,7 +2105,7 @@
>                      (
>                       $from_addresses !~ /\d+/ ||
>                       $from_addresses =~ 
> -                 /( 127\.| 192\.168\.| 10\.| 172\.(?:1[6-9]|2\d|3[01])\.)/
> +                 /( 0\.|255\.255\.255\.255|127\.| 192\.168\.| 10\.| 172\.(?:1[6-9]|2\d|3[01])\.)/
>                      )
>                    )
>                  {
> @@ -2113,7 +2116,7 @@
>                  if(!($found))
>                  {
>                      
> -                    my $query = $res->send($testhelo, 'A');
> +                    my $query = $res->send($testhelo);
>                      if(dns_error(\$query, \$res))
>                      {
>                          if($maxdnserr-- <= 1)
> @@ -2127,7 +2130,7 @@
>                      {
>                          if($addr->type eq 'PTR')
>                          {
> -                            if($helo == $ip)
> +                            if($helo eq $ip)
>                              {
>                                  $RET              .= ' CL_IP_EQ_HELO_NUMERIC='.
>                                                       $helo_score[1];
> @@ -2143,7 +2146,10 @@
>                              $from_addresses .= ' '.$addr->address;
>                          }
>  
> -                        $addresses .= ' '.$addr->address;
> +                        else
> +                        {
> +                            $addresses .= ' '.$addr->address;
> +                        }
>                          if ($ip eq $addr->address)
>                          {
>                              $found    = 1;
> @@ -2181,7 +2187,7 @@
>                      (
>                       $from_addresses !~ /\d+/ || 
>                       $from_addresses =~
> -                 /( 127\.| 192\.168\.| 10\.| 172\.(?:1[6-9]|2\d|3[01])\.)/
> +                 /( 0\.|255\.255\.255\.255|127\.| 192\.168\.| 10\.| 172\.(?:1[6-9]|2\d|3[01])\.)/
>                      )
>                    )
>                  {
> @@ -2197,7 +2203,7 @@
>              }
>              last if $found;
>          }
> -        last if $found;
> +        last if $is_mx;
>      }
>      if((!($found)) && $recs_found) # helo seems forged
>      {
> @@ -3767,7 +3773,7 @@
>      my $helo = shift;
>      my $ip   = shift;
>  
> -    if($$helo !~ /^\[(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\]$/ ) { return }
> +    if($$helo !~ /^\[(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\]$/ ) { return 0 }
>      my $tmp_helo_ip = $1;
>  
>      my $tmpip = inet_aton( $tmp_helo_ip );

> --- ./vandercruck/policyd-weight-15.orig	2010-10-19 21:20:25.000000000 +0200
> +++ policyd-weight	2011-04-01 15:02:44.000000000 +0200
> @@ -2030,6 +2030,7 @@
>          if($tmpcnt == 1)
>          { 
>              $MATCH_TYPE = 'HELO'; 
> +            $found = 0;  ## reset $found to look for IPs of the HELO Domain
>          } 
>          else 
>          { 
> @@ -2097,9 +2098,12 @@
>                              if($tmpcnt == 0)
>                              {
>                                  $from_addresses .= ' '.$ip_address;
> +                                $found = 1;   ### if there is a valid MX entry, thats enough.. don't look for A records..
> +                            }
> +                            else
> +                            {
> +                                $addresses .= ' '.$ip_address;
>                              }
> -
> -                            $addresses .= ' '.$ip_address;
>  
>                              if ($ip eq $ip_address)
>                              {
> @@ -2128,7 +2132,7 @@
>                      (
>                       $from_addresses !~ /\d+/ ||
>                       $from_addresses =~ 
> -                 /( 127\.| 192\.168\.| 10\.| 172\.(?:1[6-9]|2\d|3[01])\.)/
> +                 /( 0\.|255\.255\.255\.255|127\.| 192\.168\.| 10\.| 172\.(?:1[6-9]|2\d|3[01])\.)/
>                      )
>                    )
>                  {
> @@ -2139,9 +2143,7 @@
>                  if(!($found))
>                  {
>                      
> -		    for my $query_type ('A','AAAA') {
> -
> -                    my $query = $res->send($testhelo,$query_type);  
> +                    my $query = $res->send($testhelo);  
>                      if(dns_error(\$query, \$res))
>                      {
>                          if($maxdnserr-- <= 1)
> @@ -2155,7 +2157,7 @@
>                      {
>                          if($addr->type eq 'PTR')
>                          {
> -                            if($helo == $ip)
> +                            if($helo eq $ip)
>                              {
>                                  $RET              .= ' CL_IP_EQ_HELO_NUMERIC='.
>                                                       $helo_score[1];
> @@ -2172,8 +2174,11 @@
>                          {
>                              $from_addresses .= ' '.$ip_address;
>                          }
> +                        else
> +                        {
> +                            $addresses .= ' '.$ip_address;
> +                        }
>  
> -                        $addresses .= ' '.$ip_address;
>                          if ($ip eq $ip_address)
>                          {
>                              $found    = 1;
> @@ -2191,7 +2196,6 @@
>                          }
>  			undef $ip_address;
>                      }
> -		    } #IPv4/IPv6
>                  }
>  
>                  if($bad_mx && (!($bad_mx_scored)))
> @@ -2213,7 +2217,7 @@
>                      (
>                       $from_addresses !~ /\d+/ || 
>                       $from_addresses =~
> -                 /( 127\.| 192\.168\.| 10\.| 172\.(?:1[6-9]|2\d|3[01])\.)/
> +                 /( 0\.|255\.255\.255\.255|127\.| 192\.168\.| 10\.| 172\.(?:1[6-9]|2\d|3[01])\.)/
>                      )
>                    )
>                  {
> @@ -2229,7 +2233,7 @@
>              }
>              last if $found;
>          }
> -        last if $found;
> +        last if $is_mx;
>      }
>      if((!($found)) && $recs_found) # helo seems forged
>      {
> @@ -3830,7 +3834,7 @@
>      my $helo = shift;
>      my $ip   = shift;
>  
> -    if($$helo !~ /^\[(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\]$/ ) { return }
> +    if($$helo !~ /^\[(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\]$/ ) { return 0 }
>      my $tmp_helo_ip = $1;
>  
>      my $tmpip = inet_aton( $tmp_helo_ip );

> -- 
> _______________________________________________
> Postfixbuch-users -- http://www.postfixbuch.de
> Heinlein Professional Linux Support GmbH
> 
> Postfixbuch-users at listen.jpberlin.de
> https://listi.jpberlin.de/mailman/listinfo/postfixbuch-users


-- 
	Robert Felber, PGP: D1B2F2E5




Mehr Informationen über die Mailingliste Postfixbuch-users