Secure Coding mailing list archives
Resource limitation
From: nash at solace.net (Nash)
Date: Mon, 17 Jul 2006 19:32:56 -0400
On Mon, Jul 17, 2006 at 05:48:59PM -0400, leichter_jerrold at emc.com wrote:
I was recently looking at some code to do regular expression matching, when it occurred to me that one can produce fairly small regular expressions that require huge amounts of space and time. There's nothing in the slightest bit illegal about such regexp's - it's just inherent in regular expressions that such things exist.
Yeah... the set of regular languages is big. And, some have pretty pathological FSM representations.
In addition, the kinds of resources that you can exhaust this way is broader than you'd first guess. Memory is obvious; overrunning a thread stack is perhaps less so. ... How about file descriptors? File space? Available transmission capacity for a variety of kinds of connections?
One place to look is capability systems. They're more flexible and should have all the features you want, but are still largely theoretical. http://en.wikipedia.org/wiki/Capability-based_security That said, every decent Unix system I'm aware of has ulimit, which you can use to restrict virtual memory allocations, total open files, etc: nash @ quack% ulimit -a ... virtual memory (kbytes, -v) unlimited nash @ quack% ulimit -v 1024 # just 1M RAM, this'll be fun :-) nash @ quack% ( find * ) find: error while loading shared libraries: libc.so.6: failed to map segment from shared object: Cannot allocate memory Alternately, you can implement your own allocator library for your application and then impose per-thread limits using that library. How you do that is going to depend alot on the language. Obviously, there are lots for C/C++ floating around. http://en.wikipedia.org/wiki/Memory_allocation In Java, you don't get nice knobs on Objects and Threads, but you get several nice knobs on the VM itself: -Xm, -XM, etc. Other high level languages have similar problems to Java. I.e., how do you abstract the "size" of a thing when you don't give access to memory as a flat byte array? Well, you can do lots of fun things using LIFO queues, or LRU caches, and so forth. There are performance impacts to consider, but they you can often tweak things so it sucks primarily for the abuser. None of these is really that hard to implement. So, do we really need new theory for this? Dunno. One's mileage does vary. -nash -- "the lyf so short, the craft so long to lerne." - Geoffrey Chaucer
Current thread:
- Resource limitation leichter_jerrold at emc.com (Jul 17)
- Resource limitation Nash (Jul 17)
- Resource limitation Pete Shanahan (Jul 18)
- <Possible follow-ups>
- Resource limitation leichter_jerrold at emc.com (Jul 19)