Re: A long overdue fork-bomb defense ?

From: Robert Hailey
Date: Sat Apr 09 2011 - 19:20:50 EST



On 2011/04/09 (Apr), at 5:44 PM, Valdis.Kletnieks@xxxxxx wrote:

On Sat, 09 Apr 2011 17:25:48 CDT, Robert Hailey said:

Is there a better way to handle the integer overflows?
...
Might want to think about what situations will cause an integer overflow
here. What has to happen before an overflow is a concern?

It's counting forks per-process, so it is theoretically bound to overflow eventually.

If we use an unsigned 32-bit counter and take 'cron' as an example (say it forks 20 times / minute), it would take about 400 years to overflow. If on the other hand, we have a naive transaction processor using inetd (which if i'm not mistaken forks at every inbound connection) at 60,000/second (!) it will wrap about every 48 days. Using the div-2 method the next will come sooner, so maybe every month....

I think the cost of lock is well amortized even at 32-bits.

Thankfully, this logic would only be triggered when the process table
is full. At that point I doubt anyone would miss the compute time of
even the most painful lock :)

If you get to the point where it's full, you've already lost.
...
Depends why a fork bomb was allowed to be fatal in the first place...

Can you elaborate as to why "you've already lost" if the process table is full?

I am particularly interested in any additional information as to why fork bombs are fatal, and what the most evil/elusive fork bomb would be. At present I think it's about this:

bomb (rate, memory) {
while(true) {
if (root) {
daemonize();
new_session();
new_process_group();
new_executable_name();
if (some_chance) change_uid;
}
leak_some(memory);
bomb(rate*2, memory);
delay(rate);
}
}
bomb(time_on_target, memory_ceiling_tuned);


Presuming for a moment that it works, I think the worst case is
actually a single (perhaps compromised) process spawning child fork
bombs. For that matter it could be a bash shell with the user setting
them off. In that case it might *never* cause enough forking it to get
itself automatically killed, but the system would still be [somewhat?]

bash$ :(){ :|:&};:

Try it and see. ;)

Not yet, but maybe soon... ;-)


responsive through the attack b/c it no longer denies a legitimate
fork, i.e. logging in & using a shell work, even while the process
table is *FULL* of active fork bombs.

I suspect recent patches that allow an entire process tree to be sent SIGSTOP
will be a more productive approach.

Surely you're not relying on a user to catch the fork bomb, so how is it detected?

BTW, already starting to get off discussion of original idea & psuedo- code.

--
Robert Hailey

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/