On Sun, Aug 04, 2013 at 12:15:23PM +0900, Hiroki Sato wrote:
> Jilles Tjoelker <jil...@stack.nl> wrote
>   in <20130802152204.ga1...@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
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to