Saturday, April 23, 2011

The Linux Security Circus: On GUI isolation

There certainly is one thing that most Linux users don't realize about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir Linux systems... this is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lack of GUI-level isolation, and how it essentially nullifies all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desktop security. I wrote about it a few times, I spoke about it a few times, yet I still come across people who don't realize it all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time.

So, let me stress this one more time: if you have two GUI applications, e.g. an OpenOffice Word Processor, and a stupid Tetris game, both of which granted access to your screen (your X server), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no isolation between those two apps. Even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y run as different user accounts! Even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are somehow sandboxed by SELinux or whatever! None, zero, null, nil!

The X server architecture, designed long time ago by some happy hippies who just thought all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 people apps are good and non-malicious, simply allows any GUI application to control any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r one. No bugs, no exploits, no tricks, are required. This is all by design. One application can sniff or inject keystrokes to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r one, can take snapshots of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 screen occupied by windows belonging to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r one, etc.

If you don't believe me, I suggest you do a simple experiment. Open a terminal window, as normal user, and run xinput list, which is a standard diagnostic program for Xorg (on Fedora you will likely need to install it first: yum install xorg-x11-apps):

$ xinput list

It will show you all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pointer and keyboard devices that your Xorg knows about. Note cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ID of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device listed as “AT keyboard” and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n run (as normal user!):

$ xinput test id

It should now start displaying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scancodes for all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 keys you press on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 keyboard. If it doesn't, it means you used a wrong device ID.

Now, for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best, start anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r terminal window, and switch to root (e.g. using su, or sudo). Notice how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 xinput running as user is able to sniff all your keystrokes, including root password (for su), and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 keystrokes you enter in your root session. Start some GUI app as root, or as different user, again notice how your xinput can sniff all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 keystrokes you enter to this ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r app!

Yes, I can understand what is happening in your mind and heart right now... Don't worry, ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs have also passed through it. Feel free to hate me, throw out insults at me, etc. I don't mind, really (I just won't moderate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m). When you calm down, continue reading.

In Qubes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above problem doesn't exist, because each domain (each AppVM) has it own local, isolated, dummy X server. The main X server, that runs in Dom0 and that handles cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 real display is never exposed to any of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AppVMs directly (AppVMs cannot connect to it via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 X protocol). For details see this technical overview.

You can repeat cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same experiment in Qubes. You just need to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ID of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “qubesdev” device, as shown by xinput list (should be 7). Run cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 xinput in one of your domains, e.g. in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “red” one. Because we actually use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same device for both mouse and keystrokes, you should now see both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 key scancodes, as well as all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mouse events. Notice how your xinput is able to sniff all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 events that are destined for ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r apps belonging to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same domain where you run xinput, and how it is unable to sniff anything targeted to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r domains, or Dom0.

BTW, Windows is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only one mainstream OS I'm aware of, that actually attempts to implement some form of GUI-level isolation, starting from Windows Vista. See e.g. this ancient article I wrote in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 days when I used Vista at my primary laptop. Of course, it's still easy to bypass this isolation, because of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 huge interface that is exposed to each GUI client (that also includes GPU API). Nevercá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y at least attempt to prevent this at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 architecture level.

27 comments:

Anonymous said...

Try this with SELinux sandbox... "sandbox -X xterm" (on F14 or RHEL6... install policycoreutils-sandbox if needed). It does not see keys destined for anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r window. This is because sandbox -X also uses its own X server (Xephyr).

How does this differ from Qubes?

Joanna Rutkowska said...

The primary problem with SELinux sandbox is that it still relies on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 big, buggy, bloated Linux kernel to enforce security. In Qubes we rely on Xen to enforce domain isolation (a few orders of magnitude less code, I would say 10^3 less, even including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 few daemons/backends we also have in Dom0 and which are reachable from VMs).

Second, SELinux sandbox X server isolation doesn't really eliminate all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacks coming over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bloated X protocol. As a result it is relatively easy to attack. See, e.g. this paper from Rafal for example of an escape:
http://www.invisiblethingslab.com/resources/misc-2010/xorg-large-memory-attacks.pdf

In Qubes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only point of contact to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 real server is our GUI daemon -- see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reference quoted in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 blog post for details on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 protocol we use. Compare this now to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 X protocol. It's orders of magnitude simpler!

SELinux sandbox creates an X server instance (Xephyr) per each sandboxed app, which sounds to me like a huge resource waste. In Qubes we have one X server instance per *domain*.

SELinux sandbox doesn't offer any desktop integration, such as secure copy-and-paste operation. We provide secure inter-domain clipboard on Qubes -- again see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above-quoted reference for technical details.

Finally, SELinux sandbox requires cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to setup complex SELinux polices to achieve also filesystem-level and network-level isolation. In Qubes all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 domains are automatically isolated on all those levels.

rinaku said...

I would be interested to know what you think about capability-based security (as in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Capsicum project), and how it compares to what you do in Qubes.

From what I understand (but I know very little about security), capabilities allow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same level of security as Qubes, or even better, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y need cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 applications to be modified, which seems unrealistic. Is that correct ?

Anyway, I'm not good enough to beta test, but I can't wait for a stable release, to see what it is like to use a system like Qubes.

Joanna Rutkowska said...

@rinaku: Capsicum currently doesn't support GUI-level isolation, but I think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're planning to add it at some point in time. When this happens we would seriously consider using it inside our domains, to bring some isolation into each domain as well (currently cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no isolation between apps running in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same domain, specifically for reasons given in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 blog article above).

Capability-based systems, as you pointed out, require application modifications. This also means cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y cannot protect against intentionally malicious apps. Thus I see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m as complementing Qubes, but never replacing it. Also, note that capsicum works only on app-level, but cannot protect against e.g. network subsystem compromises (cannot isolate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 networking subsystem or ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r drivers). In Qubes we can easily do that e.g. via NetVM. Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r reason to think about it as something to complement Qubes (and to run it inside a domain).

Anonymous said...

Welcome to 1987.

Anonymous said...

That is something I didn't know about... but very interesting. Good Post.

Anonymous said...

Why can't we just fix/modify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 X-Server to make GUI level isolation easier?

Anonymous said...

How old/young has somebody to be to write "....designed long time ago by some happy hippies who just thought all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 people apps are good and non-malicious..." ?

The problem is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r way around. These guys created some awesome software tailored to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir problems and means. Using it 20 years later in a different environment/world is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fault, not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir initial design.

Blame cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual generation, respect and praise cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 founder.

Ashish said...

Yes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same hippies who built X11 before you were born....

Please read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 man page on Xsecurity
http://www.manpagez.com/man/7/Xsecurity/

While you are at it also read up on xhost, xauth.
Linux is not representative of how X11 really is supposed to work.

josericardo said...

Very interesting indeed. I didn't know about this threat and doesn't seem to be fixable. Nevercá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less I wanted to know if this is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case for wayland. It would be interesting to run your experiment in it and post cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 findings on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wayland-devel mailing list.

Unknown said...

So, how does Qubes implement global keyboard shortcuts or applications like VNC?

Joanna Rutkowska said...

@Ashish: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security mechanisms you mention have been designed for a totally different security model than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "desktop GUI security" that is prevalent today.

The point is, as correctly made by some ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r commenter, that X have been designed long, long, time ago, in different realities, for solving different problems, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Linux community has blindly adopted it to current conditions, failing to see that it really doesn't fit today. Why do you think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 title of this post is "*Linux* Security Circus" instead of "X Security Circus"? (Yes, I know, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem also affects ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r OSes, such as e.g. *BSD, etc).

Joanna Rutkowska said...

@fliebel: In Qubes all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 keystrokes are first processed byt he *trusted* window manger running in Dom0 (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trusted partition). Then, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y might be consumed by Qubes (e.g. if this is a global clipboard management sequence, or perhaps cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "Expose" sequence), or passed down to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 *active* domain's local X server.

VNC is just a regular app running in one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 domains. No special VNC for Qubes is needed.

phocean said...

Instructive article.
But what about Wayland?
Wayland is claimed to replace X soon. Major distros are already working on its integration.
Are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 authors aware of it or does it have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same design flaws?

Joanna Rutkowska said...

@phocean: good question about Wayland, why don't you check for yourself? ;)

phocean said...

So I will when I have some free time.
But as it is your research topic, I expected you had already done that or even contacted cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developers to inform cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.
As it is still under heavy development, I guess it is a good timing to implement good stuff and for expert like you to advise cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.

Joanna Rutkowska said...

@phocean: Don't kid me, kid! What I did here was not a "research" (you might want to check some real research we did at ITL on our website). That was just a Saturday morning blog post with an aim to save some lost souls, like yours... And I really don't have time to go and test all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 software in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 development that is out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re. I do have real job, that among ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r things includes doing *real* research...

Wladimir said...

*cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y at least attempt to prevent this at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 architecture level.*

I'm not sure that trying and failing is better than not trying, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case of security :)

That said, I agree application-level isolation on desktop OS is a problem that deserves solving. It is very very hard, though.

As X is going cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dodo, have you examined cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case with Unity?

Tom said...

There is an extension called XACE that when integrated with selinux fixes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se problems. I think it was developed by Eamon Walsh for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NSA.

I don't know how well that works, but it is clear that this is a problem for ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r people, too.

Joanna Rutkowska said...

@Tom: The XACE project seems to be dead for at least 3 years now...

http://www.selinuxproject.org/page/XACE

Anonymous said...

I ran gksudo and its input was not collected by xinput test. What kind of magic is it doing?

Joanna Rutkowska said...

About gksudo: perhaps it somehow owns cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input only to itself for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 period of displying its prompt window? I bet you cannot use ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r apps until cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 window is present?

But that's probably irrelevant, because I bet that once you switch to a different user and start some apps as this new user, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n xinput will be able to sniff all those keystrokes without any problem (and you could also easily write a program that could be injecting keystrokes to those apps).

KimTjik said...

I don't ask you to waste time on an explanation; you could as well just direct me to a source of information. What I wonder is: what's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 real danger of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current sloppy model?

My question is based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that all network connected systems can be remotely compromised, with or without a window system. What priority does this in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ory sane improvement get in relation to established precautions?

I understand it's difficult to objectively answer that, while you at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same time invest time in a project addressing described issue.

Joanna Rutkowska said...

@KimTijk: your assumption about easiness of exploiting any system that is connected to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network, regardless of what apps are running cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, is simply flawed.

Anonymous said...

Nice post and you're probably right, but your attitude needs some work kid.

Maybe it's a researcher thing.

Joanna Rutkowska said...

:)

Joanna Rutkowska said...

Correction: I was wrong about Xace being dead -- it has been apparently merged into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mainstream Xorg. Its just that... apparently nobody uses it, because it just not suited to solve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problems we talk about here. See e.g. this presentation from Dan Walsh (SELinux maintainer), slide #12:

http://people.fedoraproject.org/~dwalsh/SELinux/Presentations/sandbox.pdf

...which shows how he decided to use a nested X server instead of Xace to implement SELinux sandbox (see comments above), because... "Xace doesn't work" ;)