Not logged in
Log in now
Create an account
Subscribe to LWN
LWN.net Weekly Edition for May 23, 2013
An "enum" for Python 3
An unexpected perf feature
LWN.net Weekly Edition for May 16, 2013
A look at the PyPy 2.0 release
What kind of server code allows unbounded recursion to be triggered by a client?
Posted Aug 19, 2010 0:43 UTC (Thu) by nybble41 (subscriber, #55106)
Posted Aug 19, 2010 1:01 UTC (Thu) by airlied (subscriber, #9104)
Posted Aug 19, 2010 1:07 UTC (Thu) by avik (guest, #704)
Sure, the guard page helps mitigate the consequences, but as far as I can see a vulnerability still exists.
Posted Aug 19, 2010 1:08 UTC (Thu) by nybble41 (subscriber, #55106)
You can't exploit this without making Xorg overflow its stack. Even with the changes to the kernel that will cause Xorg to crash. Ergo, it is a bug in Xorg. It's nice that the kernel offers a way to catch stack overflows, but the responsibility lies with Xorg not to do that in the first place. This is no more a kernel security bug than an internal Xorg buffer overflow or the like, which can lead to exactly the same sort of privilege elevation.
If you're the kind to rely on guard pages for security rather than avoiding stack overflow by design, I suppose we can be glad you don't do security development.
Posted Aug 19, 2010 5:35 UTC (Thu) by smurf (subscriber, #17840)
"The application is responsible" is a cop-out because there are zillions of programs out there, but only one kernel. Therefore, fixing the problem once (in the kernel), with a guard page (no need for expensive user-mode checks), is the right solution.
Of course, X should not recursively overrun its stack. It's (probably) still a bug in the X server. So?
"Security by forcing the programmer to write correct code" does not work. As a further example of this principle, witness the large number of PHP-based web sites with SQL injection holes.
Posted Aug 19, 2010 6:20 UTC (Thu) by avik (guest, #704)
The kernel should provide a guard page to prevent against unknown flaws, but known flaws should be corrected.
Posted Aug 19, 2010 16:33 UTC (Thu) by tialaramex (subscriber, #21167)
In some cases the recursive algorithm will be clearer, which makes maintenance easier (and reduces the chance of security relevant bugs). In some cases the iterative algorithm will be faster (particularly if your programming language or compiler suck)
Posted Aug 22, 2010 3:31 UTC (Sun) by jeremiah (subscriber, #1221)
you don't write much XSLT do you...;)
Posted Aug 19, 2010 15:27 UTC (Thu) by nybble41 (subscriber, #55106)
This is not exactly a new problem. There is plenty of software out there (e.g. real-time embedded systems; the Linux kernel itself) which manages not to crash or misbehave when faced with a fixed-size stack and no special VM protection. The tools are simple:
1. Do not permit unbounded stack recursion.
2. Static analysis - know your worst-case stack requirements.
There may be "zillions" of application programs, but most of them don't run as root and simultaneously share memory with untrusted clients. As a privileged server process, Xorg should be designed to be more secure than most, since *any* code-execution vulnerability in Xorg is a (potentially remote) privilege-escalation vulnerability.
> Of course, X should not recursively overrun its stack.... So?
So it's not a kernel bug. It may be easier in this case to block one known exploit vector by changing the VM behavior of the kernel, and I'm not arguing against the patch, but it's not the kernel's job to prevent you from mapping untrusted memory right below your stack, or from overflowing said stack.
Posted Aug 19, 2010 1:14 UTC (Thu) by xtifr (subscriber, #143)
Posted Aug 19, 2010 1:40 UTC (Thu) by avik (guest, #704)
"3. Allocate windows arranged so that when X processes them, some function
F is called recursively. Trigger F recursion."
Looks like any X client can crash the server, with or without a patched kernel.
Posted Aug 19, 2010 3:21 UTC (Thu) by xtifr (subscriber, #143)
In any case, runaway memory use already puts your processes in the whimsical hands of the OOM-killer.
Posted Aug 19, 2010 17:32 UTC (Thu) by iabervon (subscriber, #722)
The shared memory aspect is not really a flaw to avoid; the flaws to be fixed on the userspace side are really that the server will go overboard allocating resources for clients, rather than applying some limits to protect itself, and that the server's stack can grow into the heap. At some point, the server should refuse to do what the clients are asking in order to protect itself from overloading (which is hard); the kernel should do better at preventing overloading from leading to unexpected aliasing (which they did). The MIT-SHM aspect just makes the exploit comprehensible.
I don't doubt that a sufficiently clever request could get the server to overflow the stack into the area where the response to the request will be written and write a chosen response into a spot that aliases a return address on the stack, causing the server to return to effectively calling system() on a chunk of an image provided by the client.
Posted Aug 19, 2010 14:33 UTC (Thu) by NAR (subscriber, #1313)
If I understood correctly the problem (which is far from certain) the client can ask the server to allocate memory in the server's address space. Consequently the X server can run out of memory and the OOM killer can kill it. This seems to a be a feature, not a bug (i.e. the whole X server was designed this way). By the way, the X server uses the most memory on my system currently (according to top) and as far as I know, most of the memory is allocated on behalf of clients.
Anyway, nowadays most X clients run locally and if a malicious attacker already controls a client locally, even if it doesn't find any local root holes (which I'm sure there are plenty of), he can delete all of the user's files, send e-mails in the user's name, etc.
Posted Aug 21, 2010 9:12 UTC (Sat) by niner (subscriber, #26151)
Just because this is one of my favourite misconceptions floating around: nothing at all prevents anyone from sending e-mails in any user's name. Same as you can write any name as sender on an envelope of bad old snail mail. The only thing proving the identity of the sender is in both cases a signature. The electronic version even more so than your easy to fake hand writing. And of course, such a signature should not lie around on your computer unprotected...
Posted Aug 23, 2010 23:42 UTC (Mon) by mgedmin (subscriber, #34497)
Posted Aug 19, 2010 15:28 UTC (Thu) by HelloWorld (guest, #56129)
Copyright © 2013, Eklektix, Inc.
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds