rustls/manual/
tlsvulns.rs

1/*! # A review of protocol vulnerabilities
2
3## CBC MAC-then-encrypt ciphersuites
4
5Back in 2000 [Bellare and Namprempre](https://eprint.iacr.org/2000/025) discussed how to make authenticated
6encryption by composing separate encryption and authentication primitives.  That paper included this table:
7
8| Composition Method | Privacy || Integrity ||
9|--------------------|---------||-----------||
10|| IND-CPA | IND-CCA | NM-CPA | INT-PTXT | INT-CTXT |
11| Encrypt-and-MAC | insecure | insecure | insecure | secure | insecure |
12| MAC-then-encrypt | secure | insecure | insecure | secure | insecure |
13| Encrypt-then-MAC | secure | secure | secure | secure | secure |
14
15One may assume from this fairly clear result that encrypt-and-MAC and MAC-then-encrypt compositions would be quickly abandoned
16in favour of the remaining proven-secure option.  But that didn't happen, not in TLSv1.1 (2006) nor in TLSv1.2 (2008).  Worse,
17both RFCs included incorrect advice on countermeasures for implementers, suggesting that the flaw was "not believed to be large
18enough to be exploitable".
19
20[Lucky 13](http://www.isg.rhul.ac.uk/tls/Lucky13.html) (2013) exploited this flaw and affected all implementations, including
21those written [after discovery](https://aws.amazon.com/blogs/security/s2n-and-lucky-13/). OpenSSL even had a
22[memory safety vulnerability in the fix for Lucky 13](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-2107), which
23gives a flavour of the kind of complexity required to remove the side channel.
24
25rustls does not implement CBC MAC-then-encrypt ciphersuites for these reasons.  TLSv1.3 removed support for these
26ciphersuites in 2018.
27
28There are some further rejected options worth mentioning: [RFC7366](https://tools.ietf.org/html/rfc7366) defines
29Encrypt-then-MAC for TLS, but unfortunately cannot be negotiated without also supporting MAC-then-encrypt
30(clients cannot express "I offer CBC, but only EtM and not MtE").
31
32## RSA PKCS#1 encryption
33
34"RSA key exchange" in TLS involves the client choosing a large random value and encrypting it using the server's
35public key.  This has two overall problems:
36
371. It provides no _forward secrecy_: later compromise of the server's private key breaks confidentiality of
38   *all* past sessions using that key.  This is a crucial property in the presence of software that is often
39   [poor at keeping a secret](http://heartbleed.com/).
402. The padding used in practice in TLS ("PKCS#1", or fully "RSAES-PKCS1-v1_5") has been known to be broken since
41   [1998](http://archiv.infsec.ethz.ch/education/fs08/secsem/bleichenbacher98.pdf).
42
43In a similar pattern to the MAC-then-encrypt problem discussed above, TLSv1.0 (1999), TLSv1.1 (2006) and TLSv1.2 (2008)
44continued to specify use of PKCS#1 encryption, again with incrementally more complex and incorrect advice on countermeasures.
45
46[ROBOT](https://robotattack.org/) (2018) showed that implementations were still vulnerable to these attacks twenty years later.
47
48rustls does not support RSA key exchange.  TLSv1.3 also removed support.
49
50## BEAST
51
52[BEAST](https://vnhacker.blogspot.com/2011/09/beast.html) ([CVE-2011-3389](https://nvd.nist.gov/vuln/detail/CVE-2011-3389))
53was demonstrated in 2011 by Thai Duong and Juliano Rizzo,
54and was another vulnerability in CBC-based ciphersuites in SSLv3.0 and TLSv1.0.  CBC mode is vulnerable to adaptive
55chosen-plaintext attacks if the IV is predictable.  In the case of these protocol versions, the IV was the previous
56block of ciphertext (as if the entire TLS session was one CBC ciphertext, albeit revealed incrementally).  This was
57obviously predictable, since it was published on the wire.
58
59OpenSSL contained a countermeasure for this problem from 2002 onwards: it encrypts an empty message before each real
60one, so that the IV used in the real message is unpredictable.  This was turned off by default due to bugs in IE6.
61
62TLSv1.1 fix this vulnerability, but not any of the other deficiencies of CBC mode (see above).
63
64rustls does not support these ciphersuites.
65
66## CRIME
67
68In 2002 [John Kelsey](https://www.iacr.org/cryptodb/archive/2002/FSE/3091/3091.pdf) discussed the length side channel
69as applied to compression of combined secret and attacker-chosen strings.
70
71Compression continued to be an option in TLSv1.1 (2006) and in TLSv1.2 (2008).  Support in libraries was widespread.
72
73[CRIME](http://netifera.com/research/crime/CRIME_ekoparty2012.pdf) ([CVE-2012-4929](https://nvd.nist.gov/vuln/detail/CVE-2012-4929))
74was demonstrated in 2012, again by Thai Duong and Juliano Rizzo.  It attacked several protocols offering transparent
75compression of application data, allowing quick adaptive chosen-plaintext attacks against secret values like cookies.
76
77rustls does not implement compression.  TLSv1.3 also removed support.
78
79## Logjam / FREAK
80
81Way back when SSL was first being born, circa 1995, the US government considered cryptography a munition requiring
82export control.  SSL contained specific ciphersuites with dramatically small key sizes that were not subject
83to export control.  These controls were dropped in 2000.
84
85Since the "export-grade" ciphersuites no longer fulfilled any purpose, and because they were actively harmful to users,
86one may have expected software support to disappear quickly. This did not happen.
87
88In 2015 [the FREAK attack](https://mitls.org/pages/attacks/SMACK#freak) ([CVE-2015-0204](https://nvd.nist.gov/vuln/detail/CVE-2015-0204))
89and [the Logjam attack](https://weakdh.org/) ([CVE-2015-4000](https://nvd.nist.gov/vuln/detail/CVE-2015-4000)) both
90demonstrated total breaks of security in the presence of servers that accepted export ciphersuites.  FREAK factored
91512-bit RSA keys, while Logjam optimised solving discrete logs in the 512-bit group used by many different servers.
92
93Naturally, rustls does not implement any of these ciphersuites.
94
95## SWEET32
96
97Block ciphers are vulnerable to birthday attacks, where the probability of repeating a block increases dramatically
98once a particular key has been used for many blocks.  For block ciphers with 64-bit blocks, this becomes probable
99once a given key encrypts the order of 32GB of data.
100
101[Sweet32](https://sweet32.info/) ([CVE-2016-2183](https://nvd.nist.gov/vuln/detail/CVE-2016-2183)) attacked this fact
102in the context of TLS support for 3DES, breaking confidentiality by analysing a large amount of attacker-induced traffic
103in one session.
104
105rustls does not support any 64-bit block ciphers.
106
107## DROWN
108
109[DROWN](https://drownattack.com/) ([CVE-2016-0800](https://nvd.nist.gov/vuln/detail/CVE-2016-0800)) is a cross-protocol
110attack that breaks the security of TLSv1.2 and earlier (when used with RSA key exchange) by using SSLv2.  It is required
111that the server uses the same key for both protocol versions.
112
113rustls naturally does not support SSLv2, but most importantly does not support RSA key exchange for TLSv1.2.
114
115## Poodle
116
117[POODLE](https://www.openssl.org/~bodo/ssl-poodle.pdf) ([CVE-2014-3566](https://nvd.nist.gov/vuln/detail/CVE-2014-3566))
118is an attack against CBC mode ciphersuites in SSLv3.  This was possible in most cases because some clients willingly
119downgraded to SSLv3 after failed handshakes for later versions.
120
121rustls does not support CBC mode ciphersuites, or SSLv3.  Note that rustls does not need to implement `TLS_FALLBACK_SCSV`
122introduced as a countermeasure because it contains no ability to downgrade to earlier protocol versions.
123
124## GCM nonces
125
126[RFC5288](https://tools.ietf.org/html/rfc5288) introduced GCM-based ciphersuites for use in TLS.  Unfortunately
127the design was poor; it reused design for an unrelated security setting proposed in RFC5116.
128
129GCM is a typical nonce-based AEAD: it requires a unique (but not necessarily unpredictable) 96-bit nonce for each encryption
130with a given key.  The design specified by RFC5288 left two-thirds of the nonce construction up to implementations:
131
132- wasting 8 bytes per TLS ciphertext,
133- meaning correct operation cannot be tested for (e.g., in protocol-level test vectors).
134
135There were no trade-offs here: TLS has a 64-bit sequence number that is not allowed to wrap and would make an ideal nonce.
136
137As a result, a [2016 study](https://eprint.iacr.org/2016/475.pdf) found:
138
139- implementations from IBM, A10 and Citrix used randomly-chosen nonces, which are unlikely to be unique over long connections,
140- an implementation from Radware used the same nonce for the first two messages.
141
142rustls uses a counter from a random starting point for GCM nonces.  TLSv1.3 and the Chacha20-Poly1305 TLSv1.2 ciphersuite
143standardise this method.
144
145## Renegotiation
146
147In 2009 Marsh Ray and Steve Dispensa [discovered](https://kryptera.se/Renegotiating%20TLS.pdf) that the renegotiation
148feature of all versions of TLS allows a MitM to splice a request of their choice onto the front of the client's real HTTP
149request.  A countermeasure was proposed and widely implemented to bind renegotiations to their previous negotiations;
150unfortunately this was insufficient.
151
152rustls does not support renegotiation in TLSv1.2.  TLSv1.3 also no longer supports renegotiation.
153
154## 3SHAKE
155
156[3SHAKE](https://www.mitls.org/pages/attacks/3SHAKE) (2014) described a complex attack that broke the "Secure Renegotiation" extension
157introduced as a countermeasure to the previous protocol flaw.
158
159rustls does not support renegotiation for TLSv1.2 connections, or RSA key exchange, and both are required for this attack
160to work.  rustls implements the "Extended Master Secret" (RFC7627) extension for TLSv1.2 which was standardised as a countermeasure.
161
162TLSv1.3 no longer supports renegotiation and RSA key exchange.  It also effectively incorporates the improvements made in RFC7627.
163
164## KCI
165
166[This vulnerability](https://kcitls.org/) makes use of TLS ciphersuites (those offering static DH) which were standardised
167yet not widely used. However, they were implemented by libraries, and as a result enabled for various clients.  It coupled
168this with misconfigured certificates (on services including facebook.com) which allowed their misuse to MitM connections.
169
170rustls does not support static DH/EC-DH ciphersuites.  We assert that it is misissuance to sign an EC certificate
171with the keyUsage extension allowing both signatures and key exchange.  That it isn't is probably a failure
172of CAB Forum baseline requirements.
173*/