* Implemented -D/--delay to avoid fork bombs.

This commit is contained in:
Sam Hocevar
2007-01-13 10:50:38 +00:00
committed by sam
parent cf8fcc5d13
commit 1bd6bb7a23
2 changed files with 30 additions and 15 deletions
+12 -7
View File
@@ -4,9 +4,9 @@ zzuf \- multiple purpose fuzzer
.SH SYNOPSIS
\fBzzuf\fR [\fB\-cdiMnqSx\fR] [\fB\-r\fR \fIratio\fR] [\fB\-s\fR \fIseed\fR|\fB\-s\fR \fIstart:stop\fR]
.br
[\fB\-F\fR \fIforks\fR] [\fB\-C\fR \fIcrashes\fR] [\fB\-B\fR \fIbytes\fR] [\fB\-T\fR \fIseconds\fR]
[\fB\-D\fR \fIdelay\fR] [\fB\-F\fR \fIforks\fR] [\fB\-C\fR \fIcrashes\fR] [\fB\-B\fR \fIbytes\fR]
.br
[\fB\-M\fR \fImegabytes\fR] [\fB\-P\fR \fIprotect\fR] [\fB\-R\fR \fIrefuse\fR]
[\fB\-T\fR \fIseconds\fR] [\fB\-M\fR \fImegabytes\fR] [\fB\-P\fR \fIprotect\fR] [\fB\-R\fR \fIrefuse\fR]
.br
[\fB\-I\fR \fIinclude\fR] [\fB\-E\fR \fIexclude\fR] [\fIPROGRAM\fR [\fB\-\-\fR] [\fIARGS\fR]...]
.br
@@ -69,6 +69,10 @@ argument.
\fB\-d\fR, \fB\-\-debug\fR
Activate the display of debug messages.
.TP
\fB\-D\fR, \fB\-\-delay\fR=\fIdelay\fR
Do not launch more than one process every \fIdelay\fR seconds. This option
should be used together with \fB\-F\fR to avoid fork bombs.
.TP
\fB\-E\fR, \fB\-\-exclude\fR=\fIregex\fR
Do not fuzz files whose name matches the \fIregex\fR regular expression. This
option supersedes anything that is specified by the \fB\-I\fR flag. Use this
@@ -82,7 +86,7 @@ of the regular expressions will be ignored.
Specify the number of simultaneous children that can be run.
This option is only relevant if the \fB\-s\fR flag is used with an interval
argument.
argument. See also the \fB\-D\fR flag.
.TP
\fB\-i\fR, \fB\-\-stdin\fR
Fuzz the application's standard input. By default \fBzzuf\fR only fuzzes files.
@@ -241,11 +245,12 @@ can be read by \fBVLC\fR to reproduce the same behaviour without using
.PP
Fuzz 2% of \fBMPlayer\fR's input bits (\fB\-r\ 0.02\fR) with seeds 0 to 9999
(\fB\-s\ 0:10000\fR), disabling its standard output messages (\fB\-q\fR),
launching up to three simultaneous child processes (\fB\-F\ 3\fR), killing
\fBMPlayer\fR if it takes more than one minute to read the file (\fB\-T\ 60\fR)
and disabling its \fBSIGSEGV\fR signal handler (\fB\-S\fR):
launching up to five simultaneous child processes (\fB\-F\ 5\fR) but wait at
least half a second between launches (\fB\-D\ 0.5\fR), killing \fBMPlayer\fR
if it takes more than one minute to read the file (\fB\-T\ 60\fR) and
disabling its \fBSIGSEGV\fR signal handler (\fB\-S\fR):
.PP
\fB zzuf \-c \-r 0.02 \-q \-s 0:10000 \-F 3 \-T 60 \-S \\\fR
\fB zzuf \-c \-r 0.02 \-q \-s 0:10000 \-F 5 \-D 0.5 \-T 60 \-S \\\fR
\fB mplayer \-\- \-benchmark \-vo null \-fps 1000 movie.avi\fR
.SH RESTRICTIONS
.PP
+18 -8
View File
@@ -87,6 +87,7 @@ static int md5 = 0;
static int checkexit = 0;
static int maxmem = -1;
static int64_t maxtime = -1;
static int64_t delay = 0;
static int64_t lastlaunch = 0;
#define ZZUF_FD_SET(fd, p_fdset, maxfd) \
@@ -110,6 +111,7 @@ int main(int argc, char *argv[])
#if defined(HAVE_GETOPT_H)
for(;;)
{
# define OPTSTR "B:cC:dD:E:F:iI:mM:nP:qr:R:s:ST:xhv"
# ifdef HAVE_GETOPT_LONG
# define MOREINFO "Try `%s --help' for more information.\n"
int option_index = 0;
@@ -120,6 +122,7 @@ int main(int argc, char *argv[])
{ "cmdline", 0, NULL, 'c' },
{ "max-crashes", 1, NULL, 'C' },
{ "debug", 0, NULL, 'd' },
{ "delay", 1, NULL, 'D' },
{ "exclude", 1, NULL, 'E' },
{ "max-forks", 1, NULL, 'F' },
{ "stdin", 0, NULL, 'i' },
@@ -138,11 +141,10 @@ int main(int argc, char *argv[])
{ "help", 0, NULL, 'h' },
{ "version", 0, NULL, 'v' },
};
int c = getopt_long(argc, argv, "B:cC:dE:F:iI:mM:nP:qr:R:s:ST:xhv",
long_options, &option_index);
int c = getopt_long(argc, argv, OPTSTR, long_options, &option_index);
# else
# define MOREINFO "Try `%s -h' for more information.\n"
int c = getopt(argc, argv, "B:cC:dE:F:iI:mM:nP:qr:R:s:ST:xhv");
int c = getopt(argc, argv, OPTSTR);
# endif
if(c == -1)
break;
@@ -163,6 +165,9 @@ int main(int argc, char *argv[])
case 'd': /* --debug */
setenv("ZZUF_DEBUG", "1", 1);
break;
case 'D': /* --delay */
delay = (int64_t)(atof(optarg) * 1000000.0);
break;
case 'E': /* --exclude */
exclude = merge_regex(exclude, optarg);
if(!exclude)
@@ -421,6 +426,7 @@ static void spawn_children(void)
static int const files[] = { DEBUG_FILENO, STDERR_FILENO, STDOUT_FILENO };
char buf[BUFSIZ];
int fd[3][2];
int64_t now = _zz_time();
pid_t pid;
int i, j;
@@ -433,6 +439,9 @@ static void spawn_children(void)
if(maxcrashes && crashes >= maxcrashes)
return; /* all jobs crashed */
if(delay > 0 && lastlaunch + delay > now)
return; /* too early */
/* Find the empty slot */
for(i = 0; i < maxforks; i++)
if(child_list[i].status == STATUS_FREE)
@@ -483,10 +492,8 @@ static void spawn_children(void)
return;
}
lastlaunch = _zz_time();
/* Were the parent, acknowledge spawn */
child_list[i].date = lastlaunch;
child_list[i].date = now;
child_list[i].pid = pid;
for(j = 0; j < 3; j++)
{
@@ -499,6 +506,7 @@ static void spawn_children(void)
if(md5)
child_list[i].ctx = _zz_md5_init();
lastlaunch = now;
child_count++;
seed++;
}
@@ -711,8 +719,8 @@ static void version(void)
static void usage(void)
{
printf("Usage: zzuf [-cdimnqSx] [-r ratio] [-s seed | -s start:stop]\n");
printf(" [-F forks] [-C crashes] [-B bytes] [-T seconds]\n");
printf(" [-M bytes] [-P protect] [-R refuse]\n");
printf(" [-D delay] [-F forks] [-C crashes] [-B bytes]\n");
printf(" [-T seconds] [-M bytes] [-P protect] [-R refuse]\n");
printf(" [-I include] [-E exclude] [PROGRAM [--] [ARGS]...]\n");
# ifdef HAVE_GETOPT_LONG
printf(" zzuf -h | --help\n");
@@ -729,6 +737,7 @@ static void usage(void)
printf(" -c, --cmdline only fuzz files specified in the command line\n");
printf(" -C, --max-crashes <n> stop after <n> children have crashed (default 1)\n");
printf(" -d, --debug print debug messages\n");
printf(" -D, --delay delay between forks\n");
printf(" -E, --exclude <regex> do not fuzz files matching <regex>\n");
printf(" -F, --max-forks <n> number of concurrent children (default 1)\n");
printf(" -i, --stdin fuzz standard input\n");
@@ -752,6 +761,7 @@ static void usage(void)
printf(" -c only fuzz files specified in the command line\n");
printf(" -C <n> stop after <n> children have crashed (default 1)\n");
printf(" -d print debug messages\n");
printf(" -D delay between forks\n");
printf(" -E <regex> do not fuzz files matching <regex>\n");
printf(" -F <n> number of concurrent forks (default 1)\n");
printf(" -i fuzz standard input\n");