On 24/01/2021 16:21, Mark Elkins via Exim-users wrote:
remote_smtp:
   driver = smtp
   message_size_limit = ${if > {$max_received_linelength}{998} {1}{0}}
   dnssec_request_domains = *
   hosts_try_dane = *
   return_path = ${address:$reply_address}
   dkim_domain = ${lc:${domain_data:$h_from:}}
   dkim_selector = ${substr_2_4:$tod_zulu}
   dkim_private_key = ${if 
exists{/etc/exim/dkim/${lc:${domain_data:$h_from:}}-${substr_2_4:$tod_zulu}.pem}{/etc/exim/dkim/${lc:${domain_data:$h_from:}}-${substr_2_4:$tod_zulu}.pem}{0}}
   dkim_canon=relaxed

/etc/exim contains the director 'dkim' with various files.... this basically 
allows me to have many DKIM-ed domains and to roll the DKIM signatures 
appropriately.

All my users are in a MySQL Database - if that helps with de-tainting.... although I did 
think using "domain_data" was the correct way to go. This user use port 587 
with a username/password (from MySQL) in order to hand over the email to EXIM for 
delivery.

# ls -l
total 216
drwxr-xr-x 2 root root 16384 Jan 24 17:28 dkim
-rw-r--r-- 1 root root 45830 Jan 24 18:01 exim.conf

# ls -l dkim
...
-rw-r--r-- 1 root root 891 Jan 24 17:28 posix.co.za-2101.pem
-rw-r--r-- 1 root root 272 Jan 24 17:28 posix.co.za-2101.pub

Error from the log look like....

2021-01-24 18:02:55 SMTP connection from [197.185.109.217]:35388 
I=[192.96.24.20]:587 (TCP/IP connection count = 1)
2021-01-24 18:02:55 1l3hqp-005HHq-Fl <= "[email protected]"@auth.posix.co.za 
H=([160.124.48.164]) [197.185.109.217]:35388 I=[192.96.24.20]:587 P=esmtpsa 
X=TLS1.3:TLS_AES_128_GCM_SHA256:128 CV=no A=PLAIN:[email protected] S=14670 
[email protected] T="test via auth"
2021-01-24 18:02:55 SMTP connection from ([160.124.48.164]) 
[197.185.109.217]:35388 I=[192.96.24.20]:587 closed by QUIT
2021-01-24 18:02:56 1l3hqp-005HHq-Fl Tainted filename 
'/etc/exim/dkim/posix.co.za-2101.pem'
2021-01-24 18:02:56 1l3hqp-005HHq-Fl unable to open file for reading: 
/etc/exim/dkim/posix.co.za-2101.pem
2021-01-24 18:02:56 1l3hqp-005HHq-Fl => [email protected] R=dnslookup T=remote_smtp 
H=mail.vweb.co.za [2001:42a0::16] I=[2001:42a0::20] X=TLS1.3:TLS_AES_256_GCM_SHA384:256 
CV=yes K C="250- 14187 byte chunk, total 14923\\n250 OK id=1l3hqq-00HQK7-3l"
2021-01-24 18:02:56 1l3hqp-005HHq-Fl Completed

... so mail is delivered but the DKIM signing does not happen. How do I fix this. The 
whole "Tainted" subject still leaves me feeling dazed and confused.

The basic point is that information provided by a potential adversary should
not be used for expansion or as a filename, without first being validated
against trusted information.  Taint is Exim's means for tracking this
untrustworthy information.


Your example:
2021-01-24 18:02:56 1l3hqp-005HHq-Fl Tainted filename 
'/etc/exim/dkim/posix.co.za-2101.pem'

was trying to use '/etc/exim/dkim/posix.co.za-2101.pem' as a filename. I'm 
guessing this use
was from

   dkim_private_key = ${if 
exists{/etc/exim/dkim/${lc:${domain_data:$h_from:}}-${substr_2_4:$tod_zulu}.pem}{/etc/exim/dkim/${lc:${domain_data:$h_from:}}-${substr_2_4:$tod_zulu}.pem}{0}}

which has two possible taitned sources: $domain_data and $h_from: .
However, I don't see what you're trying to express with  
${domain_data:$h_from:} - this looks
entirely bogus syntax, so I can't see you were actually running tha to produce 
the log you give.

Note that ${domain:<string>}  is not using the $domain variable, but is trying 
to pull the domain
part out of a local_part@domain syntax address.

Once you've fixed that, $h_from: will be tainted - having been supplied by your 
potential attacker.
You could consider doing some suitable lookup in a local DB (and "DB" can be 
your whole
filesystem, cf. the dsearch lookup method) in order to validate it.  Read the 
docs on lookups
and the taint-status of results of lookups.  Since you have a directory 
/etc/exim/dkim/
populated with acceptable files, this seems most simple.  And you get the 
'exists' test done
that way.
--
Cheers,
  Jeremy

--
## List details at https://lists.exim.org/mailman/listinfo/exim-users
## Exim details at http://www.exim.org/
## Please use the Wiki with this list - http://wiki.exim.org/

Reply via email to