Posted by James Forshaw currently impersonating NT AUTHORITY\SYSTEM.
Much as I enjoy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process of vulnerability research sometimes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s a significant disparity between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 difficulty of finding a vulnerability and exploiting it. The Project Zero blog contains numerous examples of complex exploits for seemingly trivial vulnerabilities. You might wonder why we’d go to this level of effort to prove exploitability, surely we don’t need to do so? Hopefully by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of this blog post you’ll have a better understanding of why it’s often cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case we spend a significant effort to demonstrate a security issue by developing a working proof of concept.
Our primary target for a PoC is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r benefits for developing one. A customer of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor’s system can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC to test 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ý bet365y’re vulnerable to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue and ensure any patch has been correctly applied. And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security industry can use it to develop mitigations and signatures for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor is not willing or able to patch. Without cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC being made available only people who reverse engineer cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 patch are likely to know about it, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y might not have your best interests in mind.
I don’t want this blog post to get bogged down in too much technical detail about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug (CVE-2015-0002 for reference). Instead I’m going to focus on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process of taking that relatively simple vulnerability, determining exploitability and developing a PoC. This PoC should be sufficient for a vendor to make a reasonable assessment of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presented vulnerability to minimize cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir triage efforts. I’ll also explain my rationale for taking various shortcuts in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC development and why it has to be so.
Reporting a Vulnerability
One of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 biggest issues with vulnerability research on closed or proprietary systems is dealing with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual reporting process to get a vulnerability fixed. This is especially cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case in complex or non-obvious vulnerabilities. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system is open source, I could develop a patch, submit it and it stands a chance of getting fixed. For a closed source system I will have to go through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process of reporting. To understand this better let’s think about what a typical large vendor might need to do when receiving external security vulnerability reports.
This is a really simplified view on vulnerability response handling but it’s sufficient to explain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 principles. For a company which develops cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 majority of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir software internally I would have little influence over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 patching cycle, but I can make a difference in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 triage cycle. The easier I can make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor’s life cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shorter cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 triage cycle can be and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 quicker we can get a patch released. Everyone wins, except hopefully cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 people who might be using this vulnerability already. Don’t forget just because I didn’t know about this vulnerability before doesn’t mean it isn’t already known about.
In an ideal vulnerability research world (i.e. one in which I have to do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 least amount of non-research work) if I find a bug all I’d need to do is write up some quick notes about it, send it to a vendor, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y’ll understand 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ý bet365y’ll immediately move heaven and earth to develop cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 patch, job done. Of course it doesn’t work that way, sometimes just getting a vendor to recognize cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s even a security issue is an important first step. There can be a significant barrier between moving from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 triage cycle to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 patch cycle, especially as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y’re usually separate entities inside a company. To provide for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best chance possible I’ll do two things:
- Put togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r a report of sufficient detail so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor understands cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability
- Develop a PoC which unequivocally demonstrates cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security impact
Writing up a Report
Writing up a report for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor is pretty crucial to getting an issue fixed, although it isn’t sufficient in many cases. You can imagine if I wrote something like, “Bug in ahcache.sys, fixit, *lol*” that doesn’t really help cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor much. At cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very least I’d want to provide some context such as what systems cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability affects (and doesn’t affect), what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 impact of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability is (to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best of my knowledge) and what area of 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 issue resides.
Why wouldn’t just cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 report be sufficient? Think about how a large modern software product is developed. It’s likely developed between a team of people who might work on individual parts. Depending on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 age of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable code cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original developer might have moved on to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r projects, left cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 company entirely or been hit by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number 42 bus. Even if it’s relatively recent code written by a single person who’s still around to talk to it doesn’t mean cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y remember how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code works. Anyone who’s developed software of any size will have come across code cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y wrote, a month, week or even a day ago and wondered how it works. There’s a real possibility that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security researcher who’s spent time going through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 executable instruction by instruction might know it better than anyone in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 world.
Also you can think about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 report in a scientific sense, it’s your vulnerability hypocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365sis. Some vulnerabilities can be proven, for example a buffer overflow can typically be proven macá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365matically, placing 10 things into space for 5 doesn’t work. But in many cases cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s nothing better than empirical proof of exploitability. If done right it can be experimentally validated by both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reporter and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor, this is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of a proof-of-concept. Correctly developed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor can observe cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 effects of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 experiment, converting my hypocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365sis to a cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ory which no-one can disprove.
Proving Exploitability through Experimentation
So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hypocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365sis posits that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability has a real-world security impact, we’ll prove it objectively using our PoC. In order to do this we need to provide cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor not just with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mechanism to prove that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability is real but also clear observations that can be made and why those observations constitute a security issue.
What observations need to be made depend on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type of vulnerability. For memory corruption vulnerabilities it might be sufficient to demonstrate an application crashing in response to certain input. This isn’t always cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case, some memory corruptions don’t provide cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker any useful control. Therefore demonstrating control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current execution flow, such as controlling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 EIP register is usually cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ideal.
For logical vulnerabilities it might be more nuanced, such as you can write a file to a location you shouldn’t be able to or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 calculator application ends up running with elevated privileges. There’s no one-size-fits-all approach, however at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very least you want to demonstrate some security impact which can be observed objectively.
The thing to understand is I’m not developing a PoC for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 purposes of being a useful exploit (from an attacker perspective) but to prove it’s a security issue to a sufficient level of confidence that it will get fixed. Unfortunately it isn’t always easy to separate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se two aspects and sometimes without demonstrating local privilege escalation or remote code execution it isn’t taken as seriously as it should be.
Developing a Proof of Concept
Now let’s go into some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 challenges I faced in developing a PoC for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ahcache vulnerability I identified. Let’s not forget cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s a trade off between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time spent developing a PoC and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chance of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability being fixed. If I don’t spend enough time to develop a working PoC cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor could turn around and not fix cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability, 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 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more time I spend cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 longer this vulnerability exists which is potentially as bad for users.
Vulnerability Technical Details
Having a bit of understanding of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability will help us frame cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 discussion later. You can view cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue here with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attached PoC that I sent to Microsoft. The vulnerability exists in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ahcache.sys driver which was introduced in Windows 8.1 but in essence this driver implements cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows native system call NtApphelpCacheControl. This system call handles a local cache for application compatibility information which is used to correct application behaviour on newer versions of Windows. You can read more about application compatibility here.
Some operations of this system call are privileged so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 driver does a check of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current calling application to ensure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have administrator privileges. This is done in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function AhcVerifyAdminContext which looks something like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following code:
BOOLEAN AhcVerifyAdminContext()
{
BOOLEAN CopyOnOpen;
BOOLEAN EffectiveOnly;
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
PACCESS_TOKEN token = PsReferenceImpersonationToken(
BOOLEAN EffectiveOnly;
SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
PACCESS_TOKEN token = PsReferenceImpersonationToken(
NtCurrentThread(),
&CopyOnOpen,
&EffectiveOnly,
&ImpersonationLevel);
&CopyOnOpen,
&EffectiveOnly,
&ImpersonationLevel);
if (token == NULL) {
token = PsReferencePrimaryToken(NtCurrentProcess());
}
PSID user = GetTokenUser(token);
if(RtlEqualSid(user, LocalSystemSid) || SeTokenIsAdmin(token)) {
return TRUE;
}
return FALSE;
}
This code queries to see if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current thread is impersonating anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r user. Windows allows a thread to pretend to be someone else on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system so that security operations can be correctly evaluated. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thread is impersonating a pointer to an access token is returned. If NULL is returned from PsReferenceImpersonationToken cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code queries for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current process’ access token. Finally cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code checks whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r eicá 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 access token’s user is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 local system user or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token is a member of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Administrators group. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function returns TRUE 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 privileged operation is allowed to go ahead.
This all seems fine, so what’s cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue? While full impersonation is a privileged operation limited to users which have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 impersonate privilege in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir token, a normal user without cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 privilege can impersonate ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r users for non-security related functions. The kernel differentiates between privileged and unprivileged impersonation by assigning a security level to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token when impersonation is enabled. To understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s only two levels of interest, SecurityImpersonation which means cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 impersonation is privileged and SecurityIdentification which is unprivileged.
If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token is assigned SecurityIdentification only operations such as querying for token information, such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token’s user is allowed. If you try and open a secured resource such as a file cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel will deny access. This is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 underlying vulnerability, if you look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PsReferenceImpersonationToken returns a copy of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security level assigned to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token, however cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code fails to verify it’s at SecurityImpersonation level. This means a normal user, who was able to get hold of a Local System access token could impersonate at SecurityIdentification and still pass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 check as querying for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user is permitted.
Proving Trivial Exploitation
Exploiting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug requires capturing a Local System access token, impersonating it and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n calling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system call with appropriate parameters. This must be achievable from normal user privilege ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise it isn’t a security vulnerability. The system call is undocumented so if we wanted to take a shortcut could we just demonstrate that we can capture cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token and leave it at that?
Well not really, what this PoC would demonstrate is that something which is documented as possible is indeed possible. Namely that it’s possible from a normal user to capture cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token and impersonate it, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 impersonation system is designed this would not cause a security issue. I knew already that COM supports impersonation, that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s a number of complex system privileged services (for example BITS) we can communicate with as a normal user that we could convince to communicate back to our application in order to perform cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 impersonation. This wouldn’t demonstrate that we can even reach cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable AhcVerifyAdminContext method in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel let alone successfully bypass cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 check.
So starts cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 long process of reverse engineering to work out how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system call works and what parameters you need to pass to get it to do something useful. There’s some existing work from ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r researchers (such as this) but certainly nothing concrete to take forward. The system call supports a number of different operations, it turned out that not all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operations needed complex parameters. For example cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AppHelpNotifyStart and AppHelpNotifyStop operations could be easily called, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y relied on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AhcVerifyAdminContext function. I could now produce a PoC which we can verify bypasses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 check by observing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system call’s return code.
BOOL IsSecurityVulnerability() {
ImpersonateLocalSystem();
NTSTATUS status = NtApphelpCacheControl(AppHelpNotifyStop, NULL);
return status != STATUS_ACCESS_DENIED;
}
Is this sufficient to prove exploitability? History has taught me no, for example this issue has almost cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exact same sort of operation, namely you can bypass an administrator check through impersonation. In this case I couldn’t produce sufficient evidence that it was exploitable for anything ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than information disclosure. So in turn it was not fixed, even though it was effectively a security issue. To give ourselves cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best chance of proving exploitability we need to spend more time on this PoC.
Improving cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Proof-of-Concept
In order to improve upon cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first PoC I would need to get a better understanding of what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system call is doing. The application compatibility cache is used to store cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lookup data from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application compatibility database. This database contains rules which tell cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application compatibility system what executables to apply “shims” to in order implement custom behaviours, such as lying about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system’s version number to circumvent an incorrect check. The lookup is made every time a process is created, if a suitable matching entry is found it’ll be applied to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new process. The new process will cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n lookup cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shim data it needs to apply from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 database.
As this occurs every time a new process is created cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s a significant performance impact in going to database file every time. The cache is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re to reduce this impact, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 database lookup can be added to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cache. If that executable is created later cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cached lookup can quickly eliminate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 expensive database lookup and eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r apply a set of shims or not.
Therefore we should be able to cache an existing lookup and apply it to an arbitrary executable. So I spent some time working out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parameters to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system call in order to add my own cached lookup. The resulting structure for Windows 8.1 32 bit looked like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following:
struct ApphelpCacheControlData {
BYTE unk0[0x98];
DWORD query_flags;
DWORD cache_flags;
HANDLE file_handle;
HANDLE process_handle;
UNICODE_STRING file_name;
UNICODE_STRING package_name;
DWORD buf_len;
LPVOID buffer;
BYTE unkC0[0x2C];
UNICODE_STRING module_name;
BYTE unkF4[0x14];
};
You can see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s an awful lot of unknown parts in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 structure. This causes a problem if you were to apply this to Windows 7 (which has a slightly different structure) or 64 bit (which has a different sized structure) but for our purposes it doesn’t matter. We’re not supposed to be writing code to exploit all versions of Windows, all we need to do is prove cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security issue to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor. As long as you inform cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC limitations (and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y pay attention to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m) we can do this. The vendor’s still better placed to determine if this PoC proves exploitability across versions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OS, it’s cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir product after all.
So I could now add an arbitrary cached entry but what can we actually add? I could only add an entry which would have been cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 result of an existing lookup. You could modify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 database to do something like patch running code (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application compatibility system is also used for hotfixes) but that would require administrator privileges. So I needed an existing shim to repurpose.
I built a copy of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SDB explorer tool (available from here) so that I could dump cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing database looking for any useful existing shim. I found that for 32 bit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s a shim which will cause a process to start cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 executable regsvr32.exe passing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original command line. This tool will load a DLL passed on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 command line and execute specific exported methods, if we could control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 command line of a privileged process we could redirect it and elevate privileges.
This again limits cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC to only 32 bit processes but that’s fine. The final step, and what caused a lot of confusion was what process to choose to redirect. I could have spent a lot of time investigating ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r ways of achieving cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 requirement of starting a process where I control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 command line. I already knew one way of doing it, UAC auto elevation. Auto elevation is a feature added to Windows 7 to reduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of UAC dialogs a typical user sees. The OS defines a fixed list of allowed auto elevating applications, when UAC is at it’s default setting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n requests to elevate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se applications do not show a dialog when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user’s an administrator. I can abuse this by applying a cache entry for an existing auto elevating application (in this case I chose ComputerDefaults.exe) and requesting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application runs elevated. This elevated application redirects to regsvr32 passing our fully controlled command line, regsvr32 loads my DLL and we’ve now got code executing with elevated privileges.
The PoC didn’t give someone anything cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y couldn’t already do through various ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r mechanisms (such as this metasploit module) but it was never meant to. It sufficiently demonstrated cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue by providing an observable result (arbitrary code running as an administrator), from this Microsoft were able to reproduce it and fix it.
Final Bit of Fun
As cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was some confusion on whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r this was only a UAC bypass I decided to spend a little time to develop a new PoC which gets local system privileges without any reliance on UAC. Sometimes I enjoy writing exploits, if only to prove that it can be done. To convert cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original PoC to one which gets local system privileges I need a different application to redirect. I decided cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most likely target was a registered scheduled task as you can sometimes pass arbitrary arguments to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 task handler process. So we’ve got three criteria for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ideal task, a normal user must be able to start it, it must result in a process starting as local system and that process must have an arbitrary command line specified by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user. After a bit of searching I found cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ideal candidate, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows Store Maintenance Task. As we can see if runs as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 local system user.
We can determine that a normal user can start it by looking at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 task file’s DACL using a tool such as icacls. Notice cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entry in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following screenshot for NT AUTHORITY\Aucá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365nticated Users with Read and Execute (RX) permissions.
Finally we can check whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r a normal user can pass any arguments to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 task by checking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XML task file. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case of WSTask it uses a custom COM handler, but allows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user to specify two command line arguments. This results in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 executable c:\windows\system32\taskhost.exe executing with an arbitrary command line as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 local system user.
It was just a case of modifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC to add a cache entry for taskhost.exe and start cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 task with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 path to our DLL. This still has a limitation, specifically it only works on 32 bit Windows 8.1 (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s no 32 bit taskhost.exe on 64 bit platforms to redirect). Still I’m sure it can be made to work on 64 bit with a bit more effort. As cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability is now fixed I’ve made available cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new PoC, it’s attached to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original issue here.
Conclusions
I hope I’ve demonstrated some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 effort a vulnerability researcher would go to in order to ensure a vulnerability will be fixed. It’s ultimately a trade off between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time spent developing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chances of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability being fixed, especially when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability is complex or non-obvious.
In this case I felt I made cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right trade-off. Even though cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC I sent to Microsoft looked, on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 surface to only be a UAC bypass combined with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 report cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were able to determine cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 true severity and develop cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 patch. Of course if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y’d pushed back and claimed it was not exploitable cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n I would have developed a more robust PoC. As a furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r demonstration of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 severity I did produce a working exploit which gained local system privileges from a normal user account.
Disclosing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC exploit is of value to aid in a user’s or security company’s mitigation of a public vulnerability. Without a PoC it’s quite difficult to verify that a security issue has been patched or mitigated. It also helps to inform researchers and developers what types of issues to look out for when developing certain security sensitive applications. Bug hunting is not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sole approach for Project Zero to help secure software, education is just as important.
Project Zero’s mission involves tackling software vulnerabilities, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 development of PoCs can be an important part of our duty to help software vendors or open source projects take informed action to fix vulnerabilities.