Module Name: src Committed By: jym Date: Tue Oct 25 22:13:22 UTC 2011
Modified Files: src/usr.bin/pmap: main.c Log Message: kill(2) might not be a good test after all, users can send signals to setuid binaries (like SIGINT for ping(8)). So apply the exact same rights as procfs, and test uid against proc p_uid (real owner of process). Bail out if we are not root and we attempt to print mappings of a process that the user does not really own. To generate a diff of this commit: cvs rdiff -u -r1.22 -r1.23 src/usr.bin/pmap/main.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/pmap/main.c diff -u src/usr.bin/pmap/main.c:1.22 src/usr.bin/pmap/main.c:1.23 --- src/usr.bin/pmap/main.c:1.22 Tue Oct 18 20:54:56 2011 +++ src/usr.bin/pmap/main.c Tue Oct 25 22:13:22 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.22 2011/10/18 20:54:56 jym Exp $ */ +/* $NetBSD: main.c,v 1.23 2011/10/25 22:13:22 jym Exp $ */ /* * Copyright (c) 2002, 2003 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: main.c,v 1.22 2011/10/18 20:54:56 jym Exp $"); +__RCSID("$NetBSD: main.c,v 1.23 2011/10/25 22:13:22 jym Exp $"); #endif #include <sys/param.h> @@ -118,6 +118,7 @@ main(int argc, char *argv[]) { kvm_t *kd; pid_t pid; + uid_t uid; int which, many, ch, rc; char errbuf[_POSIX2_LINE_MAX + 1]; struct kinfo_proc2 *kproc; @@ -308,33 +309,36 @@ main(int argc, char *argv[]) } } - /* - * Only print mappings for processes we can send a signal(7) - * to, or kernel mappings if we are root - */ - if (kill(pid, 0) == -1 || - (pid == 0 && getuid() != 0)) { - errno = EPERM; - warn("%d", pid); - pid = -1; - continue; - - } + uid = getuid(); + errno = 0; /* find the process id */ - if (pid == 0) + if (pid == 0) { kproc = NULL; - else { + if (uid != 0) { + /* only root can print kernel mappings */ + errno = EPERM; + } + } else { kproc = kvm_getproc2(kd, KERN_PROC_PID, pid, - sizeof(struct kinfo_proc2), &rc); + sizeof(struct kinfo_proc2), &rc); if (kproc == NULL || rc == 0) { errno = ESRCH; - warn("%d", pid); - pid = -1; - continue; + } else if (uid != 0 && uid != kproc->p_uid) { + /* + * only the real owner of the process and + * root can print process mappings + */ + errno = EPERM; } } + if (errno != 0) { + warn("%d", pid); + pid = -1; + continue; + } + /* dump it */ if (many) { if (kproc)