Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 28 Jul 2001 15:51:59 +0400
From:      Yar Tikhiy <yar@freebsd.org>
To:        audit@freebsd.org
Subject:   finger(1) & fingerd(8)
Message-ID:  <20010728155159.A35483@snark.rinet.ru>

next in thread | raw e-mail | index | archive | help
Hi,

Currently, finger(1) reveals user information if the user
has created the ``.nofinger'' file, but his home directory
is unreadable for finger(1).

In the case of local access, it's no problem, since anyone may read
/etc/passwd directly. OTOH, letting remote folks peek at user
information even if the user wants to hide himself is a bad thing.

Therefore, a patch is proposed that adds an option telling finger(1)
fingerd(1) not to show users whose home directories are unreadable.

Another way is not to do the bad thing by default. Any comments?

-- 
Yar

Index: finger/finger.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/finger/finger.c,v
retrieving revision 1.24
diff -u -r1.24 finger.c
--- finger/finger.c	2001/03/21 18:43:49	1.24
+++ finger/finger.c	2001/07/28 11:33:16
@@ -88,7 +88,7 @@
 
 DB *db;
 time_t now;
-int entries, lflag, mflag, pplan, sflag, oflag, Tflag;
+int entries, lflag, mflag, pplan, sflag, oflag, Hflag, Tflag;
 int d_first = -1;
 char tbuf[1024];
 
@@ -105,7 +105,7 @@
 
 	optind = 1;		/* reset getopt */
 
-	while ((ch = getopt(argc, argv, "lmpshoT")) != -1)
+	while ((ch = getopt(argc, argv, "lmpshoHT")) != -1)
 		switch(ch) {
 		case 'l':
 			lflag = 1;		/* long format */
@@ -125,6 +125,9 @@
 		case 'o':
 			oflag = 1;		/* office info */
 			break;
+		case 'H':
+			Hflag = 1;		/* hide if home unreadable */
+			break;
 		case 'T':
 			Tflag = 1;		/* disable T/TCP */
 			break;
@@ -139,7 +142,7 @@
 static void
 usage()
 {
-	(void)fprintf(stderr, "usage: finger [-lmpshoT] [login ...]\n");
+	(void)fprintf(stderr, "usage: finger [-lmpshoHT] [login ...]\n");
 	exit(1);
 }
 
Index: finger/pathnames.h
===================================================================
RCS file: /home/ncvs/src/usr.bin/finger/pathnames.h,v
retrieving revision 1.4
diff -u -r1.4 pathnames.h
--- finger/pathnames.h	2001/01/04 10:03:44	1.4
+++ finger/pathnames.h	2001/07/28 11:33:16
@@ -29,6 +29,7 @@
 #ifndef PATHNAMES_H
 
 #define	_PATH_FORWARD	".forward"
+#define	_PATH_NOFINGER	".nofinger"
 #define	_PATH_PLAN	".plan"
 #define	_PATH_PROJECT	".project"
 #define	_PATH_PUBKEY	".pubkey"
Index: finger/util.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/finger/util.c,v
retrieving revision 1.13
diff -u -r1.13 util.c
--- finger/util.c	2001/03/01 05:52:38	1.13
+++ finger/util.c	2001/07/28 11:33:16
@@ -57,7 +57,10 @@
 #include <unistd.h>
 #include <utmp.h>
 #include "finger.h"
+#include "pathnames.h"
 
+extern int	 Hflag;
+
 static void	 find_idle_and_ttywrite __P((WHERE *));
 static void	 userinfo __P((PERSON *, struct passwd *));
 static WHERE	*walloc __P((PERSON *));
@@ -415,8 +418,11 @@
 
 	if (!pw->pw_dir)
 		return 0;
+
+	if (Hflag && access(pw->pw_dir, R_OK) == -1)
+		return 1;
 
-	snprintf(buf, sizeof(buf), "%s/.nofinger", pw->pw_dir);
+	snprintf(buf, sizeof(buf), "%s/%s", pw->pw_dir, _PATH_NOFINGER);
 
 	if (access(buf, F_OK) == 0)
 		return 1;
Index: fingerd/fingerd.c
===================================================================
RCS file: /home/ncvs/src/libexec/fingerd/fingerd.c,v
retrieving revision 1.17
diff -u -r1.17 fingerd.c
--- fingerd/fingerd.c	2001/01/20 00:29:31	1.17
+++ fingerd/fingerd.c	2001/07/28 11:33:16
@@ -73,16 +73,16 @@
 	register int ch;
 	register char *lp;
 	struct sockaddr_storage ss;
-	int p[2], logging, secure, sval;
+	int p[2], hideprotected, logging, secure, sval;
 #define	ENTRIES	50
-	char **ap, *av[ENTRIES + 1], **comp, line[1024], *prog;
+	char **ap, *av[ENTRIES + 1], **avlast, **comp, line[1024], *prog;
 	char rhost[MAXHOSTNAMELEN];
 
 	prog = _PATH_FINGER;
-	logging = secure = 0;
+	hideprotected = logging = secure = 0;
 	openlog("fingerd", LOG_PID | LOG_CONS, LOG_DAEMON);
 	opterr = 0;
-	while ((ch = getopt(argc, argv, "slp:")) != -1)
+	while ((ch = getopt(argc, argv, "slp:H")) != -1)
 		switch (ch) {
 		case 'l':
 			logging = 1;
@@ -93,6 +93,9 @@
 		case 's':
 			secure = 1;
 			break;
+		case 'H':
+			hideprotected = 1;
+			break;
 		case '?':
 		default:
 			logerr("illegal option -- %c", optopt);
@@ -140,12 +143,15 @@
 		syslog(LOG_NOTICE, "query from %s: `%s'", rhost, t);
 	}
 
-	comp = &av[1];
-	av[2] = "--";
-	for (lp = line, ap = &av[3];;) {
+	avlast = &av[1];
+	comp = avlast++;
+	if (hideprotected)
+		*avlast++ = "-H";
+	*avlast++ = "--";
+	for (lp = line, ap = avlast;;) {
 		*ap = strtok(lp, " \t\r\n");
 		if (!*ap) {
-			if (secure && ap == &av[3]) {
+			if (secure && ap == avlast) {
 				puts("must provide username\r\n");
 				exit(1);
 			}

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




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