Monday, March 26, 2007

The Game Is Over!

People often say that once an attacker gets access to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game is over! That’s true indeed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se days, and most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 research I have done over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past two years or so, was about proofing just that. Some people, however, go a bit furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r and say, that thus cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no point in researching ways to detect system compromises and, once an attacker got in, you should simply assume everything has been compromised and replace all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 components, i.e. buy new machine (as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker might have modified cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BIOS or re-flashed PCI EEPROMs), reinstall OS, all applications, etc.



However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y miss one little detail – how can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y actually know that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker got access to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system and that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game is over indeed and we need to reinstall just now?

Well, we simply assume that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker had to make some mistake and that we, sooner or later, will find out. But what if she didn’t make a mistake?

There are several trends of how this problem should be addressed in a more general and elegant way though. Most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m are based on a proactive approach. Let’s have a quick look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m…
  1. One generic solution is to build in a prevention technology into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OS. That includes all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 anti-exploitation mechanisms, like e.g. ASLR, Non Executable memory, Stack Guard/GS, and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs, as well as some little design changes into OS, like e.g. implementation of least-privilege principle (think e.g. UAC in Vista) and some sort of kernel protection (e.g. securelevel in BSD, grsecurity on Linux, signed drivers in Vista, etc).

    This has been undoubtedly cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most popular approach for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last couple of years and recently it gets even more popular, as Microsoft implemented most of those techniques in Vista.

    However, everybody who follows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security research for at least several years should know that all those clever mechanisms have all been bypassed at least once in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir history. That includes attacks against Stack Guard protection presented back in 2000 by Bulba and Kil3r, several ways to bypass PaX ASLR, like those described by Nergal in 2001 and by ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs several months later as well as exploiting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 privilege elevation bug in PaX discovered by its author in 2005. Also cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Microsoft's Hardware DEP (AKA NX) has been demonstrated to be bypassable by skape and Skywing in 2005.

    Similarly, kernel protection mechanisms have also been bypassed over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past years, starting e.g. with this nice attack against grsecurity /dev/(k)mem protection presented by Guillaume Pelat in 2002. In 2006 Loic Duflot demonstrated that BSD's famous securelevel mechanism can also be bypassed. And, also last year, I showed that Vista x64 kernel protection is not foolproof eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r.

    The point is – all those hardening techniques are designed to make exploitation harder or to limit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 damage after a successful exploitation, but not to be 100% foolproof. On 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 hand, it must be said, that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y probably represent cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best prevention solutions available for us cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se days.

  2. Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r approach is to dramatically redesign cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole OS in such a way that all components (like e.g. drivers and serves) are compartmentalized, e.g. run as separate processes in usermode, and consequently are isolated not only from each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r but also from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OS kernel (micro kernel). The idea here is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most critical components, i.e. cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 micro kernel, is very small and can be easily verified. Example of such OS is Minix3 which is still under development though.

    Undoubtedly this is a very good approach to minimize impact from system or driver faults, but does not protect us against malicious system compromises. After all if an attacker exploits a bug in a web browser, she may only be interested in modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser’s code. Sure, she probably would not be able to get access to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 micro kernel, but why would she really need it?

    Imagine, for example, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following common scenario: many online banking systems require users to use smart cards to sign all transaction requests (e.g. money transfers). This usually works by having a browser (more specifically an ActiveX control or Firefox’s plugin) to display a message to a user that he or she is about to make e.g. a wire transfer to a given account number for a given amount of money. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user confirms that action, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y should press an ‘Accept’ button, which instructs browser to send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 message to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 smart card for signing. The message itself is usually just some kind of formatted text message specifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source and destination account numbers, amount of money, date and time stamp etc. Then cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user is asked to insert cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 smart card, which contains his or her private key (issued by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bank) and to also enter cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PIN code. The latter can be done eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r by using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same browser applet or, in slightly more secure implementations, by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 smart card reader itself, if it has a pad for entering PINs.

    Obviously cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 point here is that malware should not be able to forge cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 digital signature and only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 legitimate user has access to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 smart card and also knows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 card’s PIN, so nobody else will be able to sign that message with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user’s key.

    However, it’s just enough for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker to replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 message while it’s being send to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 card, while displaying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original message in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser’s window. This all can be done by just modifying (“hooking”) cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser’s in-memory code and/or data. No need for kernel malware, yet cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser more specifically) is compromised!


    Still, one good thing about such a system design is that if we don’t allow an attacker to compromise cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 microkernel, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n, at least in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ory, we can write a detector capable of finding that some (malicious) changes to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browsers memory have been introduced indeed. However, in practice, we would have to know how exactly cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser’s memory should look like, e.g. which function pointers in Firefox’s code should be verified in order to find out whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r such a compromise has indeed occurred. Unfortunately we can not do that today.

  3. Alternative approach to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above two, which does not require any dramatic changes into OS, is to make use of so called sound static code analyzers to verify all sensitive code in OS and applications. The soundness property assures that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 analyzer has been macá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365matically proven not to miss even a single potential run time error, which includes e.g. unintentional execution flow modifications. The catch here is that soundness doesn’t mean that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 analyzer doesn’t generate false positives. It’s actually macá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365matically proven that we can’t have such an ideal tool (i.e. with zero false positive rate), as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem of analyzing all possible program execution paths is incomputable. Thus, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 practical analyzers always consider some superset of all possible execution flows, which is easy to compute, yet may introduce some false alarms and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole trick is how to choose that superset so that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of false positives is minimal.

    ASTREE is an example of a sound static code analyzer for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 C language (although it doesn’t support programs which make use of dynamic memory allocation) and it apparently has been used to verify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 primary flight control software for Airbus A340 and A380. Unfortunately, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re doesn’t seem to be any publicly available sound binary code static analyzers… (if anybody knows any links, you’re more cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n welcome to paste cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 links under this post – just please make sure you’re referring to sound analyzers).

    If we had such sound and precise (i.e. with minimal rate of false alarms) binary static code analyzer that could be a big breakthrough in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OS and application security.

    We could imagine, for example, a special authority for signing device drivers for various OSes and that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y would first perform such a formal static validation on submitted drivers and, once passed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 test, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 drivers would be digitally signed. Plus, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OS kernel itself would be validated itself by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor and would accept only those drivers which were signed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver verification authority. The authority could be an OS vendor itself or a separate 3rd party organization. Additionally we could also require that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code of all security critical applications, like e.g. web browser be also signed by such an authority and set a special policy in our OS to allow e.g. only signed applications to access network.

    The only one week point here is, that if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 private key used by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 certification authority gets compromised, 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ý bet365 game is over and nobody really knows that… For this reason it would be good, to have more cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n one certification authority and require that each driver/application be signed by at least two independent authorities.

From cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above three approaches only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last one can guarantee that our system will not get compromised ever. The only problem here is that… cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are no tools today for static binary code analysis that would be proved to be sound and also precise enough to be used in practice…

So, today, as far as proactive solutions are considered, we’re left only with solutions #1 and #2, which, as discussed above, can not protect OS and applications from compromises in 100%. And, to make it worse, do not offer any clue, whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 compromise actually occurred.

That’s why I’m trying so much to promote cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 idea of Verifiable Operating Systems, which should allow to at least find out (in a systematic way) whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system in question has been compromised or not (but, unfortunately not to find whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 single-shot incident occurred). The point is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of required design changes should be fairly small. There are some problems with it too, like e.g. verifying JIT-like code, but hopefully cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can be solved in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 near feature. Expect me to write more on this topic in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 near feature.

Special thanks to Halvar Flake for eye-opening discussions about sound code analyzers and OS security in general.

Monday, March 05, 2007

Handy Tool To Play with Windows Integrity Levels

Mark Minasi wrote to me recently to point out that his new tool, chml, is capable of setting NoReadUp and NoExecuteUp policy on file objects, in addition to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 standard NoWriteUp policy, which is used by default on Vista.

As I wrote before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 default IL policy used on Vista assumes only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NoWriteUp policy. That means that all objects which do not have assigned any IL explicitly (and consequently are treated as if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were marked with Medium IL) can be read by low integrity processes (only writes are prevented). Also, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 standard Windows icacls command, which allows to set IL for file objects, assumes always cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NoWriteUp policy only (unless I’m missing some secret switch).

However, it’s possible, for each object, to define not only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 integrity level but also cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 policy which will be used to access it. All this information is stored in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same SACE which also defines cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IL.

There doesn’t seem to be too much documentation from Microsoft about how to set those permissions, except this paper about Protected Mode IE and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sddl.h file itself.

Anyway, it’s good to see a tool like chml as it allows to do some cool things in a very simple way. E.g. consider that you have some secret documents in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 folder c:\secretes and that you don’t feel like sharing those files with anybody who can exploit your Protected Mode IE. As I pointed out in my previous article, by default all your personal files are accessible to your Protected Mode IE low integrity process, so in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 event of successful exploitation cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker is free to steal cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m all. However now, using Mark Minasi’s tool, you can just do this:
chml.exe c:\secrets -i:m -nr -nx
This should prevent all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 low IL processes, like e.g. Protected Mode IE, from reading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of your secret directory.

BTW, you can use chml to also examine cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SACE which was created:
chml.exe c:\secrets -showsddl
and you should get something like that as a result:
SDDL string for c:\secrets's integrity label=S:(ML;OICI;NRNX;;;ME)
Where S means that it’s an SACE (in contrast to e.g. DACE), ML says that this ACE defines mandatory label, OICI means “Object Inherit” and “Container Inherit”, NRNX defines that to access this object cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NoReadUp and NoExecuteUp policies should be used (which also implies cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NoWriteUp BTW) and finally cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ME stands for Medium Integrity Level.

All credits go to Mark Minasi and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows IL team :)

As a side note: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 updated slides for my recent Black Hat DC talk about cheating hardware based memory acquisition can be found here. You can also get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 demo movies here.