summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorRoman Arutyunyan <arut@nginx.com>2026-02-26 11:52:53 +0400
committerRoman Arutyunyan <arutyunyan.roman@gmail.com>2026-03-24 18:46:08 +0400
commit6f3145006b41a4ec464eed4093553a335d35e8ac (patch)
tree70a4980776583d6e613e48d62dd8f8d901624212 /src
parent9739e755b8dddba82e65ca2a08d079f4c9826b75 (diff)
downloadnginx-6f3145006b41a4ec464eed4093553a335d35e8ac.tar.gz
nginx-6f3145006b41a4ec464eed4093553a335d35e8ac.tar.bz2
Mail: host validation.
Now host name resolved from client address is validated to only contain the characters specified in RFC 1034, Section 3.5. The validation allows to avoid injections when using the resolved host name in auth_http and smtp proxy. Reported by Asim Viladi Oglu Manizada, Colin Warren, Xiao Liu (Yunnan University), Yuan Tan (UC Riverside), and Bird Liu (Lanzhou University).
Diffstat (limited to 'src')
-rw-r--r--src/mail/ngx_mail_smtp_handler.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/mail/ngx_mail_smtp_handler.c b/src/mail/ngx_mail_smtp_handler.c
index 1e26c2c8d..97bbd7063 100644
--- a/src/mail/ngx_mail_smtp_handler.c
+++ b/src/mail/ngx_mail_smtp_handler.c
@@ -13,6 +13,7 @@
static void ngx_mail_smtp_resolve_addr_handler(ngx_resolver_ctx_t *ctx);
+static ngx_int_t ngx_mail_smtp_validate_host(ngx_str_t *name);
static void ngx_mail_smtp_resolve_name(ngx_event_t *rev);
static void ngx_mail_smtp_resolve_name_handler(ngx_resolver_ctx_t *ctx);
static void ngx_mail_smtp_block_reading(ngx_event_t *rev);
@@ -127,6 +128,20 @@ ngx_mail_smtp_resolve_addr_handler(ngx_resolver_ctx_t *ctx)
return;
}
+ if (ngx_mail_smtp_validate_host(&ctx->name) != NGX_OK) {
+ ngx_log_error(NGX_LOG_ERR, c->log, 0,
+ "%V resolved to invalid host name \"%V\"",
+ &c->addr_text, &ctx->name);
+
+ s->host = smtp_tempunavail;
+
+ ngx_resolve_addr_done(ctx);
+
+ ngx_mail_smtp_greeting(s, s->connection);
+
+ return;
+ }
+
c->log->action = "in resolving client hostname";
s->host.data = ngx_pstrdup(c->pool, &ctx->name);
@@ -149,6 +164,36 @@ ngx_mail_smtp_resolve_addr_handler(ngx_resolver_ctx_t *ctx)
}
+static ngx_int_t
+ngx_mail_smtp_validate_host(ngx_str_t *name)
+{
+ u_char ch;
+ ngx_uint_t i;
+
+ if (name->len == 0) {
+ return NGX_DECLINED;
+ }
+
+ for (i = 0; i < name->len; i++) {
+ ch = name->data[i];
+
+ /* allow only characters from RFC 1034, Section 3.5 */
+
+ if ((ch >= 'a' && ch <= 'z')
+ || (ch >= 'A' && ch <= 'Z')
+ || (ch >= '0' && ch <= '9')
+ || ch == '-' || ch == '.')
+ {
+ continue;
+ }
+
+ return NGX_DECLINED;
+ }
+
+ return NGX_OK;
+}
+
+
static void
ngx_mail_smtp_resolve_name(ngx_event_t *rev)
{