To: users, dev, announce Subject: ANNOUNCE: Apache SpamAssassin 3.3.0-alpha3 available [DRAFT DRAFT DRAFT - NOT YET RELEASED - DRAFT DRAFT DRAFT] Apache SpamAssassin 3.3.0-alpha3 is now available for testing. Downloads are available from: http://people.apache.org/~jm/devel/ md5sum of archive files: TODO Note that the *-rules-*.tgz files are only necessary if you cannot, or do not wish to, run "sa-update" after install to download the latest fresh rules. The release files also have a .asc accompanying them. The file serves as an external GPG signature for the given release file. The signing key is available via the wwwkeys.pgp.net key server, as well as http://spamassassin.apache.org/released/GPG-SIGNING-KEY The key information is: pub 1024D/265FA05B 2003-06-09 SpamAssassin Signing Key Key fingerprint = 26C9 00A4 6DD4 0CD5 AD24 F6D7 DEE0 1987 265F A05B See the INSTALL and UPGRADE files in the distribution for important installation notes. Summary of major changes since 3.2.5 ------------------------------------ COMPATIBILITY WITH 3.2.5 - rules are no longer distributed with the package, but installed by sa-update - either automatically fetched from the network (preferably), or from a tar archive, which is available for downloading separately - CPAN module requirements: - minimum required version of ExtUtils::MakeMaker is 6.17 - modules now required: Time::HiRes, NetAddr::IP, Archive::Tar - minimal version of Mail::DKIM is 0.31 (preferred: 0.36_5 or later) - no longer used: Mail::DomainKeys, Mail::SPF::Query - support for versions of perl 5.6.* is being gradually revoked (may still work, but no promises and no support) - preferred versions of perl are 5.8.8, 5.8.9, and 5.10.0 or later (of these three the 5.8.9 appears to be the most buggy) BUILDING AND PACKAGING - rules are no longer distributed with the package, but installed by sa-update - simplify Makefile.PL and fix a bug in DESTDIR support by increasing the minimum ExtUtils::MakeMaker version required to 6.17 - we now include check_whitelist and check_spamd tools in the distribution, now called 'sa-awl' and 'sa-check_spamd' WORKAROUNDS TO PERL BUGS AND LIMITATIONS - let the Check.pm plugin produce smaller chunks of source code from rules (60 kB) to avoid Perl compiler crashing on exceeding stack size - localize $1, $2, etc at several places, avoiding taint issue from propagating - avoid Perl I/O bug by replacing line-by-line reading with read() where suitable, or play down the EBADF status in other places and only report it as dbg instead of a die - while also providing a little speedup (10..25%) on reading a message - new sub Message::split_into_array_of_short_lines to nicely split a text into array of paragraph chunks of sizes between 1 kB and 2 kB, gives less opportunity to runaway regular expressions in rules; fixes bugs: 5717, 5644, 5795, 5486, 5801, 5041 MEMORY FOOTPRINT - as a side-effect of compiling rules in smaller chunks (to avoid compiler crashes) virtual memory footprint of SpamAssassin is reduced; - save some memory by not importing Pod::Usage unless it is needed; - save 350k+ of memory in sa-compile by replacing DynaLoader with XSLoader; - remove unneeded index from MySQL bayes_token table; IPv6 SUPPORT - IPv6 support for trusted_networks, internal_networks, whitelist_from_rcvd, msa_networks, and other stuff that uses NetSet and the Received header parser, using NetAddr::IP; - allow usage of a remote dccifd host through an INET or INET6 socket; - README.awl: increase suggested awl.ip field width to 45 to be able to hold IPv6 addresses (optionally); - IP_PRIVATE now includes the ipv6 variants of private address space, as well as the ipv6-mapped ipv4 addresses. - NetSet now understands that ::ffff:192.168.1.2 and 192.168.1.2 are the same address; - IPv6 addresses are now recognised in Received headers; - when reading Received header fields, the "IPv6:" prefix is stripped from IPv6 addresses, and "::ffff:" is removed from IPv6-mapped IPv4 addresses (so strings can match them as simply IPv4 addresses); - ::1 is always included in the trusted_networks/internal_networks set similar to 127.0.0.0/8; SPAMC - add -n / --connect-timeout switch to spamc, allowing separate connection timeout from communication timeout; - add --filter-retries and --filter-retry-sleep - spamc would not time out connections to a hung spamd - spamc client library leaks the zlib compression buffer if compression is used - spamc long option '--dest' was broken SPAMD - when spamd is started with the daemonize option do not exit the parent until the child signals that it has logged the pid, to allow a wrapper script to simply continue immediately after starting spamd; - additional tempfile cleanup in kill_handler; - add SPAMD_LOCALHOST option to "make test" to allow specifying non-127.0.0.1 IP address for use in FreeBSD jail API - adding one optional argument to Mail::SpamAssassin::parse allows caller to pass additional out-of-band information to SpamAssassin (such as DKIM verification results, information about a SMTP session, or dynamic rule hits); this information is made available to plugins and the rest of the code through a 'suppl_attrib' hash; - Plugin::Check - pick up 'rule_hits' from caller via the new mechanism and call got_hit() on them; - simplified adding dynamic score hits and dynamic rules by plugins (such as AWL, CRM114, FuzzyOcr, Check) by letting got_hit() accept options tflags and description, and letting it store a supplied dynamic score for proper reporting; - let the timing breakdown information be accessible to a caller through the existing get_tag mechanism (tag TIMING); - let the generated header fields ('add_header' configuration options) be accessible to a caller through the existing get_tag mechanism (tag ADDEDHEADER and friends); RULES - rules are no longer distributed with the package; - dropped redundant rules or rules causing too many false positives; - added or updated rules (incomplete list in no particular order: vbounce, money, image spam, fill_this_form, FreeMail, European Parliament, HTML attachments, uri_obfu*, urinsrhsbl, urinsrhssub, urifullnsrhsbl, URI_OBFU_X9_WS, rDNS=localhost, INVALID_DATE_TZ_ABSURD, KHOP_SC, RCVD_IN_PSBL, FRT_VALIUM*, BOUNCE_MESSAGE, VBOUNCE_MESSAGE, __BOUNCE_UNDELIVERABLE, HELO_STATIC_HOST, FILL_THIS_FORM_FRAUD_PHISH, CHALLENGE_RESPONSE, DKIM_VALID, DKIM_VALID_AU, DKIM_ADSP_*, NML_ADSP_CUSTOM_{LOW,MED,HIGH}, __VIA_ML, MIME_BASE64_TEXT, FORGED_MUA_THEBAT_BOUN, FORGED_MUA_THEBAT_CS, UNRESOLVED_TEMPLATE, __THEBAT_MUA, __ANY_OUTLOOK_MUA, RP_MATCHES_RCVD, one-word X-Mailer, ... - rule for plain text attachments with octet-stream MIME type; - avoid false positives on ISO-2022-JP messages in several rules; - updated various default whitelists, uridnsbl_skip_domain, adsp_override, ... PLUGINS - new plugins: FreeMail, PhishTag, Reuse - now enabled by default: DKIM - now disabled by default: AWL - retired plugin: DomainKeys AWL PLUGIN - plugin AWL is now disabled by default; - README.awl: increase suggested awl.ip field width to 45 to support IPv6 addresses or DKIM signer domains; - AutoWhitelist.pm: allow storing an IPv6 address (previously causing SQL server errors: value too long) - let AWL keep separate records for DKIM-signed and unsigned mail (when auto_whitelist_distinguish_signed configuration option is true, and SQL field awl.ip field size is increased or made dynamic); - gracefully handle NaN from corrupted database or a broken emulator; DCC PLUGIN - added support for DCC reputations, added setting dcc_rep_percent, new test check_dcc_reputation_range(), new tag DCCREP (DCC servers supply reputation data only to licensed clients); - allow usage of a remote dccifd host through an INET or INET6 socket; DKIM PLUGIN - plugin is now enabled by default; - absolute minimal version of Mail::DKIM is 0.31; support for ADSP requires Mail::DKIM 0.34; a DNS test (and rule) for NXDOMAIN is operational since Mail::DKIM 0.36_5 - supports multiple signatures (useful for whitelisting); - distinguishes author domain signatures from third party signatures (useful for whitelisting); - provides a tag DKIMIDENTITY (in addition to DKIMDOMAIN); - DKIM now supports Author Domain Signing Practices - ADSP (RFC 5617); - use the Mail::DKIM::AuthorDomainPolicy instead of Mail::DKIM::DkimPolicy, when available (since Mail::DKIM 0.34); - implements an 'adsp_override' configuration directive and adds an eval:check_dkim_adsp check, which is used by new DKIM_ADSP_* rules; - rules contain an initial set of 'adsp_override' directives, listing some of the more popular target domains for phishing (applicable only to domains which sign all their direct mail with a DKIM or DK signature); - this plugin can now re-use Mail::DKIM verification results if made available by a caller, which saves resources and makes it possible for SpamAssassin to work on a truncated large mail without breaking DKIM signatures; BUG FIXES - fixed Rule2XSBody segfaults; - do not treat user data as perl booleans (a string "0" is a false); - avoid data from the wild be interpreted as perl regular expressions; - ArchiveIterator: prevent _scan_directory from passing directories to _scan_file (on NFS it would fail with EISDIR on read(2); - fixed vpopmail support; - the 'exists:' evaluator in HEADER rules now works as documented and tests for existence of a header field, instead of testing for a header field body being nonempty; internally, the pms->get can also now distinguish between empty and nonexistent header fields - fixes to header fields parsing in several places: header field names are case-insensitive, whitespace is not required after a colon, obsolete rfc822 syntax allowed whitespace before a colon; VBounce: match "Received:" only at the beginning of a line; - Exporter never really worked in SA, was not enclosed in BEGIN{} ERROR HANDLING, ROBUSTNESS - improved error detection and reporting: test status of all system calls and I/O operations (or explicitly document where not), and report unexpected failures; - eval calls now check for eval result instead of testing the $@, which is not always reliable; - localized $@ and $! in DESTROY methods to prevent potential calls to eval and calls to system routines in code executed from a DESTROY method from clobbering global variables $@ and $!; - Util::helper_app_pipe_open_unix: contain a failing exec with an eval to prevent additional cases of process cloning. The exec could fail this way when given tainted arguments; - Util::helper_app_pipe_open_unix: flush stdout and stderr before forking, otherwise an error reported by exec (such as 'insecure dependency') was lost in a buffer; - eval-protect an open($fh,'-|') to capture implied fork failures due to lack of system resource; - explicit untainting: combine "use re 'taint'" with untaint_var(), avoiding implicit perl untainting and workarounds to prevent it; - add 'use strict' where missing; - avoid a bunch of warnings on "Use of uninitialized value" - clearly report reasons for helper application process failures OTHER - more expensive code sections are now instrumented with timing measurements; timing report is logged as a debug message by the end of processing, and made available to a caller and to 'add_header' directives through a TIMING tag; - total rewrite of URI detection in plain text body; - pseudoheader "ALL:raw" returns a pristine header section, and pseudoheader "ALL" returns a cleaned header section - many updates to the list of top level domains; - add 'util_rb_3tld', allowing 3-level TLDs to be listed in URIBLs and allowing new 3TLDs to be added from rule updates; - avoid trusted_networks bog down due to O(n^2) loop with millions of entries; - preserve order of declared 'add_header' haeder fields; - allow debug areas to be excluded from debugging, e.g.: -D all,norules,noconfig,nodcc - fixes to Plugin/VBounce.pm, updated VBounce ruleset; - new module Mail::SpamAssassin::BayesStore::BDB, but is not yet ready for use - numerous additional and updated self-tests; - updated documentation, fixed numerous typos and mistakes in documentation text and in log messages; - extensive improvements to development process: automated testing through Hudson, improvements to mass-check and rules