Posted by Natalie Silvanovich, Project Zero
CVE-2019-8646 is a somewhat unusual vulnerability I reported in iMessage. It has a number of consequences, including information leakage and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to remotely read files on a device. This blog post discusses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ways that an attacker could use this bug. It is a good example of how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 large number of classes available for NSKeyedArchiver deserialization can make a bug more versatile. It’s also a good example of how minor functional bugs can make a vulnerability more useful.
Please note that this blog post assumes some familiarity with NSKeyedArchiver deserialization. If you haven’t read our general post on iMessage, I’d recommend reading that first.
The Bug
The bug described in CVE-2019-8646 is that an unsafe class, _NSDataFileBackedFuture, can be deserialized by iMessage in a remote context. It was introduced in iOS 12.1. This class is a subclass of NSData that initializes a buffer with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of a file at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer is used. When this class is deserialized, it decodes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer, a string file name and a few ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r objects. It cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n initializes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 instance with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length and filename. Then when [_NSDataFileBackedFuture length] is called, it returns cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 deserialized length. When [_NSDataFileBackedFuture bytes]is called, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file is opened and loaded into a buffer into memory, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer is returned. The buffer is also cached for future calls to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 method.
There are two immediate problems with being able to deserialize this class in an untrusted context. One is that it has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 potential to allow a process to access a file that it is not authorized to access, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process doing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 deserialization is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one that loads cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file. When I reported this bug, I thought that this was more likely to be a concern for deserialization that occurs locally via IPC as opposed to deserialization that occurs on a remote target like iMessage. The second is that this class violates one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 guarantees that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NSData class makes, that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length property will always return cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bytes property. This is because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer returned by [_NSDataFileBackedFuture bytes]is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 loaded file, and has no relationship to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 deserialized length returned by [_NSDataFileBackedFuture length].
The original proof-of-concept (PoC) attached to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug report is a simple out-of-bounds read. The payload includes a serialized instance of class ACZeroingString, which is a subclass of NSString. Its initWithCoder method deserializes an instance of class NSData, as well as a length that must be half cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 [NSData length] that it uses to initialize cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NSData instance is of subclass _NSDataFileBackedFuture, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length property of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 instance can be longer than its internal data, causing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC to return a string that contains cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of unallocated memory, or cause a crash.
Accessing a Remote URL
At this point, this bug didn’t seem that useful for a remote attack, so I wondered if it would be possible for it to access a remote URL instead of a local file. The URL is accessed by calling [NSData initWithContentsOfURL:options:error:], which can initialize a buffer from any type of URL, including HTTP URLs, however cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 _NSDataFileBackedFuture class contains some checks to prevent this.
There are no checks to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL on initialization, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are some checks when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL is accessed in [_NSDataFileBackedFuture fileURL]. Specifically, it calls [NSURL path] on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n calls [NSFileManager fileExistsAtPath:] on that path. This does not check that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL is a file URL before checking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 path. So it is possible to bypass this check by using a URL that has a path component that resolves to an existing file. I used: http://natashenka.party//System/Library/ColorSync/Resources/ColorTables.data.
Creating a URL with Unprintable Characters
The ability to make a request to a URL created an interesting possibility. Maybe it was possible to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL to leak data remotely. Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original PoC created a string that contained leaked data, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NSURL class is deserialized using a string, it didn’t seem like it would be that difficult. It turned out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was a problem using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NSURL class though. An NSURL instance has very strict limitations on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 characters it can contain. This class is mostly open-source, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exact limitations can be seen in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 _CFStringIsLegalURLString method. This is a very robust method, and I did not find any ways to get around cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 limitations. I did notice that after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 method succeeds, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 method _CFURLInit is called, which calls CFStringCreateCopy on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input string, so it caches a copy of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 validated string to use as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL later.
One idea I had was to change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL was created, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL string is only validated once. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 absence of bugs, this shouldn’t be possible. CFStringCreateCopy calls [NSString copy] on most string objects, and for a mutable string, this should copy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string, so that any future changes to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string do not affect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 copy. For a non-mutable string, it sometimes just increases cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 retain count on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string, but that also shouldn’t be a problem, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of a mutable string can’t change.
I looked through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subclasses of NSString that can be deserialized in iMessage to see if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re were any that didn’t follow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mutable copy rules described above. There were a few, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most promising was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 class INDeferredLocalizedString. This class is technically immutable (in that it extends NSString instead of NSMutableString), and it implements copy by adding a reference. But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of an INDeferredLocalizedString instance can change. Its deserialization implementation in pseudocode is as follows.
It deserializes many properties, including a bundle URL that can be used for localization, a format string with a corresponding array of localized strings and a cached string. When an INDeferredLocalizedString instance is accessed, its value is determined by calling [INDeferredLocalizedString localizeForLanguage:], which generates cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se values and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device’s language settings. The deserialized properties have a precedence. For example, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 class would prefer to fetch a string from a bundle as opposed to generating it from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format string.
Even with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se properties, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string would only change if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device’s language changed, however, it is possible to make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string change due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issues with cycling in NSKeyedArchiver deserialization described in this post. The highest precedence property of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 class, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 _cachedLocalization string is deserialized last, meanwhile a lower precedence property _formatKey is serialized earlier. The bundle URL is deserialized in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 middle of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se two. So if an instance of class INDeferredLocalizedString has a valid _formatKey, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bundle URL’s string is a reference to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string itself, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL will validate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 _formatKey when it is being created. Initialization of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 INDeferredLocalizedString instance will cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n continue, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 _cachedLocalization string will be deserialized and set as a property. After cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 INDeferredLocalizedString deserialization is complete, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL will be available in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NSKeyedUnarchiver decoder’s cache. When anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r class, such as _NSDataFileBackedFuture, uses it, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string value will now be generated based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 _cachedLocalization property, which is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 unvalidated string.
This behavior allowed me to create a message that would leak memory and send it to a remote server as a URL parameter. A sample message with this behavior is available here. That said, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parameter is only read up to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first null character, so this PoC usually only sends a few bytes. This is probably enough to leak a single pointer to break ASLR with enough tries, but not good for much else.
Concatenating and Encoding Leaked Data
This limitation also prevents a more interesting attack: remotely leaking a file. Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 _NSDataFileBackedFuture class can load a file into a buffer, and also send cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents to a remote URL, is a possible attack, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 prevalence of null characters in file format headers limits its usefulness.
There is also a more subtle problem preventing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PoC above from being immediately repurposed to leak a file. The PoC works by creating a _NSDataFileBackedFuture instance with contents that are smaller than its length, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n using that instance to create an ACZeroingString instance, which in a roundabout way becomes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string of a URL. That URL is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n used as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL of anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r _NSDataFileBackedFuture instance. But what is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string value of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first _NSDataFileBackedFuture instance? I used anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r remote URL which responded with a buffer containing anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r partial URL (http://natashenka.party//System/Library/ColorSync/Resources/ColorTables.data?val=). So when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 _NSDataFileBackedFuture buffer is read out of bounds when creating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ACZeroingString instance, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 leaked data continues cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL. This is not possible when accessing a file with _NSDataFileBackedFuture, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file contents are set and generally are not in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format of a URL. So in order to leak a file, I also need to be able to concatenate strings.
The INDeferredLocalizedString class has functionality that is helpful in getting around both of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se limitations. Two properties that can be decoded during deserialization are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string _formatKey and an array of strings, _argument. If an INDeferredLocalizedString instance has only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se properties, it will generate its value using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first property as a format string, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second property as its parameter.
(You might be wondering at this point whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r this behaviour is a vulnerability in itself because an attacker can control both a format string and its parameters. It’s not, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 class uses a ‘fake’ format string implementation that is based on regular expressions. The implementation searches for instances of “%@” or similar in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format string, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n replaces cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m sequentially with values from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 array).
This format string behaviour allows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ACZeroingString instance to be inserted into a string containing a URL, and it also helps with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue of null characters. When an ACZeroingString instance is formatted with “%@”, non-printable characters are escaped in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format “\UXXXX”. Single null bytes will be added to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string as a part of a character in this way, however if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are two null bytes in a row, this character will be omitted. This type of encoding is useful in some contexts (for example, leaking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SMS database, where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are a lot of null characters, but only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string are relevant), but is not enough to completely leak a full file.
Looking at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ‘fake’ format string function a bit more, it calls description on every member of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 arguments array before inserting it into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format string. This would be very useful behavior if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 arguments array wasn’t limited to containing string types. Calling description on an instance of class NSURL URL encodes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL string before it is inserted. So if it was possible to put cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL containing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 leaked bytes into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 arguments array, it could be encoded, which would allow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire file to be sent as a part of a URL.
There is a problem in NSKeyedUnarchiverSerialization which can allow objects that are not included in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allow list to be returned when an instance of class NSArray or NSDictionary is deserialized. The first time an array or dictionary is deserialized, every element, key or value that is deserialized as a part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object’s contents is checked against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allow list. But if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object has already been deserialized, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object is returned from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NSKeyedUnarchiverSerialization instance’s object cache, and only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object, and not its elements, keys or values are checked against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allow list. So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 _arguments array could contain a URL, so long as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 array had already been deserialized elsewhere.
It was a bit of a challenge finding somewhere an array containing a URL could be deserialized in iMessage. The top level allow list does not include class NSArray, and I could not find a class with an initWithCoder: implementation that contained a deserialization call that allows both arrays and URLs. I eventually implemented it so that it uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug twice. First, a dictionary containing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL is decoded, which is allowed at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top level. Then, an instance of __NSLocalizedString is decoded, which decodes a property NS.configDict, which allows arrays and dictionaries, but not URLs, but because of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug, a dictionary containing a URL is okay. Then, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug is used again when initializing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 _arguments array of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 INDeferredLocalizedString instance, which is allowed because it only checks that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 referenced array is an instance of NSArray. When this object is formatted into a string, it will contain some extra characters due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dictionary, but ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise will still be encoded.
Leaking a File
Putting this all togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r allowed for a file to be read remotely from an iPhone. There are a few limitations to this attack. First, it is very memory intensive, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 largest memory hog being cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ‘fake’ format string function that needs to handle a very long string. SpringBoard can crash due to memory limits if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file is too long. The limit appears to be around 40kB to 100kB depending on device memory, though it’s likely this could be increased with enough effort. It is possible to fetch cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning of a larger file within this limit, and also reduce memory usage a bit by using escape (“\U”) encoding instead of URL encoding in situations where stripping null characters are okay.
The encoding of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL returned to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remote server is also quite complex. The URL is escaped for a few characters up until cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL schema would be is reached, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n it moves into URL encoding. The URL coding is also escaped though, so it needs to be unescaped before it is URL decoded., The escaped characters are in UTF-16 meanwhile cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL encoded characters are in UTF-8, complicating matters. Then cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re can be a third section of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL that is just escaped, which occurs because when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 valid characters are switched for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 invalid characters when creating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL it retains cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 valid characters. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL is too short, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extra characters will only be escaped.
There’s anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r problem with encoding, which is that sometimes printable characters are duplicated in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL encoded string. It’s not clear why this happens, it could be a bug in [NSURL description] or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL encoder. It is fairly easy to programmatically recognize and correct cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se duplications, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is always cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 possibility that a file contains cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se exact patterns, at which case cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file could be read with errors. A python script that decodes all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iterations of encoding in a returned URL and outputs a file is available here. I have not seen any files that contain errors after being processed with this script, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a small probability that this could occur.
The following video shows this vulnerability being used to access a photo from a remote device’s memory. First cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sms.db file is accessed to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 photo, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 photo is accessed.
Conclusion
CVE-2019-8646 is a vulnerability in iMessage that can allow memory to be leaked and files to be read remotely from a device. The bug was fixed on July 23, 2019. This fix requires cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 class to be explicitly allowed for deserialization, as opposed to being allowed in any situation that permits NSData deserialization.
There were several factors that caused this bug to be exploitable in this way. One is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 large number of classes available for deserialization in SpringBoard. Without cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ACZeroingString, INDeferredLocalizedString and __NSLocalizedString object being available, this bug would be less useful to an attacker.
Also, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re were three small bugs that contributed to this bug’s capabilities. First, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 error in [INDeferredLocalizedString copy] is a bug that would usually just lead to occasional crashes when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device’s language was changed, but in this situation, it turned out to be exactly cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug that was needed to circumvent cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 character restrictions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NSURL class. Likewise, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 error in NSKeyedUnarchiver that allows arrays and dictionaries containing any type of object to be returned if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are already decoded would usually only cause exceptions related to typing, but in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case allows for a URL to be encoded. Finally, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 _NSDataFileBackedFuture class to access remote URLs was also a small bug in URL filtering. This shows that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a security benefit to avoiding and fixing bugs, even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y don’t have an obvious security impact. Alone, none of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se bugs, including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability were that serious, but togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y allow a user’s data to be accessed remotely.
No comments:
Post a Comment