summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2012-05-17 20:52:57 +0800
committerMatt Johnston <matt@ucc.asn.au>2012-05-17 20:52:57 +0800
commit0a65d477915cb445e95575521688810fe7905b4b (patch)
tree26190cb460eea91b4be9e81f655bbdf69aa257f5
parent9695acebf0b632af7baca39455b3f01d071181cc (diff)
downloaddropbear-insecure-nocrypto.tar.gz
- Only request "none" cipher after auth has succeededinsecure-nocrypto
-rw-r--r--cli-auth.c12
-rw-r--r--cli-session.c15
-rw-r--r--common-algo.c35
-rw-r--r--options.h4
-rw-r--r--session.h3
5 files changed, 54 insertions, 15 deletions
diff --git a/cli-auth.c b/cli-auth.c
index 97c12d8..321cbf3 100644
--- a/cli-auth.c
+++ b/cli-auth.c
@@ -257,13 +257,9 @@ void cli_auth_try() {
#endif
#ifdef ENABLE_CLI_INTERACT_AUTH
-#if defined(DROPBEAR_NONE_CIPHER) && !defined(ALLOW_NONE_PASSWORD_AUTH)
if (ses.keys->trans.algo_crypt->cipherdesc == NULL) {
fprintf(stderr, "Sorry, I won't let you use interactive auth unencrypted.\n");
- }
- else
-#endif
- if (!finished && ses.authstate.authtypes & AUTH_TYPE_INTERACT) {
+ } else if (!finished && ses.authstate.authtypes & AUTH_TYPE_INTERACT) {
if (cli_ses.auth_interact_failed) {
finished = 0;
} else {
@@ -275,13 +271,9 @@ void cli_auth_try() {
#endif
#ifdef ENABLE_CLI_PASSWORD_AUTH
-#if defined(DROPBEAR_NONE_CIPHER) && !defined(ALLOW_NONE_PASSWORD_AUTH)
if (ses.keys->trans.algo_crypt->cipherdesc == NULL) {
fprintf(stderr, "Sorry, I won't let you use password auth unencrypted.\n");
- }
- else
-#endif
- if (!finished && ses.authstate.authtypes & AUTH_TYPE_PASSWORD) {
+ } else if (!finished && ses.authstate.authtypes & AUTH_TYPE_PASSWORD) {
cli_auth_password();
finished = 1;
cli_ses.lastauthtype = AUTH_TYPE_PASSWORD;
diff --git a/cli-session.c b/cli-session.c
index 566dd2a..e58fdbd 100644
--- a/cli-session.c
+++ b/cli-session.c
@@ -133,6 +133,13 @@ static void cli_session_init() {
cli_ses.lastprivkey = NULL;
cli_ses.lastauthtype = 0;
+#ifdef DROPBEAR_NONE_CIPHER
+ cli_ses.cipher_none_after_auth = get_algo_usable(sshciphers, "none");
+ set_algo_usable(sshciphers, "none", 0);
+#else
+ cli_ses.cipher_none_after_auth = 0;
+#endif
+
/* For printing "remote host closed" for the user */
ses.remoteclosed = cli_remoteclosed;
ses.buf_match_algo = cli_buf_match_algo;
@@ -207,6 +214,14 @@ static void cli_sessionloop() {
case USERAUTH_SUCCESS_RCVD:
+#ifdef DROPBEAR_NONE_CIPHER
+ if (cli_ses.cipher_none_after_auth)
+ {
+ set_algo_usable(sshciphers, "none", 1);
+ send_msg_kexinit();
+ }
+#endif
+
if (cli_opts.backgrounded) {
int devnull;
/* keeping stdin open steals input from the terminal and
diff --git a/common-algo.c b/common-algo.c
index 0e1a64c..8c1ee04 100644
--- a/common-algo.c
+++ b/common-algo.c
@@ -301,6 +301,38 @@ void buf_put_algolist(buffer * buf, algo_type localalgos[]) {
buf_free(algolist);
}
+#ifdef DROPBEAR_NONE_CIPHER
+
+void
+set_algo_usable(algo_type algos[], const char * algo_name, int usable)
+{
+ algo_type *a;
+ for (a = algos; a->name != NULL; a++)
+ {
+ if (strcmp(a->name, algo_name) == 0)
+ {
+ a->usable = usable;
+ return;
+ }
+ }
+}
+
+int
+get_algo_usable(algo_type algos[], const char * algo_name)
+{
+ algo_type *a;
+ for (a = algos; a->name != NULL; a++)
+ {
+ if (strcmp(a->name, algo_name) == 0)
+ {
+ return a->usable;
+ }
+ }
+ return 0;
+}
+
+#endif // DROPBEAR_NONE_CIPHER
+
#ifdef ENABLE_USER_ALGO_LIST
char *
@@ -367,7 +399,8 @@ check_user_algos(const char* user_algo_list, algo_type * algos,
{
*c = '\0';
try_add_algo(last_name, algos, algo_desc, new_algos, &num_ret);
- last_name = c++;
+ c++;
+ last_name = c;
}
}
try_add_algo(last_name, algos, algo_desc, new_algos, &num_ret);
diff --git a/options.h b/options.h
index e3cdcf3..8cccb3c 100644
--- a/options.h
+++ b/options.h
@@ -106,10 +106,6 @@ much traffic. */
* the only safe auth method is public key. */
#define DROPBEAR_NONE_CIPHER
-/* Define this to allow password authentication even when no encryption
- * is being used. This can be unsafe */
-#define ALLOW_NONE_PASSWORD_AUTH
-
/* Message Integrity - at least one required.
* Protocol RFC requires sha1 and recommends sha1-96.
* sha1-96 is of use for slow links as it has a smaller overhead.
diff --git a/session.h b/session.h
index 941dcb9..e9695fe 100644
--- a/session.h
+++ b/session.h
@@ -269,6 +269,9 @@ struct clientsession {
int interact_request_received; /* flag whether we've received an
info request from the server for
interactive auth.*/
+
+ int cipher_none_after_auth; /* Set to 1 if the user requested "none"
+ auth */
#endif
sign_key *lastprivkey;