Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 3 May 2001 15:37:44 +0300
From:      Peter Pentchev <roam@orbitel.bg>
To:        Gerhard Sittig <Gerhard.Sittig@gmx.net>
Cc:        freebsd-security@freebsd.org
Subject:   Re: useradd/adduser
Message-ID:  <20010503153744.D98293@ringworld.oblivion.bg>
In-Reply-To: <20010502213719.C253@speedy.gsinet>; from Gerhard.Sittig@gmx.net on Wed, May 02, 2001 at 09:37:19PM %2B0200
References:  <200105021613.RAA25130@mailgate.kechara.net> <20010502180257.B88365@ringworld.oblivion.bg> <20010502180543.C88365@ringworld.oblivion.bg> <20010502202157.A76656@daphne.unloved.org> <20010502214032.F88365@ringworld.oblivion.bg> <20010502213719.C253@speedy.gsinet>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, May 02, 2001 at 09:37:19PM +0200, Gerhard Sittig wrote:
> On Wed, May 02, 2001 at 21:40 +0300, Peter Pentchev wrote:
> > On Wed, May 02, 2001 at 08:21:57PM +0200, Ashley Penney wrote:
> > > On Wed, May 02, 2001 at 06:05:43PM +0300, Peter Pentchev said:
> > >  
> > > > And if you're really, really interested, I could give you a
> > > > little patch I made some time ago, to add a -H encrypted
> > > > pass option to pw(8), which should do exactly what you need
> > > > :)
> > >  
> > > What's wrong with chpass -p "crypthere" user ?
> > 
> > OK, several people pointed that out already :) I didn't know
> > chpass could do that, ok? :)
> 
> Not quite in all respects.  There's a short discussion in "man 8
> pw" for how the -h option and feeding it from an fd is motivated.
> By using pw(8)'s -p option you end up specifying the crypted form
> on the command line, again.  Whereas producing into an fd could
> be done any way you could think of ...
> 
> To cut it short:  I would be happy to see your (Peter's) -H
> option incorporated into pw(8).  I assume it does what -h does,
> too, but bypasses the crypt(3) call.  This should make the patch
> short and rather suitable for quick and smooth verification.

OK, here it is.  For those who've seen a similar patch on -arch
a couple of months ago, no, this one's not the same - the previous
version had the password on the command line, just as chpass -p does.
This one is similar to -h, and -H specifies an fd to read the encrypted
password from.

G'luck,
Peter

-- 
This sentence is false.

Index: src/usr.sbin/pw/pw.8
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pw/pw.8,v
retrieving revision 1.23
diff -u -r1.23 pw.8
--- src/usr.sbin/pw/pw.8	2001/03/16 14:11:41	1.23
+++ src/usr.sbin/pw/pw.8	2001/05/03 12:32:15
@@ -50,6 +50,7 @@
 .Op Fl s Ar shell
 .Op Fl o
 .Op Fl L Ar class
+.Op Fl H Ar fd
 .Op Fl h Ar fd
 .Op Fl N
 .Op Fl P
@@ -100,6 +101,7 @@
 .Op Fl w Ar method
 .Op Fl s Ar shell
 .Op Fl L Ar class
+.Op Fl H Ar fd
 .Op Fl h Ar fd
 .Op Fl N
 .Op Fl P
@@ -128,6 +130,7 @@
 .Op Fl g Ar gid
 .Op Fl M Ar members
 .Op Fl o
+.Op Fl H Ar fd
 .Op Fl h Ar fd
 .Op Fl N
 .Op Fl P
@@ -151,6 +154,7 @@
 .Op Fl l Ar name
 .Op Fl M Ar members
 .Op Fl m Ar newmembers
+.Op Fl H Ar fd
 .Op Fl h Ar fd
 .Op Fl N
 .Op Fl P
@@ -468,8 +472,9 @@
 See
 .Xr passwd 5
 for details.
+.It Fl H Ar fd
 .It Fl h Ar fd
-This option provides a special interface by which interactive scripts can
+These options provide a special interface by which interactive scripts can
 set an account password using
 .Nm .
 Because the command line and environment are fundamentally insecure mechanisms
@@ -496,6 +501,18 @@
 .Xr passwd 1 ,
 this must be implemented as part of an interactive script that calls
 .Nm .
+.Pp
+If
+.Fl h
+is given,
+.Nm
+treats the read password as plaintext, and encrypts it using
+.Xr crypt 3 .
+If
+.Fl H
+is used,
+.Nm
+treats the read password as already encrypted, and stores it unchanged.
 .Pp
 If a value of
 .Ql \&-
Index: src/usr.sbin/pw/pw.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pw/pw.c,v
retrieving revision 1.24
diff -u -r1.24 pw.c
--- src/usr.sbin/pw/pw.c	2001/03/14 03:24:30	1.24
+++ src/usr.sbin/pw/pw.c	2001/05/03 12:32:15
@@ -106,18 +106,18 @@
 	static const char *opts[W_NUM][M_NUM] =
 	{
 		{ /* user */
-			"V:C:qn:u:c:d:e:p:g:G:mk:s:oL:i:w:h:Db:NPy:Y",
+			"V:C:qn:u:c:d:e:p:g:G:mk:s:oL:i:w:h:H:Db:NPy:Y",
 			"V:C:qn:u:rY",
-			"V:C:qn:u:c:d:e:p:g:G:ml:k:s:w:L:h:FNPY",
+			"V:C:qn:u:c:d:e:p:g:G:ml:k:s:w:L:h:H:FNPY",
 			"V:C:qn:u:FPa7",
 			"V:C:q",
 			"V:C:q",
 			"V:C:q"
 		},
 		{ /* grp  */
-			"V:C:qn:g:h:M:pNPY",
+			"V:C:qn:g:h:H:M:pNPY",
 			"V:C:qn:g:Y",
-			"V:C:qn:g:l:h:FM:m:NPY",
+			"V:C:qn:g:l:h:H:FM:m:NPY",
 			"V:C:qn:g:FPa",
 			"V:C:q"
 		 }
Index: src/usr.sbin/pw/pw_group.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pw/pw_group.c,v
retrieving revision 1.13
diff -u -r1.13 pw_group.c
--- src/usr.sbin/pw/pw_group.c	2000/06/22 16:48:41	1.13
+++ src/usr.sbin/pw/pw_group.c	2001/05/03 12:32:16
@@ -158,7 +158,11 @@
 	 * software.
 	 */
 
-	if ((arg = getarg(args, 'h')) != NULL) {
+	if ((getarg(args, 'h') != NULL) && (getarg(args, 'H') != NULL))
+		err(EX_DATAERR, "-h and -H cannot be used simultaneously");
+
+	if (((arg = getarg(args, 'h')) != NULL) ||
+	    ((arg = getarg(args, 'H')) != NULL)) {
 		if (strcmp(arg->val, "-") == 0)
 			grp->gr_passwd = "*";	/* No access */
 		else {
@@ -177,7 +181,10 @@
 					/* Disable echo */
 					n.c_lflag &= ~(ECHO);
 					tcsetattr(fd, TCSANOW, &n);
-					printf("%sassword for group %s:", (mode == M_UPDATE) ? "New p" : "P", grp->gr_name);
+					printf("%sassword%s for group %s:",
+					    (mode == M_UPDATE) ? "New p" : "P",
+					    (arg->ch == 'H'? " (enc)": ""),
+					    grp->gr_name);
 					fflush(stdout);
 				}
 			}
@@ -188,7 +195,7 @@
 				fflush(stdout);
 			}
 			if (b < 0) {
-				warn("-h file descriptor");
+				warn("-%c file descriptor", arg->ch);
 				return EX_OSERR;
 			}
 			line[b] = '\0';
@@ -196,7 +203,10 @@
 				*p = '\0';
 			if (!*line)
 				errx(EX_DATAERR, "empty password read on file descriptor %d", fd);
-			grp->gr_passwd = pw_pwcrypt(line);
+			if (arg->ch == 'h')
+				grp->gr_passwd = pw_pwcrypt(line);
+			else
+				grp->gr_passwd = strdup(line);
 		}
 	}
 
Index: src/usr.sbin/pw/pw_user.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/pw/pw_user.c,v
retrieving revision 1.46
diff -u -r1.46 pw_user.c
--- src/usr.sbin/pw/pw_user.c	2001/03/21 13:46:09	1.46
+++ src/usr.sbin/pw/pw_user.c	2001/05/03 12:32:17
@@ -601,7 +601,11 @@
 		}
 	}
 
-	if ((arg = getarg(args, 'h')) != NULL) {
+	if ((getarg(args, 'h') != NULL) && (getarg(args, 'H') != NULL))
+		errx(EX_DATAERR, "-h and -H cannot be used simultaneously");
+	
+	if (((arg = getarg(args, 'h')) != NULL) ||
+	    ((arg = getarg(args, 'H')) != NULL)) {
 		if (strcmp(arg->val, "-") == 0) {
 			if (!pwd->pw_passwd || *pwd->pw_passwd != '*') {
 				pwd->pw_passwd = "*";	/* No access */
@@ -623,7 +627,10 @@
 					/* Disable echo */
 					n.c_lflag &= ~(ECHO);
 					tcsetattr(fd, TCSANOW, &n);
-					printf("%sassword for user %s:", (mode == M_UPDATE) ? "New p" : "P", pwd->pw_name);
+					printf("%sassword%s for user %s:",
+					    (mode == M_UPDATE) ? "New p" : "P",
+					    (arg->ch == 'H'? " (enc)": ""),
+					    pwd->pw_name);
 					fflush(stdout);
 				}
 			}
@@ -634,7 +641,7 @@
 				fflush(stdout);
 			}
 			if (b < 0) {
-				warn("-h file descriptor");
+				warn("-%c file descriptor", arg->ch);
 				return EX_IOERR;
 			}
 			line[b] = '\0';
@@ -647,7 +654,10 @@
 			    login_setcryptfmt(lc, "md5", NULL) == NULL)
 				warn("setting crypt(3) format");
 			login_close(lc);
-			pwd->pw_passwd = pw_pwcrypt(line);
+			if (arg->ch == 'h')
+				pwd->pw_passwd = pw_pwcrypt(line);
+			else
+				pwd->pw_passwd = strdup(line);
 			edited = 1;
 		}
 	}

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-security" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010503153744.D98293>