diff -urN linux-2.4.3.orig/net/ipv4/netfilter/ip_conntrack_ftp.c linux/net/ipv4/netfilter/ip_conntrack_ftp.c --- linux-2.4.3.orig/net/ipv4/netfilter/ip_conntrack_ftp.c Fri Aug 11 05:35:15 2000 +++ linux/net/ipv4/netfilter/ip_conntrack_ftp.c Mon Apr 16 02:18:30 2001 @@ -187,7 +187,12 @@ (int)matchlen, data + matchoff, matchlen, ntohl(tcph->seq) + matchoff); - /* Update the ftp info */ + /* + * Update the ftp info only if the source address matches the address specified + * in the PORT or PASV command. Closes hole where packets could be dangerously + * marked as RELATED to bypass filtering rules. Thanks to Cristiano Lincoln + * Mattos for the report. + */ LOCK_BH(&ip_ftp_lock); if (htonl((array[0] << 24) | (array[1] << 16) | (array[2] << 8) | array[3]) == ct->tuplehash[dir].tuple.src.ip) { @@ -197,13 +202,8 @@ info->ftptype = dir; info->port = array[4] << 8 | array[5]; } else { - /* Enrico Scholz's passive FTP to partially RNAT'd ftp - server: it really wants us to connect to a - different IP address. Simply don't record it for - NAT. */ - DEBUGP("conntrack_ftp: NOT RECORDING: %u,%u,%u,%u != %u.%u.%u.%u\n", - array[0], array[1], array[2], array[3], - NIPQUAD(ct->tuplehash[dir].tuple.src.ip)); + UNLOCK_BH(&ip_ftp_lock); + return NF_ACCEPT; } t = ((struct ip_conntrack_tuple)