[patch] Make passphrase-protected SSHv1 keys work again

Joachim Schipper joachim at joachimschipper.nl
Sun Nov 28 00:35:43 EST 2010


ssh-add on OpenBSD current (with malloc -S enabled) crashes ("chunk is
already free") when loading my password-protected SSHv1 key (used only
for testing). "ssh-add ~/.ssh/identity" also fails to format the prompt
properly ("Enter passphrase for :").

The issue is as follows:

Starting at ssh-add.c:158 in add_file(ac, filename = "~/.ssh/identity"),
we call
key_load_private(filename = "~/.ssh/identity", passphrase = "", commentp = &comment)
key_parse_private_type(blob = <contents of ~/.ssh/identity>, KEY_RSA1, passphrase = "", commentp = &comment)
key_parse_private_rsa1(blob, passphrase = "", commentp = &comment).

In key_parse_private_rsa1, at authfile.c:423-424, we execute

	if (commentp)
		*commentp = buffer_get_string(blob, NULL);

However, the empty passphrase is not correct (recall that my
~/.ssh/identity file has a passphrase), we fail to load the key and
"goto fail" at authfile.c:455?, and execute

fail:
	if (commentp)
		xfree(*commentp);

so when key_parse_private_rsa1 returns NULL (and key_parse_private_type
and key_load_private return the same value), commentp points into
deallocated space. Unfortunately, since commentp != NULL, add_file
assumes that it is valid, uses it and calls xfree at ssh-add.c:462.

Also note that *commentp as allocated at authfile.c:687 leaks.

The patch below reverts a small part of authfile.c r1.86 ("Refactor
internals of private key loading and saving to work on memory buffers
rather than directly on files."), and solves this issue.

		Joachim

Index: authfile.c
===================================================================
RCS file: /usr/cvs/src/src/usr.bin/ssh/authfile.c,v
retrieving revision 1.86
diff -u -p -r1.86 authfile.c
--- authfile.c	21 Nov 2010 10:57:07 -0000	1.86
+++ authfile.c	27 Nov 2010 13:28:27 -0000
@@ -695,7 +695,7 @@ key_load_private(const char *filename, c
 	} else {
 		key_free(pub);
 		prv = key_parse_private_type(&buffer, KEY_RSA1, passphrase,
-		    commentp);
+		    NULL);
 	}
 	buffer_free(&buffer);
 	return prv;


More information about the openssh-unix-dev mailing list