Posted by Samuel Groß, Project Zero
This blog post discusses an old type of issue, vulnerabilities in image format parsers, in a new(er) context: on interactionless code paths in popular messenger apps. This research was focused on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Apple ecosystem and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image parsing API provided by it: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ImageIO framework. Multiple vulnerabilities in image parsing code were found, reported to Apple or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 respective open source image library maintainers, and subsequently fixed. During this research, a lightweight and low-overhead guided fuzzing approach for closed source binaries was implemented and is released alongside this blogpost.
To reiterate an important point, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities described throughout this blog are reachable through popular messengers but are not part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir codebase. It is thus not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 responsibility of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 messenger vendors to fix cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.
Introduction
While reverse engineering popular messenger apps, I came across cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following code (manually decompiled into ObjC and slightly simplified) on a code path reachable without user interaction:
NSData* payload = [handler decryptData:encryptedDataFromSender, ...];
if (isImagePayload) {
UIImage* img = [UIImage imageWithData:payload];
...;
}
This code decrypts binary data received as part of an incoming message from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sender and instantiates a UIImage instance from it. The UIImage constructor will cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n try to determine cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image format automatically. Afterwards, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 received image is passed to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following code:
CGImageRef cgImage = [image CGImage];
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef cgContext = CGBitmapContextCreate(0, thumbnailWidth, thumbnailHeight, ...);
CGContextDrawImage(cgContext, cgImage, ...);
CGImageRef outImage = CGBitmapContextCreateImage(cgContext);
UIImage* thumbnail = [UIImage imageWithCGImage:outImage];
The purpose of this code is to render a smaller sized version of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input image for use as a thumbnail in a notification for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user. Unsurprisingly, similar code can be found in ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r messenger apps as well. In essence, code like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one shown above turns Apple’s UIImage image parsing and CoreGraphics image rendering code into 0click attack surface.
One of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 insights gained from developing an exploit for an iMessage vulnerability was that a memory corruption vulnerability could likely be exploited using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 described techniques if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following preconditions are met:
- A form of automatic delivery receipt sent from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same process handling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 messages
- Per-boot ASLR of at least some memory mappings
- Automatically restarting services
In that case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability could for example be used to corrupt a pointer to an ObjC object (or something similar), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n construct a crash oracle to bypass ASLR, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n gain code execution afterwards.
All preconditions are satisfied in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current attack scenario, thus prompting some research into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 robustness of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exposed image parsing code. Looking into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 documentation of UImage, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following sentence can be found: “You use image objects to represent image data of all kinds, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 UIImage class is capable of managing data for all image formats supported by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 underlying platform”. As such, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next step was determining exactly what image formats were supported by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 underlying platform.
An Introduction to ImageIO.framework
Parsing of image data passed to UIImage is implemented in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ImageIO framework. As such, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 supported image formats can be enumerated by reverse engineering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ImageIO library (/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO on macOS or part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dyld_shared_cache on iOS).
In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ImageIO framework, every supported image format has a dedicated IIO_Reader subclass for it. Each IIO_Reader subclass is expected to implement a testHeader function which, when given a chunk of bytes, should decide 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ý bet365se bytes represent an image in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format supported by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reader. An example implementation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 testHeader implementation for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 LibJPEG reader is shown below. It simply tests a few bytes of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input to detect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JPEG header magic.
bool IIO_Reader_LibJPEG::testHeader(IIO_Reader_LibJPEG *this, const unsigned __int8 *a2, unsigned __int64 a3, const __CFString *a4)
{
return *a2 == 0xFF && a2[1] == 0xD8 && a2[2] == 0xFF;
}
By listing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 different testHeader implementations, it thus becomes possible to compile a list of file formats supported by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ImageIO library. The list is as follows:
IIORawCamera_Reader::testHeader
IIO_Reader_AI::testHeader
IIO_Reader_ASTC::testHeader
IIO_Reader_ATX::testHeader
IIO_Reader_AppleJPEG::testHeader
IIO_Reader_BC::testHeader
IIO_Reader_BMP::testHeader
IIO_Reader_CUR::testHeader
IIO_Reader_GIF::testHeader
IIO_Reader_HEIF::testHeader
IIO_Reader_ICNS::testHeader
IIO_Reader_ICO::testHeader
IIO_Reader_JP2::testHeader
IIO_Reader_KTX::testHeader
IIO_Reader_LibJPEG::testHeader
IIO_Reader_MPO::testHeader
IIO_Reader_OpenEXR::testHeader
IIO_Reader_PBM::testHeader
IIO_Reader_PDF::testHeader
IIO_Reader_PICT::testHeader (macOS only)
IIO_Reader_PNG::testHeader
IIO_Reader_PSD::testHeader
IIO_Reader_PVR::testHeader
IIO_Reader_RAD::testHeader
IIO_Reader_SGI::testHeader (macOS only)
IIO_Reader_TGA::testHeader
IIO_Reader_TIFF::testHeader
While this list contains many familiar formats (JPEG, PNG, GIF, …) cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are numerous racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r exotic ones as well (KTX and ASTC, apparently used for textures or AI: Adobe Illustrator Artwork) and some that appear to be specific to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Apple ecosystem (ICNS for icons, ATX likely for Animojis)
Support for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 different formats also varies. Some formats appear fully supported and are often implemented using what appear to be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 open source parsing library which can be found in /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources on macOS: libGIF.dylib, libJP2.dylib, libJPEG.dylib, libOpenEXR.dylib, libPng.dylib, libRadiance.dylib, and libTIFF.dylib. Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r formats seem to have only rudimentary support for handling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most common cases.
Finally, some formats (e.g. PSD), also appear to support out-of-process decoding (on macOS this is handled by /System/Library/Frameworks/ImageIO.framework/Versions/A/XPCServices/ImageIOXPCService.xpc) which can help sandbox vulnerabilities in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parsers. It does not, however, seem to be possible to specify whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r parsing should be performed in-process or out-of-process in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public APIs, and no attempt was made to change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 default behaviour.
Fuzzing Closed Source Image Parsers
Given cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wide range of available image formats and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that no source code is available for 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ý bet365 code, fuzzing seemed like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 obvious choice.
The choice of which fuzzer and fuzzing approach to use was not so obvious. Since 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ý bet365 target code was not open source, many standard tools were not directly applicable. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, I had decided to limit fuzzing to a single Mac Mini for simplicity. Thus, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzer should:
- Run with as little overhead as possible to fully utilize cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 available compute resources, and
- Make use some kind of code coverage guidance
In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end I decided to implement something myself on top of Honggfuzz. The idea for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzing approach is loosely based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 paper: Full-speed Fuzzing: Reducing Fuzzing Overhead through Coverage-guided Tracing
and achieves lightweight, low-overhead coverage guided fuzzing for closed source code by:
- Enumerating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 start offset of every basic block in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program/library. This is done with a simple IDAPython script
- At runtime, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzed process, replacing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first byte of every undiscovered basic block with a breakpoint instruction (int3 on Intel). The original byte and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding offset in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 coverage bitmap are stored in a dedicated shadow memory mapping whose address can be computed from 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 modified library, and
- Installing a SIGTRAP handler that will:
- Retrieve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 faulting address and compute cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 offset in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 library as well as 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 corresponding entry in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shadow memory
- Mark cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 basic block as found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 global coverage bitmap
- Replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 breakpoint with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original byte
- Resume execution
As only undiscovered basic blocks are instrumented and since every breakpoint is only triggered once, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 runtime overhead quickly approaches zero. It should, however, be noted that this approach only achieves basic block coverage and not edge coverage as used for example by AFL and which, for closed source targets, can be achieved through dynamic binary instrumentation albeit with some performance overhead. It will thus be more “coarse grained” and for example treat different transitions to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same basic block as equal whereas AFL would not. As such, this approach will likely find fewer vulnerabilities given cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same number of iterations. I deemed this acceptable as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 goal of this research was not to perform thorough discovery of all vulnerabilities but racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r to quickly test cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 robustness of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image parsing code and highlight cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack vector. Thorough fuzzing, in any case, is always best performed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 maintainers with source code access.
The described approach was fairly easy to implement by patching honggfuzz’s client instrumentation code and writing an IDAPython script to enumerate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 basic block offsets. Both patch and IDAPython script can be found here.
The fuzzer cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n started from a small corpus of around 700 seed images covering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 supported image formats and ran for multiple weeks. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following vulnerabilities were identified:
A bug in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 usage of libTiff by ImageIO which caused controlled data to be written past cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of a memory buffer. No CVE was assigned for this issue likely because it had already been discovered internally by Apple before we reported it.
An out-of-bounds read on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap when processing DDS images with invalid size parameters.
An out-of-bounds write on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap when processing JPEG images with an optimized parser.
Possibly an off-by-one error in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PVR decoding logic leading to an additional row of pixel data being written out-of-bounds past cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 output buffer.
A related bug in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PVR decoder leading to an out-of-bounds read which likely had cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same root cause as P0 Issue 1974 and thus was assigned cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same CVE number.
An out-of-bounds read during handling of OpenEXR images.
The last issue was somewhat special as it occurred in 3rd party code bundled with ImageIO, namely that of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OpenEXR library. As that library is open source, I decided to fuzz it separately as well.
OpenEXR
OpenEXR is “a high dynamic-range (HDR) image file format [...] for use in computer imaging applications”. The parser is implemented in C and C++ and can be found on github.
As described above, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OpenEXR library is exposed through Apple’s ImageIO framework and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore is exposed as a 0click attack surface through various popular messenger apps on Apple devices. It is likely that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface is not limited to messaging apps, though I haven't conducted additional research to support that claim.
As cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 library is open source, “conventional” guided fuzzing is much easier to perform. I used a Google internal, coverage-guided fuzzer running on roughly 500 cores for around two weeks. The fuzzer was guided by edge coverage using llvm’s SanitizerCoverage and generated new inputs by mutating existing ones using common binary mutation strategies and starting from a set of roughly 80 existing OpenEXR images as seeds.
Eight likely unique vulnerabilities were identified and reported as P0 issue 1987 to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OpenEXR maintainers, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n fixed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 2.4.1 release. They are briefly summarized next:
CVE-2020-11764
An out-of-bounds write (of presumably image pixels) on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 copyIntoFrameBuffer function.
CVE-2020-11763
A bug that caused a std::vector to be read out-ouf-bounds. Afterwards, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 calling code would write into an element slot of this vector, thus likely corrupting memory.
CVE-2020-11762
An out-of-bounds memcpy that was reading data out-of-bounds and afterwards potentially writing it out-of-bounds as well.
CVE-2020-11760, CVE-2020-11761, CVE-2020-11758
Various out-of-bounds reads of pixel data and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r data structures.
CVE-2020-11765
An out-of-bounds read on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack, likely due to an off-by-one error previously overwriting a string null terminator on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack.
CVE-2020-11759
Likely an integer overflow issue leading to a write to a wild pointer.
Interestingly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crash initially found by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ImageIO fuzzer (issue 1988) did not appear to be reproducible in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 upstream OpenEXR library and was thus reported directly to Apple. A possible explanation is that Apple was shipping an outdated version of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OpenEXR library and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug had been fixed upstream in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 meantime.
Recommendations
Media format parsing remains an important issue. This was also demonstrated by ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r researchers and vendor advisories, with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two following coming immediately to mind:
This of course suggests that continuous fuzz-testing of input parsers should occur on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor/code maintainer side. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, allowing clients of a library like ImageIO to restrict cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allowed input formats and potentially to opt-in to out-of-process decoding can help prevent exploitation.
On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 messenger side, one recommendation is to reduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface by restricting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 receiver to a small number of supported image formats (at least for message previews that don’t require interaction). In that case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sender would cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n re-encode any unsupported image format prior to sending it to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 receiver. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case of ImageIO, that would reduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface from around 25 image formats down to just a handful or less.
Conclusion
This blog post described how image parsing code, as part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system or third party libraries, end up being exposed to 0click attack surface through popular messengers. Fuzzing of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exposed code turned up numerous new vulnerabilities which have since been fixed. It is likely that, given enough effort (and exploit attempts granted due to automatically restarting services), some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 found vulnerabilities can be exploited for RCE in a 0click attack scenario. Unfortunately it is also likely that ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r bugs remain or will be introduced in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 future. As such, continuous fuzz-testing of this and similar media format parsing code as well as aggressive attack-surface reduction, both in operating system libraries (in this case ImageIO) as well as messenger apps (by restricting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of accepted image formats on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 receiver) are recommended.