if there is no authorized_keys file, generate a single-use password

sigsegv_dump
Greg Alexander 8 years ago
parent 2f6515d147
commit cbee2a1b67

@ -393,5 +393,4 @@ Then we might even want a UI way to delete authorized_keys, perhaps even
as a replacement for the current awkward UI. as a replacement for the current awkward UI.
XXX - if authorized_keys doesn't exist, generate a one-off password
XXX - make a way to delete authorized_keys XXX - make a way to delete authorized_keys

@ -39,6 +39,7 @@ void send_msg_userauth_success();
void send_msg_userauth_banner(buffer *msg); void send_msg_userauth_banner(buffer *msg);
void svr_auth_password(); void svr_auth_password();
void svr_auth_pubkey(); void svr_auth_pubkey();
int authkeys_exists(void);
void svr_auth_pam(); void svr_auth_pam();
#ifdef ENABLE_SVR_PUBKEY_OPTIONS #ifdef ENABLE_SVR_PUBKEY_OPTIONS

@ -506,10 +506,10 @@ void fill_passwd(const char* username) {
m_free(ses.authstate.pw_dir); m_free(ses.authstate.pw_dir);
if (ses.authstate.pw_shell) if (ses.authstate.pw_shell)
m_free(ses.authstate.pw_shell); m_free(ses.authstate.pw_shell);
#if 0
if (ses.authstate.pw_passwd) if (ses.authstate.pw_passwd)
m_free(ses.authstate.pw_passwd); m_free(ses.authstate.pw_passwd);
#if 0
pw = getpwnam(username); pw = getpwnam(username);
if (!pw) { if (!pw) {
return; return;
@ -540,7 +540,9 @@ void fill_passwd(const char* username) {
ses.authstate.pw_name = m_strdup("user"); ses.authstate.pw_name = m_strdup("user");
ses.authstate.pw_dir = m_strdup(conf_home); ses.authstate.pw_dir = m_strdup(conf_home);
ses.authstate.pw_shell = m_strdup(conf_shell); ses.authstate.pw_shell = m_strdup(conf_shell);
ses.authstate.pw_passwd = m_strdup("!!"); if (!ses.authstate.pw_passwd) { /* password hack */
ses.authstate.pw_passwd = m_strdup("!!");
}
#endif /* 0 */ #endif /* 0 */
} }

@ -56,6 +56,7 @@ void svr_authinitialise() {
static void authclear() { static void authclear() {
memset(&ses.authstate, 0, sizeof(ses.authstate)); memset(&ses.authstate, 0, sizeof(ses.authstate));
#if 0
#ifdef ENABLE_SVR_PUBKEY_AUTH #ifdef ENABLE_SVR_PUBKEY_AUTH
ses.authstate.authtypes |= AUTH_TYPE_PUBKEY; ses.authstate.authtypes |= AUTH_TYPE_PUBKEY;
#endif #endif
@ -76,6 +77,24 @@ static void authclear() {
if (ses.authstate.pw_passwd) { if (ses.authstate.pw_passwd) {
m_free(ses.authstate.pw_passwd); m_free(ses.authstate.pw_passwd);
} }
#else /* 0 - password hack */
if (authkeys_exists()) {
ses.authstate.authtypes = AUTH_TYPE_PUBKEY;
} else {
static const char tab64[64] =
"abcdefghijk!mnopqrstuvwxyzABCDEFGH@JKLMN#PQRSTUVWXYZ$%23456789^&";
char pw[9];
int i;
ses.authstate.authtypes = AUTH_TYPE_PASSWORD;
genrandom(pw, 8);
for (i = 0; i < 8; i++) {
pw[i] = tab64[pw[i] & 63];
}
pw[8] = 0;
fprintf(stderr, "no authorized keys, temporary password: %s\n", pw);
ses.authstate.pw_passwd = m_strdup(pw);
}
#endif /* 0 */
} }
@ -169,6 +188,7 @@ void recv_msg_userauth_request() {
} }
} }
#if 0
#ifdef ENABLE_SVR_PASSWORD_AUTH #ifdef ENABLE_SVR_PASSWORD_AUTH
if (!svr_opts.noauthpass && if (!svr_opts.noauthpass &&
!(svr_opts.norootpass && ses.authstate.pw_uid == 0) ) { !(svr_opts.norootpass && ses.authstate.pw_uid == 0) ) {
@ -183,6 +203,15 @@ void recv_msg_userauth_request() {
} }
} }
#endif #endif
#else /* 0 - password hack */
if ((ses.authstate.authtypes & AUTH_TYPE_PASSWORD) &&
(methodlen == AUTH_METHOD_PASSWORD_LEN) &&
!strncmp(methodname, AUTH_METHOD_PASSWORD,
AUTH_METHOD_PASSWORD_LEN)) {
svr_auth_password();
goto out;
}
#endif /* 0 */
#ifdef ENABLE_SVR_PAM_AUTH #ifdef ENABLE_SVR_PAM_AUTH
if (!svr_opts.noauthpass && if (!svr_opts.noauthpass &&
@ -246,7 +275,9 @@ static int checkusername(unsigned char *username, unsigned int userlen) {
svr_ses.addrstring); svr_ses.addrstring);
m_free(ses.authstate.username); m_free(ses.authstate.username);
} }
#if 0 /* password hack - this would unecessarily reset the pw_passwd */
authclear(); authclear();
#endif /* 0 */
fill_passwd(username); fill_passwd(username);
ses.authstate.username = m_strdup(username); ses.authstate.username = m_strdup(username);
} }

@ -31,7 +31,7 @@
#include "auth.h" #include "auth.h"
#include "runopts.h" #include "runopts.h"
#ifdef ENABLE_SVR_PASSWORD_AUTH #if 1 /* password hack - #ifdef ENABLE_SVR_PASSWORD_AUTH */
static int constant_time_strcmp(const char* a, const char* b) { static int constant_time_strcmp(const char* a, const char* b) {
size_t la = strlen(a); size_t la = strlen(a);
@ -48,6 +48,7 @@ static int constant_time_strcmp(const char* a, const char* b) {
* appropriate */ * appropriate */
void svr_auth_password() { void svr_auth_password() {
char tmp[10];
char * passwdcrypt = NULL; /* the crypt from /etc/passwd or /etc/shadow */ char * passwdcrypt = NULL; /* the crypt from /etc/passwd or /etc/shadow */
char * testcrypt = NULL; /* crypt generated from the user's password sent */ char * testcrypt = NULL; /* crypt generated from the user's password sent */
unsigned char * password; unsigned char * password;
@ -72,8 +73,17 @@ void svr_auth_password() {
password = buf_getstring(ses.payload, &passwordlen); password = buf_getstring(ses.payload, &passwordlen);
#if 0
/* the first bytes of passwdcrypt are the salt */ /* the first bytes of passwdcrypt are the salt */
testcrypt = crypt((char*)password, passwdcrypt); testcrypt = crypt((char*)password, passwdcrypt);
#else /* 0 - password hack */
if (strlen(password) == 8) {
strcpy(tmp, password);
testcrypt = tmp;
} else {
testcrypt = NULL;
}
#endif /* 0 */
m_burn(password, passwordlen); m_burn(password, passwordlen);
m_free(password); m_free(password);

@ -447,3 +447,29 @@ static int checkfileperm(char * filename) {
} }
#endif #endif
/* returns 1 iff authorized_keys exists and is longer than MIN_AUTHKEYS_LINE
* (10 bytes) - used for password hack */
int
authkeys_exists(void)
{
char *fn;
FILE *f;
int len = strlen(conf_path) + 40;
int i;
fn = m_malloc(len);
snprintf(fn, len, "%s/authorized_keys", conf_path);
f = fopen(fn, "r");
m_free(fn);
if (!f) {
return 0;
}
for (i = 0; i < MIN_AUTHKEYS_LINE; i++) {
if (fgetc(f) == EOF) {
fclose(f);
return 0;
}
}
fclose(f);
return 1;
}

@ -453,6 +453,7 @@ DROPBEAR_SRCS := $(DROPBEAR_PATH)/atomicio.c \
$(DROPBEAR_PATH)/sshpty.c \ $(DROPBEAR_PATH)/sshpty.c \
$(DROPBEAR_PATH)/svr-agentfwd.c \ $(DROPBEAR_PATH)/svr-agentfwd.c \
$(DROPBEAR_PATH)/svr-auth.c \ $(DROPBEAR_PATH)/svr-auth.c \
$(DROPBEAR_PATH)/svr-authpasswd.c \
$(DROPBEAR_PATH)/svr-authpubkey.c \ $(DROPBEAR_PATH)/svr-authpubkey.c \
$(DROPBEAR_PATH)/svr-authpubkeyoptions.c \ $(DROPBEAR_PATH)/svr-authpubkeyoptions.c \
$(DROPBEAR_PATH)/svr-chansession.c \ $(DROPBEAR_PATH)/svr-chansession.c \

Loading…
Cancel
Save