2012-06-04 22:59:06 +00:00
|
|
|
.\" Copyright (c) 2012
|
|
|
|
.\" David E. O'Brien <obrien@FreeBSD.org>. All rights reserved.
|
|
|
|
.\"
|
|
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
|
|
.\" modification, are permitted provided that the following conditions
|
|
|
|
.\" are met:
|
|
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
|
|
.\" 3. All advertising materials mentioning features or use of this software
|
2012-06-06 16:51:33 +00:00
|
|
|
.\" must display the following acknowledgment:
|
2012-06-04 22:59:06 +00:00
|
|
|
.\" This product includes software developed by David E. O'Brien and
|
|
|
|
.\" contributors.
|
|
|
|
.\" 4. Neither the name of the author nor the names of its contributors
|
|
|
|
.\" may be used to endorse or promote products derived from this software
|
|
|
|
.\" without specific prior written permission.
|
|
|
|
.\"
|
|
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
2012-06-06 16:51:33 +00:00
|
|
|
.\" IMPLIED WARRANTIES OF MERCHANT ABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
2012-06-04 22:59:06 +00:00
|
|
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
|
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
.\" SUCH DAMAGE.
|
|
|
|
.\"
|
|
|
|
.\" $FreeBSD$
|
|
|
|
.\"
|
2016-03-22 19:39:50 +00:00
|
|
|
.Dd March 22, 2016
|
2012-06-04 22:59:06 +00:00
|
|
|
.Dt FILEMON 4
|
|
|
|
.Os
|
|
|
|
.Sh NAME
|
|
|
|
.Nm filemon
|
|
|
|
.Nd the filemon device
|
|
|
|
.Sh SYNOPSIS
|
|
|
|
.In dev/filemon/filemon.h
|
|
|
|
.Sh DESCRIPTION
|
|
|
|
The
|
|
|
|
.Nm
|
|
|
|
device allows a process to collect file operations data of its children.
|
|
|
|
The device
|
|
|
|
.Pa /dev/filemon
|
|
|
|
responds to two
|
|
|
|
.Xr ioctl 2
|
|
|
|
calls.
|
|
|
|
.Pp
|
2016-01-29 01:00:12 +00:00
|
|
|
.Nm
|
|
|
|
is not intended to be a security auditing tool.
|
2016-03-22 19:39:50 +00:00
|
|
|
Many system calls are not tracked and binaries of foreign ABI will not be fully
|
2016-01-29 01:00:12 +00:00
|
|
|
audited.
|
|
|
|
It is intended for auditing of processes for the purpose of determining its
|
|
|
|
dependencies in an efficient and easily parsable format.
|
|
|
|
An example of this is
|
|
|
|
.Xr make 1
|
|
|
|
which uses this module with
|
|
|
|
.Sy .MAKE.MODE=meta
|
|
|
|
to handle incremental builds more smartly.
|
|
|
|
.Pp
|
2012-06-04 22:59:06 +00:00
|
|
|
System calls are denoted using the following single letters:
|
2012-06-05 20:32:38 +00:00
|
|
|
.Pp
|
2012-06-04 22:59:06 +00:00
|
|
|
.Bl -tag -width indent -compact
|
2016-03-21 20:29:49 +00:00
|
|
|
.It Ql A
|
|
|
|
.Xr openat 2 .
|
|
|
|
The next log entry may be lacking an absolute path or be inaccurate.
|
2012-06-05 20:32:38 +00:00
|
|
|
.It Ql C
|
2012-06-04 22:59:06 +00:00
|
|
|
.Xr chdir 2
|
2012-06-05 20:32:38 +00:00
|
|
|
.It Ql D
|
2012-06-04 22:59:06 +00:00
|
|
|
.Xr unlink 2
|
2012-06-05 20:32:38 +00:00
|
|
|
.It Ql E
|
2012-06-04 22:59:06 +00:00
|
|
|
.Xr exec 2
|
2012-06-05 20:32:38 +00:00
|
|
|
.It Ql F
|
2012-06-04 22:59:06 +00:00
|
|
|
.Xr fork 2 ,
|
|
|
|
.Xr vfork 2
|
2012-06-05 20:32:38 +00:00
|
|
|
.It Ql L
|
2012-06-04 22:59:06 +00:00
|
|
|
.Xr link 2 ,
|
|
|
|
.Xr linkat 2 ,
|
|
|
|
.Xr symlink 2 ,
|
|
|
|
.Xr symlinkat 2
|
2012-06-05 20:32:38 +00:00
|
|
|
.It Ql M
|
2012-06-04 22:59:06 +00:00
|
|
|
.Xr rename 2
|
2012-06-05 20:32:38 +00:00
|
|
|
.It Ql R
|
2012-06-04 22:59:06 +00:00
|
|
|
.Xr open 2
|
2016-03-21 20:29:49 +00:00
|
|
|
or
|
|
|
|
.Xr openat 2
|
2012-06-04 22:59:06 +00:00
|
|
|
for read
|
2012-06-05 20:32:38 +00:00
|
|
|
.It Ql W
|
2012-06-04 22:59:06 +00:00
|
|
|
.Xr open 2
|
2016-03-21 20:29:49 +00:00
|
|
|
or
|
|
|
|
.Xr openat 2
|
2012-06-04 22:59:06 +00:00
|
|
|
for write
|
2012-06-05 20:32:38 +00:00
|
|
|
.It Ql X
|
2012-06-04 22:59:06 +00:00
|
|
|
.Xr _exit 2
|
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
Note that
|
2012-06-05 20:32:38 +00:00
|
|
|
.Ql R
|
2012-06-04 22:59:06 +00:00
|
|
|
following
|
2012-06-05 20:32:38 +00:00
|
|
|
.Ql W
|
2012-06-04 22:59:06 +00:00
|
|
|
records can represent a single
|
|
|
|
.Xr open 2
|
|
|
|
for R/W,
|
2012-06-06 16:51:33 +00:00
|
|
|
or two separate
|
2012-06-04 22:59:06 +00:00
|
|
|
.Xr open 2
|
|
|
|
calls, one for
|
2012-06-05 20:32:38 +00:00
|
|
|
.Ql R
|
2012-06-04 22:59:06 +00:00
|
|
|
and one for
|
2012-06-05 20:32:38 +00:00
|
|
|
.Ql W .
|
2012-06-06 16:51:33 +00:00
|
|
|
Note that only successful system calls are captured.
|
2012-06-04 22:59:06 +00:00
|
|
|
.Sh IOCTLS
|
2012-06-05 17:46:50 +00:00
|
|
|
User mode programs communicate with the
|
2012-06-05 20:32:38 +00:00
|
|
|
.Nm
|
|
|
|
driver through a number of ioctls which are described below.
|
2012-06-04 22:59:06 +00:00
|
|
|
Each takes a single argument.
|
2012-06-05 20:32:38 +00:00
|
|
|
.Bl -tag -width ".Dv FILEMON_SET_PID"
|
2012-06-04 22:59:06 +00:00
|
|
|
.It Dv FILEMON_SET_FD
|
|
|
|
Write the internal tracing buffer to the supplied open file descriptor.
|
2012-06-05 17:46:50 +00:00
|
|
|
.It Dv FILEMON_SET_PID
|
2012-06-04 22:59:06 +00:00
|
|
|
Child process ID to trace.
|
2016-03-21 20:29:27 +00:00
|
|
|
This should normally be done under the control of a parent in the child after
|
|
|
|
.Xr fork 2
|
|
|
|
but before anything else.
|
|
|
|
See the example below.
|
2012-06-04 22:59:06 +00:00
|
|
|
.El
|
|
|
|
.Sh RETURN VALUES
|
2012-06-05 20:32:38 +00:00
|
|
|
.\" .Rv -std ioctl
|
|
|
|
The
|
|
|
|
.Fn ioctl
|
|
|
|
function returns the value 0 if successful;
|
|
|
|
otherwise the value \-1 is returned and the global variable
|
|
|
|
.Va errno
|
|
|
|
is set to indicate the error.
|
2016-03-09 19:50:35 +00:00
|
|
|
.Sh ERRORS
|
|
|
|
The
|
|
|
|
.Fn ioctl
|
|
|
|
system call
|
|
|
|
with
|
|
|
|
.Dv FILEMON_SET_FD
|
|
|
|
will fail if:
|
|
|
|
.Bl -tag -width Er
|
|
|
|
.It Bq Er EEXIST
|
|
|
|
The
|
|
|
|
.Nm
|
|
|
|
handle is already associated with a file descriptor.
|
|
|
|
.El
|
2016-03-21 20:29:27 +00:00
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn ioctl
|
|
|
|
system call
|
|
|
|
with
|
|
|
|
.Dv FILEMON_SET_PID
|
|
|
|
will fail if:
|
|
|
|
.Bl -tag -width Er
|
|
|
|
.It Bq Er ESRCH
|
|
|
|
No process having the specified process ID exists.
|
|
|
|
.It Bq Er EBUSY
|
|
|
|
The process ID specified is already being traced and was not the current
|
|
|
|
process.
|
|
|
|
.El
|
2016-03-22 22:41:07 +00:00
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn close
|
|
|
|
system call on the filemon file descriptor may fail with the errors from
|
|
|
|
.Xr write 2
|
|
|
|
if any error is encountered while writing the log.
|
2016-03-22 22:41:14 +00:00
|
|
|
It may also fail if:
|
|
|
|
.Bl -tag -width Er
|
|
|
|
.It Bq Er EFAULT
|
|
|
|
An invalid address was used for a traced system call argument, resulting in
|
|
|
|
no log entry for the system call.
|
|
|
|
.It Bq Er ENAMETOOLONG
|
|
|
|
An argument for a traced system call was too long, resulting in
|
|
|
|
no log entry for the system call.
|
|
|
|
.El
|
2012-06-05 17:46:50 +00:00
|
|
|
.Sh FILES
|
2012-06-05 20:32:38 +00:00
|
|
|
.Bl -tag -width ".Pa /dev/filemon"
|
2012-06-05 17:46:50 +00:00
|
|
|
.It Pa /dev/filemon
|
|
|
|
.El
|
2012-06-04 22:59:06 +00:00
|
|
|
.Sh EXAMPLES
|
2012-06-05 17:46:50 +00:00
|
|
|
.Bd -literal
|
2012-06-04 22:59:06 +00:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <sys/wait.h>
|
|
|
|
#include <sys/ioctl.h>
|
|
|
|
#include <dev/filemon/filemon.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include <err.h>
|
2013-06-14 08:28:08 +00:00
|
|
|
#include <unistd.h>
|
2012-06-04 22:59:06 +00:00
|
|
|
|
|
|
|
static void
|
|
|
|
open_filemon(void)
|
|
|
|
{
|
|
|
|
pid_t child;
|
|
|
|
int fm_fd, fm_log;
|
|
|
|
|
2013-06-14 08:28:08 +00:00
|
|
|
if ((fm_fd = open("/dev/filemon", O_RDWR | O_CLOEXEC)) == -1)
|
2012-06-05 20:32:38 +00:00
|
|
|
err(1, "open(\e"/dev/filemon\e", O_RDWR)");
|
2012-06-04 22:59:06 +00:00
|
|
|
if ((fm_log = open("filemon.out",
|
2013-06-14 08:28:08 +00:00
|
|
|
O_CREAT | O_WRONLY | O_TRUNC | O_CLOEXEC, DEFFILEMODE)) == -1)
|
2012-06-04 22:59:06 +00:00
|
|
|
err(1, "open(filemon.out)");
|
|
|
|
|
2012-06-05 17:36:28 +00:00
|
|
|
if (ioctl(fm_fd, FILEMON_SET_FD, &fm_log) == -1)
|
2012-06-04 22:59:06 +00:00
|
|
|
err(1, "Cannot set filemon log file descriptor");
|
|
|
|
|
|
|
|
if ((child = fork()) == 0) {
|
2012-06-05 17:36:28 +00:00
|
|
|
child = getpid();
|
|
|
|
if (ioctl(fm_fd, FILEMON_SET_PID, &child) == -1)
|
|
|
|
err(1, "Cannot set filemon PID");
|
2012-06-04 22:59:06 +00:00
|
|
|
/* Do something here. */
|
|
|
|
} else {
|
|
|
|
wait(&child);
|
|
|
|
close(fm_fd);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.Ed
|
|
|
|
.Pp
|
|
|
|
Creates a file named
|
|
|
|
.Pa filemon.out
|
|
|
|
and configures the
|
|
|
|
.Nm
|
2012-06-05 20:32:38 +00:00
|
|
|
device to write the
|
|
|
|
.Nm
|
|
|
|
buffer contents to it.
|
2012-06-04 22:59:06 +00:00
|
|
|
.Sh SEE ALSO
|
|
|
|
.Xr dtrace 1 ,
|
|
|
|
.Xr ktrace 1 ,
|
2014-09-03 19:06:08 +00:00
|
|
|
.Xr script 1 ,
|
2012-06-06 16:51:33 +00:00
|
|
|
.Xr truss 1 ,
|
|
|
|
.Xr ioctl 2
|
2012-06-04 22:59:06 +00:00
|
|
|
.Sh HISTORY
|
|
|
|
A
|
|
|
|
.Nm
|
|
|
|
device appeared in
|
|
|
|
.Fx 9.1 .
|
2016-01-29 01:00:12 +00:00
|
|
|
.Sh BUGS
|
2016-03-07 21:39:29 +00:00
|
|
|
Unloading the module may panic the system, thus requires using
|
|
|
|
.Ic kldunload -f .
|