Benoit Tellier created JAMES-4032:
-------------------------------------
Summary: Improve external forward handling
Key: JAMES-4032
URL: https://issues.apache.org/jira/browse/JAMES-4032
Project: James Server
Issue Type: Improvement
Components: RRT
Affects Versions: 3.8.1
Reporter: Benoit Tellier
Fix For: 3.9.0
Attachments: image-2024-04-26-12-03-58-932.png,
image-2024-04-26-12-04-10-017.png, image-2024-04-26-12-13-43-910.png,
image-2024-04-26-12-14-35-358.png
Email deliverability is a tricky topic and yesterday I got one more example for
this...
(The trick is to de able to improve deliverability while still being secure)
h3. The issue
The overall scenario outline is:
{code:java}
GIVEN two local users [email protected] and [email protected] on a james based instalation
AND [email protected] on another email supplier
AND [email protected] forwards its mail to [email protected].
AND this server preserves and resend as is the SMTP transport envelope
WHEN [email protected] sends an email to [email protected]
THEN james server rejects the incoming mail from external.org as it requires
authentication
to use local addresses in MAIL FROM
AND a bounce would be generated by external.org for the original sender as the
email could not be forwarded.
{code}
Example of such "external mail providers": orange.fr SFR professional services.
See fwd1.png
!image-2024-04-26-12-04-10-017.png!
h3 Why authentication is currently required in such cases
In order to maximise delivrability, James accepts any email for local users on
port 25 (spam filtering may be applied as part of the reception chain)
However a common attack is email spoofing: a remote attacker with not
whatsoever access sends an email pretending to be a local user. Without further
checks he could submit email as a local user without being authenticated.
To prevent this behaviour James implements `verifySenderIdentity` configuration
parameter in smtpServer.xml configuration file. If using a local mail from the
current behaviour is to actualy mandate authentication.
Anybody else than the user could thus NOT be using this MAIL FROM.
This prevents the following schario: fwd2.png
!image-2024-04-26-12-03-58-932.png!
However this causes the issue discussed above.
h3. Related deliverability concerns
h4. Receiving external forwards orginating from external mail servers
[email protected] sends a mail to [email protected] which forwards mails as
described above to [email protected].
On the last hop james accepts the email as the MAIL FROM ([email protected])
is a remote one: verifySenderIdentity is not triggered for external senders.
On the spam filtering side:
- SPF checks fails (as external2.org did send a mail in external1.org name
which it is not allowed to do
- But DKIM tests pass
- Which should be enough for the spam filtering stack not to flag the message
too violently...
This current behaviour is considered lenient enough. White listing could
further be added for trusted domains if need be.
h4. Handling correctly forwards emition
We tackled the very same issue on the emition side: the goal was to improve
james forwarded email deliverability.
GIVEN [email protected] forwards its email to [email protected]
WHEN [email protected] sends a mail to [email protected]
THEN me.org would rewrite the MAIL FROM field and use [email protected] when
forwarding to [email protected]
Thus SPF check passes.
See https://issues.apache.org/jira/browse/JAMES-3944
h3. Proposed solution
We could experiment turning off sender verification hop on MAIL FROM
Instead we would verify the DKIM signature of the email before spooling it.
That way:
- We would have signed legitimate traffic forwarded back to us and would
accept it
!image-2024-04-26-12-14-35-358.png!
- And we would still reject spoofing attempts as an attacker cant craft a DKIM
signature.
!image-2024-04-26-12-13-43-910.png!
GIVEN that dkim signature of outgoing email is not setted up by default this
behaviour shall be disabled by default.
h3. Proposed changes
Implement a VerifySenderIdentity SMTP message hook that:
GIVEN an unauthenticated sender
It performs a verification of non relaying (ie all rcpts are local)
And would verify the DKIM signature of the mail.
Path to the DKIM public key needs to be provided.
This shall be contributed as part of the DKIM extention.
h3. Additional concerns
Given the Mail Exchange service (MX) and Mail Submission Agent (MSA) being
collocated - the default james architecture,
Then a common misconfiguration is not to configure TLS for SMTP and just have
regular users just try to send mails unauthenticated through SMTP.
This behaviour is classical from MacOS native client.
Current `verifySenderIdentity` behavior rejects such misconfigured client from
the MAIL FROM. Which is convenient. Fail fast:
- The error is more explicit: AUthentication required
- No message payload had been transfered.
Ideally we would like to preserve this behaviour.
The way to achieve this would be to have a "relaxed" mode to
verifySenderIdentity instead of "strict" and "disabled"
This relaxed mode would enforce the current behaviour if it determise the other
party to be a MX. We can base ourselves on the structure of the EHLO sent: is
this a valid domain?
- If the heuristic determines this is a MX we accept the mail that would be
dkim tested
- if the heuristic fails, we reject the mail from this step as today as non MX
clients are misconfigured local users.
Note that classifying a local user (heuristic false positive) only delay the
inevitable error: acceptable, and a heuristic false negative is no worse than
the current issue described.
The configuration of verifySenderIdentity would then accept the following value:
- true. Unchanged existing option. Verify strictly the sender identity. Same
as strict.
- false. Unchanged existing option. Do not verify sender identity at all. Same
as disabled.
- strict. Verify strictly the sender identity. Same as true.
- disabled. Verify strictly the sender identity. Same as false.
- relaxed. Verify strictly the sender identity if the remote party is
determined to not be a MX. Same as false. Further checks are required, like
inspecting DKIM signing, in order to prevent spoofing.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]