<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Explore Security &#187; POODLE</title>
	<atom:link href="http://www.exploresecurity.com/tag/poodle/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.exploresecurity.com</link>
	<description>IT security tools, techniques and commentary</description>
	<lastBuildDate>Wed, 15 Jun 2022 09:21:02 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6.1</generator>
		<item>
		<title>Testing for POODLE_TLS Manually</title>
		<link>http://www.exploresecurity.com/testing-for-poodle_tls-manually/</link>
		<comments>http://www.exploresecurity.com/testing-for-poodle_tls-manually/#comments</comments>
		<pubDate>Fri, 13 Mar 2015 12:25:24 +0000</pubDate>
		<dc:creator>Jerome</dc:creator>
				<category><![CDATA[SSL/TLS]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[penetration testing]]></category>
		<category><![CDATA[POODLE]]></category>
		<category><![CDATA[TLS]]></category>
		<category><![CDATA[tlslite]]></category>
		<category><![CDATA[tool]]></category>

		<guid isPermaLink="false">http://www.exploresecurity.com/?p=362</guid>
		<description><![CDATA[Testing for the original POODLE vulnerability was easy because it was an inherent problem with SSLv3, so if you find SSLv3 enabled then you&#8217;ve found POODLE (although other factors such as cipher suite preference have a role to play &#8211; see my previous post). Like Heartbleed, though, testing for POODLE over TLS is conceptually easy [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Testing for the original POODLE vulnerability was easy because it was an inherent problem with SSLv3, so if you find SSLv3 enabled then you&#8217;ve found POODLE (although other factors such as cipher suite preference have a role to play &#8211; see my previous <a title="Thoughts on Testing for POODLE" href="http://www.exploresecurity.com/thoughts-on-testing-for-poodle/">post</a>). Like Heartbleed, though, testing for POODLE <em>over TLS</em> is conceptually easy but it falls within a class of flaws that requires bespoke tools as an unpatched version of <code>openssl</code>, for example, won&#8217;t do what you want it to do. This article discusses how the Python <em>tlslite</em> library can be used to test for POODLE_TLS &#8211; and so much more.<span id="more-362"></span></p>
<h3>What is <em>tlslite</em>?</h3>
<p>From the <a href="https://github.com/trevp/tlslite">source</a> &#8220;TLS Lite is an open source python library that implements SSL and TLS&#8221;. I&#8217;d seen references to it in the original BEAST <a href="http://vnhacker.blogspot.co.uk/2011/09/beast.html">post</a> written by Thai Duong and an article on <a href="https://vivaldi.net/blogs/entry/what-is-tls-testing-tlsprober-net">TLS Prober</a> by Yngve Pettersen. This gave me some confidence that <em>tlslite</em> would be a good starting point. Obviously it&#8217;s not going to be fast but that doesn&#8217;t matter. With a SSL/TLS implementation in a high level language, it would be much easier to make the changes required for the sorts of tests I wanted to run, and I thought POODLE_TLS would be a good one to try first.</p>
<p>TLS Prober is in fact where I wanted to be heading. It works on a modified version of <em>tlslite</em> to test for various SSL/TLS bugs. However, the public source code hasn&#8217;t been updated since Yngve left Opera in 2013 and thus wouldn&#8217;t cover POODLE_TLS. While I could have added that capability, I decided to ignore TLS Prober (for now) and start afresh with the latest <em>tlslite</em> &#8211; mainly as it would be a good learning experience.</p>
<h3>How to test for POODLE_TLS</h3>
<p>I&#8217;m not going to re-hash theory that&#8217;s already <a href="https://www.imperialviolet.org/2014/10/14/poodle.html">covered</a> <a href="https://www.imperialviolet.org/2014/12/08/poodleagain.html">elsewhere</a>. Suffice to say that implementations of TLS that are faithful to the RFC shouldn&#8217;t be vulnerable to POODLE because the spec states what the contents of the padding bytes should be. Therefore, the way to test for POODLE_TLS is to ignore that rule and see if the connection is terminated by the server. This isn&#8217;t the same as performing a full attack but like all testing you have to compromise between accuracy and aggressiveness. I think this test is a good indication. After some rummaging through the source code and a bit of debugging, I found what I wanted.</p>
<h3>Changes to <em>tlslite</em></h3>
<p>It seemed a bit crazy to fork the <a href="https://github.com/trevp/tlslite">original project</a> as my changes were tiny. I also thought that working through the changes here may be helpful to anyone else who wants to do the same sort of thing.</p>
<p>So to begin with I needed to signal to <em>tlslite</em> that I wanted to send TLS messages with invalid padding. You get things going with <em>tlslite</em> through the <code>TLSConnection</code> class so I changed how that was instantiated. <code>TLSConnection</code> inherits from <code>TLSRecordLayer</code>, which is where the padding code lives, so that needed changing too. Within the &#8220;tlslite&#8221; folder I made the following changes (obviously line numbers will be version dependent so I&#8217;ve added the original code too; my version was 0.4.8):</p>
<p><strong>tlsconnection.py</strong><br />
Line 52 was:<br />
<code>def __init__(self, sock):</code><br />
Now:<br />
<code>def __init__(self, sock, check_poodle_tls=False):</code><br />
# now i can signal whether or not I want to perform the test<br />
# if you already have <em>tlslite</em>, you can change it safely because <code>check_poodle_tls</code> defaults to <code>False</code> so it&#8217;s backward-compatible with any existing code that makes use of <em>tlslite</em></p>
<p>Line 61 was:<br />
<code>TLSRecordLayer.__init__(self, sock)</code><br />
Now:<br />
<code>TLSRecordLayer.__init__(self, sock, check_poodle_tls)</code><br />
# I need to pass that signal on to the parent</p>
<p><strong>tlsrecordlayer.py</strong><br />
Line 102 was:<br />
<code>def __init__(self, sock):</code><br />
Now:<br />
<code>def __init__(self, sock, check_poodle_tls):</code></p>
<p>After line 103 <code>self.sock = sock</code> added new line:<br />
<code>self.check_poodle_tls = check_poodle_tls</code></p>
<p>After line 600 <code>paddingBytes = bytearray([paddingLength] * (paddingLength+1))</code> added new lines:<br />
<code>if self.check_poodle_tls == True:<br />
<span style="padding-left: 30px;">paddingBytes = bytearray(x ^ 42 for x in paddingBytes[0:-1])</span><br />
<span style="padding-left: 30px;">paddingBytes.append(paddingLength)</span></code><br />
# change all but the last of the padding bytes to be invalid (just XOR with 42, the answer to everything)<br />
# make the last byte of padding valid = the number of padding bytes</p>
<p>And that&#8217;s it! Remember, as it&#8217;s Python, that tabs are important and the new code needs to be properly aligned.</p>
<h3>POODLE_TLS test script</h3>
<p>I then created the test script (available <a href="https://github.com/exploresecurity/test_poodle_tls">here</a>), which attempts a normal TLS connection first before testing for POODLE using the invalid padding trick. Place the script within the modified <em>tlslite</em> and run it as <code>test_poodle_tls.py &lt;hostname&gt;</code>. Remember, it only tests for POODLE <em>over TLS, <u>not</u> SSLv3.</em></p>
<p>I&#8217;ve noticed that sometimes the normal connection fails and one of the reasons for this is that the server does not support any of the small number of cipher suites offered by <em>tlslite</em>. In this case no conclusion can be drawn &#8211; and the script catches that.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exploresecurity.com/testing-for-poodle_tls-manually/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Thoughts on Testing for POODLE</title>
		<link>http://www.exploresecurity.com/thoughts-on-testing-for-poodle/</link>
		<comments>http://www.exploresecurity.com/thoughts-on-testing-for-poodle/#comments</comments>
		<pubDate>Sat, 01 Nov 2014 00:09:21 +0000</pubDate>
		<dc:creator>Jerome</dc:creator>
				<category><![CDATA[Penetration Testing]]></category>
		<category><![CDATA[SSL/TLS]]></category>
		<category><![CDATA[OpenSSL]]></category>
		<category><![CDATA[penetration testing]]></category>
		<category><![CDATA[pentesting]]></category>
		<category><![CDATA[POODLE]]></category>
		<category><![CDATA[SSLv3]]></category>

		<guid isPermaLink="false">http://www.exploresecurity.com/?p=311</guid>
		<description><![CDATA[I recently did an internal presentation on POODLE &#8211; what the flaw is and how to test for it &#8211; and a version of the slides can be found here. Obviously much has been written about the vulnerability, its mitigations and what the future holds. What follows expands on the testing aspect of the presentation, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I recently did an internal presentation on POODLE &#8211; what the flaw is and how to test for it &#8211; and a version of the slides can be found <a href='http://www.slideshare.net/exploresecurity/ss-lv3-and-poodle'>here</a>. Obviously much <a href='https://www.imperialviolet.org/2014/10/14/poodle.html'>has<a> <a href='http://blog.cryptographyengineering.com/2014/10/attack-of-week-poodle.html'>been</a> <a href='http://blogs.opera.com/security/2014/10/security-changes-opera-25-poodle-attacks/'>written</a> about the vulnerability, its mitigations and what the future holds. What follows expands on the testing aspect of the presentation, with a few pointers on manual checks if you feel you need to verify or clarify &#8211; and possibly even add to &#8211; what the tools are telling you.<span id="more-311"></span></p>
<h3>SSLv3 support with block ciphers (in CBC mode) supported</h3>
<p>All SSL/TLS tools check for SSLv3 support. You can do this manually with:</p>
<p><code>openssl s_client -ssl3 –connect &lt;host&gt;:443</code></p>
<p>This confirms SSLv3 support but obviously it only reports 1 cipher suite. This is where the tools come in. However, remember that POODLE only affects block ciphers in cipher block chaining (CBC) mode (which I&#8217;ll just abbreviate to &#8220;block ciphers&#8221; now, as I believe all the block ciphers that can run under SSLv3 operate in CBC mode). So review the list of supported cipher suites: if the server only supports RC4 ciphers then don&#8217;t report POODLE as an issue (instead report SSLv3, which is still old and creaky, and RC4!).</p>
<h3>Server preference</h3>
<p>Even if the server supports block ciphers, it may <em>prefer</em> RC4-based ciphers so the likelihood of exploitation is going to be negligible. I recently wrote up <a href='http://www.exploresecurity.com/testing-for-cipher-suite-preference/'>what to do</a> if you find that your tools disagree over which cipher suite is preferered.</p>
<h3>TLS_FALLBACK_SCSV</h3>
<p>I also recently <a href='http://www.exploresecurity.com/poodle-and-the-tls_fallback_scsv-remedy/'>posted</a> in detail about how the TLS_FALLBACK_SCSV remediation worked. In short it&#8217;s a signal to the server from the client that it is connecting with a lower protocol version than it supports. If the server supports something better, then that should have been negotiated during the earlier connection attempts, so the server can abort the connection as being suspicious.</p>
<p>With the release of OpenSSL v1.0.1j it&#8217;s easy to test for TLS_FALLBACK_SCSV support:</p>
<p><code>openssl s_client -ssl3 -fallback_scsv -connect &lt;host&gt;:443</code></p>
<p>This is telling the server than I&#8217;d like to connect using SSLv3 &#8211; but grudgingly. I&#8217;m using <code>-ssl3</code> in the context of POODLE but TLS_FALLBACK_SCSV offers wider protection than this (checking support for it will continue to be worthwhile long after we&#8217;ve forgotten about POODLE.) Below you can see the fake cipher suite value advertising the fallback (which Wireshark couldn&#8217;t decode into something meaningful as it didn&#8217;t recognise the new cipher suite value 0&#215;5600 at the time):</p>
<p><a href="http://www.exploresecurity.com/wp-content/uploads/2014/10/tls_fallback_scsv.png"><img src="http://www.exploresecurity.com/wp-content/uploads/2014/10/tls_fallback_scsv.png" alt="tls_fallback_scsv" width="712" height="98" class="aligncenter size-full wp-image-313" /></a></p>
<p>If the OpenSSL connection succeeds as usual (as shown below &#8211; a cipher suite has been chosen) then the server doesn&#8217;t support TLS_FALLBACK_SCSV.</p>
<p><a href="http://www.exploresecurity.com/wp-content/uploads/2014/10/openssl_connects.png"><img src="http://www.exploresecurity.com/wp-content/uploads/2014/10/openssl_connects.png" alt="openssl_connects" width="590" height="99" class="aligncenter size-full wp-image-314" /></a></p>
<p>If the connection fails with the new <code>inappropriate_fallback</code> alert then the server does support TLS_FALLBACK_SCSV:</p>
<p><a href="http://www.exploresecurity.com/wp-content/uploads/2014/10/tls_fallback_alert.png"><img src="http://www.exploresecurity.com/wp-content/uploads/2014/10/tls_fallback_alert.png" alt="tls_fallback_alert" width="1182" height="78" class="aligncenter size-full wp-image-315" /></a></p>
<p>Enabling TLS_FALLBACK_SCSV is all very well but it does depend on client support too &#8211; so if the server has SSLv3 enabled with block ciphers supported (and preferred) then it&#8217;s not out of the woods. A few browsers do already support it &#8211; Chrome 33 (Feb 2014), Firefox 35 (Jan 2015), Opera 25 (Oct 2014) &#8211; so it&#8217;s better than nothing, and of course support for it among browsers will only improve. Acknowledging TLS_FALLBACK_SCSV support is therefore worthwhile &#8211; both today and in the future. A client may even feel aggrieved if they&#8217;ve gone to the trouble of enabling TLS_FALLBACK_SCSV but get no credit for it in their pentest report!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exploresecurity.com/thoughts-on-testing-for-poodle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing for Cipher Suite Preference</title>
		<link>http://www.exploresecurity.com/testing-for-cipher-suite-preference/</link>
		<comments>http://www.exploresecurity.com/testing-for-cipher-suite-preference/#comments</comments>
		<pubDate>Fri, 31 Oct 2014 22:00:01 +0000</pubDate>
		<dc:creator>Jerome</dc:creator>
				<category><![CDATA[Penetration Testing]]></category>
		<category><![CDATA[SSL/TLS]]></category>
		<category><![CDATA[OpenSSL]]></category>
		<category><![CDATA[penetration testing]]></category>
		<category><![CDATA[pentesting]]></category>
		<category><![CDATA[POODLE]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[TLS]]></category>

		<guid isPermaLink="false">http://www.exploresecurity.com/?p=296</guid>
		<description><![CDATA[It&#8217;s often important to know which SSL/TLS cipher suite is preferred by a server to alter the risk rating of a particular issue. For POODLE, if the server prefers RC4 ciphers over SSLv3 connections then it&#8217;s very unlikely that a connection will be vulnerable to POODLE. Similarly, if a server prefers block ciphers then reporting [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>It&#8217;s often important to know which SSL/TLS cipher suite is preferred by a server to alter the risk rating of a particular issue. For <a href='http://www.exploresecurity.com/thoughts-on-testing-for-poodle/'>POODLE</a>, if the server prefers RC4 ciphers over SSLv3 connections then it&#8217;s very unlikely that a connection will be vulnerable to POODLE. Similarly, if a server prefers block ciphers then reporting RC4 support should be appropriately adjusted. Occasionally tools conflict over which cipher suite is preferred so I thought I&#8217;d write up how to resolve this manaully in the spirit of the <a href='http://www.exploresecurity.com/ssltls-checklist-for-pentesters/'>SSL/TLS manual cheatsheet</a>.<span id="more-296"></span></p>
<h3>How is a cipher suite chosen?</h3>
<p>Quick overview: the connection starts with a Client Hello in which the client advertises which cipher suites it supports in order of preference (most preferred first). This list will be tailored according to any local configuration, as well as to the SSL/TLS protocol version the client is hoping to use, which is also advertised in the Client Hello:</p>
<p><a href="http://www.exploresecurity.com/wp-content/uploads/2014/10/client_hello.png"><img src="http://www.exploresecurity.com/wp-content/uploads/2014/10/client_hello.png" alt="client_hello" width="527" height="289" class="aligncenter size-full wp-image-300" /></a></p>
<p>The protocol version is the highest the client supports &#8211; unless the browser has gone down the fallback route, which is the mechanism <a href='http://www.exploresecurity.com/poodle-and-the-tls_fallback_scsv-remedy/'>abused by POODLE</a> to make the SSLv3 attack more practical. Cipher suites can vary with protocol version simply because older protocols can&#8217;t always meet the needs of newer cipher suites. For example, only TLSv1.2 supports cipher suites that use SHA-256 for message integrity.</p>
<p>In receipt of the Client Hello, the server now has two options: it can either (a) opt for the client&#8217;s most preferred cipher suite that it too supports, or (b) ignore the client&#8217;s preference and opt for the cipher suite nearest the top of its <em>own</em> list that the client supports. For example, say the client has sent up a list of cipher suites which we&#8217;ll just call 1,2,3,4,5,6,7 and the server supports 8,3,4,2,6. In the case of (a) the server&#8217;s order is unimportant and it chooses 2; in the case of (b) the server chooses 3. The choice the server makes is returned in the Server Hello message:</p>
<p><a href="http://www.exploresecurity.com/wp-content/uploads/2014/10/server_hello.png"><img src="http://www.exploresecurity.com/wp-content/uploads/2014/10/server_hello.png" alt="server_hello" width="490" height="147" class="aligncenter size-full wp-image-302" /></a></p>
<p>Something to note in the above example is that, in the case of the server having a preference, you would never find out that cipher suite 8 is in fact the preferred choice because it isn&#8217;t supported by the client and thus it&#8217;s never offered in the Client Hello. Server preference is thus not only dictated by the server: it depends on what the client knows too.</p>
<h3>Conflicting results</h3>
<p>On my last test I had a conflict between SSLyze and SSLscan over which cipher suite was preferred over SSLv3. SSLyze thought it was RC4-SHA (I&#8217;m using the OpenSSL notation here)&#8230;</p>
<p><a href="http://www.exploresecurity.com/wp-content/uploads/2014/10/sslyze.png"><img src="http://www.exploresecurity.com/wp-content/uploads/2014/10/sslyze.png" alt="sslyze" width="1252" height="145" class="aligncenter size-full wp-image-297" /></a></p>
<p>&#8230;whereas SSLscan went for DES-CBC3-SHA:</p>
<p><a href="http://www.exploresecurity.com/wp-content/uploads/2014/10/sslscan.png"><img src="http://www.exploresecurity.com/wp-content/uploads/2014/10/sslscan-300x45.png" alt="sslscan" width="300" height="45" class="aligncenter size-medium wp-image-298" /></a></p>
<h3>Manually testing for preference</h3>
<p>To resolve this was simple. I ran:</p>
<p><code>openssl s_client -ssl3 -connect &lt;host&gt;:443</code></p>
<p>OpenSSL reported that DES-CBC3-SHA had been chosen. Just to be sure &#8211; which I explain below &#8211; I let the two cipher suites in question compete with one another using the <code>-cipher</code> switch, which allows you to put specific cipher suites in the Client Hello. OpenSSL orders them exactly how you list them according to the scheme set out in <code>man ciphers</code>. So I ran:</p>
<p><code>openssl s_client -ssl3 -cipher DES-CBC3-SHA:RC4-SHA -connect &lt;host&gt;:443</code></p>
<p>and then switched the order of the cipher suites:</p>
<p><code>openssl s_client -ssl3 -cipher RC4-SHA:DES-CBC3-SHA -connect &lt;host&gt;:443</code>.</p>
<p>In both cases DES-CBC3-SHA was chosen so I was confident that SSLscan was right.</p>
<h3>Why did SSLyze get it wrong this time?</h3>
<p>Up to now I had tried SSLyze versions 0.9 and 1.0dev and both had reported RC4-SHA as the preferred cipher suite. I then tried an earlier 0.6beta version and found it correctly reported DES-CBC3-SHA. Rather than delve into the code I first took the easy option and fired up Wireshark while running one of the later versions of SSLyze. When enumerating the supported cipher suites, I could see that DES-CBC3-SHA was tested individually; however, when it came to checking for preference, DES-CBC3-SHA was left out of the list in the Client Hello. Obviously the server couldn&#8217;t choose it in this case, hence the preference was misreported. I <a href='https://github.com/nabla-c0d3/sslyze/issues/10'>reported</a> this as a bug and Alban Diquet explained that:</p>
<blockquote><p>The reason why DES-CBC3-SHA isn&#8217;t sent within the preference test is that specific servers will not reply at all if the client hello is larger than 255 bytes (due to a bug in a specific brand of load balancers). To reduce the size of the hello, I had to disable some stuff including specific cipher suites.</p></blockquote>
<p>In this case the server only supported 3 cipher suites over SSLv3 so this misidentification could have been avoided. And this got me thinking&#8230;</p>
<h3>Algorithm for testing preference</h3>
<p>For each supported SSL/TLS protocol version, this is my version 0.1 of a method a tool could use to work out cipher suite preference:</p>
<ol>
<li>Determine which cipher suites are supported individually (i.e. repeatedly send a Client Hello with just one cipher suite and see if it&#8217;s accepted).</li>
<li>Once you know which suites are supported, send them all up in one Client Hello and see which one is picked. If you&#8217;re worried about the buggy load balancers mentioned above then use a subset for now.</li>
<li>If the chosen cipher suite is the one that was at the top of the list then there are two alternative explanations: either (a) the server picked the client&#8217;s preferred suite as it has no preference of its own, or (b) the server really does prefer that cipher suite and it just happened to be at the top. (This is why I ran more than one test above.) So repeat the test in step 2, this time changing the most preferred cipher suite at the top of the order. If the same cipher suite is chosen then it&#8217;s a case of (b) and the server definitely has a preference; otherwise, the first cipher suite should be chosen and it&#8217;s case of (a) where the server is happy to be guided by the client&#8217;s preference<sup>1</sup>.</li>
<li>If the cipher suite list has been cut short to appease buggy load balancers, repeat step 2 with the next set of cipher suites. If a preference has been expressed so far, that cipher suite should be included with the next set to allow it to compete.</li>
<li>If a preference has been found and you really wanted to go the whole hog, you could determine the order in full by starting again at step 2, missing out the cipher suite previously identified as preferred.
</ol>
<p>I put some of this to Alban Diquet (as part of the bug report) and he replied &#8220;yes I thought of adding the exact check you described but that&#8217;s pretty much at the bottom of my TODO list&#8221;. I think he was referring to step 3 but, anyway, if you ever have conflicting output from your tools over cipher suite preference, hopefully this posting will help you to resolve the issue.</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p><sup>1</sup> Actually, there is a possibility of &#8220;no preference&#8221; being misreported if you consider a server that supports cipher suite &#8220;wildcards&#8221; in such as way that there is no preference within a set of cipher suites that match a wildcard. I don&#8217;t think any popular implementation features this (hence the footnote) but for the sake of completeness imagine a server that prefers AES-* then RC4-*. The test tool sends up AES-SHA, AES-MD5, RC4-SHA, RC4-MD5 and AES-SHA is chosen. As per step 3, the tool then sends up AES-MD5, RC4-SHA, RC4-MD5, AES-SHA. This time AES-MD5 is chosen, giving the illusion of no server preference but in fact the server does have a preference, it&#8217;s just by groups. To cover this, if no server preference has been detected after step 3, repeat step 2 rotating the cipher suite at the top of the list each time; if at any point the cipher suite selected is <em>not</em> the first on the list then the server <em>does</em> have a preference. Admittedly this could add a fair bit of overhead!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exploresecurity.com/testing-for-cipher-suite-preference/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>POODLE and the TLS_FALLBACK_SCSV Remedy</title>
		<link>http://www.exploresecurity.com/poodle-and-the-tls_fallback_scsv-remedy/</link>
		<comments>http://www.exploresecurity.com/poodle-and-the-tls_fallback_scsv-remedy/#comments</comments>
		<pubDate>Wed, 15 Oct 2014 16:01:00 +0000</pubDate>
		<dc:creator>Jerome</dc:creator>
				<category><![CDATA[SSL/TLS]]></category>
		<category><![CDATA[POODLE]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[SSLv3]]></category>
		<category><![CDATA[TLS]]></category>

		<guid isPermaLink="false">http://www.exploresecurity.com/?p=277</guid>
		<description><![CDATA[The POODLE attack announced very recently depends largely on a protocol downgrade attack (which I covered in my SSL/TLS presentation at BSides). I don&#8217;t think this aspect of TLS security was widely appreciated &#8211; but it is now! It&#8217;s a fair bet that any technical article about POODLE includes the phrase &#8220;TLS_FALLBACK_SCSV&#8221; as a remedy. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>The <a href="https://www.openssl.org/~bodo/ssl-poodle.pdf">POODLE</a> attack announced very recently depends largely on a protocol downgrade attack (which I covered in my <a title="SSL/TLS Checklist for Pentesters" href="http://www.exploresecurity.com/ssltls-checklist-for-pentesters/">SSL/TLS presentation</a> at BSides). I don&#8217;t think this aspect of TLS security was widely appreciated &#8211; but it is now! It&#8217;s a fair bet that any technical article about POODLE includes the phrase &#8220;TLS_FALLBACK_SCSV&#8221; as a remedy. This article discusses the mechanism proposed to protect us from attackers forcing TLS downgrades. <span style="color: red;">NEW (16/10/14):</span> while I was writing this I thought of a small but potential compatibility problem, which in fact could do us all a favour. I checked with the authors of the RFC and Adam Langley was kind enough to reply back so I&#8217;ve added added a <a href='#new'>new section below</a>.<span id="more-277"></span></p>
<p>TLS_FALLBACK_SCSV is a fake cipher suite advertised in the Client Hello, which starts the SSL/TLS handshake. SCSV stands for &#8220;Signaling Cipher Suite Value&#8221;. The idea of using a cipher suite as a signal is not new: TLS_EMPTY_RENEGOTIATION_INFO_SCSV is a way clients can advertise that they support secure renegotiation (addressing CVE-2009-3555):</p>
<p><a href="http://www.exploresecurity.com/wp-content/uploads/2014/10/secure_reneg_SCSV.png"><img class="aligncenter size-full wp-image-278" alt="secure_reneg_SCSV" src="http://www.exploresecurity.com/wp-content/uploads/2014/10/secure_reneg_SCSV.png" width="510" height="86" /></a></p>
<p>The <a href="https://tools.ietf.org/html/draft-ietf-tls-downgrade-scsv-00">RFC</a> for the TLS_FALLBACK_SCSV mechanism is still a draft but <a href="https://www.imperialviolet.org/2014/10/14/poodle.html">apparently</a> Chrome (and Google from the server-side) has been using it since February 2014. This is no surprise as the RFC was written by two Google heavyweights. (Perhaps this was written with POODLE in mind as the RFC and the attack share an author &#8211; but that&#8217;s pure speculation!)</p>
<p>The whole business of successively downgrading the protocol version was put in place because browsers wanted to ensure they could connect to servers that were buggy. The TLS_FALLBACK_SCSV mechanism ensures that this downgrade only happens with the client&#8217;s blessing.</p>
<h3>How does the protection work?</h3>
<p>TLS_FALLBACK_SCSV is recommended for a client to indicate that it is knowingly repeating a SSL/TLS connection attempt over a lower protocol version than it supports (because the last one failed for some reason). When the server sees a TLS_FALLBACK_SCSV signal it compares the highest protocol version it supports to the version indicated in the Client Hello. If the client&#8217;s version is lower, then the server responds with a new Alert defined by the RFC called <code>inappropriate_fallback</code>. The idea being that the server knows the client supports something better so the connection should have negotiated that. The <code>inappropriate_fallback</code> Alert is a &#8220;fatal&#8221; error, i.e. the SSL/TLS connection is aborted.</p>
<h3>Why does this help against POODLE?</h3>
<p>Let&#8217;s say both the client and server support TLSv1.2. The client starts off, hoping to make a TLSv1.2 connection but an active man-in-the-middle attacker interferes with the handshake in the hope of forcing a downgrade. By repeatedly doing this, the attacker can force the use of SSLv3 and try some shenanigans like POODLE. Remember, the attacker can&#8217;t remove the TLS_FALLBACK_SCSV from the Client Hello because the handshake is cryptographically protected (unlike in SSLv2).</p>
<p>After the first round of interference, the client should try TLSv1.1. With the TLS_FALLBACK_SCSV signal in place, the server will pick up on the fact that the client is only requesting a TLVs.1.1 connection because of some difficulty earlier on. The server now knows that there is no good reason why a connection with a higher procotol version should have failed &#8211; and duly aborts the current connection.</p>
<p>The attacker could, of course, drop the TLSv1.1 and the following TLSv1.0 Client Hello. If the lack of response causes the browser to downgrade again then eventually the browser will try a SSLv3 connection, which the attacker will let through. Again, the TLS_FALLBACK_SCSV signal indicates to the server that the client supports something better and will terminate the connection attempt.</p>
<p>Okay, what if the client <em>doesn&#8217;t</em> support the server&#8217;s best protocol (TLS v1.2 in this example)? Just to be clear, let&#8217;s consider that case. The client would begin with, say, a TLSv1.0 connection. The attacker interferes with the handshake and so the client tries a SSLv3 connection with TLS_FALLBACK_SCSV. Again, the server knows that the client is only doing this because an earlier attempt with a higher protocol failed so it returns the Alert and the downgrade is aborted. If the client tries again, unhindered by the attacker, the client&#8217;s opening TLSv1.0 request is accepted because it lacks the TLS_FALLBACK_SCSV signal.</p>
<h3>It&#8217;s more than just a POODLE buster&#8230;</h3>
<p>The TLS_FALLBACK_SCSV mechanism doesn&#8217;t just protect us from attacks to downgrade connections to SSLv3: it protects us from forced downgrades completely. So when we want to connect using TLSv1.2, we can be sure that a meddling attacker can&#8217;t drop us down to TLSv1.0, which doesn&#8217;t support the best available cipher suites. As ever, we do need the server to play along.</p>
<h3>&#8230;but it&#8217;s not quite a silver bullet</h3>
<p>Of course, TLS_FALLBACK_SCSV doesn&#8217;t help if the best protocol version is SSLv3 at the client and SSLv3 is supported by the server &#8211; or vice versa. In this case SSLv3 will be agreed so no downgrade attack is required but the attacker still needs to make the browser perform multiple requests to the target domain, as the <a href="https://www.openssl.org/~bodo/ssl-poodle.pdf">whitepaper</a> explains. Remember that the attack only works with block ciphers operating in CBC mode so if the preferred cipher suite over SSLv3 is RC4 then the attack is likely to fail. Not that I&#8217;m advocating SSLv3 with RC4 as a solution though!</p>
<p>If SSLv3 is disabled either on the server or the client, POODLE has lost its bite. The only practical reason to support SSLv3 for servers is to humour IE6 users (because IE6 doesn&#8217;t enable TLSv1.0 by default). But if that&#8217;s a must then TLS_FALLBACK_SCSV &#8211; when supported by both client and server &#8211; will protect the vast majority of connections when SSLv3 isn&#8217;t necessary.</p>
<p><span style="color: red;">UPDATE:</span> <a href='https://www.openssl.org/news/secadv_20141015.txt'>OpenSSL 1.0.1j</a> supports TLS_FALLBACK_SCSV.</p>
<h3 id="new"><span style="color: red;">NEW: Assumptions and side effects</span></h3>
<p>While writing up these scenarios I thought of a potential compatibility issue when TLS_FALLBACK_SCSV was in place. The draft RFC states that the connection MUST be refused by the server if the <em>maximum</em> protocol version the server supports is higher than the one advertised in the Client Hello with the TLS_FALLBACK_SCSV signal. This assumes that the server supports all protocol versions in between the client&#8217;s stated version and the server&#8217;s maximum. What can the server infer about the client? It&#8217;s clear the client supports at least a protocol version <em>one higher</em> than that in the Client Hello. But that&#8217;s all the server knows. So what if one of those intermediate versions <em>isn&#8217;t</em> supported by the server and happens to be the highest version the client supports?</p>
<p>In previous pentests I have seen servers that don&#8217;t support TLSv1.1 but do support TLSv1.0 and TLSv1.2. Imagine a client that supports TLSv1.1 at best and so it starts off a TLSv1.1 connection. TLS allows for the server to respond saying effectively &#8220;sorry, can&#8217;t do that, I can do TLSv1.0&#8243;. But supposing it&#8217;s one of those buggy servers that the downgrade fallback was intended for&#8230;In this case the connection fails in an unexpected way and the browser attempts the connection again, this time using TLSv1.0 with the TLS_FALLBACK_SCSV signal. The server then refuses the connection as its maximum TLS version is 1.2 and it assumes the client can do better. But, in fact, the client doesn&#8217;t understand 1.2 and the server doesn&#8217;t want to talk 1.1. The two will never talk to each other.</p>
<p>I put this to the RFC authors and I was delighted that <a href="https://www.imperialviolet.org">Adam Langley</a> replied (on what must have been a particularly busy day!): &#8220;I think you&#8217;re correct that the server will break in that situation&#8221;. He also proposed another, simpler compatibility scenario: &#8220;a server believes that it implements TLS 1.2 but is buggy and doesn&#8217;t handle, say, the <code>signature_algorithms</code> extension correctly. It works currently because clients downgrade to TLS 1.1. If the server implements TLS_FALLBACK_SCSV then it breaks&#8221;.</p>
<p>But is this a problem? I guess it&#8217;s unlikely. I don&#8217;t know how many of these buggy servers are out there. It&#8217;s also a fair assumption that any server that has the awareness to support TLS_FALLBACK_SCSV has also got the TLS version negotiation working. What about from the client viewpoint? In the example above, according to <a href="http://en.wikipedia.org/wiki/Transport_Layer_Security#Web_browsers">Wikipedia</a> older versions of Chrome and Opera supported TLSv1.1 at best but of course users of these browsers are now very likely to have been auto-updated to later versions. However, we want the TLS_FALLBACK_SCSV mechanism to be future-proof.</p>
<p>At the same, ultimately this is all the fault of buggy servers. Many browsers will look to disable SSLv3 in the light of POODLE, knowing that this will cause issues for a small number of sites but that&#8217;s a reasonable price to pay to protect the majority. Enabling TLS_FALLBACK_SCSV for the long-term good could be viewed in the same way. Adam Langley seemed to agree: &#8220;TLS_FALLBACK_SCSV is a way for good servers to lift themselves out of the swamp that buggy servers have created. If you have a buggy server and enable TLS_FALLBACK_SCSV then it could certainly break your server. Hopefully that&#8217;s noticed in testing and then the real bug can be fixed <img src='http://www.exploresecurity.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> &#8221;. That&#8217;s why, when he acknowledged the potential for compatibility issues, he added &#8220;but I&#8217;m ok with that&#8221;.</p>
<p>Implementing TLS_FALLBACK_SCSV could expose the buggy servers that fallback was designed for &#8211; and perhaps that&#8217;s just what we need.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.exploresecurity.com/poodle-and-the-tls_fallback_scsv-remedy/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
