1*4882a593SmuzhiyunFrom 6dafcdebde58577f4fcb190be46a0eb910cf1b96 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Maxim Dounin <mdounin@mdounin.ru> 3*4882a593SmuzhiyunDate: Wed, 19 May 2021 03:13:31 +0300 4*4882a593SmuzhiyunSubject: [PATCH 1/1] Mail: max_errors directive. 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunSimilarly to smtpd_hard_error_limit in Postfix and smtp_max_unknown_commands 7*4882a593Smuzhiyunin Exim, specifies the number of errors after which the connection is closed. 8*4882a593Smuzhiyun--- end of original header --- 9*4882a593Smuzhiyun 10*4882a593SmuzhiyunCVE: CVE-2021-3618 11*4882a593Smuzhiyun 12*4882a593SmuzhiyunUpstream-Status: Backport 13*4882a593Smuzhiyun https://github.com/nginx/nginx.git 14*4882a593Smuzhiyun commit 173f16f736c10eae46cd15dd861b04b82d91a37a 15*4882a593Smuzhiyun 16*4882a593SmuzhiyunSigned-off-by: Joe Slater <joe.slater@windriver.com> 17*4882a593Smuzhiyun--- 18*4882a593Smuzhiyun src/mail/ngx_mail.h | 3 +++ 19*4882a593Smuzhiyun src/mail/ngx_mail_core_module.c | 10 ++++++++++ 20*4882a593Smuzhiyun src/mail/ngx_mail_handler.c | 15 ++++++++++++++- 21*4882a593Smuzhiyun 3 files changed, 27 insertions(+), 1 deletion(-) 22*4882a593Smuzhiyun 23*4882a593Smuzhiyundiff --git a/src/mail/ngx_mail.h b/src/mail/ngx_mail.h 24*4882a593Smuzhiyunindex b865a3b9..76cae37a 100644 25*4882a593Smuzhiyun--- a/src/mail/ngx_mail.h 26*4882a593Smuzhiyun+++ b/src/mail/ngx_mail.h 27*4882a593Smuzhiyun@@ -115,6 +115,8 @@ typedef struct { 28*4882a593Smuzhiyun ngx_msec_t timeout; 29*4882a593Smuzhiyun ngx_msec_t resolver_timeout; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun+ ngx_uint_t max_errors; 32*4882a593Smuzhiyun+ 33*4882a593Smuzhiyun ngx_str_t server_name; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun u_char *file_name; 36*4882a593Smuzhiyun@@ -231,6 +233,7 @@ typedef struct { 37*4882a593Smuzhiyun ngx_uint_t command; 38*4882a593Smuzhiyun ngx_array_t args; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun+ ngx_uint_t errors; 41*4882a593Smuzhiyun ngx_uint_t login_attempt; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* used to parse POP3/IMAP/SMTP command */ 44*4882a593Smuzhiyundiff --git a/src/mail/ngx_mail_core_module.c b/src/mail/ngx_mail_core_module.c 45*4882a593Smuzhiyunindex 40831242..115671ca 100644 46*4882a593Smuzhiyun--- a/src/mail/ngx_mail_core_module.c 47*4882a593Smuzhiyun+++ b/src/mail/ngx_mail_core_module.c 48*4882a593Smuzhiyun@@ -85,6 +85,13 @@ static ngx_command_t ngx_mail_core_commands[] = { 49*4882a593Smuzhiyun offsetof(ngx_mail_core_srv_conf_t, resolver_timeout), 50*4882a593Smuzhiyun NULL }, 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun+ { ngx_string("max_errors"), 53*4882a593Smuzhiyun+ NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1, 54*4882a593Smuzhiyun+ ngx_conf_set_num_slot, 55*4882a593Smuzhiyun+ NGX_MAIL_SRV_CONF_OFFSET, 56*4882a593Smuzhiyun+ offsetof(ngx_mail_core_srv_conf_t, max_errors), 57*4882a593Smuzhiyun+ NULL }, 58*4882a593Smuzhiyun+ 59*4882a593Smuzhiyun ngx_null_command 60*4882a593Smuzhiyun }; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun@@ -163,6 +170,8 @@ ngx_mail_core_create_srv_conf(ngx_conf_t *cf) 63*4882a593Smuzhiyun cscf->timeout = NGX_CONF_UNSET_MSEC; 64*4882a593Smuzhiyun cscf->resolver_timeout = NGX_CONF_UNSET_MSEC; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun+ cscf->max_errors = NGX_CONF_UNSET_UINT; 67*4882a593Smuzhiyun+ 68*4882a593Smuzhiyun cscf->resolver = NGX_CONF_UNSET_PTR; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun cscf->file_name = cf->conf_file->file.name.data; 71*4882a593Smuzhiyun@@ -182,6 +191,7 @@ ngx_mail_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) 72*4882a593Smuzhiyun ngx_conf_merge_msec_value(conf->resolver_timeout, prev->resolver_timeout, 73*4882a593Smuzhiyun 30000); 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun+ ngx_conf_merge_uint_value(conf->max_errors, prev->max_errors, 5); 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun ngx_conf_merge_str_value(conf->server_name, prev->server_name, ""); 78*4882a593Smuzhiyun 79*4882a593Smuzhiyundiff --git a/src/mail/ngx_mail_handler.c b/src/mail/ngx_mail_handler.c 80*4882a593Smuzhiyunindex 0aaa0e78..71b81512 100644 81*4882a593Smuzhiyun--- a/src/mail/ngx_mail_handler.c 82*4882a593Smuzhiyun+++ b/src/mail/ngx_mail_handler.c 83*4882a593Smuzhiyun@@ -871,7 +871,20 @@ ngx_mail_read_command(ngx_mail_session_t *s, ngx_connection_t *c) 84*4882a593Smuzhiyun return NGX_MAIL_PARSE_INVALID_COMMAND; 85*4882a593Smuzhiyun } 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun- if (rc == NGX_IMAP_NEXT || rc == NGX_MAIL_PARSE_INVALID_COMMAND) { 88*4882a593Smuzhiyun+ if (rc == NGX_MAIL_PARSE_INVALID_COMMAND) { 89*4882a593Smuzhiyun+ 90*4882a593Smuzhiyun+ s->errors++; 91*4882a593Smuzhiyun+ 92*4882a593Smuzhiyun+ if (s->errors >= cscf->max_errors) { 93*4882a593Smuzhiyun+ ngx_log_error(NGX_LOG_INFO, c->log, 0, 94*4882a593Smuzhiyun+ "client sent too many invalid commands"); 95*4882a593Smuzhiyun+ s->quit = 1; 96*4882a593Smuzhiyun+ } 97*4882a593Smuzhiyun+ 98*4882a593Smuzhiyun+ return rc; 99*4882a593Smuzhiyun+ } 100*4882a593Smuzhiyun+ 101*4882a593Smuzhiyun+ if (rc == NGX_IMAP_NEXT) { 102*4882a593Smuzhiyun return rc; 103*4882a593Smuzhiyun } 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun-- 106*4882a593Smuzhiyun2.25.1 107*4882a593Smuzhiyun 108