summaryrefslogtreecommitdiff
path: root/kex.c
diff options
context:
space:
mode:
authordjm@openbsd.org <djm@openbsd.org>2018-07-03 11:39:54 +0000
committerDamien Miller <djm@mindrot.org>2018-07-03 23:26:36 +1000
commit4ba0d54794814ec0de1ec87987d0c3b89379b436 (patch)
treeb8d904880f8927374b377b2e4d5661213c1138b6 /kex.c
parent95344c257412b51199ead18d54eaed5bafb75617 (diff)
upstream: Improve strictness and control over RSA-SHA2 signature
In ssh, when an agent fails to return a RSA-SHA2 signature when requested and falls back to RSA-SHA1 instead, retry the signature to ensure that the public key algorithm sent in the SSH_MSG_USERAUTH matches the one in the signature itself. In sshd, strictly enforce that the public key algorithm sent in the SSH_MSG_USERAUTH message matches what appears in the signature. Make the sshd_config PubkeyAcceptedKeyTypes and HostbasedAcceptedKeyTypes options control accepted signature algorithms (previously they selected supported key types). This allows these options to ban RSA-SHA1 in favour of RSA-SHA2. Add new signature algorithms "rsa-sha2-256-cert-v01@openssh.com" and "rsa-sha2-512-cert-v01@openssh.com" to force use of RSA-SHA2 signatures with certificate keys. feedback and ok markus@ OpenBSD-Commit-ID: c6e9f6d45eed8962ad502d315d7eaef32c419dde
Diffstat (limited to 'kex.c')
-rw-r--r--kex.c17
1 files changed, 5 insertions, 12 deletions
diff --git a/kex.c b/kex.c
index 15ea28b07..d0a5f1b66 100644
--- a/kex.c
+++ b/kex.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: kex.c,v 1.136 2018/02/07 02:06:50 jsing Exp $ */ 1/* $OpenBSD: kex.c,v 1.137 2018/07/03 11:39:54 djm Exp $ */
2/* 2/*
3 * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. 3 * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
4 * 4 *
@@ -342,6 +342,7 @@ kex_send_ext_info(struct ssh *ssh)
342 342
343 if ((algs = sshkey_alg_list(0, 1, 1, ',')) == NULL) 343 if ((algs = sshkey_alg_list(0, 1, 1, ',')) == NULL)
344 return SSH_ERR_ALLOC_FAIL; 344 return SSH_ERR_ALLOC_FAIL;
345 /* XXX filter algs list by allowed pubkey/hostbased types */
345 if ((r = sshpkt_start(ssh, SSH2_MSG_EXT_INFO)) != 0 || 346 if ((r = sshpkt_start(ssh, SSH2_MSG_EXT_INFO)) != 0 ||
346 (r = sshpkt_put_u32(ssh, 1)) != 0 || 347 (r = sshpkt_put_u32(ssh, 1)) != 0 ||
347 (r = sshpkt_put_cstring(ssh, "server-sig-algs")) != 0 || 348 (r = sshpkt_put_cstring(ssh, "server-sig-algs")) != 0 ||
@@ -378,7 +379,7 @@ kex_input_ext_info(int type, u_int32_t seq, struct ssh *ssh)
378{ 379{
379 struct kex *kex = ssh->kex; 380 struct kex *kex = ssh->kex;
380 u_int32_t i, ninfo; 381 u_int32_t i, ninfo;
381 char *name, *found; 382 char *name;
382 u_char *val; 383 u_char *val;
383 size_t vlen; 384 size_t vlen;
384 int r; 385 int r;
@@ -401,16 +402,8 @@ kex_input_ext_info(int type, u_int32_t seq, struct ssh *ssh)
401 return SSH_ERR_INVALID_FORMAT; 402 return SSH_ERR_INVALID_FORMAT;
402 } 403 }
403 debug("%s: %s=<%s>", __func__, name, val); 404 debug("%s: %s=<%s>", __func__, name, val);
404 found = match_list("rsa-sha2-256", val, NULL); 405 kex->server_sig_algs = val;
405 if (found) { 406 val = NULL;
406 kex->rsa_sha2 = 256;
407 free(found);
408 }
409 found = match_list("rsa-sha2-512", val, NULL);
410 if (found) {
411 kex->rsa_sha2 = 512;
412 free(found);
413 }
414 } else 407 } else
415 debug("%s: %s (unrecognised)", __func__, name); 408 debug("%s: %s (unrecognised)", __func__, name);
416 free(name); 409 free(name);