Hello,

the `link-auth' event hash the user first and the result of the
operation after; this breaks when a username has a '|' character in
it.  Since this is triggered by the `auth login' command, anyone could
send a user with a '|' and, depending on the filter used, make smtpd
exit.  (if the filter dies, smtpd does too)

This was reported on the OpenSMTPD-portable github repository with
Gilles' opensmtpd-filter-rspamd:

        https://github.com/OpenSMTPD/OpenSMTPD/issues/1213

Diff below is straightforward and includes the documentation changes.
I believe link-auth was forgotten in revision 1.61 of lka_filter.c
when the mail-from/rcpt-to events got their fields swapped.

For opensmtpd-filter-rspamd I have a corresponding diff that I'll send
to Gilles as it is off-topic for tech@, but here it is too if you want
to play with it:

        https://paste.omarpolo.com/9jtli2w

To reproduce: (there may be quicker ways, this is just the first i
found)

        # pkg_add rspamd opensmtpd-filter-rspamd
        # rcctl enable rspamd
        # rcctl start rspamd

add the rspamd filter to /etc/mail/smtpd.conf

        filter "rspamd" proc-exec "filter-rspamd"
        listen on lo0 smtps pki localhost auth filter "rspamd"

and try to do a login:

        $ nc -c -Tnoverify localhost 465
        helo localhost
        auth login
        b3xw
        MTMyNA==


Thanks,

Omar Polo


diff /usr/src
commit - 66c6b79616659a94b04092c9f103e3aa29809704
path + /usr/src
blob - 0c63657be21352fb1f060505250f7a9ef4fc8d8c
file + usr.sbin/smtpd/lka_filter.c
--- usr.sbin/smtpd/lka_filter.c
+++ usr.sbin/smtpd/lka_filter.c
@@ -24,7 +24,7 @@
 #include "smtpd.h"
 #include "log.h"
 
-#define        PROTOCOL_VERSION        "0.6"
+#define        PROTOCOL_VERSION        "0.7"
 
 struct filter;
 struct filter_session;
@@ -1461,7 +1461,7 @@ lka_report_smtp_link_auth(const char *direction, struc
                fs->username = xstrdup(username);
        }
        report_smtp_broadcast(reqid, direction, tv, "link-auth", "%s|%s\n",
-           username, result);
+           result, username);
 }
 
 void
blob - 313404c111c77b099b3855f43252c26877874b17
file + usr.sbin/smtpd/smtpd-filters.7
--- usr.sbin/smtpd/smtpd-filters.7
+++ usr.sbin/smtpd/smtpd-filters.7
@@ -271,12 +271,9 @@ This event is generated upon disconnection of the clie
 the cipher suite used by the session and the cipher strength in bits.
 .It Ic link-disconnect
 This event is generated upon disconnection of the client.
-.It Ic link-auth : Ar username result
+.It Ic link-auth : Ar result username
 This event is generated upon an authentication attempt by the client.
 .Pp
-.Ar username
-contains the username used for the authentication attempt.
-.Pp
 .Ar result
 contains the string
 .Dq pass ,
@@ -284,6 +281,9 @@ depending on the result of the authentication attempt.
 or
 .Dq error
 depending on the result of the authentication attempt.
+.Pp
+.Ar username
+contains the username used for the authentication attempt.
 .It Ic tx-reset : Op message-id
 This event is generated when a transaction is reset.
 .Pp

Reply via email to