Date: Sun, 28 Jun 1998 00:13:13 +0900 (JST) From: Just Another Perl Hacker <japh@gol.com> To: FreeBSD-gnats-submit@FreeBSD.ORG Subject: bin/7090: crypt(3) partially returns raw password when salt isn't null-terminated Message-ID: <199806271513.AAA26526@mew.gol.ad.jp>
next in thread | raw e-mail | index | archive | help
>Number: 7090
>Category: bin
>Synopsis: crypt(3) partially returns raw password when salt isn't null-terminated
>Confidential: no
>Severity: serious
>Priority: high
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sat Jun 27 08:20:00 PDT 1998
>Last-Modified:
>Originator: Junichi Kurokawa, AKA Just Another Perl Hacker
>Organization:
Global Online Japan Corporation, Tokyo
>Release: FreeBSD 2.2.6-RELEASE i386
>Environment:
FreeBSD 2.2.6-RELEASE, with MD5 based libcrypt
>Description:
MD5 based crypt(3) in libcrypt.{a,so.maj.min} as distributed
by FreeBSD returns a portion of the password in the clear,
when the salt isn't terminated by a null character.
Example:
crypt("abcdefgh","YX") returns <$1$YXabcdef$.tHXoLufzR8OYyH4BBghm1
^^^^^^
This problem surfaces when an application that assumes a salt
is an array of two characters with no trailing null character
calls crypt(3). Such an example is xlock(1), with USE_XLOCKRC
defined in the compilation.
This is actually an operating system problem of FreeBSD that
can cause any C based application to reproduce; however, only
FreeBSD seems to have both this problem shown herein, and an
implementation of crypt(3) that does not assume that a salt is
a two bytes array with no terminating null character.
DESfied crypt(3) therefore does not exhibit this problem.
Also, FreeBSD's /usr/bin/passwd(1) command puts a null
character with a salt correctly when calling crypt(3).
>How-To-Repeat:
The following code demonstrates that a portioin of the raw
password is exposed in an output of crypt(3).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define PW "abcdefgh"
int
main(int argc, char** argv)
{
char pw[sizeof PW];
char salt[2];
strncpy(pw,PW,sizeof PW);
salt[0]='Y';
salt[1]='X';
fprintf(stdout,"password is <%s>.\n",pw);
fprintf(stdout,"salt is <%s>.\n",salt);
fprintf(stdout,"crypt(3) returned <%s>.\n",crypt(pw,salt));
return EXIT_SUCCESS;
}
% ./followingcode
password is <abcdefgh>.
salt is <YXabcdefgh>.
crypt(3) returned <$1$YXabcdef$.tHXoLufzR8OYyH4BBghm1>.
The salt seen at the second line should merely have been <YX>,
as well as the salt contained in the crypt(3)'s output which
is followed by a portion of the raw password.
>Fix:
Workaround: always terminate a salt with a null character.
Modify the source of an application when necessary.
Real Fix: refrain any use of crypt(3) altogether, until a
meaningful replacement of crypt(3) is implemented;
e.g. md5_crypt(3) as opposed to des_crypt(3), such that a salt
is wholelly copied onto the stack instead of pointed by a
pointer when passed to md5_crypt(3).
Comment to Maintainer: should I submit md5_crypt(3)?
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199806271513.AAA26526>
