Wednesday, December 19, 2018

On VBScript

Posted by Ivan Fratric, Google Project Zero

Introduction

Vulnerabilities in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VBScript scripting engine are a well known way to attack Microsoft Windows. In order to reduce this attack surface, in Windows 10 Fall Creators Update, Microsoft disabled VBScript execution in Internet Explorer in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Internet Zone and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Restricted Sites Zone by default. Yet this did not deter attackers from using it - in 2018 alone, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re have been at least two instances of 0day attacks using vulnerabilities in VBScript: CVE-2018-8174 and CVE-2018-8373. In both of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se cases, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 delivery method for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit were Microsoft Office files with an embedded object which caused malicious VBScript code to be processed using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Internet Explorer engine. For a more detailed analysis of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 techniques used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se exploits please refer to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir analysis by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original discoverers here and here.

Because of this dubious popularity of VBScript, multiple security researchers took up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 challenge of finding (and reporting) ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r instances of VBScript vulnerabilities, including a number of variants of those vulnerabilities used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild. Notably, researchers working with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Zero day initiative discovered multiple instances of vulnerabilities relying on VBScript Class_Terminate callback and Yuki Chen of Qihoo 360 Vulcan Team discovered multiple variants of CVE-2018-8174 (one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploits used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild).

As a follow up to those events, this blog post tries to answer cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following question: Despite all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing efforts from Microsoft and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security community, how easy is it to still discover new VBScript vulnerabilities? And how strong are Windows policies intended to stop cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se vulnerabilities from being exploited?

Even more VBScript vulnerabilities

The approach we used to find VBScript vulnerabilities was quite straightforward: We used cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 already published Domato grammar fuzzing engine and wrote a grammar that describes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 built-in VBScript functions, various callbacks and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r common patterns. This is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same approach we used successfully previously to find multiple vulnerabilities in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JScript scripting engine and it was relatively straightforward to do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same for VBScript. The grammar and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 generator script can be found here.

This approach resulted in uncovering three new VBScript vulnerabilities that we reported to Microsoft and are now fixed. The vulnerabilities are interesting, not because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are complex, but precisely for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 opposite reason: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are pretty straightforward (yet, somehow, still survived to this day). Additionally, in several cases, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are parallels that can be drawn between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ones we found.

To demonstrate this, before taking a look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first vulnerability cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzer found, let’s take a look at a PoC for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest VBScript 0day found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild:

Class MyClass
 Dim array
 
 Private Sub Class_Initialize
   ReDim array(2)
 End Sub

 Public Default Property Get P
   ReDim preserve array(1)
 End Property
End Class

Set cls = new MyClass
cls.array(2) = cls

Trend Micro has a more detailed analysis, but in short, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most interesting line is

cls.array(2) = cls

In it, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 left side is evaluated first and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address of variable at cls.array(2) is computed. Then, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right side is evaluated, and because cls is an object of type MyClass which has a default property getter, it triggers a callback. Inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 callback, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 array is resized and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 variable computed previously is no longer valid - it now points to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 freed memory. This results in writing to a freed memory when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 line above gets executed.

Now, let’s compare this sample to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first issue we found:

Class MyClass
 Private Sub Class_Terminate()
   dict.RemoveAll
 End Sub
End Class

Set dict = CreateObject("Scripting.Dictionary")
Set dict.Item("foo") = new MyClass
dict.Item("foo") = 1

On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first glance, this might not appear all that similar, but in reality cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are. The line that triggers cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue is

dict.Item("foo") = 1

In it, once again, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 left side is allocated first and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address of dict.Item("foo") is computed. Then, a value is assigned to it, but because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is already a value cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re it needs to be cleared first. Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing value is of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type MyClass, this results in a Class_Terminate() callback, in which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dict is cleared. This, once again, causes that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address computed when evaluating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 left side of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 expression now points to a freed memory.

In both of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se cases, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pattern is:
  1. Compute cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address of a member variable of some container object
  2. Assign a value to it
  3. Assignment causes a callback in which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 container storage is freed
  4. Assignment causes writing to a freed memory

The two differences between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se two samples are that:
  1. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 container used was an array and in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second it was a dictionary
  2. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 callback used was a default property getter, and in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 callback was Class_Terminate.

Perhaps it was because this similarity with a publicly known sample that this variant was also independently discovered by a researcher working with Trend Micro's Zero Day Initiative and Yuki Chen of Qihoo 360 Vulcan Team. Given this similarity, it would not be surprising if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 0day that was used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild also knew about this variant.

The second bug we found wasn’t directly related to any 0days found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild (that we know about), however it is a classic example of a scripting engine vulnerability:

Class class1
 Public Default Property Get x
   ReDim arr(1)
 End Property
End Class

set c = new class1
arr = Array("b", "b", "a", "a", c)
Call Filter(arr, "a")

In it, a Filter function gets called on an array. The Filter function walks cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 array and returns anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r array containing just cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 elements that match cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specified substring ("a" in this case). Because one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 members of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input array is an object with a default property getter, this causes a callback, and in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 callback cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input array is resized. This results in reading variables out-of-bounds once we return from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 callback into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Filter function.

A possible reason why this bug survived this long could be that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Filter function tried to prevent bugs like this by checking if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 array size is larger (or equal) than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of matching objects at every iteration of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 algorithm. However, this check fails to account for array members that do not match cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 given substring (such as elements with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of "b" in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC).

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir advisory, Microsoft (initially) incorrectly classified cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 impact of this issue as an infoleak. While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug results in an out-of-bounds read, what is read out-of-bounds (and subsequently returned to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user) is a VBScript variable. If an attacker-controlled data is interpreted as a VBScript variable, this can result in a lot more than just infoleak and can easily be converted into a code execution. This issue is a good example of why, in general, an out-of-bounds read can be more than an infoleak: it always depends on precisely what kind of data is being read and how it is used.

The third bug we found is interesting because it is in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code that was already heavily worked on in order to address CVE-2018-8174 and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 variants found by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Qihoo 360 Vulcan Team. In fact, it is possible that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug we found was introduced when fixing one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous issues.

We initially became aware of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzer generated a sample that resulted in a NULL-pointer dereference with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following (minimized) PoC:

Dim a, r

Class class1
End Class

Class class2
 Private Sub Class_Terminate()
   set a = New class1
 End Sub
End Class

a = Array(0)
set a(0) = new class2
Erase a
set r = New RegExp
x = r.Replace("a", a)

Why does this result in a NULL-pointer dereference? This is what happens:
  1. An array a is created. At this point, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type of a is an array.
  2. An object of type class2 is set as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only member of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 array
  3. The array a is deleted using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Erase function. This also clears all array elements.
  4. Since class2 defines a custom destructor, it gets called during Erase function call.
  5. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 callback, we change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of a to an object of type class1.The type of a is now an object.
  6. Before Erase returns, it sets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of variable a to NULL. Now, a is a variable with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type object and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value NULL.
  7. In some cases, when a gets used, this leads to a NULL-pointer dereference.

But, can this scenario be used for more than a NULL-pointer dereference. To answer this question, let’s look at step 5. In it, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of a is set to an object of type class1. This assignment necessarily increases cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reference count of a class1 object. However, later, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of a is going to be set to NULL without decrementing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reference count. When cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC above finishes executing, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re will be an object of type class1 somewhere in memory with a reference count of 1, but no variable will actually point to it. This leads us to a reference leak scenario. For example, consider cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following PoC:

Dim a, c, i

Class class1
End Class

Class class2
 Private Sub Class_Terminate()
   set a = c
 End Sub
End Class

Set c = New class1
For i = 1 To 1000
 a = Array(0)
 set a(0) = new class2
 Erase a
Next

Using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 principle described above, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC above will increase cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reference count for variable c to 1000 when in reality only one object (variable c) will hold a reference to it. Since a reference count in VBScript is a 32-bit integer, if we increase it sufficient amount of times, it is going to overflow and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object might get freed when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are still references to it.

The above is not exactly true, because custom classes in VBScript have protection against reference count overflows, however this is not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case for built-in classes, such as RegExp. So, we can just use an object of type RegExp instead of class1 and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reference count will overflow eventually. As every reference count increase requires a callback, “eventually” here could mean several hours, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only realistic exploitation scenario would be someone opening a tab/window and forgetting to close it - not really an APT-style attack (unlike cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous bugs discussed) but still a good example how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 design of VBScript makes it very difficult to fix cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object lifetime issues.

Hunting for reference leaks

In an attempt to find more reference leaks issues, a simple modification was made to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzer: A counter was added and, every time a custom object was created, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 class constructor, this counter was increased. Similarly, every time an object was deleted, this counter was decreased in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 class destructor. When a sample finishes executing and all variables are clear, if this counter is larger than 0, this means cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was a reference leak somewhere.

This approach immediately resulted in a variant to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previously described reference leak, which is almost identical but uses ReDim instead of Erase. Microsoft responded that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are considering this a duplicate of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Erase issue.

Unfortunately cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a problem with this approach that prevents it from discovering more interesting reference leak issues: The approach can’t distinguish between “pure” reference leak issues and reference leak issues that are also memory leak issues and thus don’t necessarily have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same security impact. One example of issues this approach gets stuck on are circular references (imagine that object A has a reference to object B and object B also has reference to object A). However, we still believe that finding reference leaks can be automated as described later in this blog post.

Bypassing VBScript execution policy

As mentioned in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 introduction, in Windows 10 Fall Creators Update, Microsoft disabled VBScript execution in Internet Explorer in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Internet Zone and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Restricted Sites Zone by default. This is certainly a step in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right direction. However, let’s also examine cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 weaknesses in this approach and its implementation.

Firstly, note that, by default, this policy only applies to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Internet Zone and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Restricted Sites Zone. If a script runs (or an attacker can make it run) in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Local Intranet Zone or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Trusted Sites Zone, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 policy simply does not apply. Presumably this is to strike a balance between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 home users and business users that still rely on VBScript on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir local intranet. However, it is somewhat debatable whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r leaving potential gaps in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end-user security vs. having (behind-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-times) businesses that still rely on VBScript change a default setting strikes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right balance. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 future, we would prefer to see VBScript completely disabled by default in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Internet Explorer engine.

Secondly, when implementing this policy, Microsoft forgot to account for some places where VBScript code can be executed in Internet Explorer. Specifically, Internet Explorer supports MSXML object that has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to run VBScript code in XSL Transformations, for example like in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code below.

     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:msxsl="urn:schemas-microsoft-com:xslt"
     xmlns:user="http://mycompany.com/mynamespace">

Function xml(str)
          a = Array("Hello", "from", "VBscript")
          xml = Join(a)
End Function

  


Microsoft did not disable VBScript execution for MSXML, even for websites running in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Internet Zone. This issue was reported to Microsoft and fixed at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time of publishing this blog post.

You might think that all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se issues are avoidable if Internet Explorer isn’t used for web browsing, but unfortunately cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem with VBScript (and IE in general) runs deeper than that. Most Windows applications that render web content do it using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Internet Explorer engine, as is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case with Microsoft Office that was used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 recent 0days. It should be said that, earlier this year, Microsoft disabled VBScript creation in Microsoft Office (at least cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most recent version), so this popular vector has been blocked. However, 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 applications, including those from third parties, that also use IE engine for rendering web content.

Future research ideas

During this research, some ideas came up that we didn’t get around to implement. Racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than sitting on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, we’ll list cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m here in case a reader looking for a light research project wants to pick one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m up:

  • Combine VBScript fuzzer with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JScript fuzzer in a way that allows VBScript to access JScript objects/functions and vice-versa. Perhaps issues can be found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interaction of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se two engines. Possibly callbacks from one engine (e.g. default property getter from VBScript) can be triggered in unexpected places in 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 engine.

  • Create a better tool for finding reference leaks. This could be accomplished by running IE in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 debugger and setting breakpoints on object creation/deletion to track addresses of live objects. Afterwards, memory could be scanned similarly to how it was done here to find if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are any objects alive (with reference count >0) that are not actually referenced from anywhere else in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory (note: Page Heap should be used to ensure cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are no stale references from freed memory).

  • Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r objects. During cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 previous year, a number of bugs were found that rely on Scripting.Dictionary object. Scripting.Dictionary is not one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 built-in VBScript objects, but racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r needs to be instantiated using CreateObject function. Are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r objects available from VBScript that would be interesting to fuzz?

Conclusion

VBScript is a scripting engine from a time when a lot of today’s security considerations weren’t in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 forefront of anyone’s thoughts. Because of this, it shouldn’t be surprising that it is a crowd favorite when it comes to attacking Windows systems. And although it received a lot of attention from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security community recently, new vulnerabilities are still straightforward to find.

Microsoft made some good steps in attack surface reduction recently. However in combination with an execution policy bypass and various applications relying on Internet Explorer engine to render web content, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se bugs could still endanger even users using best practices on up-to-date systems. We hope that, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 future, Microsoft is going to take furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r steps to more comprehensively remove VBScript from all security-relevant contexts.

No comments:

Post a Comment