** Description changed:
- /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt installed by
- exim4-config.
+ [ Impact ]
+
+ The exim4-config package ships an optional SPF check in the recipient ACL
+ (/etc/exim4/conf.d/acl/30_exim4-config_check_rcpt, enabled via the
+ CHECK_RCPT_SPF macro together with the spf-tools-perl package). It calls the
+ external spfquery.mail-spf-perl helper via Exim's ${run} expansion:
+
+ condition = ${run{/usr/bin/spfquery.mail-spf-perl \
+ --ip ${quote:$sender_host_address} \
+ --scope mfrom \
+ --identity ${quote:$sender_address}} ...
+
+ The envelope sender is wrapped in ${quote:...}, ${run} splits its
+ command string into arguments *before* expansion rather than after. As a
+ result, the double quotes that ${quote:} inserts around the address are
+ passed to spfquery literally, e.g. the --identity argument becomes:
+
+ "[email protected]"
+
+ spfquery cannot parse a domain out of the quoted string, so instead of
+ returning the real SPF verdict it returns "none" (exit code 6) for every
+ message. Because the ACL only rejects on exit code 1 (fail), the deny can
+ never fire: SPF enforcement is silently non-functional for everyone who has
+ enabled CHECK_RCPT_SPF. No mail is ever rejected or marked on the basis of
+ SPF, and every message is stamped "Received-SPF: none" regardless of the
+ sender's actual SPF policy.
+
+ [ Test Plan ]
+
+ On an affected system:
+
+ 1. Install the SPF helper and enable the check:
+ $ sudo apt install spf-tools-perl
+ $ echo 'CHECK_RCPT_SPF=1' | sudo tee -a /etc/exim4/exim4.conf.localmacros
+ $ sudo update-exim4.conf
+
+ 2. Simulate an inbound SMTP session from a known-good sender IP
+ (209.85.128.1 is a genuine Google outbound host) using a sender whose
+ domain publishes SPF:
+
+ exim4 -d -bhc 209.85.128.1 <<'EOF'
+ helo me
+ mail from:<[email protected]>
+ rcpt to:<postmaster@localhost>
+ quit
+ EOF
+
+ 3. In the debug output, inspect the "direct command after expansion" block
+ and the generated Received-SPF header.
+
+ Without the fix (broken):
+ argv[6] = '"[email protected]"' <- literal quotes
+ Received-SPF: none ... <- wrong; gmail.com publishes SPF
+
+ With the fix (correct):
+ argv[6] = '[email protected]'
+ Received-SPF: pass ... <- real gmail.com policy
evaluated
+
+ gmail.com always publishes an SPF record, so a result of "none" is itself
+ proof the query failed. A "pass" (from a legitimate Google IP) confirms
+ spfquery is now evaluated correctly.
+
+ [ Where problems could occur ]
+
+ The change only removes the two ${quote:...} wrappers from the spfquery
+ command line; the ACL decision logic (deny on fail, defer on temperror, the
+ Received-SPF header mapping, and the error-logging warn) is unchanged.
+
+ - The affected block is behind the CHECK_RCPT_SPF macro, which is undefined
+ by default, so the default configuration is unaffected and the vast
+ majority of installations see no change at all.
+
+ - Only sites that have explicitly enabled CHECK_RCPT_SPF and installed
+ spf-tools-perl are touched. For them the change is strictly a fix: a
+ previously dead check begins functioning. Such sites should be aware that
+ SPF rejection will now actually take effect, so a misconfigured local SPF
+ setup could start rejecting mail that was previously (incorrectly) always
+ accepted.
+
+ - This is a configuration-file (conffile) change only; no binary or daemon
+ behaviour is altered.
+
+ [ Other Info ]
+
+
+ -----
+ /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt installed by exim4-config.
Line 289: --identity ${quote:$sender_address}} \
This puts "" around the email address and the IP address and then Exim
itself puts '' around each parameter so the email_address becomes
'"[email protected]"'. This causes spfquery to fail.
You can verify this with:
$ '/usr/bin/spfquery.mail-spf-perl' '--ip' '"1.1.1.1"' '--identity'
'"[email protected]"'
Corrected:
$ '/usr/bin/spfquery.mail-spf-perl' '--ip' '1.1.1.1' '--identity'
'[email protected]'
For best effect, use a valid email address.
Fix (remove the ${quote: functions):
- condition = ${run{/usr/bin/spfquery.mail-spf-perl \
- --ip $sender_host_address \
- --scope mfrom \
- --identity $sender_address} \
- {no}{${if eq {$runrc}{1}{yes}{no}}}}
-
+ condition = ${run{/usr/bin/spfquery.mail-spf-perl \
+ --ip $sender_host_address \
+ --scope mfrom \
+ --identity $sender_address} \
+ {no}{${if eq {$runrc}{1}{yes}{no}}}}
If you use a static exim4.conf, this ACL will surface the issue:
warn condition = ${run{/usr/bin/spfquery.mail-spf-perl --ip
$sender_host_address --identity $sender_address}{yes}{yes}}
logwrite = Output of spfquery: $value rc: $runrc
Test with:
$ exim4 -d -bhc 1.1.1.1
helo me
mail from:[email protected]
rcpt to:[email protected]
(scroll back up until you find the result of the command expansion and
the logwrite)
Docs:
https://www.exim.org/exim-html-current/doc/html/spec_html/ch-string_expansions.html
(search for ${run)
ProblemType: Bug
DistroRelease: Ubuntu 24.04
Package: exim4-config 4.97-4ubuntu4.7
ProcVersionSignature: Ubuntu 6.8.0-138.138-generic 6.8.12
Uname: Linux 6.8.0-138-generic x86_64
ApportVersion: 2.28.3-0ubuntu0.1
Architecture: amd64
CasperMD5CheckResult: unknown
Date: Wed Aug 26 17:03:23 2026
PackageArchitecture: all
SourcePackage: exim4
UpgradeStatus: Upgraded to noble on 2025-04-14 (499 days ago)
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2165160
Title:
SPF handling in Exim4 incorrectly quotes the email address
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/exim4/+bug/2165160/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs