Thursday, September 09, 2010

(Un)Trusting your GUI Subsystem

Why do we need secure desktop systems? Why support from hardware is necessary to build secure desktop OSes? Does virtualization make things more, or less complex? Why Dynamic RTM (Intel TXT) is better than Static RTM? Can we have untrusted GUI domain/subsystem?

I tried to cover those questions in my recent keynote at ETISS, and you can grab cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 slides here.

Particularly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 slide #18 presents cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 idealistic view of an OS that could be achieved through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 use of hardware virtualization and trusted boot technologies. It might look very similar to many ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r pictures of virtualized systems one can see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se days, but what makes it special is that all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dark gray boxes represent untrusted domains (so, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir compromise is not security-critical, except for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 potential of a denial-of-service).

No OS currently implements this architecture, even Qubes. We still have Storage and GUI subsystem in Dom0 (so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are both trusted), although we already know (we think) how to implement cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 untrusted storage domain (this is described in detail in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 arch spec), and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main reason we don't have it now is that TXT market adoption is so poor, that very few people could make use of it.

The GUI subsystem is, however, a much bigger challenge. When we think about, it should really feel impossible to have an untrusted GUI subsystem, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI subsystem really "sees" all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pixmaps that are to be displayed to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user, so also all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 confidential emails, documents, etc. The GUI is different in nature than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 networking subsystem, where we can use encrypted protocols to prevent cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 netvm from sniffing or meaningfully intercepting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application-generated traffic, or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 storage subsystem, where we can use fs-encryption and trusted boot technologies to keep cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 storage domain off from reading or modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 files used by apps in a meaningful ways. We cannot really encrypt cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pixmaps (in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 apps, or AppVMs), because for this to work we would need to have graphics cards that would be able to do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 decryption and key exchange (note how this is different from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case of an untrusted storage domain, where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no need for internal hardware encryption!), and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 idea of putting, essentially an HTTPS webserver on your GPU is doubtful at best, because it would essentially move cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI domain to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GPU, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is really no reason why lots-of-code in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GPU were any harder to attack than lots-of-code in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI domain...

So we came out recently with an idea of a Split I/O model that is also presented in my slides, where we separate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user input (keyboard, mouse), and keep it still in dom0 (trusted domain), from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 output (GUI, audio), which is moved into an untrusted GUI domain. We obviously need to make sure that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI domain cannot "talk" to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r domains, to make sure it cannot "leak out" cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 secrets that it "sees" while processing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 various pixmaps. For this we need to have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hypervisor ensure that all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inter-domain shared pages mapped into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI domain are read-only for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI domain, and this would imply that we need cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI protocol, exposed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI domain to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r AppVMs, to be unidirectional.

There are more challenges though, e.g. how to keep cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bandwith of timing covert channels, such as those through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPU caches, between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI domain and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r AppVMs on a reasonably low level (please note cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 distinction between a covert channel, which require cooperation of two domains, and a side-channel, which requires just one domain to be malicious - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latter are much more of a cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365oretical problem, and are of a concern only in some very high security military systems, while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 former are easy to implement in practice usually, and present a practical problem in this very scenario).

Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r problem, that was immediately pointed out by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ETISS audience, is that an attacker, who compromised cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI domain, can manipulate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pixmaps that are being processed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI subsystem to present false picture to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user (remember, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker should have no way to send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m out anywhere). This includes attacks such as button relabeling ("OK" becomes "Cancel" and 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), content manipulation ("$1,000,000" instead of "$100", and vice-versa), security labels spoofing ("red"-labeled windows becoming "green"-labeled), and so on. It's an open question how practical cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se attacks are, at least when we consider automated attacks, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y require ability to extract some semantics from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pixmaps (where is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 button, where is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 decoration), as well as understanding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user's actions, intentions, and behavior (just automatically relabeling my Friefox label to "green" would be a poor attack, as I would immediately realize something is going wrong). Nevercá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less this is a problem, and I'm not sure how this could be solved with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current hardware architecture.

But do we really need untrusted GUI domain? That depends. Currently in Qubes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI subsystem is located in dom0, and thus it is fully trusted, and this also means that a potential compromise of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI subsystem is considered fatal. We try to make an attack on GUI as hard as possible, and this is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reason we have designed and implemented special, very simple GUI protocol that is exposed to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r AppVMs (instead of e.g. using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 X protocol or VNC). But if we wanted to add some more "features", such as 3D hardware acceleration for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 apps (3D acceleration is already available to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Window Manager in Qubes, but not for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 apps), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n we would not be able to keep cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI protocol so simple anymore, and this might result in introducing exploitable fatal bugs. So, in that case it would be great to have untrusted GUI domain, because we would be able to provide feature-rich GUI protocols, with all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OpenGL-ish like things, without worrying that somebody might exploit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI backend. We would also not need to worry about putting all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 various 3rd party software in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI domain, such as KDE, Xorg, and various 3rd party GPU drivers, like e.g. NVIDIA's closed source ones, and that some of it might be malicious.

So, generally, yes, we would like to have untrusted GUI domain - we can live without it, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n we will not have all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fancy 3D acceleration for games, and also need to carefully choose and verify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI-related software (which is lots of software).

But perhaps in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next 5 years everybody will have a computer with a few dozens of cores, and also cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CPU-to-DRAM bandwidth will be orders of magnitude faster than today, and so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re will be no longer a need to offload graphic intensive work to a specialized GPU, because one of our 64 cores will happily do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 work? Wouldn't that be a nicer architecture, also for many ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r reasons (e.g. better utilization of power/circuit real estate)? In that case nobody will need OpenGL, and so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re will be no need for a richer GUI protocol than what is already implemented in Qubes...

It's quite exciting to see what will happen (and what we will come up for Qubes) :)

BTW, some people might confuse X server de-privileging efforts, i.e. making cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 X server run without root privileges, which is being done in some Linux distros and BSDs, with what had been described in this article, namely making cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI subsystem untrusted. Please note that a de-priviliged X server doesn't really solve any major security problems related to GUI subsystem, as whoever controls ("0wns") cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 X server (depriviliged or not) can steal or manipulate all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data that this X server is processing/displaying. Apparently cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are some reasons why people want to run Xorg as non-root, but in case of typical desktop OSes this provides little security benefit (unless you want to run a few X servers with different user accounts, and on different vt's, which most people would never do anyway).

12 comments:

Anonymous said...

Hello joahanna,

you made me remember about 8 1/2 .
http://doc.cat-v.org/plan_9/4th_edition/papers/812/
thi is an example of "window manager" in userspace; you get access to a pixmap, a keyboard and a mouse and you can delegate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 handling of part of that to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r process.

this is done in a "real" os that you can boot on a pc (or at least a virtual machine).

do you know about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security system of plan9? what do you think about it?

Joanna Rutkowska said...

@anonymous_mentioning_812_and_plan9:

What specific aspect of 812 does my article made you remember of?

Anonymous said...

did you get a chance to talk with David about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 somewhat neglected trusted IO/ trusted sprite model in Trusted computing?

Max Tiktin said...

hi, Joanna

sorry if im posting to an unapporpriate post :) but still..
its cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most recent one.

i've read some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interesting things you've posted, especially security trends (3 of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m). seen Qubes.

what do you think about ThinClients as a security concept (encrypted env, ipsec etc)? (security by secure network?)

and what do you think about total separation of environments (physical security)?

cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re were also concepts of anonimization, have you any thoughts on this ? what about anonymizing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 internet via anonimization protocols, so that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 traditional "traffic" will no longer exist?

with all your mastery with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Rings do you think traditional OS will survive in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Internet ?
maybe Internet OS is better for public use? and good-old-os like windows and linux along with mac should be out of Internet connection :)

any philosophical stuff you provide will be highly appreciated,

thanks.

Joanna Rutkowska said...

@Max:
http://cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365invisiblethings.blogspot.com/2010/09/on-thin-clients-security.html

The question about anonimization is off-topic, so skipping it.

Martim said...

Interesting thoughts.

But if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI is assumed untrusted, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n indeed an attacker can completely fake what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user sees. Think of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implication that this could have for security notifications.

Perhaps cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ideal option would be to basically have two GUI subsystems: an untrusted, fully-featured one for general use and a very simple, trusted one (which could be formally verified) which can act as a communication channel between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trusted computing base and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user. The videocard framebuffer could cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n be partitioned between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se two GUIs by having cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hypervisor virtualize access to it.

Almost sounds like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "trusted path" concept from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Orange Book...

Anonymous said...

anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r paper you should have already read:

A Nitpicker’s guide to a minimal-complexity secure GUI:

http://os.inf.tu-dresden.de/papers_ps/feske-nitpicker.pdf

Joanna Rutkowska said...

Yes, I read about Nitpicker, and I even tried cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir Live CD, as we have considered its use for Qubes at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very beginning. Unfortunately Nitpicker doesn't really solve any of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problems I described in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 article, and has more disadvantages than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current Qubes GUI implementation. Specifically:

1) It doesn't provide a common Window Manager for all VMs -- instead it just lets each VM to use its own manager. This results in a bug mess on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desktop, and IMO is really an unacceptable solution in any production-quality desktop environment.

2) It uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own X-like server (very small though) and its own drivers -- this approach doesn't scale to commercial hardware. Of course, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y don't make use of H/W acceleration at all.

3) Even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y finally implemented H/W acceleration for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir trusted X-server, still cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a problem of how to *securely* expose this H/W acceleration to all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 apps in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VMs (in terms of avoiding exploitable bugs in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 backend).

So, all in all, my impression was that it was (is?) more of an academic proof-of-concept project, with little practical applications. It's main advantage being cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very small code base, covering not only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI backend, but also cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 X-like server and VESA drivers. Quite impressive in this respect.

Hal Finney said...

I wanted to ask a question on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Qubes post but comments weren't allowed.

Recently cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re has been discussion of Internet voting. The conventional wisdom is that no mass market software could be secure enough to serve as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 foundation of our democracy. What do you think? Could Qubes evolve to where it would be secure enough to serve as a voting client?

And how about attestation to prove that a secure VM is being used, could/should that be part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 solution?

Joanna Rutkowska said...

@Hal: I don't think you need something as complex as Qubes for just a voting software. I can very well imagine a one-purpose OS and software stack being distributed on CDs/USBs, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 users would be required to shut-down cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir normal systems and boot from this "voting OS" in order to vote. Because it's a racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r rare activity, it's perfectly reasonably to require users to reboot for voting.

Of course, for this to work, a reasonably secure trusted boot technology is needed, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only one that comes to mind is Intel TXT. But even TXT is not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re yet -- we need TXT that would be immune to SMM attacks (anybody saw an STM already?), ACPI attacks (is Intel gonna do something about it?), and perhaps with more open SINIT code (would you be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are no more integer overflows in Intel's code?). But that seems like a way to go in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 long run.

Anonymous said...

You could use Xen's multi GPU passthrough support for this. Each VM that needs 3D could get a 3D GPU dedicated to it. The VM driver would use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 adapter in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 standard way and render whatever it wants to a framebuffer which would cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n be passed to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GUI VM. This driver may be non-trivial but it may not be more difficult than passing video.

I expect newer CPU/GPU like AMD's fusion to support virtualization of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GPU functions directly. Of course, Intel could resurrect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir 80 cores CPU/GPU too and switch everything to ray-tracing but this seems doubtful right now.

Nicolas Wagrez

Christian said...

I stumbled upon this blog post via Google - so sorry for commenting so late...

Joanna, are you aware of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dissertation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original author of Nitpicker? Also, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 work on Nitpicker kept moving and you may get an impression here.

Besides, I'm curious why you think: [Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VMs window managers] results in a bug mess on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desktop.

Regards