import openssh-8.7p1-28.el9
This commit is contained in:
parent
044f5935ef
commit
7f53c0e133
@ -1,6 +1,14 @@
|
|||||||
diff -up openssh-8.6p1/dh.c.fips openssh-8.6p1/dh.c
|
diff -up openssh-8.6p1/dh.c.fips openssh-8.6p1/dh.c
|
||||||
--- openssh-8.6p1/dh.c.fips 2021-04-16 05:55:25.000000000 +0200
|
--- openssh-8.6p1/dh.c.fips 2021-04-16 05:55:25.000000000 +0200
|
||||||
+++ openssh-8.6p1/dh.c 2021-05-06 12:12:10.107634472 +0200
|
+++ openssh-8.6p1/dh.c 2021-05-06 12:12:10.107634472 +0200
|
||||||
|
@@ -36,6 +36,7 @@
|
||||||
|
|
||||||
|
#include <openssl/bn.h>
|
||||||
|
#include <openssl/dh.h>
|
||||||
|
+#include <openssl/fips.h>
|
||||||
|
|
||||||
|
#include "dh.h"
|
||||||
|
#include "pathnames.h"
|
||||||
@@ -164,6 +164,12 @@ choose_dh(int min, int wantbits, int max
|
@@ -164,6 +164,12 @@ choose_dh(int min, int wantbits, int max
|
||||||
int best, bestcount, which, linenum;
|
int best, bestcount, which, linenum;
|
||||||
struct dhgroup dhg;
|
struct dhgroup dhg;
|
||||||
@ -67,6 +75,14 @@ diff -up openssh-8.6p1/dh.h.fips openssh-8.6p1/dh.h
|
|||||||
diff -up openssh-8.6p1/kex.c.fips openssh-8.6p1/kex.c
|
diff -up openssh-8.6p1/kex.c.fips openssh-8.6p1/kex.c
|
||||||
--- openssh-8.6p1/kex.c.fips 2021-05-06 12:08:36.489926807 +0200
|
--- openssh-8.6p1/kex.c.fips 2021-05-06 12:08:36.489926807 +0200
|
||||||
+++ openssh-8.6p1/kex.c 2021-05-06 12:08:36.498926877 +0200
|
+++ openssh-8.6p1/kex.c 2021-05-06 12:08:36.498926877 +0200
|
||||||
|
@@ -39,6 +39,7 @@
|
||||||
|
|
||||||
|
#ifdef WITH_OPENSSL
|
||||||
|
#include <openssl/crypto.h>
|
||||||
|
+#include <openssl/fips.h>
|
||||||
|
#include <openssl/dh.h>
|
||||||
|
# ifdef HAVE_EVP_KDF_CTX_NEW_ID
|
||||||
|
# include <openssl/kdf.h>
|
||||||
@@ -203,7 +203,10 @@ kex_names_valid(const char *names)
|
@@ -203,7 +203,10 @@ kex_names_valid(const char *names)
|
||||||
for ((p = strsep(&cp, ",")); p && *p != '\0';
|
for ((p = strsep(&cp, ",")); p && *p != '\0';
|
||||||
(p = strsep(&cp, ","))) {
|
(p = strsep(&cp, ","))) {
|
||||||
@ -86,7 +102,7 @@ diff -up openssh-8.6p1/kexgexc.c.fips openssh-8.6p1/kexgexc.c
|
|||||||
|
|
||||||
#ifdef WITH_OPENSSL
|
#ifdef WITH_OPENSSL
|
||||||
|
|
||||||
+#include <openssl/crypto.h>
|
+#include <openssl/fips.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#include <openssl/dh.h>
|
#include <openssl/dh.h>
|
||||||
@ -154,6 +170,14 @@ diff -up openssh-8.6p1/myproposal.h.fips openssh-8.6p1/myproposal.h
|
|||||||
diff -up openssh-8.6p1/readconf.c.fips openssh-8.6p1/readconf.c
|
diff -up openssh-8.6p1/readconf.c.fips openssh-8.6p1/readconf.c
|
||||||
--- openssh-8.6p1/readconf.c.fips 2021-05-06 12:08:36.428926336 +0200
|
--- openssh-8.6p1/readconf.c.fips 2021-05-06 12:08:36.428926336 +0200
|
||||||
+++ openssh-8.6p1/readconf.c 2021-05-06 12:08:36.499926885 +0200
|
+++ openssh-8.6p1/readconf.c 2021-05-06 12:08:36.499926885 +0200
|
||||||
|
@@ -39,6 +39,7 @@
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
+#include <openssl/fips.h>
|
||||||
|
#ifdef USE_SYSTEM_GLOB
|
||||||
|
# include <glob.h>
|
||||||
|
#else
|
||||||
@@ -2538,11 +2538,16 @@ fill_default_options(Options * options)
|
@@ -2538,11 +2538,16 @@ fill_default_options(Options * options)
|
||||||
all_key = sshkey_alg_list(0, 0, 1, ',');
|
all_key = sshkey_alg_list(0, 0, 1, ',');
|
||||||
all_sig = sshkey_alg_list(0, 1, 1, ',');
|
all_sig = sshkey_alg_list(0, 1, 1, ',');
|
||||||
@ -192,6 +216,14 @@ diff -up openssh-8.6p1/sandbox-seccomp-filter.c.fips openssh-8.6p1/sandbox-secco
|
|||||||
diff -up openssh-8.6p1/servconf.c.fips openssh-8.6p1/servconf.c
|
diff -up openssh-8.6p1/servconf.c.fips openssh-8.6p1/servconf.c
|
||||||
--- openssh-8.6p1/servconf.c.fips 2021-05-06 12:08:36.455926545 +0200
|
--- openssh-8.6p1/servconf.c.fips 2021-05-06 12:08:36.455926545 +0200
|
||||||
+++ openssh-8.6p1/servconf.c 2021-05-06 12:08:36.500926893 +0200
|
+++ openssh-8.6p1/servconf.c 2021-05-06 12:08:36.500926893 +0200
|
||||||
|
@@ -38,6 +38,7 @@
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <errno.h>
|
||||||
|
+#include <openssl/fips.h>
|
||||||
|
#ifdef HAVE_UTIL_H
|
||||||
|
#include <util.h>
|
||||||
|
#endif
|
||||||
@@ -226,11 +226,16 @@ assemble_algorithms(ServerOptions *o)
|
@@ -226,11 +226,16 @@ assemble_algorithms(ServerOptions *o)
|
||||||
all_key = sshkey_alg_list(0, 0, 1, ',');
|
all_key = sshkey_alg_list(0, 0, 1, ',');
|
||||||
all_sig = sshkey_alg_list(0, 1, 1, ',');
|
all_sig = sshkey_alg_list(0, 1, 1, ',');
|
||||||
@ -221,7 +253,7 @@ diff -up openssh-8.6p1/ssh.c.fips openssh-8.6p1/ssh.c
|
|||||||
#include <openssl/evp.h>
|
#include <openssl/evp.h>
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#endif
|
#endif
|
||||||
+#include <openssl/crypto.h>
|
+#include <openssl/fips.h>
|
||||||
#include "openbsd-compat/openssl-compat.h"
|
#include "openbsd-compat/openssl-compat.h"
|
||||||
#include "openbsd-compat/sys-queue.h"
|
#include "openbsd-compat/sys-queue.h"
|
||||||
|
|
||||||
@ -243,7 +275,7 @@ diff -up openssh-8.6p1/sshconnect2.c.fips openssh-8.6p1/sshconnect2.c
|
|||||||
#include <vis.h>
|
#include <vis.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
+#include <openssl/crypto.h>
|
+#include <openssl/fips.h>
|
||||||
+
|
+
|
||||||
#include "openbsd-compat/sys-queue.h"
|
#include "openbsd-compat/sys-queue.h"
|
||||||
|
|
||||||
@ -332,7 +364,7 @@ diff -up openssh-8.6p1/sshd.c.fips openssh-8.6p1/sshd.c
|
|||||||
#include <openssl/dh.h>
|
#include <openssl/dh.h>
|
||||||
#include <openssl/bn.h>
|
#include <openssl/bn.h>
|
||||||
#include <openssl/rand.h>
|
#include <openssl/rand.h>
|
||||||
+#include <openssl/crypto.h>
|
+#include <openssl/fips.h>
|
||||||
#include "openbsd-compat/openssl-compat.h"
|
#include "openbsd-compat/openssl-compat.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -395,7 +427,7 @@ diff -up openssh-8.6p1/sshkey.c.fips openssh-8.6p1/sshkey.c
|
|||||||
#include <openssl/evp.h>
|
#include <openssl/evp.h>
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#include <openssl/pem.h>
|
#include <openssl/pem.h>
|
||||||
+#include <openssl/crypto.h>
|
+#include <openssl/fips.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "crypto_api.h"
|
#include "crypto_api.h"
|
||||||
@ -482,6 +514,14 @@ diff -up openssh-8.6p1/sshkey.c.fips openssh-8.6p1/sshkey.c
|
|||||||
diff -up openssh-8.6p1/ssh-keygen.c.fips openssh-8.6p1/ssh-keygen.c
|
diff -up openssh-8.6p1/ssh-keygen.c.fips openssh-8.6p1/ssh-keygen.c
|
||||||
--- openssh-8.6p1/ssh-keygen.c.fips 2021-05-06 12:08:36.467926637 +0200
|
--- openssh-8.6p1/ssh-keygen.c.fips 2021-05-06 12:08:36.467926637 +0200
|
||||||
+++ openssh-8.6p1/ssh-keygen.c 2021-05-06 12:08:36.503926916 +0200
|
+++ openssh-8.6p1/ssh-keygen.c 2021-05-06 12:08:36.503926916 +0200
|
||||||
|
@@ -20,6 +20,7 @@
|
||||||
|
|
||||||
|
#ifdef WITH_OPENSSL
|
||||||
|
#include <openssl/evp.h>
|
||||||
|
+#include <openssl/fips.h>
|
||||||
|
#include <openssl/pem.h>
|
||||||
|
#include "openbsd-compat/openssl-compat.h"
|
||||||
|
#endif
|
||||||
@@ -205,6 +205,12 @@ type_bits_valid(int type, const char *na
|
@@ -205,6 +205,12 @@ type_bits_valid(int type, const char *na
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -521,7 +561,7 @@ diff -up openssh-8.7p1/kexgen.c.fips3 openssh-8.7p1/kexgen.c
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
+#include <openssl/crypto.h>
|
+#include <openssl/fips.h>
|
||||||
|
|
||||||
#include "sshkey.h"
|
#include "sshkey.h"
|
||||||
#include "kex.h"
|
#include "kex.h"
|
||||||
@ -607,7 +647,7 @@ diff -up openssh-8.7p1/ssh-ed25519.c.fips3 openssh-8.7p1/ssh-ed25519.c
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
+#include <openssl/crypto.h>
|
+#include <openssl/fips.h>
|
||||||
|
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "sshbuf.h"
|
#include "sshbuf.h"
|
||||||
|
@ -1,184 +1,188 @@
|
|||||||
diff --git a/auth2-hostbased.c b/auth2-hostbased.c
|
diff --git a/auth2-hostbased.c b/auth2-hostbased.c
|
||||||
index 2ab222ed6..4e9437912 100644
|
index 36b9d2f5..6b517db4 100644
|
||||||
--- a/auth2-hostbased.c
|
--- a/auth2-hostbased.c
|
||||||
+++ b/auth2-hostbased.c
|
+++ b/auth2-hostbased.c
|
||||||
@@ -118,6 +118,10 @@ userauth_hostbased(struct ssh *ssh, const char *method)
|
@@ -119,6 +119,11 @@ userauth_hostbased(struct ssh *ssh, const char *method)
|
||||||
"(null)" : key->cert->signature_type);
|
"(null)" : key->cert->signature_type);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
+ if ((r = sshkey_check_rsa_length(key, options.rsa_min_size)) != 0) {
|
+ if ((r = sshkey_check_rsa_length(key,
|
||||||
+ logit("refusing %s key", sshkey_type(key));
|
+ options.required_rsa_size)) != 0) {
|
||||||
|
+ logit_r(r, "refusing %s key", sshkey_type(key));
|
||||||
+ goto done;
|
+ goto done;
|
||||||
+ }
|
+ }
|
||||||
|
|
||||||
if (!authctxt->valid || authctxt->user == NULL) {
|
if (!authctxt->valid || authctxt->user == NULL) {
|
||||||
debug2_f("disabled because of invalid user");
|
debug2_f("disabled because of invalid user");
|
||||||
diff --git a/auth2-pubkey.c b/auth2-pubkey.c
|
diff --git a/auth2-pubkey.c b/auth2-pubkey.c
|
||||||
index daa756a01..68e7dea1f 100644
|
index 962fd342..5d59febc 100644
|
||||||
--- a/auth2-pubkey.c
|
--- a/auth2-pubkey.c
|
||||||
+++ b/auth2-pubkey.c
|
+++ b/auth2-pubkey.c
|
||||||
@@ -172,6 +172,10 @@ userauth_pubkey(struct ssh *ssh, const char *method)
|
@@ -175,6 +175,11 @@ userauth_pubkey(struct ssh *ssh, const char *method)
|
||||||
"(null)" : key->cert->signature_type);
|
"(null)" : key->cert->signature_type);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
+ if ((r = sshkey_check_rsa_length(key, options.rsa_min_size)) != 0) {
|
+ if ((r = sshkey_check_rsa_length(key,
|
||||||
+ logit("refusing %s key", sshkey_type(key));
|
+ options.required_rsa_size)) != 0) {
|
||||||
|
+ logit_r(r, "refusing %s key", sshkey_type(key));
|
||||||
+ goto done;
|
+ goto done;
|
||||||
+ }
|
+ }
|
||||||
key_s = format_key(key);
|
key_s = format_key(key);
|
||||||
if (sshkey_is_cert(key))
|
if (sshkey_is_cert(key))
|
||||||
ca_s = format_key(key->cert->signature_key);
|
ca_s = format_key(key->cert->signature_key);
|
||||||
diff --git a/readconf.c b/readconf.c
|
diff --git a/readconf.c b/readconf.c
|
||||||
index 5b5afa8e3..5e17abd41 100644
|
index 7f26c680..42be690b 100644
|
||||||
--- a/readconf.c
|
--- a/readconf.c
|
||||||
+++ b/readconf.c
|
+++ b/readconf.c
|
||||||
@@ -160,7 +160,7 @@ typedef enum {
|
@@ -174,7 +174,7 @@ typedef enum {
|
||||||
oStreamLocalBindMask, oStreamLocalBindUnlink, oRevokedHostKeys,
|
oStreamLocalBindMask, oStreamLocalBindUnlink, oRevokedHostKeys,
|
||||||
oFingerprintHash, oUpdateHostkeys, oHostbasedAcceptedAlgorithms,
|
oFingerprintHash, oUpdateHostkeys, oHostbasedAcceptedAlgorithms,
|
||||||
oPubkeyAcceptedAlgorithms, oCASignatureAlgorithms, oProxyJump,
|
oPubkeyAcceptedAlgorithms, oCASignatureAlgorithms, oProxyJump,
|
||||||
- oSecurityKeyProvider, oKnownHostsCommand,
|
- oSecurityKeyProvider, oKnownHostsCommand,
|
||||||
+ oSecurityKeyProvider, oKnownHostsCommand, oRSAMinSize,
|
+ oSecurityKeyProvider, oKnownHostsCommand, oRequiredRSASize,
|
||||||
oIgnore, oIgnoredUnknownOption, oDeprecated, oUnsupported
|
oIgnore, oIgnoredUnknownOption, oDeprecated, oUnsupported
|
||||||
} OpCodes;
|
} OpCodes;
|
||||||
|
|
||||||
@@ -306,6 +306,7 @@ static struct {
|
@@ -320,6 +320,8 @@ static struct {
|
||||||
{ "proxyjump", oProxyJump },
|
{ "proxyjump", oProxyJump },
|
||||||
{ "securitykeyprovider", oSecurityKeyProvider },
|
{ "securitykeyprovider", oSecurityKeyProvider },
|
||||||
{ "knownhostscommand", oKnownHostsCommand },
|
{ "knownhostscommand", oKnownHostsCommand },
|
||||||
+ { "rsaminsize", oRSAMinSize },
|
+ { "requiredrsasize", oRequiredRSASize },
|
||||||
|
+ { "rsaminsize", oRequiredRSASize }, /* alias */
|
||||||
|
|
||||||
{ NULL, oBadOption }
|
{ NULL, oBadOption }
|
||||||
};
|
};
|
||||||
@@ -2162,6 +2163,10 @@ process_config_line_depth(Options *options, struct passwd *pw, const char *host,
|
@@ -2176,6 +2177,10 @@ parse_pubkey_algos:
|
||||||
*charptr = xstrdup(arg);
|
*charptr = xstrdup(arg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
+ case oRSAMinSize:
|
+ case oRequiredRSASize:
|
||||||
+ intptr = &options->rsa_min_size;
|
+ intptr = &options->required_rsa_size;
|
||||||
+ goto parse_int;
|
+ goto parse_int;
|
||||||
+
|
+
|
||||||
case oDeprecated:
|
case oDeprecated:
|
||||||
debug("%s line %d: Deprecated option \"%s\"",
|
debug("%s line %d: Deprecated option \"%s\"",
|
||||||
filename, linenum, keyword);
|
filename, linenum, keyword);
|
||||||
@@ -2409,6 +2414,7 @@ initialize_options(Options * options)
|
@@ -2423,6 +2428,7 @@ initialize_options(Options * options)
|
||||||
options->hostbased_accepted_algos = NULL;
|
options->hostbased_accepted_algos = NULL;
|
||||||
options->pubkey_accepted_algos = NULL;
|
options->pubkey_accepted_algos = NULL;
|
||||||
options->known_hosts_command = NULL;
|
options->known_hosts_command = NULL;
|
||||||
+ options->rsa_min_size = -1;
|
+ options->required_rsa_size = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2598,6 +2604,8 @@ fill_default_options(Options * options)
|
@@ -2619,6 +2625,8 @@ fill_default_options(Options * options)
|
||||||
if (options->sk_provider == NULL)
|
if (options->sk_provider == NULL)
|
||||||
options->sk_provider = xstrdup("$SSH_SK_PROVIDER");
|
options->sk_provider = xstrdup("$SSH_SK_PROVIDER");
|
||||||
#endif
|
#endif
|
||||||
+ if (options->rsa_min_size == -1)
|
+ if (options->required_rsa_size == -1)
|
||||||
+ options->rsa_min_size = SSH_RSA_MINIMUM_MODULUS_SIZE;
|
+ options->required_rsa_size = SSH_RSA_MINIMUM_MODULUS_SIZE;
|
||||||
|
|
||||||
/* Expand KEX name lists */
|
/* Expand KEX name lists */
|
||||||
all_cipher = cipher_alg_list(',', 0);
|
all_cipher = cipher_alg_list(',', 0);
|
||||||
@@ -3287,6 +3295,7 @@ dump_client_config(Options *o, const char *host)
|
@@ -3308,6 +3316,7 @@ dump_client_config(Options *o, const char *host)
|
||||||
dump_cfg_int(oNumberOfPasswordPrompts, o->number_of_password_prompts);
|
dump_cfg_int(oNumberOfPasswordPrompts, o->number_of_password_prompts);
|
||||||
dump_cfg_int(oServerAliveCountMax, o->server_alive_count_max);
|
dump_cfg_int(oServerAliveCountMax, o->server_alive_count_max);
|
||||||
dump_cfg_int(oServerAliveInterval, o->server_alive_interval);
|
dump_cfg_int(oServerAliveInterval, o->server_alive_interval);
|
||||||
+ dump_cfg_int(oRSAMinSize, o->rsa_min_size);
|
+ dump_cfg_int(oRequiredRSASize, o->required_rsa_size);
|
||||||
|
|
||||||
/* String options */
|
/* String options */
|
||||||
dump_cfg_string(oBindAddress, o->bind_address);
|
dump_cfg_string(oBindAddress, o->bind_address);
|
||||||
diff --git a/readconf.h b/readconf.h
|
diff --git a/readconf.h b/readconf.h
|
||||||
index f647bd42a..29db353ab 100644
|
index f647bd42..ffb5ec4f 100644
|
||||||
--- a/readconf.h
|
--- a/readconf.h
|
||||||
+++ b/readconf.h
|
+++ b/readconf.h
|
||||||
@@ -176,6 +176,8 @@ typedef struct {
|
@@ -176,6 +176,8 @@ typedef struct {
|
||||||
|
|
||||||
char *known_hosts_command;
|
char *known_hosts_command;
|
||||||
|
|
||||||
+ int rsa_min_size; /* minimum size of RSA keys */
|
+ int required_rsa_size; /* minimum size of RSA keys */
|
||||||
+
|
+
|
||||||
char *ignored_unknown; /* Pattern list of unknown tokens to ignore */
|
char *ignored_unknown; /* Pattern list of unknown tokens to ignore */
|
||||||
} Options;
|
} Options;
|
||||||
|
|
||||||
diff --git a/servconf.c b/servconf.c
|
diff --git a/servconf.c b/servconf.c
|
||||||
index f7317a5cb..362ff5b67 100644
|
index 29df0463..423772b1 100644
|
||||||
--- a/servconf.c
|
--- a/servconf.c
|
||||||
+++ b/servconf.c
|
+++ b/servconf.c
|
||||||
@@ -177,6 +177,7 @@ initialize_server_options(ServerOptions *options)
|
@@ -195,6 +195,7 @@ initialize_server_options(ServerOptions *options)
|
||||||
options->fingerprint_hash = -1;
|
options->fingerprint_hash = -1;
|
||||||
options->disable_forwarding = -1;
|
options->disable_forwarding = -1;
|
||||||
options->expose_userauth_info = -1;
|
options->expose_userauth_info = -1;
|
||||||
+ options->rsa_min_size = -1;
|
+ options->required_rsa_size = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns 1 if a string option is unset or set to "none" or 0 otherwise. */
|
/* Returns 1 if a string option is unset or set to "none" or 0 otherwise. */
|
||||||
@@ -416,6 +417,8 @@ fill_default_server_options(ServerOptions *options)
|
@@ -441,6 +442,8 @@ fill_default_server_options(ServerOptions *options)
|
||||||
options->expose_userauth_info = 0;
|
options->expose_userauth_info = 0;
|
||||||
if (options->sk_provider == NULL)
|
if (options->sk_provider == NULL)
|
||||||
options->sk_provider = xstrdup("internal");
|
options->sk_provider = xstrdup("internal");
|
||||||
+ if (options->rsa_min_size == -1)
|
+ if (options->required_rsa_size == -1)
|
||||||
+ options->rsa_min_size = SSH_RSA_MINIMUM_MODULUS_SIZE;
|
+ options->required_rsa_size = SSH_RSA_MINIMUM_MODULUS_SIZE;
|
||||||
|
|
||||||
assemble_algorithms(options);
|
assemble_algorithms(options);
|
||||||
|
|
||||||
@@ -489,6 +492,7 @@ typedef enum {
|
@@ -517,6 +520,7 @@ typedef enum {
|
||||||
sStreamLocalBindMask, sStreamLocalBindUnlink,
|
sStreamLocalBindMask, sStreamLocalBindUnlink,
|
||||||
sAllowStreamLocalForwarding, sFingerprintHash, sDisableForwarding,
|
sAllowStreamLocalForwarding, sFingerprintHash, sDisableForwarding,
|
||||||
sExposeAuthInfo, sRDomain, sPubkeyAuthOptions, sSecurityKeyProvider,
|
sExposeAuthInfo, sRDomain, sPubkeyAuthOptions, sSecurityKeyProvider,
|
||||||
+ sRSAMinSize,
|
+ sRequiredRSASize,
|
||||||
sDeprecated, sIgnore, sUnsupported
|
sDeprecated, sIgnore, sUnsupported
|
||||||
} ServerOpCodes;
|
} ServerOpCodes;
|
||||||
|
|
||||||
@@ -632,6 +636,7 @@ static struct {
|
@@ -676,6 +680,8 @@ static struct {
|
||||||
{ "rdomain", sRDomain, SSHCFG_ALL },
|
{ "rdomain", sRDomain, SSHCFG_ALL },
|
||||||
{ "casignaturealgorithms", sCASignatureAlgorithms, SSHCFG_ALL },
|
{ "casignaturealgorithms", sCASignatureAlgorithms, SSHCFG_ALL },
|
||||||
{ "securitykeyprovider", sSecurityKeyProvider, SSHCFG_GLOBAL },
|
{ "securitykeyprovider", sSecurityKeyProvider, SSHCFG_GLOBAL },
|
||||||
+ { "rsaminsize", sRSAMinSize, SSHCFG_ALL },
|
+ { "requiredrsasize", sRequiredRSASize, SSHCFG_ALL },
|
||||||
|
+ { "rsaminsize", sRequiredRSASize, SSHCFG_ALL }, /* alias */
|
||||||
{ NULL, sBadOption, 0 }
|
{ NULL, sBadOption, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2377,6 +2382,10 @@ process_server_config_line_depth(ServerOptions *options, char *line,
|
@@ -2438,6 +2443,10 @@ process_server_config_line_depth(ServerOptions *options, char *line,
|
||||||
*charptr = xstrdup(arg);
|
*charptr = xstrdup(arg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
+ case sRSAMinSize:
|
+ case sRequiredRSASize:
|
||||||
+ intptr = &options->rsa_min_size;
|
+ intptr = &options->required_rsa_size;
|
||||||
+ goto parse_int;
|
+ goto parse_int;
|
||||||
+
|
+
|
||||||
case sDeprecated:
|
case sDeprecated:
|
||||||
case sIgnore:
|
case sIgnore:
|
||||||
case sUnsupported:
|
case sUnsupported:
|
||||||
@@ -2549,6 +2558,7 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth)
|
@@ -2610,6 +2619,7 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth)
|
||||||
M_CP_INTOPT(rekey_limit);
|
M_CP_INTOPT(rekey_limit);
|
||||||
M_CP_INTOPT(rekey_interval);
|
M_CP_INTOPT(rekey_interval);
|
||||||
M_CP_INTOPT(log_level);
|
M_CP_INTOPT(log_level);
|
||||||
+ M_CP_INTOPT(rsa_min_size);
|
+ M_CP_INTOPT(required_rsa_size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The bind_mask is a mode_t that may be unsigned, so we can't use
|
* The bind_mask is a mode_t that may be unsigned, so we can't use
|
||||||
@@ -2810,6 +2820,7 @@ dump_config(ServerOptions *o)
|
@@ -2874,6 +2884,7 @@ dump_config(ServerOptions *o)
|
||||||
dump_cfg_int(sMaxSessions, o->max_sessions);
|
dump_cfg_int(sMaxSessions, o->max_sessions);
|
||||||
dump_cfg_int(sClientAliveInterval, o->client_alive_interval);
|
dump_cfg_int(sClientAliveInterval, o->client_alive_interval);
|
||||||
dump_cfg_int(sClientAliveCountMax, o->client_alive_count_max);
|
dump_cfg_int(sClientAliveCountMax, o->client_alive_count_max);
|
||||||
+ dump_cfg_int(sRSAMinSize, o->rsa_min_size);
|
+ dump_cfg_int(sRequiredRSASize, o->required_rsa_size);
|
||||||
dump_cfg_oct(sStreamLocalBindMask, o->fwd_opts.streamlocal_bind_mask);
|
dump_cfg_oct(sStreamLocalBindMask, o->fwd_opts.streamlocal_bind_mask);
|
||||||
|
|
||||||
/* formatted integer arguments */
|
/* formatted integer arguments */
|
||||||
diff --git a/servconf.h b/servconf.h
|
diff --git a/servconf.h b/servconf.h
|
||||||
index 115db1e79..2e3486906 100644
|
index 8a04463e..9346155c 100644
|
||||||
--- a/servconf.h
|
--- a/servconf.h
|
||||||
+++ b/servconf.h
|
+++ b/servconf.h
|
||||||
@@ -227,6 +227,7 @@ typedef struct {
|
@@ -229,6 +229,7 @@ typedef struct {
|
||||||
int expose_userauth_info;
|
int expose_userauth_info;
|
||||||
u_int64_t timing_secret;
|
u_int64_t timing_secret;
|
||||||
char *sk_provider;
|
char *sk_provider;
|
||||||
+ int rsa_min_size; /* minimum size of RSA keys */
|
+ int required_rsa_size; /* minimum size of RSA keys */
|
||||||
} ServerOptions;
|
} ServerOptions;
|
||||||
|
|
||||||
/* Information about the incoming connection as used by Match */
|
/* Information about the incoming connection as used by Match */
|
||||||
diff --git a/ssh.c b/ssh.c
|
diff --git a/ssh.c b/ssh.c
|
||||||
index a926cc007..cd13fb879 100644
|
index 559bf2af..25be53d5 100644
|
||||||
--- a/ssh.c
|
--- a/ssh.c
|
||||||
+++ b/ssh.c
|
+++ b/ssh.c
|
||||||
@@ -500,14 +500,22 @@ resolve_canonicalize(char **hostp, int port)
|
@@ -516,14 +516,22 @@ resolve_canonicalize(char **hostp, int port)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -196,7 +200,7 @@ index a926cc007..cd13fb879 100644
|
|||||||
+ /* Check RSA keys size and discard if undersized */
|
+ /* Check RSA keys size and discard if undersized */
|
||||||
+ if (k != NULL && *k != NULL &&
|
+ if (k != NULL && *k != NULL &&
|
||||||
+ (r = sshkey_check_rsa_length(*k,
|
+ (r = sshkey_check_rsa_length(*k,
|
||||||
+ options.rsa_min_size)) != 0) {
|
+ options.required_rsa_size)) != 0) {
|
||||||
+ error_r(r, "load %s \"%s\"", message, path);
|
+ error_r(r, "load %s \"%s\"", message, path);
|
||||||
+ free(*k);
|
+ free(*k);
|
||||||
+ *k = NULL;
|
+ *k = NULL;
|
||||||
@ -204,13 +208,16 @@ index a926cc007..cd13fb879 100644
|
|||||||
break;
|
break;
|
||||||
case SSH_ERR_INTERNAL_ERROR:
|
case SSH_ERR_INTERNAL_ERROR:
|
||||||
case SSH_ERR_ALLOC_FAIL:
|
case SSH_ERR_ALLOC_FAIL:
|
||||||
@@ -1557,12 +1565,13 @@ main(int ac, char **av)
|
@@ -1578,7 +1586,7 @@ main(int ac, char **av)
|
||||||
if ((o) >= sensitive_data.nkeys) \
|
if ((o) >= sensitive_data.nkeys) \
|
||||||
fatal_f("pubkey out of array bounds"); \
|
fatal_f("pubkey out of array bounds"); \
|
||||||
check_load(sshkey_load_public(p, &(sensitive_data.keys[o]), NULL), \
|
check_load(sshkey_load_public(p, &(sensitive_data.keys[o]), NULL), \
|
||||||
- p, "pubkey"); \
|
- p, "pubkey"); \
|
||||||
+ &(sensitive_data.keys[o]), p, "pubkey"); \
|
+ &(sensitive_data.keys[o]), p, "pubkey"); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
#define L_CERT(p,o) do { \
|
||||||
|
if ((o) >= sensitive_data.nkeys) \
|
||||||
|
@@ -1586,7 +1594,8 @@ main(int ac, char **av)
|
||||||
#define L_CERT(p,o) do { \
|
#define L_CERT(p,o) do { \
|
||||||
if ((o) >= sensitive_data.nkeys) \
|
if ((o) >= sensitive_data.nkeys) \
|
||||||
fatal_f("cert out of array bounds"); \
|
fatal_f("cert out of array bounds"); \
|
||||||
@ -229,7 +236,7 @@ index a926cc007..cd13fb879 100644
|
|||||||
debug("identity file %s type %d", filename,
|
debug("identity file %s type %d", filename,
|
||||||
public ? public->type : -1);
|
public ? public->type : -1);
|
||||||
free(options.identity_files[i]);
|
free(options.identity_files[i]);
|
||||||
@@ -2263,7 +2272,7 @@ load_public_identity_files(const struct ssh_conn_info *cinfo)
|
@@ -2284,7 +2293,7 @@ load_public_identity_files(const struct ssh_conn_info *cinfo)
|
||||||
continue;
|
continue;
|
||||||
xasprintf(&cp, "%s-cert", filename);
|
xasprintf(&cp, "%s-cert", filename);
|
||||||
check_load(sshkey_load_public(cp, &public, NULL),
|
check_load(sshkey_load_public(cp, &public, NULL),
|
||||||
@ -238,7 +245,7 @@ index a926cc007..cd13fb879 100644
|
|||||||
debug("identity file %s type %d", cp,
|
debug("identity file %s type %d", cp,
|
||||||
public ? public->type : -1);
|
public ? public->type : -1);
|
||||||
if (public == NULL) {
|
if (public == NULL) {
|
||||||
@@ -2294,7 +2303,7 @@ load_public_identity_files(const struct ssh_conn_info *cinfo)
|
@@ -2315,7 +2324,7 @@ load_public_identity_files(const struct ssh_conn_info *cinfo)
|
||||||
free(cp);
|
free(cp);
|
||||||
|
|
||||||
check_load(sshkey_load_public(filename, &public, NULL),
|
check_load(sshkey_load_public(filename, &public, NULL),
|
||||||
@ -248,25 +255,27 @@ index a926cc007..cd13fb879 100644
|
|||||||
public ? public->type : -1);
|
public ? public->type : -1);
|
||||||
free(options.certificate_files[i]);
|
free(options.certificate_files[i]);
|
||||||
diff --git a/sshconnect2.c b/sshconnect2.c
|
diff --git a/sshconnect2.c b/sshconnect2.c
|
||||||
index 67f8e0309..d050c1656 100644
|
index f9bd19ea..58fe98db 100644
|
||||||
--- a/sshconnect2.c
|
--- a/sshconnect2.c
|
||||||
+++ b/sshconnect2.c
|
+++ b/sshconnect2.c
|
||||||
@@ -91,6 +91,10 @@ static const struct ssh_conn_info *xxx_conn_info;
|
@@ -96,6 +96,11 @@ static const struct ssh_conn_info *xxx_conn_info;
|
||||||
static int
|
static int
|
||||||
verify_host_key_callback(struct sshkey *hostkey, struct ssh *ssh)
|
verify_host_key_callback(struct sshkey *hostkey, struct ssh *ssh)
|
||||||
{
|
{
|
||||||
+ int r;
|
+ int r;
|
||||||
+
|
+
|
||||||
+ if ((r = sshkey_check_rsa_length(hostkey, options.rsa_min_size)) != 0)
|
+ if ((r = sshkey_check_rsa_length(hostkey,
|
||||||
|
+ options.required_rsa_size)) != 0)
|
||||||
+ fatal_r(r, "Bad server host key");
|
+ fatal_r(r, "Bad server host key");
|
||||||
if (verify_host_key(xxx_host, xxx_hostaddr, hostkey,
|
if (verify_host_key(xxx_host, xxx_hostaddr, hostkey,
|
||||||
xxx_conn_info) == -1)
|
xxx_conn_info) == -1)
|
||||||
fatal("Host key verification failed.");
|
fatal("Host key verification failed.");
|
||||||
@@ -1762,6 +1762,12 @@ load_identity_file(Identity *id)
|
@@ -1606,6 +1611,13 @@ load_identity_file(Identity *id)
|
||||||
private = NULL;
|
private = NULL;
|
||||||
quit = 1;
|
quit = 1;
|
||||||
}
|
}
|
||||||
+ if (r = sshkey_check_rsa_length(private, options.rsa_min_size) != 0) {
|
+ if (!quit && (r = sshkey_check_rsa_length(private,
|
||||||
|
+ options.required_rsa_size)) != 0) {
|
||||||
+ debug_fr(r, "Skipping key %s", id->filename);
|
+ debug_fr(r, "Skipping key %s", id->filename);
|
||||||
+ sshkey_free(private);
|
+ sshkey_free(private);
|
||||||
+ private = NULL;
|
+ private = NULL;
|
||||||
@ -275,12 +284,12 @@ index 67f8e0309..d050c1656 100644
|
|||||||
if (!quit && private != NULL && id->agent_fd == -1 &&
|
if (!quit && private != NULL && id->agent_fd == -1 &&
|
||||||
!(id->key && id->isprivate))
|
!(id->key && id->isprivate))
|
||||||
maybe_add_key_to_agent(id->filename, private, comment,
|
maybe_add_key_to_agent(id->filename, private, comment,
|
||||||
@@ -1747,6 +1751,12 @@ pubkey_prepare(struct ssh *ssh, Authctxt *authctxt)
|
@@ -1752,6 +1764,12 @@ pubkey_prepare(struct ssh *ssh, Authctxt *authctxt)
|
||||||
close(agent_fd);
|
close(agent_fd);
|
||||||
} else {
|
} else {
|
||||||
for (j = 0; j < idlist->nkeys; j++) {
|
for (j = 0; j < idlist->nkeys; j++) {
|
||||||
+ if ((r = sshkey_check_rsa_length(idlist->keys[j],
|
+ if ((r = sshkey_check_rsa_length(idlist->keys[j],
|
||||||
+ options.rsa_min_size)) != 0) {
|
+ options.required_rsa_size)) != 0) {
|
||||||
+ debug_fr(r, "ignoring %s agent key",
|
+ debug_fr(r, "ignoring %s agent key",
|
||||||
+ sshkey_ssh_name(idlist->keys[j]));
|
+ sshkey_ssh_name(idlist->keys[j]));
|
||||||
+ continue;
|
+ continue;
|
||||||
@ -289,15 +298,15 @@ index 67f8e0309..d050c1656 100644
|
|||||||
TAILQ_FOREACH(id, &files, next) {
|
TAILQ_FOREACH(id, &files, next) {
|
||||||
/*
|
/*
|
||||||
diff --git a/sshd.c b/sshd.c
|
diff --git a/sshd.c b/sshd.c
|
||||||
index d26eb86ae..5f36905a1 100644
|
index 17eee9d8..395ef493 100644
|
||||||
--- a/sshd.c
|
--- a/sshd.c
|
||||||
+++ b/sshd.c
|
+++ b/sshd.c
|
||||||
@@ -1746,6 +1746,13 @@ main(int ac, char **av)
|
@@ -1870,6 +1870,13 @@ main(int ac, char **av)
|
||||||
fatal_r(r, "Could not demote key: \"%s\"",
|
fatal_r(r, "Could not demote key: \"%s\"",
|
||||||
options.host_key_files[i]);
|
options.host_key_files[i]);
|
||||||
}
|
}
|
||||||
+ if (pubkey != NULL && (r = sshkey_check_rsa_length(pubkey,
|
+ if (pubkey != NULL && (r = sshkey_check_rsa_length(pubkey,
|
||||||
+ options.rsa_min_size)) != 0) {
|
+ options.required_rsa_size)) != 0) {
|
||||||
+ error_fr(r, "Host key %s", options.host_key_files[i]);
|
+ error_fr(r, "Host key %s", options.host_key_files[i]);
|
||||||
+ sshkey_free(pubkey);
|
+ sshkey_free(pubkey);
|
||||||
+ sshkey_free(key);
|
+ sshkey_free(key);
|
||||||
@ -307,10 +316,10 @@ index d26eb86ae..5f36905a1 100644
|
|||||||
sensitive_data.host_pubkeys[i] = pubkey;
|
sensitive_data.host_pubkeys[i] = pubkey;
|
||||||
|
|
||||||
diff --git a/sshkey.c b/sshkey.c
|
diff --git a/sshkey.c b/sshkey.c
|
||||||
index 47864e6d8..8bad6bd99 100644
|
index ed2b5dff..77093235 100644
|
||||||
--- a/sshkey.c
|
--- a/sshkey.c
|
||||||
+++ b/sshkey.c
|
+++ b/sshkey.c
|
||||||
@@ -2319,18 +2319,24 @@ cert_parse(struct sshbuf *b, struct sshkey *key, struct sshbuf *certbuf)
|
@@ -2365,18 +2365,24 @@ cert_parse(struct sshbuf *b, struct sshkey *key, struct sshbuf *certbuf)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -341,7 +350,7 @@ index 47864e6d8..8bad6bd99 100644
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
|
sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
|
||||||
@@ -2391,7 +2397,7 @@ sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
|
@@ -2439,7 +2445,7 @@ sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
rsa_n = rsa_e = NULL; /* transferred */
|
rsa_n = rsa_e = NULL; /* transferred */
|
||||||
@ -350,7 +359,7 @@ index 47864e6d8..8bad6bd99 100644
|
|||||||
goto out;
|
goto out;
|
||||||
#ifdef DEBUG_PK
|
#ifdef DEBUG_PK
|
||||||
RSA_print_fp(stderr, key->rsa, 8);
|
RSA_print_fp(stderr, key->rsa, 8);
|
||||||
@@ -3580,7 +3586,7 @@ sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
|
@@ -3642,7 +3648,7 @@ sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
rsa_p = rsa_q = NULL; /* transferred */
|
rsa_p = rsa_q = NULL; /* transferred */
|
||||||
@ -359,7 +368,7 @@ index 47864e6d8..8bad6bd99 100644
|
|||||||
goto out;
|
goto out;
|
||||||
if ((r = ssh_rsa_complete_crt_parameters(k, rsa_iqmp)) != 0)
|
if ((r = ssh_rsa_complete_crt_parameters(k, rsa_iqmp)) != 0)
|
||||||
goto out;
|
goto out;
|
||||||
@@ -4566,7 +4572,7 @@ sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type,
|
@@ -4644,7 +4650,7 @@ sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type,
|
||||||
r = SSH_ERR_LIBCRYPTO_ERROR;
|
r = SSH_ERR_LIBCRYPTO_ERROR;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -369,10 +378,10 @@ index 47864e6d8..8bad6bd99 100644
|
|||||||
} else if (EVP_PKEY_base_id(pk) == EVP_PKEY_DSA &&
|
} else if (EVP_PKEY_base_id(pk) == EVP_PKEY_DSA &&
|
||||||
(type == KEY_UNSPEC || type == KEY_DSA)) {
|
(type == KEY_UNSPEC || type == KEY_DSA)) {
|
||||||
diff --git a/sshkey.h b/sshkey.h
|
diff --git a/sshkey.h b/sshkey.h
|
||||||
index 125cadb64..52e879456 100644
|
index 094815e0..be254e6b 100644
|
||||||
--- a/sshkey.h
|
--- a/sshkey.h
|
||||||
+++ b/sshkey.h
|
+++ b/sshkey.h
|
||||||
@@ -267,6 +267,7 @@ int sshkey_parse_private_fileblob_type(struct sshbuf *blob, int type,
|
@@ -273,6 +273,7 @@ int sshkey_parse_private_fileblob_type(struct sshbuf *blob, int type,
|
||||||
int sshkey_parse_pubkey_from_private_fileblob_type(struct sshbuf *blob,
|
int sshkey_parse_pubkey_from_private_fileblob_type(struct sshbuf *blob,
|
||||||
int type, struct sshkey **pubkeyp);
|
int type, struct sshkey **pubkeyp);
|
||||||
|
|
||||||
@ -381,57 +390,57 @@ index 125cadb64..52e879456 100644
|
|||||||
int ssh_rsa_complete_crt_parameters(struct sshkey *, const BIGNUM *);
|
int ssh_rsa_complete_crt_parameters(struct sshkey *, const BIGNUM *);
|
||||||
|
|
||||||
diff --git a/ssh.1 b/ssh.1
|
diff --git a/ssh.1 b/ssh.1
|
||||||
index b4956aec..b1a40ebd 100644
|
index b4956aec..e255b9b9 100644
|
||||||
--- a/ssh.1
|
--- a/ssh.1
|
||||||
+++ b/ssh.1
|
+++ b/ssh.1
|
||||||
@@ -554,6 +554,7 @@ For full details of the options listed below, and their possible values, see
|
@@ -571,6 +571,7 @@ For full details of the options listed below, and their possible values, see
|
||||||
.It LogLevel
|
.It RemoteCommand
|
||||||
.It MACs
|
.It RemoteForward
|
||||||
.It Match
|
.It RequestTTY
|
||||||
+.It RSAMinSize
|
+.It RequiredRSASize
|
||||||
.It NoHostAuthenticationForLocalhost
|
.It SendEnv
|
||||||
.It NumberOfPasswordPrompts
|
.It ServerAliveInterval
|
||||||
.It PasswordAuthentication
|
.It ServerAliveCountMax
|
||||||
diff --git a/ssh_config.5 b/ssh_config.5
|
diff --git a/ssh_config.5 b/ssh_config.5
|
||||||
index 24a46460..68771e4b 100644
|
index 24a46460..d1ede18e 100644
|
||||||
--- a/ssh_config.5
|
--- a/ssh_config.5
|
||||||
+++ b/ssh_config.5
|
+++ b/ssh_config.5
|
||||||
@@ -1322,6 +1322,10 @@ The argument to this keyword must be
|
@@ -1634,6 +1634,17 @@ and
|
||||||
or
|
.Fl T
|
||||||
.Cm no
|
flags for
|
||||||
(the default).
|
.Xr ssh 1 .
|
||||||
+.It Cm RSAMinSize
|
+.It Cm RequiredRSASize
|
||||||
+Provides a minimal bits requirement for RSA keys when used for signature and
|
+Specifies the minimum RSA key size (in bits) that
|
||||||
+verification but not for the key generation. The default value is 1024 and
|
+.Xr ssh 1
|
||||||
+can't be reduced.
|
+will accept.
|
||||||
.It Cm NumberOfPasswordPrompts
|
+User authentication keys smaller than this limit will be ignored.
|
||||||
Specifies the number of password prompts before giving up.
|
+Servers that present host keys smaller than this limit will cause the
|
||||||
The argument to this keyword must be an integer.
|
+connection to be terminated.
|
||||||
|
+The default is
|
||||||
|
+.Cm 1024
|
||||||
|
+bits.
|
||||||
|
+Note that this limit may only be raised from the default.
|
||||||
|
.It Cm RevokedHostKeys
|
||||||
|
Specifies revoked host public keys.
|
||||||
|
Keys listed in this file will be refused for host authentication.
|
||||||
diff --git a/sshd_config.5 b/sshd_config.5
|
diff --git a/sshd_config.5 b/sshd_config.5
|
||||||
index 867a747d..e08811ca 100644
|
index 867a747d..f5a06637 100644
|
||||||
--- a/sshd_config.5
|
--- a/sshd_config.5
|
||||||
+++ b/sshd_config.5
|
+++ b/sshd_config.5
|
||||||
@@ -1266,6 +1266,10 @@ will refuse connection attempts with a probability of rate/100 (30%)
|
@@ -1596,6 +1596,16 @@ is
|
||||||
if there are currently start (10) unauthenticated connections.
|
.Cm default none ,
|
||||||
The probability increases linearly and all connection attempts
|
which means that rekeying is performed after the cipher's default amount
|
||||||
are refused if the number of unauthenticated connections reaches full (60).
|
of data has been sent or received and no time based rekeying is done.
|
||||||
+.It Cm RSAMinSize
|
+.It Cm RequiredRSASize
|
||||||
+Provides a minimal bits requirement for RSA keys when used for signature and
|
+Specifies the minimum RSA key size (in bits) that
|
||||||
+verification but not for the key generation. The default value is 1024 and
|
+.Xr sshd 8
|
||||||
+can't be reduced.
|
+will accept.
|
||||||
.It Cm ModuliFile
|
+User and host-based authentication keys smaller than this limit will be
|
||||||
Specifies the
|
+refused.
|
||||||
.Xr moduli 5
|
+The default is
|
||||||
diff --git a/sshkey.h b/sshkey.h
|
+.Cm 1024
|
||||||
index 094815e0..2bb8cb90 100644
|
+bits.
|
||||||
--- a/sshkey.h
|
+Note that this limit may only be raised from the default.
|
||||||
+++ b/sshkey.h
|
.It Cm RevokedKeys
|
||||||
@@ -286,6 +286,8 @@ int sshkey_private_serialize_maxsign(struct sshkey *key,
|
Specifies revoked public keys file, or
|
||||||
|
.Cm none
|
||||||
void sshkey_sig_details_free(struct sshkey_sig_details *);
|
|
||||||
|
|
||||||
+int ssh_set_rsa_min_bits(int minbits);
|
|
||||||
+
|
|
||||||
#ifdef SSHKEY_INTERNAL
|
|
||||||
int ssh_rsa_sign(const struct sshkey *key,
|
|
||||||
u_char **sigp, size_t *lenp, const u_char *data, size_t datalen,
|
|
||||||
|
100
SOURCES/openssh-8.7p1-nohostsha1proof.patch
Normal file
100
SOURCES/openssh-8.7p1-nohostsha1proof.patch
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
diff -up openssh-8.7p1/compat.c.sshrsacheck openssh-8.7p1/compat.c
|
||||||
|
--- openssh-8.7p1/compat.c.sshrsacheck 2023-01-12 13:29:06.338710923 +0100
|
||||||
|
+++ openssh-8.7p1/compat.c 2023-01-12 13:29:06.357711165 +0100
|
||||||
|
@@ -43,6 +43,7 @@ void
|
||||||
|
compat_banner(struct ssh *ssh, const char *version)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
+ int forbid_ssh_rsa = 0;
|
||||||
|
static struct {
|
||||||
|
char *pat;
|
||||||
|
int bugs;
|
||||||
|
@@ -145,16 +146,21 @@ compat_banner(struct ssh *ssh, const cha
|
||||||
|
};
|
||||||
|
|
||||||
|
/* process table, return first match */
|
||||||
|
+ forbid_ssh_rsa = (ssh->compat & SSH_RH_RSASIGSHA);
|
||||||
|
ssh->compat = 0;
|
||||||
|
for (i = 0; check[i].pat; i++) {
|
||||||
|
if (match_pattern_list(version, check[i].pat, 0) == 1) {
|
||||||
|
debug_f("match: %s pat %s compat 0x%08x",
|
||||||
|
version, check[i].pat, check[i].bugs);
|
||||||
|
ssh->compat = check[i].bugs;
|
||||||
|
+ if (forbid_ssh_rsa)
|
||||||
|
+ ssh->compat |= SSH_RH_RSASIGSHA;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
debug_f("no match: %s", version);
|
||||||
|
+ if (forbid_ssh_rsa)
|
||||||
|
+ ssh->compat |= SSH_RH_RSASIGSHA;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Always returns pointer to allocated memory, caller must free. */
|
||||||
|
diff -up openssh-8.7p1/compat.h.sshrsacheck openssh-8.7p1/compat.h
|
||||||
|
--- openssh-8.7p1/compat.h.sshrsacheck 2021-08-20 06:03:49.000000000 +0200
|
||||||
|
+++ openssh-8.7p1/compat.h 2023-01-12 13:29:06.358711178 +0100
|
||||||
|
@@ -30,7 +30,7 @@
|
||||||
|
#define SSH_BUG_UTF8TTYMODE 0x00000001
|
||||||
|
#define SSH_BUG_SIGTYPE 0x00000002
|
||||||
|
#define SSH_BUG_SIGTYPE74 0x00000004
|
||||||
|
-/* #define unused 0x00000008 */
|
||||||
|
+#define SSH_RH_RSASIGSHA 0x00000008
|
||||||
|
#define SSH_OLD_SESSIONID 0x00000010
|
||||||
|
/* #define unused 0x00000020 */
|
||||||
|
#define SSH_BUG_DEBUG 0x00000040
|
||||||
|
diff -up openssh-8.7p1/serverloop.c.sshrsacheck openssh-8.7p1/serverloop.c
|
||||||
|
--- openssh-8.7p1/serverloop.c.sshrsacheck 2023-01-12 14:57:08.118400073 +0100
|
||||||
|
+++ openssh-8.7p1/serverloop.c 2023-01-12 14:59:17.330470518 +0100
|
||||||
|
@@ -737,6 +737,10 @@ server_input_hostkeys_prove(struct ssh *
|
||||||
|
else if (ssh->kex->flags & KEX_RSA_SHA2_256_SUPPORTED)
|
||||||
|
sigalg = "rsa-sha2-256";
|
||||||
|
}
|
||||||
|
+ if (ssh->compat & SSH_RH_RSASIGSHA && sigalg == NULL) {
|
||||||
|
+ sigalg = "rsa-sha2-512";
|
||||||
|
+ debug3_f("SHA1 signature is not supported, falling back to %s", sigalg);
|
||||||
|
+ }
|
||||||
|
debug3_f("sign %s key (index %d) using sigalg %s",
|
||||||
|
sshkey_type(key), ndx, sigalg == NULL ? "default" : sigalg);
|
||||||
|
if ((r = sshbuf_put_cstring(sigbuf,
|
||||||
|
diff -up openssh-8.7p1/sshd.c.sshrsacheck openssh-8.7p1/sshd.c
|
||||||
|
--- openssh-8.7p1/sshd.c.sshrsacheck 2023-01-12 13:29:06.355711140 +0100
|
||||||
|
+++ openssh-8.7p1/sshd.c 2023-01-12 13:29:06.358711178 +0100
|
||||||
|
@@ -1640,6 +1651,7 @@ main(int ac, char **av)
|
||||||
|
int keytype;
|
||||||
|
Authctxt *authctxt;
|
||||||
|
struct connection_info *connection_info = NULL;
|
||||||
|
+ int forbid_ssh_rsa = 0;
|
||||||
|
|
||||||
|
#ifdef HAVE_SECUREWARE
|
||||||
|
(void)set_auth_parameters(ac, av);
|
||||||
|
@@ -1938,6 +1950,19 @@ main(int ac, char **av)
|
||||||
|
key = NULL;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
+ if (key && (sshkey_type_plain(key->type) == KEY_RSA || sshkey_type_plain(key->type) == KEY_RSA_CERT)) {
|
||||||
|
+ size_t sign_size = 0;
|
||||||
|
+ u_char *tmp = NULL;
|
||||||
|
+ u_char data[] = "Test SHA1 vector";
|
||||||
|
+ int res;
|
||||||
|
+
|
||||||
|
+ res = ssh_rsa_sign(key, &tmp, &sign_size, data, sizeof(data), NULL);
|
||||||
|
+ free(tmp);
|
||||||
|
+ if (res == SSH_ERR_LIBCRYPTO_ERROR) {
|
||||||
|
+ logit_f("sshd: ssh-rsa algorithm is disabled");
|
||||||
|
+ forbid_ssh_rsa = 1;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
if (sshkey_is_sk(key) &&
|
||||||
|
key->sk_flags & SSH_SK_USER_PRESENCE_REQD) {
|
||||||
|
debug("host key %s requires user presence, ignoring",
|
||||||
|
@@ -2275,6 +2306,9 @@ main(int ac, char **av)
|
||||||
|
|
||||||
|
check_ip_options(ssh);
|
||||||
|
|
||||||
|
+ if (forbid_ssh_rsa)
|
||||||
|
+ ssh->compat |= SSH_RH_RSASIGSHA;
|
||||||
|
+
|
||||||
|
/* Prepare the channels layer */
|
||||||
|
channel_init_channels(ssh);
|
||||||
|
channel_set_af(ssh, options.address_family);
|
@ -33,16 +33,16 @@ diff --color -ru a/ssh.1 b/ssh.1
|
|||||||
+.It LogVerbose
|
+.It LogVerbose
|
||||||
.It MACs
|
.It MACs
|
||||||
.It Match
|
.It Match
|
||||||
.It RSAMinSize
|
.It NoHostAuthenticationForLocalhost
|
||||||
@@ -566,6 +571,8 @@
|
@@ -566,6 +571,8 @@
|
||||||
.It RemoteCommand
|
.It RemoteCommand
|
||||||
.It RemoteForward
|
.It RemoteForward
|
||||||
.It RequestTTY
|
.It RequestTTY
|
||||||
+.It RevokedHostKeys
|
+.It RevokedHostKeys
|
||||||
+.It SecurityKeyProvider
|
+.It SecurityKeyProvider
|
||||||
|
.It RequiredRSASize
|
||||||
.It SendEnv
|
.It SendEnv
|
||||||
.It ServerAliveInterval
|
.It ServerAliveInterval
|
||||||
.It ServerAliveCountMax
|
|
||||||
@@ -575,6 +582,7 @@
|
@@ -575,6 +582,7 @@
|
||||||
.It StreamLocalBindMask
|
.It StreamLocalBindMask
|
||||||
.It StreamLocalBindUnlink
|
.It StreamLocalBindUnlink
|
||||||
|
57
SOURCES/openssh-9.1p1-sshbanner.patch
Normal file
57
SOURCES/openssh-9.1p1-sshbanner.patch
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
diff --git a/ssh-keyscan.c b/ssh-keyscan.c
|
||||||
|
index d29a03b4..d7283136 100644
|
||||||
|
--- a/ssh-keyscan.c
|
||||||
|
+++ b/ssh-keyscan.c
|
||||||
|
@@ -490,6 +490,15 @@ congreet(int s)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * Read the server banner as per RFC4253 section 4.2. The "SSH-"
|
||||||
|
+ * protocol identification string may be preceeded by an arbitarily
|
||||||
|
+ * large banner which we must read and ignore. Loop while reading
|
||||||
|
+ * newline-terminated lines until we have one starting with "SSH-".
|
||||||
|
+ * The ID string cannot be longer than 255 characters although the
|
||||||
|
+ * preceeding banner lines may (in which case they'll be discarded
|
||||||
|
+ * in multiple iterations of the outer loop).
|
||||||
|
+ */
|
||||||
|
for (;;) {
|
||||||
|
memset(buf, '\0', sizeof(buf));
|
||||||
|
bufsiz = sizeof(buf);
|
||||||
|
@@ -517,6 +526,11 @@ congreet(int s)
|
||||||
|
conrecycle(s);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
+ if (cp >= buf + sizeof(buf)) {
|
||||||
|
+ error("%s: greeting exceeds allowable length", c->c_name);
|
||||||
|
+ confree(s);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
if (*cp != '\n' && *cp != '\r') {
|
||||||
|
error("%s: bad greeting", c->c_name);
|
||||||
|
confree(s);
|
||||||
|
diff --git a/sshsig.c b/sshsig.c
|
||||||
|
index 1e3b6398..eb2a931e 100644
|
||||||
|
--- a/sshsig.c
|
||||||
|
+++ b/sshsig.c
|
||||||
|
@@ -491,7 +491,7 @@ hash_file(int fd, const char *hashalg, struct sshbuf **bp)
|
||||||
|
{
|
||||||
|
char *hex, rbuf[8192], hash[SSH_DIGEST_MAX_LENGTH];
|
||||||
|
ssize_t n, total = 0;
|
||||||
|
- struct ssh_digest_ctx *ctx;
|
||||||
|
+ struct ssh_digest_ctx *ctx = NULL;
|
||||||
|
int alg, oerrno, r = SSH_ERR_INTERNAL_ERROR;
|
||||||
|
struct sshbuf *b = NULL;
|
||||||
|
|
||||||
|
@@ -549,9 +548,11 @@ hash_file(int fd, const char *hashalg, struct sshbuf **bp)
|
||||||
|
/* success */
|
||||||
|
r = 0;
|
||||||
|
out:
|
||||||
|
+ oerrno = errno;
|
||||||
|
sshbuf_free(b);
|
||||||
|
ssh_digest_free(ctx);
|
||||||
|
explicit_bzero(hash, sizeof(hash));
|
||||||
|
+ errno = oerrno;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
@ -51,7 +51,7 @@
|
|||||||
|
|
||||||
# Do not forget to bump pam_ssh_agent_auth release if you rewind the main package release to 1
|
# Do not forget to bump pam_ssh_agent_auth release if you rewind the main package release to 1
|
||||||
%global openssh_ver 8.7p1
|
%global openssh_ver 8.7p1
|
||||||
%global openssh_rel 22
|
%global openssh_rel 28
|
||||||
%global pam_ssh_agent_ver 0.10.4
|
%global pam_ssh_agent_ver 0.10.4
|
||||||
%global pam_ssh_agent_rel 5
|
%global pam_ssh_agent_rel 5
|
||||||
|
|
||||||
@ -221,6 +221,8 @@ Patch983: openssh-8.7p1-evpgenkey.patch
|
|||||||
# downstream only, IBMCA tentative fix
|
# downstream only, IBMCA tentative fix
|
||||||
# From https://bugzilla.redhat.com/show_bug.cgi?id=1976202#c14
|
# From https://bugzilla.redhat.com/show_bug.cgi?id=1976202#c14
|
||||||
Patch984: openssh-8.7p1-ibmca.patch
|
Patch984: openssh-8.7p1-ibmca.patch
|
||||||
|
# Upstream ff89b1bed80721295555bd083b173247a9c0484e, 5062ad48814b06162511c4f5924a33d97b6b2566
|
||||||
|
Patch986: openssh-9.1p1-sshbanner.patch
|
||||||
|
|
||||||
# Minimize the use of SHA1 as a proof of possession for RSA key (#2031868)
|
# Minimize the use of SHA1 as a proof of possession for RSA key (#2031868)
|
||||||
# upstream commits:
|
# upstream commits:
|
||||||
@ -257,6 +259,8 @@ Patch1005: openssh-8.7p1-host-based-auth.patch
|
|||||||
# upstream MR:
|
# upstream MR:
|
||||||
# https://github.com/openssh/openssh-portable/pull/323
|
# https://github.com/openssh/openssh-portable/pull/323
|
||||||
Patch1006: openssh-8.7p1-negotiate-supported-algs.patch
|
Patch1006: openssh-8.7p1-negotiate-supported-algs.patch
|
||||||
|
#
|
||||||
|
Patch1007: openssh-8.7p1-nohostsha1proof.patch
|
||||||
|
|
||||||
License: BSD
|
License: BSD
|
||||||
Requires: /sbin/nologin
|
Requires: /sbin/nologin
|
||||||
@ -324,6 +328,10 @@ Requires: openssh = %{version}-%{release}
|
|||||||
Summary: A passphrase dialog for OpenSSH and X
|
Summary: A passphrase dialog for OpenSSH and X
|
||||||
Requires: openssh = %{version}-%{release}
|
Requires: openssh = %{version}-%{release}
|
||||||
|
|
||||||
|
%package sk-dummy
|
||||||
|
Summary: OpenSSH SK driver for test purposes
|
||||||
|
Requires: openssh = %{version}-%{release}
|
||||||
|
|
||||||
%package -n pam_ssh_agent_auth
|
%package -n pam_ssh_agent_auth
|
||||||
Summary: PAM module for authentication with ssh-agent
|
Summary: PAM module for authentication with ssh-agent
|
||||||
Version: %{pam_ssh_agent_ver}
|
Version: %{pam_ssh_agent_ver}
|
||||||
@ -364,6 +372,9 @@ OpenSSH is a free version of SSH (Secure SHell), a program for logging
|
|||||||
into and executing commands on a remote machine. This package contains
|
into and executing commands on a remote machine. This package contains
|
||||||
an X11 passphrase dialog for OpenSSH.
|
an X11 passphrase dialog for OpenSSH.
|
||||||
|
|
||||||
|
%description sk-dummy
|
||||||
|
This package contains a test SK driver used for OpenSSH test purposes
|
||||||
|
|
||||||
%description -n pam_ssh_agent_auth
|
%description -n pam_ssh_agent_auth
|
||||||
This package contains a PAM module which can be used to authenticate
|
This package contains a PAM module which can be used to authenticate
|
||||||
users using ssh keys stored in a ssh-agent. Through the use of the
|
users using ssh keys stored in a ssh-agent. Through the use of the
|
||||||
@ -442,6 +453,7 @@ popd
|
|||||||
%patch982 -p1 -b .minrsabits
|
%patch982 -p1 -b .minrsabits
|
||||||
%patch983 -p1 -b .evpgenrsa
|
%patch983 -p1 -b .evpgenrsa
|
||||||
%patch984 -p1 -b .ibmca
|
%patch984 -p1 -b .ibmca
|
||||||
|
%patch986 -p1 -b .91cleanup
|
||||||
|
|
||||||
%patch200 -p1 -b .audit
|
%patch200 -p1 -b .audit
|
||||||
%patch201 -p1 -b .audit-race
|
%patch201 -p1 -b .audit-race
|
||||||
@ -457,6 +469,8 @@ popd
|
|||||||
|
|
||||||
%patch100 -p1 -b .coverity
|
%patch100 -p1 -b .coverity
|
||||||
|
|
||||||
|
%patch1007 -p1 -b .sshrsacheck
|
||||||
|
|
||||||
autoreconf
|
autoreconf
|
||||||
pushd pam_ssh_agent_auth-pam_ssh_agent_auth-%{pam_ssh_agent_ver}
|
pushd pam_ssh_agent_auth-pam_ssh_agent_auth-%{pam_ssh_agent_ver}
|
||||||
autoreconf
|
autoreconf
|
||||||
@ -532,6 +546,7 @@ perl -pi -e "s|-lcrypto|%{_libdir}/libcrypto.a|g" Makefile
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%make_build
|
%make_build
|
||||||
|
make regress/misc/sk-dummy/sk-dummy.so
|
||||||
|
|
||||||
# Define a variable to toggle gnome1/gtk2 building. This is necessary
|
# Define a variable to toggle gnome1/gtk2 building. This is necessary
|
||||||
# because RPM doesn't handle nested %%if statements.
|
# because RPM doesn't handle nested %%if statements.
|
||||||
@ -623,6 +638,10 @@ pushd pam_ssh_agent_auth-pam_ssh_agent_auth-%{pam_ssh_agent_ver}
|
|||||||
%make_install
|
%make_install
|
||||||
popd
|
popd
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
install -m 755 -d $RPM_BUILD_ROOT%{_libdir}/sshtest/
|
||||||
|
install -m 755 regress/misc/sk-dummy/sk-dummy.so $RPM_BUILD_ROOT%{_libdir}/sshtest
|
||||||
|
|
||||||
%pre
|
%pre
|
||||||
getent group ssh_keys >/dev/null || groupadd -r ssh_keys || :
|
getent group ssh_keys >/dev/null || groupadd -r ssh_keys || :
|
||||||
|
|
||||||
@ -726,6 +745,9 @@ test -f %{sysconfig_anaconda} && \
|
|||||||
%attr(0755,root,root) %{_libexecdir}/openssh/ssh-askpass
|
%attr(0755,root,root) %{_libexecdir}/openssh/ssh-askpass
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
%files sk-dummy
|
||||||
|
%attr(0755,root,root) %{_libdir}/sshtest/sk-dummy.so
|
||||||
|
|
||||||
%if %{pam_ssh_agent}
|
%if %{pam_ssh_agent}
|
||||||
%files -n pam_ssh_agent_auth
|
%files -n pam_ssh_agent_auth
|
||||||
%license pam_ssh_agent_auth-pam_ssh_agent_auth-%{pam_ssh_agent_ver}/OPENSSH_LICENSE
|
%license pam_ssh_agent_auth-pam_ssh_agent_auth-%{pam_ssh_agent_ver}/OPENSSH_LICENSE
|
||||||
@ -734,6 +756,32 @@ test -f %{sysconfig_anaconda} && \
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Jan 12 2023 Dmitry Belyavskiy <dbelyavs@redhat.com> - 8.7p1-28
|
||||||
|
- Do not try to use SHA1 for host key ownership proof when we don't support it server-side
|
||||||
|
Resolves: rhbz#2088750
|
||||||
|
|
||||||
|
* Thu Jan 12 2023 Zoltan Fridrich <zfridric@redhat.com> - 8.7p1-27
|
||||||
|
- Add sk-dummy subpackage for test purposes
|
||||||
|
Resolves: rhbz#2092780
|
||||||
|
|
||||||
|
* Fri Jan 06 2023 Dmitry Belyavskiy <dbelyavs@redhat.com> - 8.7p1-26
|
||||||
|
- Fix one-byte overflow in SSH banner processing
|
||||||
|
Resolves: rhbz#2138345
|
||||||
|
- Fix double free() in error path
|
||||||
|
Resolves: rhbz#2138347
|
||||||
|
|
||||||
|
* Fri Dec 16 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 8.7p1-25
|
||||||
|
- Build fix after OpenSSL rebase
|
||||||
|
Resolves: rhbz#2153626
|
||||||
|
|
||||||
|
* Fri Sep 23 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 8.7p1-24
|
||||||
|
- Set minimal value of RSA key length via configuration option - support both names
|
||||||
|
Resolves: rhbz#2128352
|
||||||
|
|
||||||
|
* Thu Sep 22 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 8.7p1-23
|
||||||
|
- Set minimal value of RSA key length via configuration option
|
||||||
|
Resolves: rhbz#2128352
|
||||||
|
|
||||||
* Tue Aug 16 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 8.7p1-22
|
* Tue Aug 16 2022 Dmitry Belyavskiy <dbelyavs@redhat.com> - 8.7p1-22
|
||||||
- Avoid spirous message on connecting to the machine with ssh-rsa keys
|
- Avoid spirous message on connecting to the machine with ssh-rsa keys
|
||||||
Related: rhbz#2115246
|
Related: rhbz#2115246
|
||||||
|
Loading…
Reference in New Issue
Block a user