a trouble about filename authentication in 2.9.9p2

JINMEI Tatuya / 神明達哉 jinmei at isl.rdc.toshiba.co.jp
Wed Oct 3 15:38:00 EST 2001


Hello,

After upgrading OpenSSH to 2.9.9p2, I've found some troubles on public
key authentication with an sshd working at Solaris 2.5.1 machine.

The server failed to validate the user's path in
auth.c:secure_filename().  There were actually two reasons for the
trouble:

1. the "realpath" of pw->pw_dir (that realpath() would return) was
   different from pw->pw_dir itself.  Thus, comparing the directory
   name to each directory in the for loop of the function never
   succeeded.
2. Our Solaris box had its own dirname(), which returned an empty
   string for the root directory.  So the stat() call in the for loop
   failed for the root directory.

I've attached a patch to fix the problem 1 to this message.  For the
problem 2, we're using a quick patch to check the empty string in
secure_filename(), but I'm not sure if this is the correct fix.  We
might rather use the shared dirname() in openbsd-compat/dirname.c.  So
I've not included the quick hack for now.

I'd apologize in advance if this is a well-known issue and/or has
already been fixed.

					JINMEI, Tatuya
					Communication Platform Lab.
					Corporate R&D Center, Toshiba Corp.
					jinmei at isl.rdc.toshiba.co.jp

p.s. I don't subscribe to the list, so if anyone of you need further
information or questions on this issue, please include me in the
response explicitly.  Thanks.

*** auth.c.orig	Wed Oct  3 14:15:47 2001
--- auth.c	Wed Oct  3 14:14:43 2001
***************
*** 363,369 ****
      char *err, size_t errlen)
  {
  	uid_t uid = pw->pw_uid;
! 	char buf[MAXPATHLEN];
  	char *cp;
  	struct stat st;
  
--- 363,369 ----
      char *err, size_t errlen)
  {
  	uid_t uid = pw->pw_uid;
! 	char buf[MAXPATHLEN], pwbuf[MAXPATHLEN];
  	char *cp;
  	struct stat st;
  
***************
*** 372,377 ****
--- 372,382 ----
  		    strerror(errno));
  		return -1;
  	}
+ 	if (realpath(pw->pw_dir, pwbuf) == NULL) {
+ 		snprintf(err, errlen, "realpath %s failed: %s", pw->pw_dir,
+ 		    strerror(errno));
+ 		return -1;
+ 	}
  
  	/* check the open file to avoid races */
  	if (fstat(fileno(f), &st) < 0 ||
***************
*** 400,406 ****
  		}
  
  		/* If are passed the homedir then we can stop */
! 		if (strcmp(pw->pw_dir, buf) == 0) {
  			debug3("secure_filename: terminating check at '%s'",
  			    buf);
  			break;
--- 405,411 ----
  		}
  
  		/* If are passed the homedir then we can stop */
! 		if (strcmp(pwbuf, buf) == 0) {
  			debug3("secure_filename: terminating check at '%s'",
  			    buf);
  			break;




More information about the openssh-unix-dev mailing list