<?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>Adobe Secure Software Engineering Team (ASSET) Blog</title>
	<atom:link href="http://blogs.adobe.com/asset/feed" rel="self" type="application/rss+xml" />
	<link>http://blogs.adobe.com/asset</link>
	<description></description>
	<lastBuildDate>Tue, 15 May 2012 19:57:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>ColdFusion 10 Provides Powerful New Security Tools</title>
		<link>http://blogs.adobe.com/asset/2012/05/coldfusion-10-provides-powerful-new-security-tools.html</link>
		<comments>http://blogs.adobe.com/asset/2012/05/coldfusion-10-provides-powerful-new-security-tools.html#comments</comments>
		<pubDate>Tue, 15 May 2012 19:57:44 +0000</pubDate>
		<dc:creator>Peleus Uhley</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/asset/?p=1146</guid>
		<description><![CDATA[Today marks the release of ColdFusion 10. This release redefines many aspects of the ColdFusion 10 security model and incorporates the principles of the Adobe Secure Product Lifecycle (SPLC). With this release, we&#8217;ve worked to improve three major areas: Our goals were to improve patch adoption, improve the default configuration, and to make it easier [...]]]></description>
			<content:encoded><![CDATA[<p>Today marks the release of ColdFusion 10. This release redefines many aspects of the ColdFusion 10 security model and incorporates the principles of the <a href="http://www.adobe.com/security/splc/">Adobe Secure Product Lifecycle (SPLC)</a>. With this release, we&#8217;ve worked to improve three major areas: Our goals were to improve patch adoption, improve the default configuration, and to make it easier for developers to create secure ColdFusion applications.</p>
<p>One of the most common reasons for a successful attack against a ColdFusion server is that it doesn&#8217;t have the latest security updates. In all fairness, this is not completely the administrator&#8217;s fault. Updating a ColdFusion server can be difficult due to the number of manual steps involved. Also, it is easy to miss a security update announcement. With ColdFusion 10, we make both of these steps easier. The ColdFusion 10 administration interface now incorporates a simple &#8220;Check For Updates&#8221; button. Alternatively, the server can be configured to automatically check for updates and send an email to the administrator once one becomes available.  Finally, the interface allows the developer to apply the patch through a single button click in the administrator interface. These features help make updating the server much more straightforward.</p>
<p>The second major area of improvement focused on making it easier for administrators to securely deploy ColdFusion 10. One of the most attractive characteristics of ColdFusion is that it has always been a simple development environment. Therefore, there were several features that favored making the early phases of development easier by leaving the complicated aspects disabled by default. The cost of this choice was that once developers were ready to deploy to production, they had to review a 35-page lockdown guide to enable and/or configure those more complicated features appropriately. With today&#8217;s release, we offer the option of starting the server in a secure-by-default configuration. This greatly simplifies the process of making a server production-ready with a secure configuration.</p>
<p>The last area of improvement focused on providing developers with an increased number of tools for creating secure ColdFusion applications. One example is that we have provided integrated OWASP ESAPI support in the platform. We originally started to include ESAPI in ColdFusion 9 just for our internal needs of addressing cross-site scripting (XSS). Once developers noticed the library in the update, they quickly developed several blogs on how to unofficially start using it in your ColdFusion code. Today&#8217;s release formally exposes several aspects of ESAPI through ColdFusion API&#8217;s to help developers avoid cross-site scripting vulnerabilities.</p>
<p>We also improved the session management capabilities in ColdFusion&#8211;another aspect of making it easier for developers to create ColdFusion applications. We have improved APIs to make it easier to set the HttpOnly and Secure flags on cookies. Session rotation has been improved through new SessionRotate and SessionInvalidate APIs.  To combat cross-site request forgery (CSRF) with active sessions, the ColdFusion team added an API for generating unique tokens for form requests. The team also added support for protecting against clickjacking attacks on active users by adding support for the X-FRAME-OPTIONS header.</p>
<p>ColdFusion 10 is a significant advancement in helping ColdFusion customers improve their secure product lifecycle processes. It is even easier to create secure content, deploy the content on a secure server and manage the server updates once it is deployed. This is only an introduction to the major security enhancements in ColdFusion 10. For more information on all the new security APIs for developers, please see the ColdFusion documentation on <a href="http://help.adobe.com/en_US/ColdFusion/10.0/Developing/WSe61e35da8d3185183e145c0d1353e31f559-8000.html">Security Enhancements in ColdFusion 10</a>.  ColdFusion administrators should review the <a href="http://help.adobe.com/en_US/ColdFusion/10.0/Admin/WSc3ff6d0ea77859461172e0811cbf364104-7ff2.html">Administering Security</a> and the <a href="http://help.adobe.com/en_US/ColdFusion/10.0/Admin/WSe61e35da8d318518-33adffe0134c60cd31c-8000.html">Server Update</a> sections for a complete list of server improvements.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/asset/2012/05/coldfusion-10-provides-powerful-new-security-tools.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Working Together on Keeping Our Mutual Customers Up-to-Date</title>
		<link>http://blogs.adobe.com/asset/2012/05/working-together-on-keeping-our-mutual-customers-up-to-date.html</link>
		<comments>http://blogs.adobe.com/asset/2012/05/working-together-on-keeping-our-mutual-customers-up-to-date.html#comments</comments>
		<pubDate>Wed, 09 May 2012 18:40:35 +0000</pubDate>
		<dc:creator>Brad Arkin</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Brad Arkin]]></category>
		<category><![CDATA[Flash Player]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Safari]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/asset/?p=1134</guid>
		<description><![CDATA[No doubt, staying up-to-date on the latest security patches is critical in today’s threat environment. In addition to the many security initiatives we engage in as a vendor to help keep our products and our users safe, the single most important advice we can give to users is to always stay up-to-date. The vast majority [...]]]></description>
			<content:encoded><![CDATA[<p>No doubt, staying up-to-date on the latest security patches is critical in today’s threat environment. In addition to the many security initiatives we engage in as a vendor to help keep our products and our users safe, the single most important advice we can give to users is to always stay up-to-date. The vast majority of users who ever encountered a security problem using Adobe products were attacked via a known vulnerability that was patched in more recent versions of the software. This is why we’ve invested so much in the Adobe Reader/Acrobat update mechanism <a href="http://(http://blogs.adobe.com/adobereader/2010/04/upcoming_adobe_reader_and_acro.html">introduced in 2010</a>, and more recently in the Flash Player background updater <a href="https://blogs.adobe.com/asset/2012/03/an-update-for-the-flash-player-updater.html">delivered in March</a> of this year and used for the first time with last week&#8217;s Flash Player <a href="http://www.adobe.com/support/security/bulletins/apsb12-09.html">security update</a>. Both update mechanisms give Windows users the option to install updates automatically, without user interaction. A Mac version of the Flash Player background updater is <a href="http://labs.adobe.com/technologies/flashplatformruntimes/flashplayer11-3/">currently in beta</a> and will be available very soon—stay tuned.</p>
<p>In the meantime, we welcome today&#8217;s initiative by Apple to encourage Mac users to stay up-to-date: With the <a href="http://support.apple.com/kb/HT5271">Apple Safari 5.1.7 update</a> released today, Apple is disabling older versions of Flash Player (specifically Flash Player 10.1.102.64 and earlier) and directing users to the <a href="http://get.adobe.com/flashplayer/">Flash Player Download Center</a>, from where they can install the latest, most secure version of Flash Player. For more information, visit <a href="http://support.apple.com/kb/HT5271">http://support.apple.com/kb/HT5271</a>.</p>
<p>Remember: The single most important thing we can do to protect ourselves from the bad guys is to stay up-to-date. A thank you to the security team at Apple for working with us to help protect our mutual customers!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/asset/2012/05/working-together-on-keeping-our-mutual-customers-up-to-date.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Basic Distributed Fuzzing Framework for FOE</title>
		<link>http://blogs.adobe.com/asset/2012/05/a-basic-distributed-fuzzing-framework-for-foe.html</link>
		<comments>http://blogs.adobe.com/asset/2012/05/a-basic-distributed-fuzzing-framework-for-foe.html#comments</comments>
		<pubDate>Wed, 02 May 2012 20:31:13 +0000</pubDate>
		<dc:creator>Peleus Uhley</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/asset/?p=1047</guid>
		<description><![CDATA[Last week, CERT released a Python-based file format fuzzer for Windows called Failure Observation Engine (FOE). It is a Windows port of their Linux-based fuzzer, Basic Fuzzing Framework(BFF). CERT provided Adobe with an advanced copy of FOE for internal testing, and we have found it to be very useful. One of the key features of [...]]]></description>
			<content:encoded><![CDATA[<p>Last week, CERT released a Python-based file format fuzzer for Windows called <a href="http://www.cert.org/blogs/certcc/2012/04/cert_failure_observation_engin.html">Failure Observation Engine</a> (FOE). It is a Windows port of their Linux-based fuzzer, Basic Fuzzing Framework(BFF). CERT provided Adobe with an advanced copy of FOE for internal testing, and we have found it to be very useful. One of the key features of FOE is its simplicity. The configuration file is very straightforward, which makes it easy to introduce to new teams. We have also used the &#8220;copy&#8221; mode of FOE to help automate triaging large sets of external reports. It is a great tool to have for dumb fuzzing. For this blog, I am going to discuss a simple Python wrapper I created during my initial testing of the tool which helped to coordinate running FOE across multiple machines. This approach allows you to pull seed files from a centralized location. You can also view the status of all of the fuzzing runs and their results from the same location. If you are not interested in writing a distributed fuzzing framework, then you might want to stop reading because the rest of this blog is all about code. <img src='http://blogs.adobe.com/asset/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>The goal of this distributed fuzzing framework design was to create something simple, lightweight since I was experimenting with a new tool. I set a personal limit of keeping the project to around 1,000 lines of code in order to scope my time investment. That said, I also wanted to build something that I could easily scale later in the event that I liked it enough to invest more time. For the client-side code, I used Python since that was already required for FOE. On the server side, I had a Linux/Apache/MySQL/Perl (LAMP) server. Knowing that everyone has their own preference for server-side authoring, I am only going to describe the server-side architecture rather than providing the Perl source. Nothing in the server-side code is so complicated that a Web developer couldn&#8217;t figure out how to do an implementation in the language of their choice from this description. While I designed this for testing the FOE fuzzer, only one file in the entire system is FOE-specific, which makes the infrastructure reusable for other fuzzers. The current name of the main script is &#8220;dffiac.py&#8221; because I thought of this project as a, &#8220;Distributed Fuzzing Framework in a Can&#8221;.</p>
<p>For this design, all of the tracking logic is consolidated on the centralized server. The Python script will issue requests for data using simple GETs and POSTs over HTTP. The server will respond to the requests with basic XML. The fuzzing seed files are hosted on the server in a public web server directory from which they can be downloaded. Identified crashes will be uploaded to the server and placed in a public web server directory. Both the client-side and server-side codes are agnostic with regards to the format of the seed files and the targeted application. Therefore, this should be relatively easy to set up in any infrastructure.</p>
<p>&nbsp;</p>
<h2>The database design</h2>
<p>In this design, the mySQL server coordinates the runs across all the different machines. You first need a table containing all the files that you want to fuzz. At a bare minimum, it needs a unique primary key (fid), the name of the file and its location on the web server. I currently have a database of more than 60,000 SWF files that are sub-categorized based on type so that I can focus fuzzing to specific types of SWF files. However, name and location will get you started with fuzzing.</p>
<p>&nbsp;</p>
<p><em>seed_files</em></p>
<table>
<tbody>
<tr>
<td style="padding: 5px;">Field</td>
<td style="padding: 5px;">Type</td>
<td style="padding: 5px;">Description</td>
</tr>
<tr>
<td style="padding: 5px;">fid</td>
<td style="padding: 5px;">Integer</td>
<td style="padding: 5px;">(primary key, autoincrement) The unique File ID for this entry</td>
</tr>
<tr>
<td style="padding: 5px;">name</td>
<td style="padding: 5px;">VARCHAR</td>
<td style="padding: 5px;">The filename</td>
</tr>
<tr>
<td style="padding: 5px;">location</td>
<td style="padding: 5px;">VARCHAR</td>
<td style="padding: 5px;">The relative web directory for the file (e.g. &#8220;/fuzzing/files/&#8221;)</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>The next thing that you will need is a table to track all of the fuzzing runs. A &#8220;run&#8221; is defined as one or more servers testing with the same FOE configuration file against a defined set of seed files. There are multiple ways in which you can define the selected seed files for the run. For instance, you may want to use FOE against multiple types of applications. For this scenario, you might have a different <em>seed_files</em> for each file type. To support the need for different <em>seed_files</em> tables, the design of <em>run_records</em> requires that you provide the &#8220;table_name&#8221; that will be used for this run. Once a <em>seed_files</em> table is selected, it may be necessary to further restrict the run to a subset of files within the <em>seed_files</em> tables. For instance, you may only want to select a subset of files within the given table. Therefore, the design requires that you provide a &#8220;<em>type</em>&#8221; parameter which denotes the method for selecting files from the <em>seed_files</em> table. The value of <em>type</em> can include values such as &#8220;all&#8221;, &#8220;range&#8221; or any other sub-category you want to define. As an example, this particular run may be a &#8220;range&#8221; <em>type</em> that starts at <em>start_fid</em> and stops at <em>end_fid</em>.</p>
<p>&nbsp;</p>
<p><em>run_records</em></p>
<table>
<tbody>
<tr>
<td style="padding: 5px;">Field</td>
<td style="padding: 5px;">Type</td>
<td style="padding: 5px;">Description</td>
</tr>
<tr>
<td style="padding: 5px;">rid</td>
<td style="padding: 5px;">Integer</td>
<td style="padding: 5px;">(primary key, autoincrement) The unique ID for this run</td>
</tr>
<tr>
<td style="padding: 5px;">name</td>
<td style="padding: 5px;">VARCHAR</td>
<td style="padding: 5px;">The human readable name for the run</td>
</tr>
<tr>
<td style="padding: 5px;">description</td>
<td style="padding: 5px;">VARCHAR</td>
<td style="padding: 5px;">A description for the run (e.g. config or mutation used, # of iterations, etc.)</td>
</tr>
<tr>
<td style="padding: 5px;">type</td>
<td style="padding: 5px;">VARCHAR</td>
<td style="padding: 5px;">Values can include (all, range, etc)</td>
</tr>
<tr>
<td style="padding: 5px;">table_name</td>
<td style="padding: 5px;">VARCHAR</td>
<td style="padding: 5px;">The name of the seed_files table that will be used for testing</td>
</tr>
<tr>
<td style="padding: 5px;">start_fid</td>
<td style="padding: 5px;">Integer</td>
<td style="padding: 5px;">The first fid from seed_files to be fuzzed in this run</td>
</tr>
<tr>
<td style="padding: 5px;">end_fid</td>
<td style="padding: 5px;">Integer</td>
<td style="padding: 5px;">The last fid from seed_files to be fuzzed in this run</td>
</tr>
<tr>
<td style="padding: 5px;">current_fid</td>
<td style="padding: 5px;">Integer</td>
<td style="padding: 5px;">This tracks the next fid to be tested during the run</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>For every run, you will have multiple servers running FOE. For each server instance, it will be necessary to track the server name, when it started, the current status of the server, and when it last provided an update. The <em>status</em> will include values such as &#8220;running&#8221; and &#8220;complete.&#8221;  You can infer whether a machine has died based on whether it has been too long since the timestamp for the <em>last_update </em>field was modified.</p>
<p>&nbsp;</p>
<p><em>server_instances</em></p>
<table>
<tbody>
<tr>
<td style="padding: 5px;">Field</td>
<td style="padding: 5px;">Type</td>
<td style="padding: 5px;">Description</td>
</tr>
<tr>
<td style="padding: 5px;">siid</td>
<td style="padding: 5px;">Integer</td>
<td style="padding: 5px;">(primary key, autoincrement) The unique server instance ID</td>
</tr>
<tr>
<td style="padding: 5px;">server_name</td>
<td style="padding: 5px;">VARCHAR</td>
<td style="padding: 5px;">The name of the server (e.g hostname + IP address)</td>
</tr>
<tr>
<td style="padding: 5px;">status</td>
<td style="padding: 5px;">VARCHAR</td>
<td style="padding: 5px;">Is it running or has it completed.</td>
</tr>
<tr>
<td style="padding: 5px;">start_time</td>
<td style="padding: 5px;">timestamp</td>
<td style="padding: 5px;">When did this instance start?</td>
</tr>
<tr>
<td style="padding: 5px;">last_update</td>
<td style="padding: 5px;">timestamp</td>
<td style="padding: 5px;">When was the last request from this instance?</td>
</tr>
<tr>
<td style="padding: 5px;">rid</td>
<td style="padding: 5px;">Integer</td>
<td style="padding: 5px;">What run_record is this instance associated with?</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>Lastly, you will need a table to record the results. The script will record the <em>server_instance</em> ID (<em>siid</em>) where the crash was found in case there are issues with reproducing the crash. This will allow a QA to retest on the original machine where the crash occured. It is also necessary to track which run was able to identify the crash. The <em>rid</em> is not recorded because it can already be extrapolated from the <em>siid</em>. According to database normalization rules, redundant information should not be stored in tables. In this design, the script will record a result in <em>fuzz_records</em> regardless of whether a crash was identified.  This allows you to track which files have been tested against which FOE configurations. If a crash is identified, the web server directory where the crash result was stored is also recorded.</p>
<p>&nbsp;</p>
<p><em>fuzz_records</em></p>
<table>
<tbody>
<tr>
<td style="padding: 5px;">Field</td>
<td style="padding: 5px;">Type</td>
<td style="padding: 5px;">Description</td>
</tr>
<tr>
<td style="padding: 5px;">frid</td>
<td style="padding: 5px;">Integer</td>
<td style="padding: 5px;">(primary key, autoincrement) The unique fuzz record ID</td>
</tr>
<tr>
<td style="padding: 5px;">fid</td>
<td style="padding: 5px;">Integer</td>
<td style="padding: 5px;">The seed_files ID for this entry</td>
</tr>
<tr>
<td style="padding: 5px;">siid</td>
<td style="padding: 5px;">Integer</td>
<td style="padding: 5px;">The server instance ID for this entry</td>
</tr>
<tr>
<td style="padding: 5px;">crash</td>
<td style="padding: 5px;">Boolean</td>
<td style="padding: 5px;">Whether a crash was recorded during this test</td>
</tr>
<tr>
<td style="padding: 5px;">location</td>
<td style="padding: 5px;">VARCHAR</td>
<td style="padding: 5px;">Where the crash result was stored (e.g. /results/run_id/)</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h2>The config file</h2>
<p>You will start the Python script by providing a simple configuration file in the command line: &#8220;python dffiac.py dffiac.cfg&#8221;. The configuration file is in the same format as the FOE configuration file and contains the following:</p>
<p>&nbsp;</p>
<p><span style="text-decoration: underline;">dffiac.cfg</span></p>
<pre>[foeoptions]</pre>
<pre>python_location=C:\Python26\python.exe</pre>
<pre>config_location=C:\FOE\configs\my_foe_config.cfg</pre>
<p>&nbsp;</p>
<pre>[runoptions]</pre>
<pre>run_id=1</pre>
<pre>web_server=http://my.internal.server.com</pre>
<pre>upload_cgi=/fuzzers/crash_uploader.cgi</pre>
<pre>action_cgi=/fuzzers/action_handler.cgi</pre>
<p>&nbsp;</p>
<pre>[logoptions]</pre>
<pre>log_dir=C:\dffiac\logs\</pre>
<p>&nbsp;</p>
<p>The<em> foeoptions</em> section tells the script where to find the Python executable and the location of the FOE config script you will use for this run. The<em> runoptions</em> section provides the run id (<em>rid</em>) the database is using to track this run along with the location of the web server, the path to the action_handler.cgi and the path to the CGI that will handle the file uploads. The<em> logoptions</em> allows you to specify where the script will log local information regarding the run. The logs directory needs to exist prior to starting the script. The <em>config_location</em> and <em>run_id</em> are likely the only two elements that will change from run to run.</p>
<p>&nbsp;</p>
<h2>The transaction flow</h2>
<p>For this next section, we will review the transactions between the dffiac.py script and the web server. The web server will read in the GET parameters, execute the relevant SQL query and return the results as XML. All but one request is handled by the <em>action_handler</em> defined in the dffiac.cfg config file. The upload of the crash results is handled by the <em>upload_cgi</em> defined in the dffiac.cfg config file.</p>
<p>Once dffiac.py has started and been initialized by the config file, the script will begin sending requests to the server. An &#8220;action&#8221; parameter informs the <em>action_handler</em> CGI which query to perform. The server will always respond to the Python script with the relevant information for the request in a simple XML format.</p>
<p>&nbsp;</p>
<p>The first HTTP request from the Python code will be to gather all the information regarding the <em>run_id</em> provided in the config file:</p>
<pre>GET /fuzzers/action_handler.cgi?action=getRunInfo&amp;rid=1</pre>
<p>&nbsp;</p>
<p>The web server will then perform this SQL query with the<em> rid </em>that was provided:</p>
<pre>select run_type,start_fid,end_fid from run_records where rid = ?</pre>
<p>&nbsp;</p>
<p>The results from the query will be used to return the following XML (assuming the run is defined as the range of fids from 1-25):</p>
<pre>&lt;xml&gt;</pre>
<pre>  &lt;run_type&gt;range&lt;/run_type&gt;</pre>
<pre>  &lt;start_fid&gt;1&lt;/start_fid&gt;</pre>
<pre>  &lt;end_fid&gt;25&lt;/end_fid&gt;</pre>
<pre>&lt;/xml&gt;</pre>
<p>&nbsp;</p>
<p>Now that dffiac.py has the information for the run, it will then inform the web server that the run is starting:</p>
<pre>GET /fuzzers/action_handler.cgi?action=recordServerStart&amp;rid=1&amp;serverName=server1</pre>
<p>&nbsp;</p>
<p>This HTTP request will result in the following SQL query:</p>
<pre style="word-wrap: break-word;">insert into server_instances (server_name,status,start_time,rid) values (?,'running',NOW(),?)</pre>
<p>&nbsp;</p>
<p>The insert_id from this query (<em>siid</em>) becomes the unique identifier for this instance and is returned for use in later queries:</p>
<pre>&lt;xml&gt;</pre>
<pre>  &lt;siid&gt;1&lt;/siid&gt;</pre>
<pre>&lt;/xml&gt;</pre>
<p>&nbsp;</p>
<p>Now that this instance has officially registered to contribute to this run, the Python script will begin requesting individual files to test:</p>
<pre>GET /fuzzers/action_handler.cgi?action=getNextFid&amp;rid=1&amp;run_type=range</pre>
<p>&nbsp;</p>
<p>The corresponding SQL query will vary depending on how you have defined your run. For this example, we will assume that this is a basic run that will incrementally walk through the file IDs in the <em>seed_files</em> table. To accomplish this, we create an SQL variable called &#8220;value&#8221; and assign it the <em>current_fid</em>. By recording the value of the <em>current fid</em> and incrementing the &#8220;value&#8221; in a single statement, we can avoid a race condition when multiple servers are running.</p>
<pre style="word-wrap: break-word;">update run_records set current_fid = current_fid + 1 where rid = ? and @value := current_fid;</pre>
<p>&nbsp;</p>
<p>At this point, &#8220;@value&#8221; is set to 1 which is the <em>fid </em>the Python script will test and the <em>current_fid</em> in the database table has been incremented to 2. The web server can then fetch &#8221;@value<em>&#8220;</em> with the following SQL command:</p>
<pre>select @value;</pre>
<p>&nbsp;</p>
<p>Since the process of asking for the next fid will automatically increment the value of <em>current_fid</em>, the value of <em>current_fid</em> will eventually exceed the value of the <em>end_fid</em> in the database table. While it may seem weird, it doesn&#8217;t hurt the process. This can be allowed to occur or you can add a little more server-side logic to have the server return -1 as the <em>current_fid</em> to stop the run when <em>end_fid</em> is reached.</p>
<p>&nbsp;</p>
<p>The &#8220;select @value&#8221; result will be returned to Python script as the current_<em>fid </em>available for testing:</p>
<pre>&lt;xml&gt;</pre>
<pre>  &lt;current_fid&gt;1&lt;/current_fid&gt;</pre>
<pre>&lt;/xml&gt;</pre>
<p>&nbsp;</p>
<p>The Python script will then compare the <em>current_fid</em> with the<em> end_fid</em> that it received earlier to determine whether to stop testing.</p>
<p>&nbsp;</p>
<p>Once we have the <em>fid</em> of the file that we will test, we can then fetch the information for that specific file:</p>
<pre>GET /fuzzers/action_handler.cgi?action=getFileInfo&amp;rid=1&amp;fid=1</pre>
<p>&nbsp;</p>
<p>Using the <em>rid</em>, the web server can query the <em>run_records</em> table to find the <em>table_name</em> that contains the seed files.</p>
<pre>select table_name from run_records where rid = ?</pre>
<p>&nbsp;</p>
<p>Assuming the result of that query will be saved as the variable, &#8220;$table_name&#8221;, the web server can construct the query to retrieve the file <em>name</em> and the directory <em>location</em> that corresponds to the file id:</p>
<pre>"select name, location from" . $table_name . "where fid = ?"</pre>
<p>&nbsp;</p>
<p>The web server will return the file <em>name</em> and <em>location</em> with the following XML:</p>
<pre>&lt;xml&gt;</pre>
<pre>  &lt;name&gt;seed.txt&lt;/name&gt;</pre>
<pre>  &lt;location&gt;/fuzzers/files/&lt;/location&gt;</pre>
<pre>&lt;/xml&gt;</pre>
<p>&nbsp;</p>
<p>Now, that the location of the seed file is known, it can be downloaded by dffiac.py and saved in the FOE seeds directory. The FOE fuzzer is then started, and dffiac.py waits for FOE to finish testing that seed file. Once FOE testing has completed, the result will need to be recorded by sending the <em>fid</em> and a boolean value indicating whether a <em>crash</em> was identified with that test:</p>
<pre>GET /fuzzers/action_handler.cgi?action=recordResult&amp;siid=1&amp;fid=1&amp;crash=1</pre>
<p>&nbsp;</p>
<p>This will result in the following query:</p>
<pre>insert into fuzz_records (siid,fid,crash) values (?,?,?)</pre>
<p>&nbsp;</p>
<p>The web server will also record that it has received an update from this fuzzing server instance in the <em>server_instances</em> table to let us know that it is still alive and processing:</p>
<pre>update server_instances set lastUpdate = NOW() where siid = ?</pre>
<p>&nbsp;</p>
<p>The result is recorded regardless of success or failure so that you can track which files have been successfully tested with which configs. You could infer this from the <em>run_records</em>, but if a machine dies, a file might be skipped. The server-side code will take the insert_id from the<em> fuzz_records</em> statement <em>(frid)</em> and return the following XML:</p>
<pre>&lt;xml&gt;</pre>
<pre>  &lt;frid&gt;1&lt;/frid&gt;</pre>
<pre>&lt;/xml&gt;</pre>
<p>&nbsp;</p>
<p>If there was a crash, the Python script will zip up the crash directory, base64 encode the file and POST it to the <em>upload_cgi</em> identified in the dffiac configuration file. The script will leave the zip file on the fuzzing server if an error is detected during the upload. Along with the zip file, it will send the<em> rid</em> and <em>frid</em>. The <em>rid</em> is used to store files in a web server directory unique to that run. The<em> frid</em> is sent so that the <em>action_handler</em> can update the <em>fuzz_records</em> entry with the location of the uploaded crash file (e.g. &#8220;/results/1/zip_file_name.zip&#8221;) in the following SQL query:</p>
<pre>update fuzz_records set location = ? where frid = ?</pre>
<p>&nbsp;</p>
<p>A successful upload will result in the following XML:</p>
<pre>&lt;xml&gt;</pre>
<pre>  &lt;success&gt;1&lt;/success&gt;</pre>
<pre>&lt;/xml&gt;</pre>
<p>&nbsp;</p>
<p>A failed upload can return the description of the error to the client with the following XML:</p>
<pre>&lt;xml&gt;</pre>
<pre>  &lt;error&gt;Replace me with the actual error description&lt;/error&gt;</pre>
<pre>&lt;/xml&gt;</pre>
<p>&nbsp;</p>
<p>The dffiac.py script will then continue retrieving new files and testing them with FOE until the <em>end_fid</em> is reached. Then the final call to the web server will record that this fuzzing server instance has completed its run and has stopped:</p>
<pre>GET /fuzzers/action_handler.cgi?action=recordRunComplete&amp;siid=1</pre>
<p>&nbsp;</p>
<p>The web server will record the completion with the following SQL query:</p>
<pre>update server_instances set status='complete', lastUpdate=NOW() where siid = ?</pre>
<p>&nbsp;</p>
<p>The web server will respond to this last request with the following XML:</p>
<pre>&lt;xml&gt;</pre>
<pre>  &lt;success&gt;1&lt;/success&gt;</pre>
<pre>&lt;/xml&gt;</pre>
<p>&nbsp;</p>
<p>The last XML response is currently ignored by the Python script but a more robust implementation could double-check for errors.</p>
<p>&nbsp;</p>
<h2>The Python code</h2>
<p>The logic for the distributed fuzzing framework is split into one main file (dffiac.py) and three libraries that are contained in a /libs directory. We&#8217;ll start with the three libraries in the /libs directory. The code below is the library that contains the utilities for creating the zip file of the crash result.</p>
<p>&nbsp;</p>
<p><span style="text-decoration: underline;">ZipUtil.py (30 lines)</span></p>
<pre>import zipfile</pre>
<pre>import os</pre>
<p>&nbsp;</p>
<pre>class ZipUtil:</pre>
<p>&nbsp;</p>
<pre>#Create a zip file and add everything in path_ref</pre>
<pre>def createZipFile(self, path_ref, filename):</pre>
<pre>  zip_file = zipfile.ZipFile(filename, 'w')</pre>
<p>&nbsp;</p>
<pre>  #Check to see if path_ref is a file or folder</pre>
<pre>  if os.path.isfile(path_ref):</pre>
<pre>    zip_file.write(path_ref)</pre>
<pre>  else:</pre>
<pre>    self.addFolder(zip_file, path_ref)</pre>
<p>&nbsp;</p>
<pre>  zip_file.close()</pre>
<p>&nbsp;</p>
<pre>#Recursively add folder contents to the zip file</pre>
<pre>def addFolder(self, zip_file, folder):</pre>
<pre>  for file in os.listdir(folder):</pre>
<p>&nbsp;</p>
<pre>    #Get path of child element</pre>
<pre>    child_path = os.path.join(folder, file)</pre>
<p>&nbsp;</p>
<pre>    #Check to see if the child is a file or folder</pre>
<pre>    if os.path.isfile(child_path):</pre>
<pre>      zip_file.write(child_path)</pre>
<pre>    elif os.path.isdir(child_path):</pre>
<pre>      self.addFolder(zip_file, child_path)</pre>
<p>&nbsp;</p>
<p>The second library will base64 encode the zip file prior to uploading it to the web server via a POST method.  On the server side, you will need to base64 decode the file before writing it to disk.</p>
<p>&nbsp;</p>
<p><span style="text-decoration: underline;">PostHandler.py (77 lines)</span></p>
<pre>import mimetools</pre>
<pre>import mimetypes</pre>
<pre>import urllib</pre>
<pre>import urllib2</pre>
<pre>import base64</pre>
<p>&nbsp;</p>
<pre>class PostHandler(object):</pre>
<p>&nbsp;</p>
<pre>  def __init__(self,webServer,uploadCGI):</pre>
<pre>    self.web_server = webServer</pre>
<pre>    self.upload_cgi = uploadCGI</pre>
<pre>    self.form_vars = []</pre>
<pre>    self.file_attachments = []</pre>
<pre>    self.mime_boundary = mimetools.choose_boundary()</pre>
<pre>    return</pre>
<p>&nbsp;</p>
<pre>  #Add a form field to the request</pre>
<pre>  def add_form_vars(self, name, value):</pre>
<pre>    self.form_vars.append((name, value))</pre>
<pre>    return</pre>
<p>&nbsp;</p>
<pre>  #Get the mimetype for the attachment</pre>
<pre>  def get_mimetype(self,filename):</pre>
<pre>    mimetype = mimetypes.guess_type(filename)[0] or 'application/octet-stream'</pre>
<pre>    return(mimetype)</pre>
<pre></pre>
<pre>  #Add a base64 encoded file attachment</pre>
<pre>  def append_file(self, var_name, filename, file_ref, mimetype=None):</pre>
<pre>    raw = file_ref.read()</pre>
<pre>    body = base64.standard_b64encode(raw)</pre>
<pre>    if mimetype is None:</pre>
<pre>      mimetype = self.get_mimetype(filename)</pre>
<pre>    self.file_attachments.append((var_name, filename, mimetype, body))</pre>
<pre></pre>
<pre>  #Get the body of the request as a string</pre>
<pre>  def get_request_body(self):</pre>
<pre>    lines = []</pre>
<pre>    section_boundary = '--' + self.mime_boundary</pre>
<p>&nbsp;</p>
<pre>    # Add the form fields</pre>
<pre>    for (name, value) in self.form_vars:</pre>
<pre>      lines.append(section_boundary)</pre>
<pre>      lines.append('Content-Disposition: form-data; name="%s"' % name)</pre>
<pre>      lines.append('')</pre>
<pre>      lines.append(value)</pre>
<p>&nbsp;</p>
<pre>    # Add the files to upload</pre>
<pre>    for var_name, filename, content_type, data in self.file_attachments:</pre>
<pre>      lines.append(section_boundary)</pre>
<pre>      lines.append('Content-Disposition: file; name="%s"; filename="%s"' % \</pre>
<pre>        (var_name, filename))</pre>
<pre>      lines.append('Content-Type: %s' % content_type)</pre>
<pre>      lines.append('Content-Transfer-Encoding: Base64')</pre>
<pre>      lines.append('')</pre>
<pre>      lines.append(data)</pre>
<p>&nbsp;</p>
<pre>    #Add the final boundary</pre>
<pre>    lines.append('--' + self.mime_boundary + '--')</pre>
<pre>    lines.append('')</pre>
<p>&nbsp;</p>
<pre>    #Combine the list into one long string</pre>
<pre>    CRLF = '\r\n'</pre>
<pre>    return CRLF.join(lines)</pre>
<pre>  #Send the final request</pre>
<pre>  def send_request(self):</pre>
<pre>    request = urllib2.Request(self.web_server + self.upload_cgi)</pre>
<pre>    content_type = 'multipart/form-data; boundary=%s' % self.mime_boundary</pre>
<pre>    request.add_header('Content-type',content_type)</pre>
<p>&nbsp;</p>
<pre>    form_data = self.get_request_body()</pre>
<pre>    request.add_header('Content-length',len(form_data))</pre>
<pre>    request.add_data(form_data)</pre>
<p>&nbsp;</p>
<pre>    result = urllib2.urlopen(request).read()</pre>
<pre>    return result</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>The third library handles the communication between the client and server. It will generate the GET requests and parse the XML responses.</p>
<p>&nbsp;</p>
<p><span style="text-decoration: underline;">actionHandler.py (94 lines)</span></p>
<pre>import urllib</pre>
<pre>import urllib2</pre>
<pre>from xml.dom.minidom import parseString</pre>
<p>&nbsp;</p>
<pre>class ActionHandler:</pre>
<p>&nbsp;</p>
<pre>  #Initialize with the information from the config file</pre>
<pre>  def __init__(self,options,localLog):</pre>
<pre>    self.webServer = options['runoptions']['web_server']</pre>
<pre>    self.uploadCGI = options['runoptions']['upload_cgi']</pre>
<pre>    self.actionCGI = options['runoptions']['action_cgi']</pre>
<pre>    localLog.write("Configured web server\n")</pre>
<p>&nbsp;</p>
<pre>  #Parse the XML for the requested text value</pre>
<pre>  def getText(self,nodelist):</pre>
<pre>    rc = []</pre>
<pre>    for node in nodelist:</pre>
<pre>      if node.nodeType == node.TEXT_NODE:</pre>
<pre>        rc.append(node.data)</pre>
<pre>    return ''.join(rc)</pre>
<p>&nbsp;</p>
<pre>  #Make a web request to the server with the provided GET parameters</pre>
<pre>  def retrieveInfo(self,values):</pre>
<pre>    url = self.webServer + self.actionCGI</pre>
<pre>    data = urllib.urlencode(values)</pre>
<pre>    response = urllib2.urlopen(url,data)</pre>
<pre>    xml = response.read()</pre>
<pre>    response.close()</pre>
<pre>    return(xml)</pre>
<p>&nbsp;</p>
<pre>  #Get the information for the rid provided in the config file</pre>
<pre>  def getRunInfo(self,rid):</pre>
<pre>    values = {'action':'getRunInfo',</pre>
<pre>      'rid': rid}</pre>
<pre>    xml = self.retrieveInfo(values)</pre>
<pre>    dom = parseString(xml)</pre>
<pre>    run_type = self.getText(dom.getElementsByTagName("run_type")[0].childNodes)</pre>
<pre>    start_fid = self.getText(dom.getElementsByTagName("start_fid")[0].childNodes)</pre>
<pre>    end_fid = self.getText(dom.getElementsByTagName("end_fid")[0].childNodes)</pre>
<pre>    return (run_type,start_fid,end_fid)</pre>
<p>&nbsp;</p>
<pre>  #Record that this server instance is starting a run</pre>
<pre>  def recordServerStart(self,rid,serverName):</pre>
<pre>    values = {'action':'recordServerStart',</pre>
<pre>      'rid': rid,</pre>
<pre>      'serverName':serverName}</pre>
<pre>    xml = self.retrieveInfo(values)</pre>
<pre>    dom = parseString(xml)</pre>
<pre>    lastrowid = self.getText(dom.getElementsByTagName("siid")[0].childNodes)</pre>
<pre>    return (lastrowid)</pre>
<p>&nbsp;</p>
<pre>  #Record that the server is now complete with its tests</pre>
<pre>  def recordRunComplete(self,siid):</pre>
<pre>    values = {'action':'recordRunComplete',</pre>
<pre>      'siid': siid}</pre>
<pre>    xml = self.retrieveInfo(values)</pre>
<p>&nbsp;</p>
<pre>  #Get the fid for the next file to be fuzzed</pre>
<pre>  def getNextFid(self,rid,fid,run_type):</pre>
<pre>    values = {'action':'getNextFid',</pre>
<pre>      'fid':fid,</pre>
<pre>      'run_type':run_type,</pre>
<pre>      'rid':rid}</pre>
<pre>    xml = self.retrieveInfo(values)</pre>
<pre>    dom = parseString(xml)</pre>
<pre>    current_id = self.getText(dom.getElementsByTagName("current_fid")[0].childNodes)</pre>
<pre>    return current_id</pre>
<p>&nbsp;</p>
<pre>  #Get the file name and location for the selected fid</pre>
<pre>  def getFileInfo(self,rid,fInfo):</pre>
<pre>    values = {'action':'getFileInfo',</pre>
<pre>      'rid':rid,</pre>
<pre>      'fid':fInfo.fid}</pre>
<pre>    xml = self.retrieveInfo(values)</pre>
<pre>    dom = parseString(xml)</pre>
<pre>    fInfo.name = self.getText(dom.getElementsByTagName("name")[0].childNodes)</pre>
<pre>    fInfo.location = self.getText(dom.getElementsByTagName("location")[0].childNodes)</pre>
<p>&nbsp;</p>
<pre>#Record the result from the fuzzing test</pre>
<pre>  def recordResult(self,siid,fid,result):</pre>
<pre>    values = {'action':'recordResult',</pre>
<pre>      'siid':siid,</pre>
<pre>      'fid':fid,</pre>
<pre>      'crash':result}</pre>
<pre>    xml = self.retrieveInfo(values)</pre>
<pre>    dom = parseString(xml)</pre>
<pre>    frid = self.getText(dom.getElementsByTagName("frid")[0].childNodes)</pre>
<pre>    return frid</pre>
<p>&nbsp;</p>
<p>Finally, we get to the main file which is responsible for reading the config file and driving the fuzzing run. This is the only file that is specific to the FOE fuzzer.</p>
<p>&nbsp;</p>
<p><span style="text-decoration: underline;">dffiac.py (177 lines)</span></p>
<pre>import os</pre>
<pre>import shutil</pre>
<pre>import socket</pre>
<pre>import subprocess</pre>
<pre>import sys</pre>
<pre>import urllib2</pre>
<pre>import ConfigParser</pre>
<pre>import time</pre>
<p>&nbsp;</p>
<pre>sys.path.append("libs")</pre>
<p>&nbsp;</p>
<pre>from ZipUtil import ZipUtil</pre>
<pre>from PostHandler import PostHandler</pre>
<pre>from ActionHandler import ActionHandler</pre>
<p>&nbsp;</p>
<pre>#This will track the fid, and location of the file</pre>
<pre>class FileInfo:</pre>
<pre>  pass</pre>
<p>&nbsp;</p>
<pre>#Convert the options in the config file to lists</pre>
<pre>def parse_options(config):</pre>
<pre>  options = {}</pre>
<pre>  for section in config.sections():</pre>
<pre>    options[section] = {}</pre>
<pre>    for (option, value) in config.items(section):</pre>
<pre>      options[section][option] = value</pre>
<pre>  return options</pre>
<pre></pre>
<pre>#Create a local text file for logging</pre>
<pre>def openLog(options):</pre>
<pre>  localLogDir = options['logoptions']['log_dir']</pre>
<pre>  runName = options['runoptions']['run_id']</pre>
<pre>  timestamp = int(time.time())</pre>
<pre>  localLog = open(localLogDir + runName + '_' + str(timestamp) + '.txt', 'w')</pre>
<pre>  localLog.write("Starting run: " + runName + " at " + str(timestamp) + "\n")</pre>
<pre>  return localLog</pre>
<p>&nbsp;</p>
<pre>#Close the local text file log</pre>
<pre>def closeLog(localLog):</pre>
<pre>  localLog.write("COMPLETE\n")</pre>
<pre>  localLog.close()</pre>
<p>&nbsp;</p>
<pre>#Download the next file to be fuzzed</pre>
<pre>def getNextFile(fInfo, options, foe_options, localLog):</pre>
<pre>  u = urllib2.urlopen(options['runoptions']['web_server'] + fInfo.location + fInfo.name)</pre>
<pre>  localFile = open(foe_options['runoptions']['seedsdir'] + "\\" + fInfo.name, 'wb')</pre>
<pre>  localFile.write(u.read())</pre>
<pre>  localFile.close()</pre>
<pre style="word-wrap: break-word;">  localLog.write ('Created file: ' + foe_options['runoptions']['seedsdir'] + "\\" + fInfo.name + '\n')</pre>
<p>&nbsp;</p>
<pre>#Store the results in a zip file</pre>
<pre>def createZip(outputDir,filename):</pre>
<pre>  zipTool = ZipUtil()</pre>
<pre>  zipTool.toZip(outputDir,filename)</pre>
<pre>  zipFile = open(filename,'rb')</pre>
<pre>  return zipFile</pre>
<p>&nbsp;</p>
<pre>#Post the zip file to the server</pre>
<pre>def postZip(options,frid,rid,filename,zipFile):</pre>
<pre style="word-wrap: break-word;">  form = PostHandler(options['runoptions']['web_server'], options['runoptions']['upload_cgi'])</pre>
<pre>  form.add_form_vars('frid',frid)</pre>
<pre>  form.add_form_vars('rid',rid)</pre>
<pre>  form.append_file('fname',filename,zipFile)</pre>
<pre>  result = form.send_request()</pre>
<pre>  return result</pre>
<p>&nbsp;</p>
<pre>if __name__ == "__main__":</pre>
<pre>  if (len(sys.argv) &lt; 2):</pre>
<pre>    print "usage: %s &lt;runconfig.cfg&gt;" % sys.argv[0]</pre>
<pre>    exit(1)</pre>
<p>&nbsp;</p>
<pre>  #Read the dffiac config file</pre>
<pre>  configFile = sys.argv[1]</pre>
<pre>  if not os.path.exists(configFile):</pre>
<pre>    print "config file doesn't exist: %s" % configFile</pre>
<pre>    exit(1)</pre>
<pre>  config = ConfigParser.SafeConfigParser()</pre>
<pre>  config.read(configFile)</pre>
<p>&nbsp;</p>
<pre>  #Read the foe config file</pre>
<pre>  options = parse_options(config)</pre>
<pre>  config2 = ConfigParser.SafeConfigParser()</pre>
<pre>  config2.read (options['foeoptions']['config_location'])</pre>
<pre>  foe_options = parse_options(config2)</pre>
<p>&nbsp;</p>
<pre>  #Set up logging</pre>
<pre>  localLog = openLog(options)</pre>
<p>&nbsp;</p>
<pre>  #Configure the web server</pre>
<pre>  aHandler = ActionHandler(options, localLog)</pre>
<p>&nbsp;</p>
<pre>  #Get the information for this run</pre>
<pre>  rid = options['runoptions']['run_id']</pre>
<pre>  (run_type,start_fid,end_fid) = aHandler.getRunInfo(rid)</pre>
<p>&nbsp;</p>
<pre>  #Record server start</pre>
<pre>  hostName = socket.gethostname()</pre>
<pre>  hostIP = socket.gethostbyname(hostName)</pre>
<pre>  serverName = hostName + "_" + hostIP</pre>
<pre>  siid = aHandler.recordServerStart(rid, serverName)</pre>
<pre>  localLog.write("Starting as server instance: " + siid + "\n")</pre>
<p>&nbsp;</p>
<pre>  #Get the first file to be processed</pre>
<pre>  fInfo = FileInfo()</pre>
<pre>  fInfo.fid = aHandler.getNextFid(rid,start_fid,run_type)</pre>
<pre>  localLog.flush()</pre>
<p>&nbsp;</p>
<pre>  #loop until done</pre>
<pre>  while (int(fInfo.fid) &lt;= int(end_fid)):</pre>
<pre>    #Get the location information for the current file</pre>
<pre>    aHandler.getFileInfo(rid,fInfo)</pre>
<p>&nbsp;</p>
<pre>    #Download and store the file</pre>
<pre>    getNextFile(fInfo,options,foe_options,localLog)</pre>
<pre></pre>
<pre style="word-wrap: break-word;">    outputDir = foe_options['runoptions']['outputdir'] + "\\" + foe_options['runoptions']['runid']</pre>
<p>&nbsp;</p>
<pre>    #Run fuzzer</pre>
<pre style="word-wrap: break-word;">    exitCode = subprocess.call(options['foeoptions']['python_location'] + " " + options['foeoptions']['foe_location'] + " " + options['foeoptions']['config_location'], shell=True)</pre>
<p>&nbsp;</p>
<pre>    #Check for completion of a succesful run</pre>
<pre>    if exitCode != 0:</pre>
<pre>      localLog.write("Error running foe on fid " + fInfo.fid + "\n")</pre>
<pre>    else:</pre>
<pre>      dirList = os.listdir(outputDir)</pre>
<p>&nbsp;</p>
<pre>      #Detect whether bugs were found</pre>
<pre>      if len(dirList) &gt; 2:</pre>
<p>&nbsp;</p>
<pre>        #Record the result in fuzz_records</pre>
<pre>        frid = aHandler.recordResult(siid,fInfo.fid,1)</pre>
<pre>        localLog.write("Recording frid: " + frid + "\n")</pre>
<p>&nbsp;</p>
<pre>        #Store the results in a zip file</pre>
<pre>        filename = frid + "-" + fInfo.name + ".zip"</pre>
<pre>        file_path = os.getcwd() + filename</pre>
<pre>        zipFile = createZip(outputDir,file_path)</pre>
<p>&nbsp;</p>
<pre>        #Post the zip file back to the server</pre>
<pre>        result = postZip(options,frid,rid,filename,zipFile)</pre>
<pre>        zipFile.close()</pre>
<p>&nbsp;</p>
<pre>        #Make sure the file got there OK</pre>
<pre>        if result.find("error") == -1:</pre>
<pre>          localLog.write("Results successfully uploaded.\n")</pre>
<pre>          os.remove(file_path)</pre>
<pre>        else:</pre>
<pre>          localLog.write("There was an error in the upload: " + result + "\n")</pre>
<p>&nbsp;</p>
<pre>        localLog.write("Found bugs with " + fInfo.fid + "\n")</pre>
<pre>      else:</pre>
<pre>        #Record no bugs found in the directory</pre>
<pre>        aHandler.recordResult(siid,fInfo.fid,0)</pre>
<pre>        localLog.write("No bugs found with " + fInfo.fid + "\n")</pre>
<p>&nbsp;</p>
<pre>    #The if len(dirlist) check on the results is complete</pre>
<pre>    #Erase files so that FOE starts clean on the next run</pre>
<pre>    os.remove(foe_options['runoptions']['seedsdir'] + "\\" + fInfo.name)</pre>
<pre>    shutil.rmtree(outputDir)</pre>
<pre>    localLog.flush()</pre>
<p>&nbsp;</p>
<pre>    #Get the next FID</pre>
<pre>    fInfo.fid = aHandler.getNextFid(rid,fInfo.fid,run_type)</pre>
<p>&nbsp;</p>
<pre>  #The while loop is complete</pre>
<pre>  #Record this run instance as being complete</pre>
<pre>  aHandler.recordRunComplete(siid)</pre>
<p>&nbsp;</p>
<pre>  #Close the local file log</pre>
<pre>  closeLog(localLog)</pre>
<p>&nbsp;</p>
<p>This blog is only meant to describe how you can stand up a basic distributed fuzzing framework based on FOE fairly quickly in approximately 1,000 lines of code. The client-side code turned out to be 378 lines, my server-side action_handler CGI was 150 lines and the upload CGI was 72 lines of Perl. That is enough to get the script to run based on information from a database. With the remaining 400 lines, I created a CGI to display the status of my runs and a CGI to generate a run. You will also want to write a script to mirror the dffiac.cfg and FOE configuration file across machines. Over time, I expect that you would make this design more robust for your particular infrastructure and needs. You can also expand this infrastructure for your other fuzzers with some modifications to the main file. What I provide here is just enough to help you get started performing distributed fuzzing with a small amount of coding and the FOE fuzzer.</p>
<p>&nbsp;</p>
<p>Permission for this blog entry is granted as CCplus, <a href="http://www.adobe.com/communities/guidelines/ccplus/commercialcode_plus_permission.html">http</a><a href="http://www.adobe.com/communities/guidelines/ccplus/commercialcode_plus_permission.html">://</a><a href="http://www.adobe.com/communities/guidelines/ccplus/commercialcode_plus_permission.html">www</a><a href="http://www.adobe.com/communities/guidelines/ccplus/commercialcode_plus_permission.html">.adobe.</a><a href="http://www.adobe.com/communities/guidelines/ccplus/commercialcode_plus_permission.html">com</a><a href="http://www.adobe.com/communities/guidelines/ccplus/commercialcode_plus_permission.html">/communities/guidelines/</a><a href="http://www.adobe.com/communities/guidelines/ccplus/commercialcode_plus_permission.html">ccplus</a><a href="http://www.adobe.com/communities/guidelines/ccplus/commercialcode_plus_permission.html">/</a><a href="http://www.adobe.com/communities/guidelines/ccplus/commercialcode_plus_permission.html">commercialcode</a><a href="http://www.adobe.com/communities/guidelines/ccplus/commercialcode_plus_permission.html">_plus_permission.html</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/asset/2012/05/a-basic-distributed-fuzzing-framework-for-foe.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Straight from the Source: SOURCE Boston</title>
		<link>http://blogs.adobe.com/asset/2012/04/straight-from-the-source-source-boston.html</link>
		<comments>http://blogs.adobe.com/asset/2012/04/straight-from-the-source-source-boston.html#comments</comments>
		<pubDate>Fri, 13 Apr 2012 17:12:03 +0000</pubDate>
		<dc:creator>Karthik</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[incident response]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/asset/?p=1037</guid>
		<description><![CDATA[Karthik here from Adobe PSIRT. My colleague from the Adobe Acrobat team, Manish Pali, and I will be speaking next week at the SOURCE Boston conference. In our talk, we’ll cover some of the processes behind incident response at Adobe, including our security community outreach via the Microsoft Active Protections Program (MAPP), and automation strategies [...]]]></description>
			<content:encoded><![CDATA[<p>Karthik here from Adobe PSIRT. My colleague from the Adobe Acrobat team, Manish Pali, and I will be speaking next week at the <a href="http://www.sourceconference.com/boston/speakers_2012.asp#kraman">SOURCE Boston</a> conference. In our talk, we’ll cover some of the processes behind incident response at Adobe, including our security community outreach via the Microsoft Active Protections Program (MAPP), and automation strategies and solutions from the trenches for new and known vulnerability reports.</p>
<p>Demo alert! Manish is going to demo one of his tools for incident-triage automation—we’re hoping this and other aspects of the talk will benefit our friends on other incident response teams.</p>
<p>Please swing by our talk, if you’ll be at SOURCE Boston. We look forward to catching up in hallway conversations.</p>
<p>See you in Boston,</p>
<p>Karthik</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/asset/2012/04/straight-from-the-source-source-boston.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Background on Security Bulletin APSB12-08</title>
		<link>http://blogs.adobe.com/asset/2012/04/background-on-security-bulletin-apsb12-08.html</link>
		<comments>http://blogs.adobe.com/asset/2012/04/background-on-security-bulletin-apsb12-08.html#comments</comments>
		<pubDate>Tue, 10 Apr 2012 16:47:10 +0000</pubDate>
		<dc:creator>David Lenoe</dc:creator>
				<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/asset/?p=1025</guid>
		<description><![CDATA[Today we released Security Bulletin APSB12-08 along with corresponding updates for Adobe Reader and Acrobat. We&#8217;d like to highlight a few changes we are making with today&#8217;s releases. Rendering Flash (SWF) Content in Adobe Reader and Acrobat 9.5.1 First off, starting with the Adobe Reader and Acrobat 9.5.1 updates, Adobe Reader and Acrobat 9.x on [...]]]></description>
			<content:encoded><![CDATA[<p>Today we released <a href="http://www.adobe.com/go/apsb12-08">Security Bulletin APSB12-08</a> along with corresponding updates for Adobe Reader and Acrobat. We&#8217;d like to highlight a few changes we are making with today&#8217;s releases.</p>
<p><strong>Rendering Flash (SWF) Content in Adobe Reader and Acrobat 9.5.1</strong></p>
<p>First off, starting with the Adobe Reader and Acrobat 9.5.1 updates, Adobe Reader and Acrobat 9.x on Windows and Macintosh will use the Adobe Flash Player plugin version installed on the user&#8217;s system (rather than the Authplay component that ships with Adobe Reader and Acrobat) to render any Flash (SWF) content contained in PDF files. We added an Application Programming Interface (API) to both Adobe Reader/Acrobat and Flash Player to allow Adobe Reader/Acrobat to communicate directly with a Netscape Plugin Application Programming Interface (NPAPI) version of Flash Player installed on the user&#8217;s system. From a security perspective, this means that Adobe Reader/Acrobat 9.x users will no longer have to update Adobe Reader/Acrobat each time we make available an update for Flash Player. This will be particularly beneficial to customers in managed environments because fewer updates help reduce the overhead for IT administration.</p>
<p>If Adobe Reader or Acrobat 9.5.1 is installed on a system that does not have the NPAPI version of Flash Player installed and the user opens a PDF file that includes Flash (SWF) content, a dialog will prompt the user to download and install the latest Flash Player. (Browsers such as Firefox, Opera and Safari use the NPAPI version of Flash Player as opposed to the ActiveX version of Flash Player used by Internet Explorer. Chrome uses a bundled version of Flash Player, even if there is an NPAPI version of Flash Player installed on the system.)</p>
<p>We are currently working on integrating the same API into Adobe Reader and Acrobat X, and will follow up with another blog post once this functionality is available in version X.</p>
<p><strong>Rendering 3D Content in PDF Files</strong></p>
<p>We also changed the default behavior in Adobe Reader and Acrobat 9.5.1 to disable the rendering of 3D content. Since the majority of consumers do not typically open PDF files that include 3D content and 3D content in untrusted documents has been a previous vector of attack we have disabled this functionality by default starting with version 9.5.1. Users have the option to enable 3D content, but a Yellow Message Bar will flag potentially harmful documents in the event that untrusted documents attempt to render 3D content. IT administrators in managed environments will also have the option of turning this behavior off for trusted documents.</p>
<p>More information on the two changes to content rendering described above is available in the <a href="http://helpx.adobe.com/content/dam/help/attachments/Acrobat_Reader_ReleaseNote_9.5.1.pdf">Adobe Reader and Acrobat 9.5.1 release notes</a>.</p>
<p><strong>Further Alignment of the Adobe Reader/Acrobat Update Cycle with Microsoft&#8217;s Model</strong></p>
<p>In June 2009, we shipped our first quarterly security update for Adobe Reader and Acrobat. Since then, we have come a long way in putting mitigations into place that make Adobe Reader and Acrobat a less attractive attack target. Sandboxing <a href="http://blogs.adobe.com/asset/2010/11/adobe-reader-x-is-here.html">Adobe Reader</a> and <a href="http://blogs.adobe.com/asset/2011/06/inside-adobe-acrobat-protected-view.html">Acrobat X</a>, in particular, has led to greater than expected results. Attackers have indicated through their target selection thus far that the extra effort required to attack version X is not currently worth it. Additionally, we have seen a lower volume of vulnerability reports overall against Adobe Reader and Adobe Acrobat. Given the shift in the threat landscape and the lower volume of vulnerability reports, we have revisited the decision to follow a strict quarterly release cycle.</p>
<p>After three years of shipping a security update once a quarter and announcing the date of the next update the same day we ship the current update, we are making a change. We are shifting to a model that more closely aligns with the familiar &#8220;Microsoft Patch Tuesday&#8221; cadence. We will continue to publish a prenotification three business days before we release a security update to Adobe Reader and Acrobat. We will continue to publish security updates on the second Tuesday of the month. We will continue to be flexible and respond &#8220;out of cycle&#8221; to urgent needs such as a zero-day attack. What we are discontinuing is the quarterly cadence and the pre-announcement of the next scheduled release date in the security bulletin for the previous release. We will publish updates to Adobe Reader and Acrobat as needed throughout the year to best address customer requirements and keep all of our users safe.</p>
<p><strong>A Note on the Update Priority Ratings in APSB12-08</strong></p>
<p>Finally, in today&#8217;s <a href="http://www.adobe.com/go/apsb12-08">Security Bulletin</a>, we rated Adobe Reader and Acrobat 9.5.1 for Windows as a &#8220;Priority 1&#8243; update, while Adobe Reader and Acrobat X (10.1.2) was rated a &#8220;Priority 2&#8243; update. This was an interesting decision, and we thought we would provide some background information: Although there are no exploits in the wild targeting any of the vulnerabilities addressed in Adobe Reader 9.5.1, Adobe Reader 9.x continues to be a target for attackers, so, for users who can not update to Adobe Reader X, we feel that urgently updating Adobe Reader 9.x remains a must to stay ahead of potential attacks.</p>
<p>Since the release of Adobe Reader X, Protected Mode mitigations (or the Protected View mitigations in Adobe Acrobat X version 10.1 and later) continue to be the best way to block potentially malicious behavior in PDF files. Therefore, a &#8220;Priority 2&#8243; designation is appropriate for the Adobe Reader X and Acrobat X 10.1.2 updates. Adobe Reader and Acrobat for Macintosh and Linux have not historically been a target of attacks, and therefore are also assigned a &#8220;Priority 2.&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/asset/2012/04/background-on-security-bulletin-apsb12-08.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Presenting “Malware Classifier” Tool</title>
		<link>http://blogs.adobe.com/asset/2012/03/presenting-malware-classifier-tool.html</link>
		<comments>http://blogs.adobe.com/asset/2012/03/presenting-malware-classifier-tool.html#comments</comments>
		<pubDate>Thu, 29 Mar 2012 16:24:06 +0000</pubDate>
		<dc:creator>Karthik</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[incident response]]></category>
		<category><![CDATA[malware classification]]></category>
		<category><![CDATA[open-source]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[tool]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/asset/?p=1017</guid>
		<description><![CDATA[Hi folks, Karthik here from Adobe PSIRT. Part of what we do at PSIRT is respond to security incidents. Sometimes this involves analyzing malware.  To make life easier, I wrote a Python tool for quick malware triage for our team. I&#8217;ve since decided to make this tool, called &#8220;Adobe Malware Classifier,&#8221; available to other first [...]]]></description>
			<content:encoded><![CDATA[<p>Hi folks,</p>
<p>Karthik here from Adobe PSIRT. Part of what we do at PSIRT is respond to security incidents. Sometimes this involves analyzing malware.  To make life easier, I wrote a Python tool for quick malware triage for our team. I&#8217;ve since decided to make this tool, called &#8220;Adobe Malware Classifier,&#8221; available to other first responders (malware analysts, IT admins and security researchers of any stripe) as an open-source tool, since you might find it equally helpful.</p>
<p>Malware Classifier uses machine learning algorithms to classify Win32 binaries – EXEs and DLLs – into three classes: 0 for “clean,” 1 for “malicious,” or “UNKNOWN.” The tool extracts seven key features from a binary, feeds them to one or all of the four classifiers, and presents its classification results.</p>
<p>The tool was developed using models resultant from running the J48, J48 Graft, PART, and Ridor machine-learning algorithms on a data set of approximately 100,000 malicious programs and 16,000 clean programs.</p>
<p>Malware Classifier is available at <a title="Adobe Malware Classifier download" href="https://sourceforge.net/adobe/malclassifier" target="_blank">Open @ Adobe</a>.</p>
<p>I will be speaking about the research behind the tool at <a title="Infosec Southwest 2012" href="http://infosecsouthwest.com/agenda.html" target="_blank">Infosec Southwest 2012</a> in Austin, TX, on April 1. If you’re going to be there, I look forward to meeting up and discussing product security and secure engineering at Adobe.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/asset/2012/03/presenting-malware-classifier-tool.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An Update for the Flash Player Updater</title>
		<link>http://blogs.adobe.com/asset/2012/03/an-update-for-the-flash-player-updater.html</link>
		<comments>http://blogs.adobe.com/asset/2012/03/an-update-for-the-flash-player-updater.html#comments</comments>
		<pubDate>Wed, 28 Mar 2012 00:12:39 +0000</pubDate>
		<dc:creator>Peleus Uhley</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Flash Player]]></category>
		<category><![CDATA[Peleus Uhley]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[Update]]></category>
		<category><![CDATA[Updater]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/asset/?p=1003</guid>
		<description><![CDATA[Peleus here with the second major 2012 security announcement for Flash Player. Today&#8217;s release of Flash Player contains a new background updater. This new background updater will allow Windows users to choose an automatic update option for future Flash Player updates. If you read this September 2011 CSIS report, then you saw that 99.8 percent [...]]]></description>
			<content:encoded><![CDATA[<p>Peleus here with the second major 2012 security announcement for Flash Player. Today&#8217;s release of Flash Player contains a new background updater. This new background updater will allow Windows users to choose an automatic update option for future Flash Player updates.</p>
<p>If you read <a href="http://www.csis.dk/en/csis/news/3321">this September 2011 CSIS report</a>, then you saw that 99.8 percent of malware installs through exploit kits are targeting out-of-date software installations. This point was reiterated recently in volume 11 of the <a href="http://www.microsoft.com/security/sir/default.aspx">Microsoft Security Intelligent Report</a>. Also, attackers have been taking advantage of users trying to manually search for Flash Player updates by <a href="http://sunbeltblog.blogspot.com/2011/10/continuation-of-dangerous-rogue-ads-on.html">buying ads on search engines</a> pretending to be legitimate Flash Player download sites. Improving the update process is probably the single most important challenge we can tackle for our customers at this time.</p>
<p><strong>Overview of the background updater design</strong></p>
<p>A full technical description of the new background updater design is available on <a href="http://www.adobe.com/devnet/flashplayer/articles/background-updater-windows.html ">DevNet</a>, but here are the highlights:</p>
<p>After a successful installation of Adobe Flash Player 11.2, users will be presented with a dialog box to choose an update method. The following three update options are available to users:</p>
<ul>
<li>Install updates automatically when available (recommended)</li>
<li>Notify me when updates are available</li>
<li>Never check for updates (not recommended)</li>
</ul>
<p><a class="lightbox" title="FP_Updater_Installer_UpdateOptions" href="http://blogs.adobe.com/asset/files/2012/03/FP_Updater_Installer_UpdateOptions.jpg"><img class="alignnone size-full wp-image-1008" title="FP_Updater_Installer_UpdateOptions" src="http://blogs.adobe.com/asset/files/2012/03/FP_Updater_Installer_UpdateOptions.jpg" alt="" width="491" height="398" /></a></p>
<p>For our initial release, we have set the new background updater to check for updates once an hour until it gets a response from Adobe. If the response says there is no new update, then it will wait 24 hours before checking again. We accomplish this through the Windows Task Scheduler to avoid running a background service on the system. If you are running multiple browsers on your system, the background updater will update every browser. This will solve the problem of end-users having to update Flash Player for Internet Explorer separately from Flash Player for their other open-source browsers. Google Chrome users, who have the integrated Flash Player, will still be updated through the Chrome update system.</p>
<p>Additionally, the user can change their update preferences at any time via the Flash Player Settings Manager, which for Windows users can be accessed via the <em>Control Panel</em> &gt; <em>Flash Player</em>. In the Flash Player Settings Manager, the update preferences can be found and selected in the &#8220;<em>Advanced</em>&#8221; tab under &#8220;<em>Updates</em>.&#8221;</p>
<p><a class="lightbox" title="FP_Updater_SettingsManager_UpdateOptions" href="http://blogs.adobe.com/asset/files/2012/03/FP_Updater_SettingsManager_UpdateOptions.png"><img class="alignnone size-full wp-image-1010" title="FP_Updater_SettingsManager_UpdateOptions" src="http://blogs.adobe.com/asset/files/2012/03/FP_Updater_SettingsManager_UpdateOptions.png" alt="" width="471" height="426" /></a></p>
<p>Organizations with managed environments do have the capability to disable the background updater feature through the Flash Player mms.cfg file. Also, those users who want to be notified of updates and do not want to be silently updated can continue to use the existing update mechanism. Lastly, the background updater feature is currently Windows-only for Windows XP and newer operating systems. A Mac version is currently under development.</p>
<p>I do want to note that we are not promising that all Flash Player updates going forward will be completely silent. We will be making the decision to silently install on a case-by-case basis. For instance, any update that changes the default settings of Flash Player will require confirmation from end-users even if they have already agreed to allowing background updates. Today&#8217;s update is an example of where confirmation would be required since we are changing how updates get applied to the user&#8217;s machine. However, we could apply a zero-day patch without requiring end-user confirmation, so long as the user has agreed to receiving background updates. Adobe will also continue to release feature-bearing releases that will trigger an update notification to users that highlight new and exciting features to the Flash Player.</p>
<p>The new background updater will provide a better experience for our customers, and it will allow us to more rapidly respond to zero-day attacks. This model for updating users is similar to the Google Chrome update experience, and <a href="http://research.google.com/pubs/pub35246.html">Google has had great success with this approach</a>. We are hoping to have similar success.</p>
<p><strong>One last note</strong></p>
<p>Since Flash Player 11 was first released in September 2011, we have continued to maintain Flash Player 10.3 with security updates for users who cannot update to the current version of Flash Player. In support of Microsoft’s initiative to get the world to <a href="http://www.ie6countdown.com/">drop Internet Explorer 6</a> and upgrade to a newer version of Internet Explorer for a safer browsing experience, Adobe will be dropping support for Internet Explorer 6 starting with today&#8217;s release of Flash Player 10.3.</p>
<p>While we will no longer include testing on Internet Explorer 6 in our certification process and strongly encourage users to upgrade to the newest version of Internet Explorer, we will not block the installation of newer versions of Flash Player 10.3 on systems running Internet Explorer 6 and expect functionality on those systems to remain unchanged.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/asset/2012/03/an-update-for-the-flash-player-updater.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CanSecWest 2012</title>
		<link>http://blogs.adobe.com/asset/2012/03/cansecwest-2012.html</link>
		<comments>http://blogs.adobe.com/asset/2012/03/cansecwest-2012.html#comments</comments>
		<pubDate>Tue, 06 Mar 2012 17:50:37 +0000</pubDate>
		<dc:creator>Peleus Uhley</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[AdobeLabs]]></category>
		<category><![CDATA[CanSecWest]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flash Player]]></category>
		<category><![CDATA[Fuzzing]]></category>
		<category><![CDATA[open]]></category>
		<category><![CDATA[open-source]]></category>
		<category><![CDATA[Peleus Uhley]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[SWF]]></category>
		<category><![CDATA[SWF Investigator]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/asset/?p=994</guid>
		<description><![CDATA[The team and I are about to head off to CanSecWest. While I have been attending CanSecWest for several years, this year will be a unique experience for me. During my talk, I will demo an open-source tool I just released, called Adobe SWF Investigator. The tool can be useful for developers, quality engineers and [...]]]></description>
			<content:encoded><![CDATA[<p>The team and I are about to head off to <a href="http://cansecwest.com/agenda.html">CanSecWest</a>. While I have been attending CanSecWest for several years, this year will be a unique experience for me. During my talk, I will demo an open-source tool I just released, called Adobe SWF Investigator. The tool can be useful for developers, quality engineers and security professionals for analyzing SWF applications. It has been a pet project of mine for some time, and I decided to share it with a broader audience.</p>
<p>Within my current role, I have to look at all aspects of SWF applications from cross-site scripting issues to binary analysis. Therefore, the tool includes capabilities to perform everything from testing cross-site scripting to viewing the individual SWF tags within the file format. I am hoping that by releasing the tool as an open-source ActionScript application, it will encourage all ActionScript developers to learn more about security. The tool is designed to be an extensible framework everyone can build upon or modify. More information on the tool can be found in my <a href="http://www.adobe.com/devnet/security/articles/inroducing-adobe-swf-investigator.html">DevNet article</a>.</p>
<p>In addition to demonstrating the tool, I will also be talking about Advanced Persistent Response. Adobe has been the focus of hackers for some time, and I plan to discuss what we have learned and observed in the process of responding to those threats. My talk will be on Wednesday at 3:30pm, if you are interested. When I am not speaking, you can probably find me and the Adobe team either at the Adobe table or milling around the pwn2own contest for no particular reason. Please feel free to come by and talk with us. See you there!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/asset/2012/03/cansecwest-2012.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>When Do I Need to Apply This Update &#8211; Adding Priority Ratings to Adobe Security Bulletins</title>
		<link>http://blogs.adobe.com/asset/2012/02/when-do-i-need-to-apply-this-update-adding-priority-ratings-to-adobe-security-bulletins-2.html</link>
		<comments>http://blogs.adobe.com/asset/2012/02/when-do-i-need-to-apply-this-update-adding-priority-ratings-to-adobe-security-bulletins-2.html#comments</comments>
		<pubDate>Tue, 28 Feb 2012 18:52:03 +0000</pubDate>
		<dc:creator>David Lenoe</dc:creator>
				<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/asset/?p=968</guid>
		<description><![CDATA[How urgently do I need to apply this update? That&#8217;s the most common question we get from customers in managed environments when we release a security bulletin. Our current severity ratings do a good job of objectively describing the worst-case scenario involved with a security issue, but they do not necessarily tell a customer all [...]]]></description>
			<content:encoded><![CDATA[<p>How urgently do I need to apply this update? That&#8217;s the most common question we get from customers in managed environments when we release a security bulletin. Our current <a href="http://www.adobe.com/devnet/security/severity_ratings.html">severity ratings</a> do a good job of objectively describing the worst-case scenario involved with a security issue, but they do not necessarily tell a customer all they need to know about the risk and priority of a particular security update. All critical security updates are not created equal. For example, if a <a href="http://www.adobe.com/go/apsb12-03">Flash Player issue</a> is being exploited in the wild, the update to resolve the vulnerability deserves a much higher priority than, say, a patch for a <a href="http://www.adobe.com/support/security/bulletins/apsb11-22.html">critical vulnerability in Photoshop</a>. After all, Flash Player is a browser-based plugin with hundreds of millions of customers. Photoshop, on the other hand, has a much smaller customer base and would require significant social engineering to successfully exploit the product. So we started to wonder, how can we communicate the priority of our security updates more effectively?</p>
<p>We want to be as simple and direct as possible about the real-world risk associated with the vulnerabilities addressed in any given security update, and we decided that adopting a separate priority ranking scheme was the best way to accomplish this. Here is the priority scheme we are planning to use to rank security updates in the future:</p>
<table border="1" cellspacing="3" cellpadding="3">
<tbody>
<tr>
<th><span style="color: #000000;">Priority 1</span></th>
<th><span style="color: #000000;">Priority 2</span></th>
<th><span style="color: #000000;">Priority 3</span></th>
</tr>
<tr>
<td><span style="color: #000000;"> This update resolves vulnerabilities being targeted, or which have a higher risk of being targeted, by exploit(s) in the wild for a given product version and platform. Adobe recommends administrators install the update as soon as possible. (for instance, within 72 hours).</span></td>
<td><span style="color: #000000;">This update resolves vulnerabilities in a product that has historically been at elevated risk. There are currently no known exploits. Based on previous experience, we do not anticipate exploits are imminent. As a best practice, Adobe recommends administrators install the update soon (for instance, within 30 days).</span></td>
<td><span style="color: #000000;">This update resolves vulnerabilities in a product that has historically not been a target for attackers. Adobe recommends administrators install the update at their discretion.</span></td>
</tr>
</tbody>
</table>
<p>We&#8217;re going to base our priority ranking on historical attack patterns for the relevant product, the type of vulnerability, the platform(s) affected, and any potential mitigations that may be in place. This is a new system, so we may find that adjustments will need to be made. We also believe that continuing to use the current severity ratings makes sense, since this information has been helpful to many customers, so you can expect to see both ratings being used in future security bulletins.</p>
<p>We look forward to your feedback. Our goal is to help our customers in managed environments prioritize updates, so we&#8217;ll see if this new priority ranking scheme works to accomplish that! As we have been emphasizing a lot recently, the majority of attacks we are seeing are exploiting software installations that are not up-to-date with the latest security updates, so as always we recommend that users keep their software installations updated with the latest version of Adobe software.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/asset/2012/02/when-do-i-need-to-apply-this-update-adding-priority-ratings-to-adobe-security-bulletins-2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RSA Conference Schedule</title>
		<link>http://blogs.adobe.com/asset/2012/02/rsa-conference-schedule.html</link>
		<comments>http://blogs.adobe.com/asset/2012/02/rsa-conference-schedule.html#comments</comments>
		<pubDate>Thu, 23 Feb 2012 21:08:10 +0000</pubDate>
		<dc:creator>Brad Arkin</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Brad Arkin]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[RSA]]></category>
		<category><![CDATA[RSA Conference]]></category>
		<category><![CDATA[SAFECode]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://blogs.adobe.com/asset/?p=955</guid>
		<description><![CDATA[Brad Arkin here. RSA Conference is upon us once again. There are some exciting talks and events on the calendar, but I&#8217;m looking forward to the informal &#8220;hallway track&#8221; the most. In the days leading up to RSA Conference, everyone in the industry seems to be reminding each other of the sessions you “absolutely should [...]]]></description>
			<content:encoded><![CDATA[<p>Brad Arkin here. RSA Conference is upon us once again. There are some exciting talks and events on the calendar, but I&#8217;m looking forward to the informal &#8220;hallway track&#8221; the most.</p>
<p>In the days leading up to RSA Conference, everyone in the industry seems to be reminding each other of the sessions you “absolutely should not miss.” Here’s my pitch—and a summary of where you can find me and members of the Adobe Secure Software Engineering Team at RSA Conference:</p>
<p><strong>MONDAY, FEBRUARY 27, 2012</strong></p>
<p>On Monday, February 27, you’ll find me at the <strong>“Improving Application Security Seminar” (<a href="https://ae.rsaconference.com/US12/scheduler/modifySession.do?SESSION_ID=11241&amp;back=true">SEM-002</a>)</strong>, along with experts from Symantec, Cigital, Fortify Software, HP, Microsoft, and Veracode. This full-day seminar for delegates will kick off at <strong>8:30 a.m.</strong> in Room 305 at the Moscone Center.</p>
<p>In the evening, please join the Adobe Security Team from <strong>6:30 to 9:30 p.m.</strong> at <strong><a href="http://www.roe-sf.com/">Roe Restaurant</a></strong> (10 Hawthorne Street, two blocks from the Moscone Center) for food, drinks, and a lively discussion on the current challenges facing the security industry. Please note that this is a limited capacity event, so please <strong><a href="http://www.securityischange.com/">register for this event</a></strong> as soon as possible to save your spot.</p>
<p><strong>TUESDAY, FEBRUARY 28, 2012</strong></p>
<p>Join Adobe’s Kyle Randolph and other participants from EMC, Cigital, Symantec and Microsoft for a panel discussion titled <strong>“Making Sense of Software Security Advice: Best vs. Practiced Practices” (<a href="https://ae.rsaconference.com/US12/scheduler/modifySession.do?SESSION_ID=9175&amp;back=true">ASEC-106</a>)</strong> at <strong>1:10 p.m.</strong> on Tuesday, February 28, in Room 302. The panel, moderated by EMC’s Reeny Sondhi, will help you make sense of the different software security advice available and discuss how to apply it to your work.</p>
<p><strong>WEDNESDAY, FEBRUARY 29, 2012</strong></p>
<p>If you are an early riser, join me at <strong>8:00 a.m.</strong> on Wednesday, February 29, in Room 302 for a panel discussion moderated by Chenxi Wang from Forrester, titled <strong>“War Stories: The Good, Bad and the Ugly of Application Security Programs” (<a href="https://ae.rsaconference.com/US12/scheduler/modifySession.do?SESSION_ID=9093&amp;back=true">ASEC-201</a>)</strong>. I’ll be participating on the panel along with Doug Cavit from Microsoft and James Routh from JPMorgan Chase &amp;amp; Co. We look forward to your questions and comments!</p>
<p>Afterwards, don’t miss my talk <strong>“Never Waste a Crisis &#8211; Necessity Drives Software Security Improvements” (<a href="https://ae.rsaconference.com/US12/scheduler/modifySession.do?SESSION_ID=8900&amp;back=true">ASEC-203</a>)</strong>, which will take place from <strong>10:40-11:30 a.m.</strong> in Room 302. I’ll share some general lessons on both how to prepare for a crisis and what to do once it arrives. And I’ll provide step-by-step instruction on what to do through every phase of a crisis with an eye towards promoting the priority of software security activities throughout.</p>
<p><strong>THURSDAY, MARCH 1, 2012</strong></p>
<p>On Thursday, March 1, I’ll be moderating a SAFECode panel discussion titled <strong>“What Motivated My Company to Invest in a Secure Development Program?” (<a href="https://ae.rsaconference.com/US12/scheduler/modifySession.do?SESSION_ID=9240&amp;back=true">ASEC-301</a>)</strong>. Other panelists include Steven Lipner from Microsoft, Gunter Bitz from SAP, Janne Uusilehto from Nokia, and Gary Phillips from Symantec. Don’t miss what promises to be a lively discussion from <strong>8:00-9:10 a.m.</strong> in Room 302!</p>
<p>We hope to see you at RSA Conference!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.adobe.com/asset/2012/02/rsa-conference-schedule.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

