Wednesday, August 7, 2019

The Fully Remote Attack Surface of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone

Posted by Natalie Silvanovich, Project Zero

While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re have been several rumours and reports of fully remote vulnerabilities affecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone being used by attackers in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last couple of years, limited information is available about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 technical details of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se vulnerabilities, as well as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 underlying attack surface cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y occur in. I investigated cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remote, interaction-less attack surface of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone, and found several serious vulnerabilities.

Vulnerabilities are considered ‘remote’ when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker does not require any physical or network proximity to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target to be able to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability. Remote vulnerabilities are described as ‘fully remote’, ‘interaction-less’ or ‘zero click’ when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y do not require any physical interaction from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target to be exploited, and work in real time. I focused on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surfaces of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone that can be reached remotely, do not require any user interaction and immediately process input.

There are several attack surfaces of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone that have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se qualities, including SMS, MMS, VVM, Email and iMessage.

SMS

SMS seemed like a good starting point, as I had looked at SMS on Android in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past. Unlike Android, SMS messages are processed in native code by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone, which increases cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 likelihood of memory corruption vulnerabilities. SMS Packet Data Units (PDUs) are parsed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CommCenter binary using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 method sms::Controller::parseRawBytes which creates an instance of class sms::Model containing details of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 message. This instance is eventually processed by sms::Controller::processReceivedSms_sync which does additional processing and sends cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 message on to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r processes that handle cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. I reviewed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se two methods, but did not find any vulnerabilities.

I also noticed that CommCenter contained an SMS simulator that can be triggered via XPC. This tool processes SMS deliver PDUs as if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y arrived over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network. The simulator was missing a library that likely exists on internal test devices, so I wrote a library that implements cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 needed functionality to make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 simulator work.  This tool is available here. Fuzzing SMS with this tool did not uncover any vulnerabilities.

MMS

MMS messages are also processed by CommCenter, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bulk of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 processing is performed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 method MmsOperation::decodeMessage. I reviewed this method using IDA, and also fuzzed it by writing an application that called into this method in iOS. There were no vulnerabilities discovered with eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r method.

Visual Voicemail

While reviewing sms::Controller::processReceivedSms_sync, I noticed that this method forwards many specially formatted SMS messages on to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r processes. One area that looked interesting was Visual Voicemail (VVM), which I had reviewed previously on Android. VVM is a feature that allows voicemail messages to be viewed in a visual format similar to how emails are displayed.

VVM works by fetching voicemail messages from an IMAP server maintained by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device’s carrier. The server URL and credentials for this server are provided to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 carrier over SMS. The iPhone uses a different format for VVM SMS messages than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 publicly documented format, so I determined cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of an incoming VVM SMS by putting a breakpoint in CommCenter where SMS PDUs are received. The following is an example of an incoming VVM message.

STATE?state=Active;server=vvm.att.com;port=143;pw=asdf;name=5556667777@att.com

I tried sending this message on an Android device that had been modified to send raw PDUs, and found that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 logs showed an additional query had been made to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server. I tried changing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server to a server I controlled, and after several attempts, I was able to send a message that changed a target device’s VVM server, with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following limitations:

  • VVM must be configured (a greeting message recorded) on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device
  • The PID field of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SMS must be set to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VVM value for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target device’s carrier (this can be easily determined if you have a SIM from that carrier, but is different for each carrier)
  • Some carriers block VVM IMAP requests to external servers, in which case this won’t work for that carrier remotely. It’s possible that an attacker could get around this using a base station in proximity of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target device, but I didn’t look into this attack. 

This was enough for VVM IMAP to be a viable attack surface for most carriers, and I thought it was reasonably likely to contain bugs, as VVM uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same IMAP library as Email on iOS. IMAP servers are usually hardened against attacks from untrusted email clients, because it is common for a malicious client to attack cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server in an attempt to access ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r users’ emails. It is far less common, however, for a client to connect to a malicious server, as users need to enter cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se by hand, and typically only enter servers cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y trust. This means that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server to client attack surface is likely less well-tested, as it is not a realistic attack surface from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 perspective of Email. VVM changes this, as it allows a device to be connected to a malicious IMAP server without user interaction. I wondered if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IMAP library had been adequately reviewed when its attack surface was drastically changed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VVM implementation.

I looked at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IMAP library in IDA, but didn’t find any bugs, so I set up fuzzing. I wrote a fake IMAP server that returned malformed responses to every request, and used cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SMS simulator from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 section above to constantly send VVM SMS messages, triggering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device to query cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server. This uncovered one vulnerability, CVE-2019-8613, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementation. This bug is a use-after-free of an NSString that occurs due to incorrect handling of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NAMESPACE IMAP command. When an IMAP server sets up a connection, it first sends a LIST command to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mailbox separator string, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n sends a NAMESPACE command to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mailbox prefix. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iOS IMAP implementation, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 separator string is freed if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server encounters an error, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code that calls cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NAMESPACE command does not check 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ý bet365 command has succeeded, so it continues even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 separator has been freed.

Email

Looking at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IMAP implementation, I noticed several code paths in MIME that are not used by VVM, but are used by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 email client when processing messages. One of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se had an obvious and unusual vulnerability in it.

The method [MFMimePart _contents:toOffset:resultOffset:downloadIfNecessary:asHTML:isComplete:] processes incoming MIME messages, and sends cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to specific decoders based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MIME type. Unfortunately, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementation did this by appending cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MIME type string from an incoming message to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string ‘decode’ and calling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resulting method. This meant that an unintended selector could be called, leading to memory corruption.

I found this vulnerability in version 11.3.1 of iOS, but it was clearly unexploitable in iOS 12 due to changes to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functionality of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 unintended selectors that could be called. These changes did not appear to be security related. This issue could still cause a crash though, and was resolved as CVE-2019-8626.

While email is a potential remote attack surface for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone, it is unclear how serious it is. To start, some users install third-party clients instead of using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 native email client, and some email providers also filter incoming messages and remove malformed MIME components that are needed to reach a vulnerability. While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above bug worked on Gmail signed in on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 native email client, it is not clear how common this configuration is, or whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r provider filtering could be a problem in reaching similar bugs.

iMessage

iMessage is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 native messaging client on iOS and Mac devices. It supports sending and receiving messages with a variety of formatting options, and also supports extensions, which allow custom message types to be sent and received by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 device. Extensions can be written by both Apple and third parties. Samuel Groß and I reviewed iMessage and its extensions that are installed by default on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone.

To start off cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 project, Samuel wrote tools that can send and dump iMessage messages on a Mac. They work by hooking code in iMessage that sends or receives messages with Frida, and eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r writing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 message to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 console in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case of dumping, or replacing it with a different message in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case of sending. The following is a sample message dumped with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se tools.

to: mailto:TARGET@gmail.com
from: tel:+15556667777
{
    gid = "FAA29682-27A6-498D-8170-CC92F2077441";
    gv = 8;
    p =     (
        "tel:+15556667777",
        "mailto:TARGET@gmail.com"
    );
    pv = 0;
    r = "68DF1E20-9ABB-4413-B86B-02E6E6EB9DCF";
    t = "Hello World";
    v = 1;
}

It is a binary plist containing several fields. The following is a table of interesting fields.

t
Plain text message content
x
XML message content
bid
“Balloon identifier” for plugin
bp
Plugin data
ati
Attribution info
p
Participants

We noticed that several of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se fields contain binary data that is deserialized with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NSKeyedUnarchiver class. (Fields can also be optionally compressed with gzip. To get around this, we wrote a program that calls [NSData _FTOptionallyDecompressData] to decompress cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Mac command line.) Specifically, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bp field is deserialized in SpringBoard for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 purpose of notifications, which makes deserialization a fully remote attack surface. SpringBoard also does not have any sandboxing on iOS. This field is also deserialized by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 MobileSMS process, but this requires one click. The ati field is also decoded without user interaction in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 imagent process, though it is more restricted in what it can decode than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bp field.

NSKeyedArchiver serialization encodes NSObject instances in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 plist format. Below is an example portion of a serialized object that includes an instance of NSURL.

$class
CF$UID
7
NS.base
CF$UID
0
NS.relative
CF$UID
6
http://www.google.com
$classes
NSURL
NSObject
$classname
NSURL

The fields NS.base and NS.relative are objects that will be used to construct cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NSURL instance. The NS.relative field references cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string ‘http://www.google.com’, which represents cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL location. The dictionary below that, with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 $classes and $classname fields, describes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 class of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 instance, which is referenced by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 $class field of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first dictionary. When deserializing this instance, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 decoder will call [NSURL initWithCoder:] which contains code that will deserialize cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NS.base and NS.relative fields and use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to initialize cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NSURL instance.

NSKeyedArchiver serialization can serialize or deserialize any Objective-C class that implements initWithCoder:, but it has a security feature called NSSecureCoding that allows developers to limit what is decoded. First, classes that implement initWithCoder: must also implement requiresSecureCoding for deserialization to be enabled when NSSecureCoding is enabled. This prevents deserialization code from being accidentally exposed by developers in secure contexts. Secondly, NSSecureCoding requires that all deserialization calls provide a list of allowed classes that can be deserialized, and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r classes are not allowed. It’s important to note though, that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list of allowed classes is not a complete list of what initWithCoder: methods can be called during serialization. For example, a pseudo-code representation of [NSURL initWithCoder:] with some omissions is as follows.

[NSURL initWithCoder:](NSURL *u, id decoder){
NSData* book = [decoder decodeObjectOfClass:[NSData class] forKey:@"NS.minimalBookmarkData"];
if(book)
return [URLByResolvingBookmarkData:data];
NSString* base = [decoder decodeObjectOfClass:[NSString class] forKey:@"NS.base"];
NSString* relative = [decoder decodeObjectOfClass:[NSString class] forKey:@"NS.relative"];
return [NSURL initWithString:base relativeToURL:relative];
}

For a URL that is not a bookmark, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 method will need to deserialize an instance of class NSString for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NS.relative  and NS.base fields, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NSString class will be allowed in that deserialization. Likewise, if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 serialized data contains cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NS.minimalBookmarkData field, it will deserialize an instance of NSData. So while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 class limits on deserialization limit what class will be returned, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y do not limit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface to just that class. They still reduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface somewhat though.

There are several methods that can be used to create an NSKeyedUnarchiver instance or deserialize an object, and not all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m enable NSSecureCoding by default. The following methods enable it by default:

initForReadingFromData:
unarchivedObjectOfClasses:fromData:error: 

The following methods do not:

initWithData:
unarchiveObjectWithData:error
initForReadingWithData:

The names of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se methods do not make it especially clear whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r NSSecureCoding is enabled, especially cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very similarly named initForReadingFromData: and initForReadingWithData: . Our first attempt at finding bugs was looking for a place in iMessage that performed deserialization without NSSecureCoding. The hope was to be able to use this to deserialize a WebKit instance, and find a way to get it to load a webpage containing a WebKit vulnerability, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are many such vulnerabilities found on a regular basis, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir exploitability is well understood. Unfortunately, we did not find any deserialization without NSSecureCoding.  

Next, we looked at extensions. Extensions are a fairly new feature, so we hoped to find a bug in how extensions process cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 serialized data in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bp field. This processing can sometimes be performed without user interaction. Extensions can support previews, in which case SpringBoard will call previewSummary in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extension without user interaction. Some versions of iOS also process cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire input by calling initWithPluginPayload: without user interaction, but it is inconsistent based on version. This occured on 12.1.2 but not later versions while testing.

We found one bug in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Digital Touch extension, CVE-2019-8624. This extension allows users to send messages containing drawings and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r visual elements. Extensions are allowed to use custom encoding so long as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y signal to SpringBoard not to attempt to decode cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bp field, and Digital Touch uses protobuf to decode its payload. It decodes several byte arrays, and in one case incorrectly checks cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length of a byte array before copying it, leading to an out-of-bounds read. This issue is very likely not exploitable, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 path to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bug is interesting.

The Link Presentation extension displays link previews when a link is sent in a message. It works by loading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 link in WebKit on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sender device and generating a preview text and image that is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n sent to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 destination device. We looked at this extension in great detail, looking for a way to spawn a WebKit instance on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 receiving device, but did not find any. The WebKit processing always appears to be done by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sender.

We cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n decided to look for bugs in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initWithCoder: methods of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 classes that are allowed to be deserialized by SpringBoard when generating a message preview. Ian Beer has found several issues of this type allowing privilege escalation in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past. The classes permitted when SpringBoard decodes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bp field are: NSDictionary, NSString, NSData, NSNumber, NSURL, NSUUID and NSValue. Subclasses of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se classes with any level of inheritance are also allowed, as is always cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case with NSKeyedUnarchiver deserialization. We reviewed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initWithCoder: implementations of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se classes and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir subclasses that are imported by SpringBoard. This analysis resulted in three vulnerabilities. 

CVE-2019-8663 is a vulnerability in deserializing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 SGBigUTF8String class, which is a subclass of NSString. The initWithCoder: implementation of this class deserializes a byte array that is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n treated as a UTF-8 string with a null terminator, even if it does not have one. This can lead to a string that contains out-of-bounds memory being created.

CVE-2019-8661 is a vulnerability in [NSURL initWithCoder:] that affects Mac only. When a URL is deserialized, usually an instance of class NSString is decoded, but it is also possible for an NSData instance to be deserialized, which is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n treated as a bookmark. On Mac only, it is possible for this bookmark to be in ‘alis’ alias format, which was deprecated in 2012. This format is processed by a Framework called CarbonCore, which processes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 alias file using many safe and unsafe string handling functions. The vulnerability is caused by heap corruption due to an unsafe call to strcat. It is important to note that this bookmarking functionality is never legitimately used by iMessage. It is present because NSURL deserialization is universal across cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system, and so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initWithCoder implementation has to support all input possibilities, even ones that will never be encountered in normal use on a specific attack surface.

CVE-2019-8646 is a vulnerability in deserializing a subclass of NSData, _NSDataFileBackedFuture. This class allows a buffer containing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of a file to be created, but it does not load cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file until cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data is accessed. Deserialization is implemented so that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer length is deserialized from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input data, as is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filename, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementation never checks that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 deserialized length is consistent with 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 file that is eventually loaded. This violates a basic guarantee 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 be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 correct length of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bytes property. This can cause a variety of problems, including memory corruption, that will be explored in a future blog post. It is also interesting to note that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 _NSDataFileBackedFuture class is a hidden class. Classes do not need to be public or exported to be available for deserialization.

After reviewing all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initWithCoder implementations, we started to wonder what happens if a subclass of an allowed class does not implement initWithCoder. It turns out that it follows normal inheritance rules. This means that it will use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initWithCoder implementation for its superclass, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n any method that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 class has overridden will be called for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subclass. This turned out to be possible for many subclasses of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allowed classes, for example initWithCapacity: is a common method to implement and call.  Some classes have checks that prevent inheritance, or more commonly, require direct inheritance (i.e. a subclass that overrides all needed methods is allowed, while a subclass that relies on some superclass implementations is not). This is something that needs to be reviewed on a class by class basis. We determined cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 classes available by loading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dyld_shared_cache into IDA, and running a script that inspects cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Objective C metadata.

One vulnerability we found is CVE-2019-8647. This vulnerability occurs when deserializing class _PFArray, which extends NSArray and implements [_PFArray initWithObjects:count:], which is called by [NSArray initWithCoder:]. This method assumes that all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 objects in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 array have references to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, which is likely cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 intended use of this class, but is not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case during deserialization. This means that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 array that contains objects that have already been freed can be created and used.  It is likely that this class was never intended to be deserialized, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 availability of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 method initWithObjects:count: for deserialization whenever its containing library is imported by a process that deserializes arrays is behaviour that its developer did not expect.

We reported a similar vulnerability, CVE-2019-8662 in a class that as far as we know is not imported into iMessage, but is likely imported by ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r applications that use deserialization.

Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r interesting question about NSKeyedArchiver serialization is what happens if a serialized object contains a cycle. Fundamentally, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NSKeyedArchiver format is a plist file containing numeric references, so an object can reference itself, or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re can be cycles involving multiple objects.  Looking at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source in IDA, deserialization of an object works roughly as follows.


    if(temp_dict[key])
    return [temp_dict[key] copy];
     if(obj_dict[key])
    return [obj_dict[key] copy];
     NSObject* a = [NSSomeClass alloc];
     temp_dict[key] = a; //No references!!
     NSObject* obj = [a initWithCoder:];
     temp_dict[key] = NIL;
     obj_dict[key] = obj;
     return obj;

So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first time an object is deserialized, alloc is called on its class, 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 object returned by alloc is stored in a temporary dictionary that does not retain references to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object. Then initWithCoder is called on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocated object. When that call is finished, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocated object is removed from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 temporary dictionary, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object returned by initWithCoder is added to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 permanent object dictionary, which does add a reference to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object.

There are a couple of problems with this scheme. First, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no guarantee that initWithCoder returns cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 this object that it is called with, in fact, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 documentation states specifically that this is not guaranteed to be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case. Moreover, initWithCoder is responsible for releasing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 this object in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case where it is not returned. So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365oretically, an initWithCoder implementation could free cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object returned by  alloc and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n deserialize a field that could be a reference to that same object, which would lead to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reference that is returned being an invalid reference to freed memory. We looked, and did not find any initWithCoder implementations that have this problem in SpringBoard, but it is possible cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y exist in ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r applications, as this does not violate any documented restrictions on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 behavior of initWithCoder implementations.

Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r problem is if an initWithCoder implementation ends up deserializing itself and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object, it can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 call is completed. This can cause problems if certain methods assume that an object is complete or will not change (because it could continue to change as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initWithCoder call completes).

We looked for vulnerabilities involving cycles and found two such bugs. The first is CVE-2019-8641, which we are not yet disclosing, because its fix did not fully remediate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue. 

Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r issue that involves cycles in serialized objects was CVE-2019-8660. This vulnerability was in anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r subclass of NSDictionaryNSKnownKeysDictionary1. This is anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r optimized dictionary class that requires that keys be provided up front. In this case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 keys are provided as an instance of class NSKnownKeysMappingStrategy1, which deserializes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number of keys separately from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 array containing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 keys.  The deserialized number of keys is checked to be consistent with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 key array length after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 keys are deserialized, so if a key is anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r instance of NSKnownKeysDictionary1, it can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NSKnownKeysMappingStrategy1  instance before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 key number has been checked. This allows for an integer overflow leading to memory corruption in [NSKnownKeysDictionary1 initWithCoder:]to be reachable when it ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise wouldn’t be.

The nature of NSKeyedArchiver serialization makes it extremely difficult to secure. Even if NSSecureCoding is enabled, NSKeyedArchiver serialization can unintentionally create extremely large attack surfaces. To give an example, what is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following call, if secure coding is enabled?

[NSKeyedUnarchiver unarchivedObjectOfClasses:@[NSURL] fromData:mydata error:NIL];

Clearly, it includes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL deserializer, [NSURL initWithCoder:] as well as any subclass deserializers implemented in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 calling application, for example [NSMyURLSubClass initWithCoder:].

But it also includes any subclasses of NSURL in libraries that were imported by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application. For example, let’s say that this application imports cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 UserNotifications framework. In that case, [UNSecurityScopedURL initWithCoder:], a subclass of NSURL would also be a part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface, even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 library was not imported for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 purposes of serialization.

Let’s look a bit more at [NSURL initWithCoder:], which was discussed earlier. 

[NSURL initWithCoder:](NSURL *u, id decoder){
NSData* book = [decoder decodeObjectOfClass:[NSData class] forKey:@"NS.minimalBookmarkData"];
if(book)
return [URLByResolvingBookmarkData:data];
NSString* base = [decoder decodeObjectOfClass:[NSString class] forKey:@"NS.base"];
NSString* relative = [decoder decodeObjectOfClass:[NSString class] forKey:@"NS.relative"];
return [NSURL initWithString:base relativeToURL:relative];
}

It contains three calls to decodeObjectOfClass:forKey:, decoding object of classes NSString, NSData and NSURL respectively. So [NSString initWithCoder:] and [NSData initWithCoder:] are now part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface.  The [NSURL initWithCoder:] implementation will also parse cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 provided NSData object as a bookmark if it exists, so that is in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface as well.

The attack surface now also includes subclasses of NSString and  NSData too. Assuming that this application only imports cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 UserNotifications framework as well as Foundation and CoreFoundation which are typically mandatory, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following deserialization functions are now in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are subclasses of those two classes: [_NSDispatchData initWithCoder:], [__NSLocalizedString initWithCoder:], [NSLocalizableString initWithCoder:] and [UNLocalizedString initWithCoder:].

Looking at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are two methods which allow even more classes. [UNLocalizedString initWithCoder:] deserializes an NSArray instance, meanwhile [__NSLocalizedString initWithCoder:] decodes objects of class NSDictionary, NSNumber and NSDate. We won’t investigate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subclasses of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se classes for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 purposes of this example, but it’s clear that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y will allow even more classes, and increase cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface even more, as will cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subclasses of those classes, and so on.

This is just considering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 initWithCoder methods of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subclasses. Considering that any subclass of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allowed classes could be part of deserialization due to inheritance, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface could be even larger. For example, [NSString initWithCoder:] can call [NSString initWithString:] or [NSString initWithBytes:length:encoding:] depending on what fields are deserialized, so both of those methods of subclasses are part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack surface. In this case, this includes [NSBigMutableString initWithString:], [NSDebugString initWithString:], [NSPlaceholderMutableString initWithBytes:length:encoding:] and [NSPlaceholderString initWithBytes:length:encoding:]. All cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r allowed classes have a similar increase in attack surface due to inheritance.

This is an extremely large attack surface for decoding a URL which is probably just a string, and it is an attack surface that gets exponentially larger as an application grows. For example, imagine cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 impact of importing a few extra libraries on this attack surface. Or adding a few extra classes to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allow list. It’s also relevant that classes from different frameworks that were never intended to be used togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r can be combined during serialization. For example, a URL can be decoded with a string subclass from anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r framework that contains a data object from anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r framework, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resulting object can contain many properties that are of classes that were never intended or expected. The expansive attack surface of deserialization, as well as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 many degrees of freedom that are available when deserializing objects from many frameworks are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reasons we found so many vulnerabilities in iMessage.

Conclusion


We investigated cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remote attack surface of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone, and reviewed SMS, MMS, VVM, Email and iMessage. Several tools which can be used to furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r test cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se attack surfaces were released. We reported a total of 10 vulnerabilities, all of which have since been fixed. The majority of vulnerabilities occurred in iMessage due to its broad and difficult to enumerate attack surface. Most of this attack surface is not part of normal use, and does not have any benefit to users. Visual Voicemail also had a large and unintuitive attack surface that likely led to a single serious vulnerability being reported in it.  Overall, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number and severity of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remote vulnerabilities we found was substantial. Reducing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remote attack surface of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 iPhone would likely improve its security.

No comments:

Post a Comment