Tuesday, December 4, 2018

Adventures in Video Conferencing Part 1: The Wild World of WebRTC

Posted by Natalie Silvanovich, Project Zero

Over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past five years, video conferencing support in websites and applications has exploded. Facebook, WhatsApp, FaceTime and Signal are just a few of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 many ways that users can make audio and video calls across networks. While a lot of research has been done into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cryptographic and privacy properties of video conferencing, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is limited information available about 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ý bet365se platforms and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir susceptibility to vulnerabilities. We reviewed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 three most widely-used video conferencing implementations. In this series of blog posts, we describe what we found.

This part will discuss our analysis of WebRTC. Part 2 will cover our analysis of FaceTime. Part 3 will discuss how we fuzzed WhatsApp. Part 4 will describe some attacks against WhatsApp that didn’t work out. And finally, Part 5 will discuss cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 future of video conferencing and steps that  developers can take to improve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir implementation.

Typical Video Conferencing Architecture


All cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 video conferencing implementations we investigated allow at least two peers anywhere on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Internet to communicate through audiovisual streams. Implementing this capability so that it is reliable and has good audio and video quality presents several challenges. First, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 peers need to be able to find each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r and establish a connection regardless of NATs or ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r network infrastructure. Then cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y need to be able to communicate, even though cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y could be on different platforms, application versions or browsers. Finally, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y need to maintain audio and video quality, even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 connection is low-bandwidth or noisy.

Almost all video conferencing solutions have converged on a single architecture. It assumes that two peers can communicate via a secure, integrity checked channel which may have low bandwidth or involve an intermediary server, and it allows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to create a faster, higher-bandwidth peer-to-peer channel.

The first stage in creating a connection is called signalling. It is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process through which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two peers exchange cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 information cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y will need to create a connection, including network addresses, supported codecs and cryptographic keys. Usually, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 calling peer sends a call request including information about itself to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 receiving peer, 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 receiving peer responds with similar information. SDP is a common protocol for exchanging this information, but it is not always used, and most implementations do not conform to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specification. It is common for mobile messaging apps to send this information in a specially formatted message, sent through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same channel text messages are sent. Websites that support video conferencing often use WebSockets to exchange information, or exchange it via HTTPS using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 webserver as an intermediary.

Once signalling is complete, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 peers find a way to route traffic to each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 STUN, TURN and ICE protocols. Based on what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se protocols determine, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 peers can create UDP, UDP-over-STUN and occasionally TCP connections based of what is favorable for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 network conditions.

Once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 connection has been made, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 peers communicate using Real-time Transport Protocol. Though this protocol is standardized, most implementations deviate somewhat from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 standard. RTP can be encrypted using a protocol called Secure RTP (SRTP), and some implementations also encrypt streams using DTLS. Under cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 encryption envelope, RTP supports features that allow multiple streams and formats of data to be exchanged simultaneously. Then, based on how RTP classifies cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data, it is passed on to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r processing, such as video codecs.  Stream Control Transmission Protocol (SCTP) is also sometimes used to exchange small amounts of data (for example a text message on top of a call) during video conferencing, but it is less commonly used than RTP.

Even when it is encrypted, RTP often doesn’t include integrity protection, and if it does, it usually doesn’t discard malformed packets. Instead, it attempts to recover cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m using strategies such as Forward Error Correction (FEC). Most video conferencing solutions also detect when a channel is noisy or low-bandwidth and attempt to handle cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 situation in a way that leads to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best audio and video quality, for example, sending fewer frames or changing codecs. Real Time Control Protocol (RTCP) is used to exchange statistics on network quality and coordinate adjusting properties of RTP streams to adapt to network conditions.

WebRTC


WebRTC is an open source project that enables video conferencing. It is by far cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most commonly used implementation. Chrome, Safari, Firefox, Facebook Messenger, Signal and many ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r mobile applications use WebRTC. WebRTC seemed like a good starting point for looking at video conferencing as it is heavily used, open source and reasonably well-documented.

WebRTC Signalling


I started by looking at WebRTC signalling, because it is an attack surface that does not require any user interaction. Protocols like RTP usually start being processed after a user has picked up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 video call, but signalling is performed before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user is notified of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 call. WebRTC uses SDP for signalling.

I reviewed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WebRTC SDP parser code, but did not find any bugs. I also compiled it so it would accept an SDP file on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 commandline and fuzzed it, but I did not find any bugs through fuzzing eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. I later discovered that WebRTC signalling is not implemented consistently across browsers anyhow. Chrome uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main WebRTC implementation, Safari has branched slightly and Firefox uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own implementation. Most mobile applications that use WebRTC implement cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own signalling in a protocol that is not SDP as well. So it is not likely that a bug in WebRTC signalling would affect a wide variety of targets.

RTP Fuzzing


I cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n decided to look at how RTP is processed in WebRTC. While RTP is not an interaction-less attack surface because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user usually has to answer cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 call before RTP traffic is processed, picking up a call is a reasonable action to expect a user to take. I started by looking at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WebRTC source, but it is very large and complex, so I decided fuzzing would be a better approach.

The WebRTC repository contains fuzzers written for OSS-Fuzz for every protocol and codec supported by WebRTC, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y do not simulate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interactions between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 various parsers, and do not maintain state between test cases, so it seemed likely that end-to-end fuzzing would provide additional coverage.

Setting up end-to-end fuzzing was fairly time intensive, so to see if it was likely to find many bugs, I altered Chrome to send malformed RTP packets. I changed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 srtp_protect function in libsrtp so that it ran cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following fuzzer on every packet:

void fuzz(char* buf, int len){

int q = rand()%10;

if (q == 7){
int ind = rand()%len;
buf[ind] = rand();
}

if(q == 5){
for(int i = 0; i < len; i++)
buf[i] = rand();

}
RTP fuzzer (fuzzer q)

When this version was used to make a WebRTC call to an unmodified instance of Chrome, it crashed roughly every 30 seconds.

Most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crashes were due to divide-by-zero exceptions, which I submitted patches for, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re were three interesting crashes. I reproduced cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m by altering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WebRTC source in Chrome so that it would generate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 packets that caused cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same crashes, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n set up a standalone build of WebRTC to reproduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, so that it was not necessary to rebuild Chrome to reproduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issues.

The first issue, CVE-2018-6130 is an out-of-bounds memory issue related to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 use of std::map find in processing VP9 (a video codec). In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following code, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value t10_pic_idx is pulled out of an RTP packet unverified (GOF stands for group of frames).

if (frame->frame_type() == kVideoFrameKey) {
   ...
   GofInfo info = gof_info_.find(codec_header.tl0_pic_idx)->second;
   FrameReceivedVp9(frame->id.picture_id, &info);
   UnwrapPictureIds(frame);
   return kHandOff;
 }


If this value does not exist in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 gof_info_ array, std::map::find returns cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end value of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 map, which points to one element past cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 allocated values for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 map. Depending on memory layout, dereferencing this iterator will eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r crash or return cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contents of unallocated memory.

The second issue, CVE-2018-6129 is a more typical out-of-bounds read issue, where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 index of a field is read out of an RTP packet, and not verified before it is used to index a vector.

The third issue, CVE-2018-6157 is a type confusion issue that occurs when a packet that looks like a VP8 packet is sent to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 H264 parser. The packet will eventually be treated like an H264 packet even though it hasn’t gone through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 necessary checks for H264. The impact of this issue is also limited to reading out of bounds.
There are a lot of limitations to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 approach of fuzzing in a browser. It is very slow, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issues are difficult to reproduce, and it is difficult to fuzz a variety of test cases, because each call needs to be started manually, and certain properties, such as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 default codec, can’t change 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ý bet365 call. After I reported cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se issues, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WebRTC team suggested that I use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 video_replay tool, which can be used to replay RTP streams recorded in a patched browser. The tool was not able to reproduce a lot of my issues because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y used non-default WebRTC settings configured through signalling, so I added cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to load a configuration file alongside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RTP dump to this tool. This made it possible to quickly reproduce vulnerabilities in WebRTC.

This tool also had cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 benefit of enabling much faster fuzzing, as it was possible to fuzz RTP by fuzzing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RTP dump file and loading it into video_replay. There were some false positives, as it was also possible that fuzzing caused bugs in parsing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RTP dump file format, but most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bugs were actually in RTP processing.
Fuzzing with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 video_replay tool with code coverage and ASAN enabled led to four more bugs. We ran cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzer on 50 cores for about two weeks to find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se issues.

CVE-2018-6156 is probably cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most exploitable bug uncovered. It is a large overflow in FEC. The buffer WebRTC uses to process FEC packets is 1500 bytes, but it does no size checking of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se packets once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are extracted from RTP. Practically, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can be up to about 2000 bytes long.

CVE-2018-6155 is a use-after-free in a video codec called VP8. It is interesting because it affects cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VP8 library, libvpx as opposed to code in WebRTC, so it has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 potential to affect software that uses this library ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than WebRTC. A generic fix for libvpx was released as a result of this bug.

CVE-2018-16071 is a use-after-free in VP9 processing that is somewhat similar to CVE-2018-6130. Once again, an untrusted index is pulled out of a packet, but this time it is used as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 upper bounds of a vector erase operation, so it is possible to delete all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 elements of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vector before it is used.

CVE-2018-16083 is an out-of-bounds read in FEC that occurs due to a lack of bounds checking.

Overall, end-to-end fuzzing found a lot of bugs in WebRTC, and a few were fairly serious. They have all now been fixed. This shows that end-to-end fuzzing is an effective approach for finding vulnerabilities in this type of video conferencing solution. In Part 2, we will try a similar approach on FaceTime. Stay tuned!

1 comment:

  1. Good writing piece, thank you for sharing it! I'm a WebRTC user (developer), looking forward to part 2

    ReplyDelete