Hello,
As is done in other MTA, smtpd allows execution of a custom command in forward
files so
users can plug their procmail, fdm and other. It is currently not possible to
allow the
users to forward their mail through a .forward file without also allowing them
to run a
custom mda.
This diff builds on top of the previous one, it removes the ability to execute
a custom
command from a ~/.forward file by default unless admin explicitly allows it in
config:
action "local_users" maildir forward-file allow-exec
If a user adds a command, the session will be rejected with a temporary failure
until
the .forward file is fixed.
diff --git a/usr.sbin/smtpd/lka_session.c b/usr.sbin/smtpd/lka_session.c
index ff328441957..aea0780017e 100644
--- a/usr.sbin/smtpd/lka_session.c
+++ b/usr.sbin/smtpd/lka_session.c
@@ -482,6 +482,15 @@ lka_expand(struct lka_session *lks, struct rule *le,
struct expandnode *xn)
lks->error = LKA_TEMPFAIL;
break;
}
+
+ if (xn->parent->forwarded) {
+ if (! dsp->u.local.allow_forward_exec) {
+ log_trace(TRACE_EXPAND, "expand: matched
forward with no allow-exec");
+ lks->error = LKA_TEMPFAIL;
+ break;
+ }
+ }
+
log_trace(TRACE_EXPAND, "expand: lka_expand: filter: %s "
"[depth=%d]", xn->u.buffer, xn->depth);
lka_submit(lks, rule, xn);
diff --git a/usr.sbin/smtpd/parse.y b/usr.sbin/smtpd/parse.y
index 752c3376b77..908c189c93d 100644
--- a/usr.sbin/smtpd/parse.y
+++ b/usr.sbin/smtpd/parse.y
@@ -173,7 +173,7 @@ typedef struct {
%}
-%token ACTION ADMD ALIAS ANY ARROW AUTH AUTH_OPTIONAL
+%token ACTION ADMD ALIAS ALLOW_EXEC ANY ARROW AUTH AUTH_OPTIONAL
%token BACKUP BOUNCE BYPASS
%token CA CERT CHAIN CHROOT CIPHERS COMMIT COMPRESSION CONNECT
%token DATA DATA_LINE DHE DISCONNECT DOMAIN
@@ -200,7 +200,7 @@ typedef struct {
%token <v.string> STRING
%token <v.number> NUMBER
%type <v.table> table
-%type <v.number> size negation
+%type <v.number> size negation allow_exec
%type <v.table> tables tablenew tableref
%%
@@ -580,6 +580,10 @@ SRS KEY STRING {
;
+allow_exec : ALLOW_EXEC { $$ = 1; }
+ | /* empty */ { $$ = 0; }
+ ;
+
dispatcher_local_option:
USER STRING {
if (dispatcher->u.local.is_mbox) {
@@ -669,12 +673,13 @@ USER STRING {
}
dispatcher->u.local.mda_wrapper = $2;
}
-| FORWARD_FILE {
+| FORWARD_FILE allow_exec {
if (dispatcher->u.local.forward_file) {
yyerror("forward-file already specified for this dispatcher");
YYERROR;
}
dispatcher->u.local.forward_file = 1;
+ dispatcher->u.local.allow_forward_exec = $2;
}
;
@@ -2628,6 +2633,7 @@ lookup(char *s)
{ "action", ACTION },
{ "admd", ADMD },
{ "alias", ALIAS },
+ { "allow-exec", ALLOW_EXEC },
{ "any", ANY },
{ "auth", AUTH },
{ "auth-optional", AUTH_OPTIONAL },
diff --git a/usr.sbin/smtpd/smtpd.conf.5 b/usr.sbin/smtpd/smtpd.conf.5
index fa98e13e158..c2ef5f568ca 100644
--- a/usr.sbin/smtpd/smtpd.conf.5
+++ b/usr.sbin/smtpd/smtpd.conf.5
@@ -173,8 +173,12 @@ Use the mapping
for
.Xr aliases 5
expansion.
-.It Cm forward-file
+.It Cm forward-file Op Cm allow-exec
Allow the use of a .forward file in user home directory .
+.Pp
+If
+.Cm allow-exec
+is specified, the .forward file is allowed to execute a custom command.
.It Xo
.Cm ttl
.Sm off
diff --git a/usr.sbin/smtpd/smtpd.h b/usr.sbin/smtpd/smtpd.h
index 8225f3ff157..57a8bebec79 100644
--- a/usr.sbin/smtpd/smtpd.h
+++ b/usr.sbin/smtpd/smtpd.h
@@ -1161,6 +1161,8 @@ struct dispatcher_local {
uint8_t forward_only;
uint8_t forward_file;
+ uint8_t allow_forward_exec;
+
char *mda_wrapper;
char *command;