svn commit: r253887 - head/sys/dev/filemon

Jilles Tjoelker jilles at stack.nl
Sun Aug 4 10:03:21 UTC 2013


On Sun, Aug 04, 2013 at 12:15:23PM +0900, Hiroki Sato wrote:
> Jilles Tjoelker <jilles at stack.nl> wrote
>   in <20130802152204.GA1880 at stack.nl>:

> ji> You can simplify the code using the fairly new pget(). This will also
> ji> fix the incorrect errno when the process does not exist (should be
> ji> [ESRCH]).
> ji>
> ji> This change is a step in the right direction but is incomplete. Although
> ji> the check protects currently running processes, I do not see how it
> ji> prevents tracing a process that gets the same PID again after the
> ji> original target process has exited. This not only leaks sensitive
> ji> information but may also prevent tracing by the legitimate owner of the
> ji> process (because only one filemon will write events for a process). This
> ji> could be fixed by setting filemon->pid = -1 in
> ji> filemon_wrapper_sys_exit() and not allowing P_WEXIT and zombies in
> ji> FILEMON_SET_PID (PGET_NOTWEXIT disallows both). An [EBUSY] when there is
> ji> already a filemon monitoring the process may also be useful (or writing
> ji> copies of the events to all attached filemons).

>  Thank you for your comments.  Can you review the attached patch?  If
>  there is no problem, I will commit this and MFC to stable branches.

> Index: sys/dev/filemon/filemon.c
> ===================================================================
> --- sys/dev/filemon/filemon.c	(revision 253911)
> +++ sys/dev/filemon/filemon.c	(working copy)
> @@ -164,13 +164,12 @@
> 
>  	/* Set the monitored process ID. */
>  	case FILEMON_SET_PID:
> -		p = pfind(*((pid_t *)data));
> -		if (p == NULL)
> -			return (EINVAL);
> -		error = p_candebug(curthread, p);
> -		if (error == 0)
> +		error = pget(*((pid_t *)data), PGET_CANDEBUG | PGET_NOTWEXIT,
> +		    &p);
> +		if (error == 0) {
>  			filemon->pid = p->p_pid;
> -		PROC_UNLOCK(p);
> +			PROC_UNLOCK(p);
> +		}
>  		break;
> 
>  	default:
> Index: sys/dev/filemon/filemon_wrapper.c
> ===================================================================
> --- sys/dev/filemon/filemon_wrapper.c	(revision 253911)
> +++ sys/dev/filemon/filemon_wrapper.c	(working copy)
> @@ -574,6 +574,7 @@
>  			    (uintmax_t)now.tv_sec, (uintmax_t)now.tv_usec);
> 
>  			filemon_output(filemon, filemon->msgbufr, len);
> +			filemon->pid = -1;
>  		}
> 
>  		/* Unlock the found filemon structure. */

This looks OK, but I have not tested it.

I think filemon_ioctl() may need to lock the struct filemon. Replacing
the fp seems particularly unsafe.

I did not fully know about the recursive effect on child processes when
I wrote my earlier mail. Filemon allows tracing setuid programs this
way, which may be a security risk and is not possible with ktrace/truss.
Perhaps it is best to commit this patch, but also add a warning to
filemon(4) that it should not be loaded on systems with untrusted users
or the permissions on /dev/filemon should be restricted (via
/etc/devfs.rules).

-- 
Jilles Tjoelker


More information about the svn-src-all mailing list