From: dtucker Date: Thu, 21 Jul 2016 01:39:35 +0000 (+0000) Subject: Skip passwords longer than 1k in length so clients can't easily DoS sshd X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=66ea199ae4ce8e8b637f464d8bfcce1915f4ac24;p=openbsd Skip passwords longer than 1k in length so clients can't easily DoS sshd by sending very long passwords, causing it to spend CPU hashing them. feedback djm@, ok markus@. Brought to our attention by tomas.kuthan at oracle.com, shilei-c at 360.cn and coredump at autistici.org --- diff --git a/usr.bin/ssh/auth-passwd.c b/usr.bin/ssh/auth-passwd.c index 1346f8cdfee..69f49bf2648 100644 --- a/usr.bin/ssh/auth-passwd.c +++ b/usr.bin/ssh/auth-passwd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth-passwd.c,v 1.44 2014/07/15 15:54:14 millert Exp $ */ +/* $OpenBSD: auth-passwd.c,v 1.45 2016/07/21 01:39:35 dtucker Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -63,6 +63,8 @@ extern login_cap_t *lc; #define DAY (24L * 60 * 60) /* 1 day in seconds */ #define TWO_WEEKS (2L * 7 * DAY) /* 2 weeks in seconds */ +#define MAX_PASSWORD_LEN 1024 + static void disable_forwarding(void) { @@ -81,6 +83,9 @@ auth_password(Authctxt *authctxt, const char *password) struct passwd * pw = authctxt->pw; int ok = authctxt->valid; + if (strlen(password) > MAX_PASSWORD_LEN) + return 0; + if (pw->pw_uid == 0 && options.permit_root_login != PERMIT_YES) ok = 0; if (*password == '\0' && options.permit_empty_passwd == 0)