<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2511631377600597263</id><updated>2012-01-17T21:23:19.204-06:00</updated><category term='Secure Coding'/><category term='Secure Software Development Process'/><category term='Microsoft SDL'/><category term='SQL Injection'/><category term='SAMM'/><category term='Exploits'/><category term='Tools'/><category term='Publications'/><category term='Cross-site Scripting'/><category term='Presentations'/><category term='SAML'/><category term='Cloud'/><category term='Struts 2'/><category term='ASP.NET'/><title type='text'>Nick Coblentz</title><subtitle type='html'>Web Application Security Ideas, Research, and Experiments</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>56</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-6824691835636026770</id><published>2012-01-16T11:21:00.000-06:00</published><updated>2012-01-16T11:24:35.697-06:00</updated><title type='text'>Security and Development: Building A Better Relationship</title><content type='html'>Let's build a better relationship between security assessors and software developers. &amp;nbsp;Instead, of having security teams act like an external, neutral audit group that simply finds problems and reports them, let's make security assessors problem solvers, advocates, and advisors! &lt;br /&gt;&lt;br /&gt;Typically, assessors identify security defects, and then reports issues to the application development team. &amp;nbsp;Defects may be accompanied by a best practice approach or description for remediating each vulnerability, but that advice often isn't customized for the relevant framework, language, or libraries being used in the software package. &amp;nbsp;Assessments typically occur after specific milestones like a release or after an elapsed time period. &amp;nbsp;I want to shake up these patterns!&lt;br /&gt;&lt;br /&gt;First,&amp;nbsp;let's assign a relationship, development team, and set of applications to each assessor within the security group. &amp;nbsp;This assessor will partner with software developers and really get to know the application over time through repeated interaction and review. &amp;nbsp;Next,&amp;nbsp;let's give the assessors read only access to the source code repositories for each application they are assessing. &amp;nbsp;Now, instead of providing security services (assessments, code reviews, architecture reviews, design reviews, etc.) once an application reaches a specific milestone, let's make the assessor responsible for guiding the team on a continuous basis. &amp;nbsp;The assessor attends important meetings, gets to know the project goals, identifies and executes on security needs continuously, provides training, advice, and gets out in front of potential privacy, compliance, and security concerns while the application is still being designed and architected.&lt;br /&gt;&lt;br /&gt;The organization as a whole should have specific security tools and activities that are required for all applications (may be a tiered approach based on an application's risk profile and valuation) identified in advance and the security assessor is responsible for setting up, configuring and running these tools and activities (often with cooperation of the development team). &amp;nbsp;Let's assume that the organization uses a static code analysis tool to identify security defects in a software package. &amp;nbsp;The tool is installed on a continuous integration server (automatically monitors code repositories, checks out, builds, and then assesses code for quality and security) and as new defects are found, the security assessor is notified. &amp;nbsp;The security assessor is then responsible for reviewing and validating the findings (alternatively, a filter could be set up to notify developers of security issues already mastered and the assessor could&amp;nbsp;receive&amp;nbsp;only new issues). &amp;nbsp;Once a finding is validated, the assessor develops an example code patch that would remediate the vulnerability. &amp;nbsp;He or she then brings that solution to the software team, and provides a mini training session with the whole team covering: information about the vulnerability, the specific best practice used to remediate it, and then the code proposed to fix the issue. &amp;nbsp;The team (security and development) discusses the cause, effect, and fix, and then the team as a whole agrees upon an appropriate secure coding standard for that vulnerability class (based on the code example above). &amp;nbsp;Finally, the development team applies that standard for all instances of the issue in the application and uses it for developing similar code in the future.&lt;br /&gt;&lt;br /&gt;This approach allows teams to identify and fix security defects quickly, it allows developers to focus on developing code rather than understanding security tools, and creates a relationship in which the security team brings solutions to the table rather than problems.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Taking it further:&lt;/i&gt; If the organization has a formalized secure software development process and a central repository for application security requirements, then the knowledge should be captured within this repository in the form of application security requirements and secure coding standards. &amp;nbsp;These added requirements and secure coding standards should be evangelized to other software development teams to help them avoid similar vulnerabilities.&lt;br /&gt;&lt;br /&gt;Related:&lt;br /&gt;&lt;a href="http://nickcoblentz.blogspot.com/2009/10/turn-application-assessment-reports.html"&gt;Turn Application Assessment Reports into Training Classes&lt;/a&gt;&lt;br /&gt;&lt;a href="http://nickcoblentz.blogspot.com/2011/10/security-testing-roles-expanding-on.html"&gt;Security Testing Roles - Expanding on Integrating Security Testing into the QA Process&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-6824691835636026770?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/6824691835636026770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=6824691835636026770' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/6824691835636026770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/6824691835636026770'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2012/01/security-and-development-building.html' title='Security and Development: Building A Better Relationship'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-6001046506358828528</id><published>2011-11-30T08:00:00.000-06:00</published><updated>2011-11-30T08:00:15.781-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Exploits'/><title type='text'>Web Application Vulnerability Unit Testing Cheat Sheet (Capybara and Watir-WebDriver)</title><content type='html'>For an example template for Watir-WebDriver/RSpec or Capybara Test Case, start here:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2011/11/using-watir-webdriver-or-capybara-for.html"&gt;http://nickcoblentz.blogspot.com/2011/11/using-watir-webdriver-or-capybara-for.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;For common questions with Watir-WebDriver or Capybara, look here next:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;http://watirwebdriver.com/web-elements/ (and the "advanced interactions" items)&lt;/li&gt;&lt;li&gt;https://github.com/jnicklas/capybara&lt;/li&gt;&lt;/ul&gt;Finally, refer to the cheat sheet below for issues I came across while trying to write test case for web application vulnerabilities:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Detect and Close JavaScript Alert Boxes:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;Watir-WebDriver&lt;/i&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;begin&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;browser.driver.switch_to.alert.accept #raises an exception if no alert is present&lt;/span&gt;&lt;br /&gt;puts 'alert box found'&lt;br /&gt;rescue&lt;br /&gt;puts 'alert box not found'&lt;br /&gt;end&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Capybara:&lt;br /&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;page.driver.browser.switch_to.alert.accept&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Perform Arbitrary HTTP POST Requests:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;Watir-WebDriver&lt;/i&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1387190.js?file=Arbitrary%20HTTP%20POST%20with%20Watir-WebDriver.rb"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Send Keyboard Commands:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;Watir-WebDriver&lt;/i&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;browser.text_field(:name,/login/i).send_keys(:arrow_down)&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Capybara:&lt;/i&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;page.find_field('login').native.send_keys(:arrow_down)&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Search For Text/HTML Within a Nested Frame:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;Watir-WebDriver&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1387209.js?file=gistfile1.rb"&gt;&lt;/script&gt;&lt;br /&gt;&lt;b&gt;Returning Content From Javascript:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;Watir-WebDriver&lt;/i&gt;&lt;br /&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;browser.execute_script(‘return “asdf”’) #=&amp;gt; returns “asdf” to ruby&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Include JQuery:&lt;/b&gt;&lt;i&gt;Watir-WebDriver&lt;/i&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;browser.execute_script(%q|&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;var el = document.createElement("script");&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;el.setAttribute("src","http://code.jquery.com/jquery-1.6.4.min.js");&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #6aa84f;"&gt;document.body.appendChild(el);|)&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Return HTTP Headers:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;Watir-WebDriver&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1387229.js?file=gistfile1.rb"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-6001046506358828528?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/6001046506358828528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=6001046506358828528' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/6001046506358828528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/6001046506358828528'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2011/11/web-application-vulnerability-unit.html' title='Web Application Vulnerability Unit Testing Cheat Sheet (Capybara and Watir-WebDriver)'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-7490539105397888769</id><published>2011-11-22T15:17:00.001-06:00</published><updated>2011-11-22T15:52:38.503-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='Exploits'/><title type='text'>Using Watir-WebDriver or Capybara For Web Application Vulnerability Unit Testing</title><content type='html'>Back in October, I gave a &lt;a href="http://nickcoblentz.blogspot.com/2011/10/security-b-sides-kansas-city.html"&gt;Security B-Sides presentation&lt;/a&gt; filled with demos showing how to construct and execute unit tests for web application security vulnerabilities. &amp;nbsp;The goal was to:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Allow QA teams or developers to execute unit tests to demonstrate that a web application vulnerability remains fixed 1 day, 1 week, 1 month, or even 1 year from the date it was remediated (For example, security unit tests run as part of a continuous integration process).&lt;/li&gt;&lt;li&gt;Provide a mechanism for security teams to demonstrate a vulnerability instance to web application stakeholders. &amp;nbsp;One that can be run by the stakeholders themselves, as many times as needed, with little or no knowledge of security testing techniques.&lt;/li&gt;&lt;li&gt;Allow security testers to write testing tools or scripts that interact directly with the browser, eliminating many false positives&amp;nbsp;occurring&amp;nbsp;due to the inability to execute JavaScript or other similar browser dependent components.&lt;/li&gt;&lt;/ol&gt;The presentation slides and unit test scripts are available below. &amp;nbsp;Before trying out the unit tests, make sure you have the &lt;a href="http://code.google.com/p/owaspbwa/wiki/ProjectSummary"&gt;OWASP Broken Web Application Virtual Machine&lt;/a&gt; downloaded and running. &amp;nbsp;Next, install Ruby, Watir-WebDriver, RSpec, escape_utils, and Capybara.&lt;br /&gt;&lt;br /&gt;To install everything on Windows, here's what I did:&lt;br /&gt;1. Install Ruby (1.9.x)  (http://rubyinstaller.org/downloads/) &lt;br /&gt;2. Install Watir (http://watir.com/installation/#win)&lt;br /&gt;&lt;code&gt;Get an admin command prompt &lt;br /&gt;gem update --system &lt;br /&gt;gem install watir &lt;br /&gt;gem install watir-webdriver&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;3. Install RSpec and escape_utils&lt;code&gt;gem install rspec &lt;br /&gt;gem install escape_utils&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;4. Install Capybara&lt;br /&gt;&lt;code&gt;gem install capybara&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;To run the test cases, use the following commands:&lt;br /&gt;&lt;code&gt;rspec -f d "OWASP Broken WebApps RSpec.rb"&lt;/code&gt;&lt;br /&gt;&lt;code&gt;rspec -f d "OWASP Broken WebApps Capybara.rb"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Presentation Materials:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/1132296/Using%20Watir%20%26%20Ruby%20for%20Web%20Application%20Vulnerability%20Unit%20Testing%202011-10-26.pdf"&gt;Using Watir &amp;amp; Ruby for Web Application Vulnerability Unit Testing&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://gist.github.com/1386988"&gt;OWASP Broken WebApps Capybara.rb&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://gist.github.com/1386992"&gt;OWASP Broken WebApps RSpec.rb&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-7490539105397888769?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/7490539105397888769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=7490539105397888769' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/7490539105397888769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/7490539105397888769'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2011/11/using-watir-webdriver-or-capybara-for.html' title='Using Watir-WebDriver or Capybara For Web Application Vulnerability Unit Testing'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-3329894196071793215</id><published>2011-10-13T15:57:00.000-05:00</published><updated>2012-01-16T10:55:50.700-06:00</updated><title type='text'>Security Testing Roles - Expanding on Integrating Security Testing into the QA Process</title><content type='html'>If you haven't read my previous post:&amp;nbsp;&lt;a href="http://nickcoblentz.blogspot.com/2011/10/integrating-security-into-qa-process.html"&gt;Integrating Security into the QA Process&lt;/a&gt;&amp;nbsp;and/or listened to the podcast from Rafal Los:&amp;nbsp;&lt;a href="http://podcast.wh1t3rabbit.net/down-the-rabbithole-episode-3-qa-and-security-can-we-make-it-work-"&gt;http://podcast.wh1t3rabbit.net/down-the-rabbithole-episode-3-qa-and-security-can-we-make-it-work-&lt;/a&gt;, do that first. &amp;nbsp;The content below breaks down my thoughts on the type of security testing that can be integrated into each role (developer, QA, Security). This&amp;nbsp;covers security testing, and does not include any other activities like threat modeling, architecture review, design review, following secure coding standards during development, etc.&lt;br /&gt;&lt;br /&gt;Development Team:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Use an automated static code analysis tool&amp;nbsp;&amp;nbsp;(for example: Ounce, Fortify, or Veracode)&lt;/li&gt;&lt;li&gt;Perform peer code reviews&lt;/li&gt;&lt;li&gt;Construct and run&amp;nbsp;unit/functional/automated&amp;nbsp;tests&amp;nbsp;for previously identified security issues using libraries like Watir/WatiN/Watij/Capybara/etc&lt;/li&gt;&lt;/ul&gt;QA Team:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Test security controls that can be broken down into positive, concrete tests with a clear start and end (may require step by step directions and training) -- possible focus mainly on controls that ALL application should have in place&lt;/li&gt;&lt;li&gt;Construct (or have developers construct) and run unit/functional/automated&amp;nbsp;tests for previously identified security issues using libraries like Watir/WatiN/Watij/Capybara/etc (listed for both QA and Dev.)&lt;/li&gt;&lt;li&gt;Perform testing for business logic or domain specific vulnerabilities (a list of these business logic rules should be specified in the application's requirements)&lt;/li&gt;&lt;/ul&gt;Security Team (possibly a team within QA!?!):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Manually Perform negative testing and using penetration testing experience to identify issues&lt;/li&gt;&lt;li&gt;Perform automated static code analysis (for example: Ounce, Fortify, or Veracode)&lt;/li&gt;&lt;li&gt;Perform manual code review&lt;/li&gt;&lt;li&gt;Perform automated security scanning (for example: AppScan, Web Inspect, or Burp Suite)&lt;/li&gt;&lt;/ul&gt;I also want to&amp;nbsp;emphasize&amp;nbsp;that identifying a vulnerability through testing should ALWAYS result in the organization creating a new or&amp;nbsp;correlating to an existing application security requirement (like a functional or business requirement) and an associated secure coding standard (specific code/configuration example and discussion showing how to accomplish the application security requirement in a particular development language, framework, and/or library). &amp;nbsp;The goal is to proactively avoid vulnerabilities in the future, decreasing costs and improving security for all projects within the organization rather than for one specific application. &amp;nbsp;Feeding solutions back into the requirements specification phase of software development will help accomplish this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-3329894196071793215?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/3329894196071793215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=3329894196071793215' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3329894196071793215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3329894196071793215'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2011/10/security-testing-roles-expanding-on.html' title='Security Testing Roles - Expanding on Integrating Security Testing into the QA Process'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-2862961584527257299</id><published>2011-10-11T12:46:00.001-05:00</published><updated>2011-10-11T12:46:32.999-05:00</updated><title type='text'>Integrating Security into the QA Process</title><content type='html'>I just listened to the latest podcast from Rafal Los's site "Down the Rabbit Hole":&lt;br /&gt;&lt;a href="http://podcast.wh1t3rabbit.net/down-the-rabbithole-episode-3-qa-and-security-can-we-make-it-work-"&gt;http://podcast.wh1t3rabbit.net/down-the-rabbithole-episode-3-qa-and-security-can-we-make-it-work-&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On the show, they discuss integrating security testing into the QA process, which isn't terribly new, but what I got really excited about was the discussion about &lt;b&gt;*how*&lt;/b&gt; to integrate it. &amp;nbsp;Security testing is difficult for QA teams. Security testing requires specific skill sets and knowledge. &amp;nbsp;QA teams don't know how to run automated security testing tools, have trouble interpreting the assessment results, and usually focus on testing defined requirements rather than having an open-ended mandate to look for security defects.&lt;br /&gt;&lt;br /&gt;On the podcast, they recommend breaking security testing up and distributing it across the organization as much as possible. &amp;nbsp;Security testing should be a normal part of developing and testing software. &amp;nbsp;In regards to QA testing,&amp;nbsp;define specific security tests, in a similar manner to the way functional or business requirements are tested, and provide those to the QA team. &amp;nbsp;Step by step directions, training on a particular tool (like the web developer toolbar plugin for Firefox, not&amp;nbsp;necessarily&amp;nbsp;a static code analysis tool), or custom scripts may be required and included in these test definitions (use templates if possible). &amp;nbsp;Link all of these security defect QA tests to functional or business requirements (this may require the organization to define new ones). &amp;nbsp;Then, add these requirements back into the software development process, so they are included during the planning, design, or coding phases. &amp;nbsp;Finally, provide secure coding standards that show step by step directions or specific code examples for accomplishing the functional or business requirements in the team's language, framework, library, or other software component.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-2862961584527257299?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/2862961584527257299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=2862961584527257299' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/2862961584527257299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/2862961584527257299'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2011/10/integrating-security-into-qa-process.html' title='Integrating Security into the QA Process'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-4930491071168579846</id><published>2011-10-04T10:59:00.000-05:00</published><updated>2011-10-04T11:03:44.438-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentations'/><title type='text'>Security B-Sides Kansas City Presentation</title><content type='html'>&lt;a href="http://www.securitybsides.com/w/page/26298468/BSidesKC"&gt;Security B-Sides Kansas City&lt;/a&gt; is happening Wednesday, October 26, 2011. &amp;nbsp;I will be presenting there at 10AM. &amp;nbsp;The topic is using &lt;a href="http://http//watirwebdriver.com/"&gt;Watir-WebDriver&lt;/a&gt; (a browser automation framework/driver) and Ruby to perform web application security unit testing. &amp;nbsp;While doing the research, I also got a chance to use another framework, &lt;a href="https://github.com/jnicklas/capybara"&gt;Capybara&lt;/a&gt;, so I included examples from it as well. &amp;nbsp;The presentation will mostly consist of demos. &amp;nbsp;I will discuss what Watir-WebDriver is, alternate frameworks and languages to use, and how to apply them to web application security unit testing. &amp;nbsp;Then, I will walk through specific examples/demos showing how to use the frameworks to exploit/unit test vulnerabilities in the &lt;a href="http://code.google.com/p/owaspbwa/wiki/ProjectSummary"&gt;OWASP Broken Web Applications Project&lt;/a&gt;/VMware image. &amp;nbsp;The unit testing framework I chose is &lt;a href="https://www.relishapp.com/rspec"&gt;RSpec&lt;/a&gt;. I have demos ready for the following issues:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SQL Injection&lt;/li&gt;&lt;ul&gt;&lt;li&gt;error message based&lt;/li&gt;&lt;li&gt;matching contents of a union select over the application usernames/passwords&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Cross-site Scripting&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Reflected -&amp;nbsp;URL Based&lt;/li&gt;&lt;li&gt;Reflected - Using a custom POST request&lt;/li&gt;&lt;li&gt;Stored&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Autocomplete&lt;/li&gt;&lt;li&gt;Session Fixation&lt;/li&gt;&lt;li&gt;Open Redirect&lt;/li&gt;&lt;li&gt;Enumerating authorization/access controls&lt;/li&gt;&lt;li&gt;Information Disclosure through HTTP headers&lt;/li&gt;&lt;/ul&gt;After the presentation, I can provide anyone that asks with completed unit tests for all of the vulnerabilities listed above for both Ruby/Watir-WebDriver and Ruby/Capybara, using RSpec as the unit testing framework. &amp;nbsp;To run these demos at home, simply download and run the &lt;a href="http://code.google.com/p/owaspbwa/wiki/Downloads"&gt;OWASP Broken Web Application VMware image&lt;/a&gt; using &lt;a href="http://www.vmware.com/products/player/"&gt;VMware Player&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-4930491071168579846?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/4930491071168579846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=4930491071168579846' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/4930491071168579846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/4930491071168579846'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2011/10/security-b-sides-kansas-city.html' title='Security B-Sides Kansas City Presentation'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-6050106191731275151</id><published>2011-10-03T14:55:00.000-05:00</published><updated>2011-10-03T15:49:03.201-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Exploits'/><title type='text'>Potential BlackBerry Playbook Application Permissions Vulnerability - Need Help Confirming</title><content type='html'>I'm posting some details about a potential BlackBerry Playbook application permissions vulnerability with the idea that others out there may help confirm and test the issue's existence. &amp;nbsp;I can only take the exploit so far, and I need help from those with a BlackBerry AppWorld Vendor Account and a Playbook device (I have neither of these at the moment).&lt;br /&gt;&lt;br /&gt;A completed exploit/application is available here:&amp;nbsp;&lt;a href="http://dl.dropbox.com/u/1132296/PermissionsTestModified.bar"&gt;http://dl.dropbox.com/u/1132296/PermissionsTestModified.bar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Vulnerability Discussion&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;What I *think* I have found is a vulnerability that will allow an attacker to develop a BB Playbook application (think malware) with specific device permissions without those permissions being reported by App World. &amp;nbsp;What I have discovered is when you compile a WebWorks SDK application, the SDK uses a config file containing permissions as an input, and compiles those permissions into a flash file. The flash file manages, fullfills, and grants access to device APIs like accessing the camera, accelerometers, or sensitive user/device information. &amp;nbsp; I suspect that AppWorld determines the permissions for the application via that config file OR possibly a method call like getPermissions() in the flash file, but I have no way to confirm this. &amp;nbsp;I can alter the config file so it shows zero permissions, but then deploy an application with full permissions on the BB Playbook simulator successfully. &amp;nbsp;Now I need to confirm that AppWorld reports that no permissions are granted to the application despite the fact that these privileged APIs are being called successfully. &amp;nbsp;If it is successful, It will tell me that AppWorld relies on the config file to notify users of application permissions (which means I can get arbitrary permissions without the user ever knowing).&lt;br /&gt;&lt;br /&gt;If that first attempt is unsuccessful, then I have already successfully disassembled, altered, and reassembled parts of the flash file and reincluded it within the application, so its just a matter of discovering how to obfuscate those permissions from AppWorld. &amp;nbsp;Most, if not all, the permissions enforcement occurs in the compiled flash file rather than by the underlying operating system itself.&lt;br /&gt;&lt;br /&gt;The specific help I need is in publishing the application to AppWorld, observing the permissions reported for the application via AppWorld, and observing the permissions reported for the application via the Permissions Module on the Playbook control panel, and then running the application on a Playbook itself (rather than the simulator, which works just fine, but doesn't report permissions at all). &amp;nbsp;I don't own a BB Playbook and I don't currently have a Vendor account, so it is difficult to confirm whether this issue really exists.&lt;br /&gt;&lt;br /&gt;If you have a BB AppWorld Vendor Account and a BB Playbook that you can confirm my results on, please read the details below and publish your results.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Instructions&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;First, install all the prerequisites needed to compile and deploy a BB WebWorks SDK application. &amp;nbsp;For a walk through, take a look at this guidance:&amp;nbsp;&lt;a href="http://us.blackberry.com/developers/tablet/webworks.jsp"&gt;http://us.blackberry.com/developers/tablet/webworks.jsp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next, we will create a very simple WebWorks App that uses a few privileged API calls (specifically the Blackberry.app API:&amp;nbsp;&lt;a href="http://www.blackberry.com/developers/docs/webworks/api/blackberry.app.html"&gt;http://www.blackberry.com/developers/docs/webworks/api/blackberry.app.html&lt;/a&gt;). &amp;nbsp;We will use the example provided in the API documentation to create an index.html page:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1259941.js"&gt;&lt;/script&gt;&lt;br /&gt;Then, add the JQuery libraries referenced by the index.html page to the /js folder.&lt;br /&gt;&lt;br /&gt;Now, we will create two configuration files, one containing the proper permissions and one without any permissions. &amp;nbsp;config.xml should read:&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1259955.js"&gt; &lt;/script&gt;&lt;br /&gt;config2.xml:&lt;br /&gt;&lt;script src="https://gist.github.com/1259959.js"&gt; &lt;/script&gt;&lt;br /&gt;Compile the application into a .bar file as you would any other WebWorks application.  First create a zip archive at the root level of the application, then run the following command:&lt;br /&gt;&lt;br /&gt;"c:\Program Files (x86)\Research In Motion\BlackBerry WebWorks SDK for TabletOS 2.1.0.6\bbwp\bbwp.exe" PermissionsTest.zip -d&lt;br /&gt;&lt;br /&gt;In the /bin directory, a PermissionsTest.bar file will be created.  Unzip this file (its just a zip file containing the compiled flash file and html, JavaScript, and XML files.  Open the /bin/PermissionsTest/META-INF/MANIFEST.MF file. There will be two lines we will modify.  They are (the SHA-512-Digest value will differ):&lt;br /&gt;&lt;br /&gt;Archive-Asset-Name: air/config.xmlArchive-Asset-SHA-512-Digest: 9x6Jp-WRWEV14A0DGdO7rIIXxEB7V-Ya6Ke1pRnM9oeckJB6GzS9EqzoDosXyaUEEaLDebxE6o36UalIqtv2gQ&lt;br /&gt;&lt;br /&gt;Archive-Asset-Name: air/config2.xmlArchive-Asset-SHA-512-Digest: Y5hA0NxFXOCHpfy5utM-9oMWG5elciLxKNWl0AcU4azyXWDBOrq6v4tw9cU0coG3jXzWqg4Od3OtZsEcqxNLwA&lt;br /&gt;&lt;br /&gt;Delete the lines for config.xml, then rename config2.xml to config.xml&lt;br /&gt;&lt;br /&gt;Next, go to the /bin/PermissionsTest/air/ directory and delete "config.xml", and rename "config2.xml" to "config.xml"&lt;br /&gt;&lt;br /&gt;Go back to the /bin/PermissionsTest directory and make a new zip archive. &amp;nbsp;Change the file extension from ".zip" to ".bar".&lt;br /&gt;&lt;br /&gt;Deploy the application to the simulator (or AppWorld):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"c:\Program Files (x86)\Research In Motion\BlackBerry WebWorks SDK for TabletOS 2.1.0.6\bbwp\blackberry-tablet-sdk\bin\blackberry-deploy.bat" -installApp -device &amp;lt;device ip here&amp;gt; -package bin\PermissionsTestModified.bar -password &amp;lt;simulator device password&amp;gt;&lt;br /&gt;&lt;br /&gt;When you open the application, and click "Populate - APP" it should retrieve the author and title of the application (which require privileged API access).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So Why does this work?&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Permissions seem to be enforced by the Adobe AIR application executable rather than the protected operating system itself. &amp;nbsp;if you decompile the swf file generated by the compilation process, you will see the following interesting code fragments:&lt;br /&gt;&lt;br /&gt;public static const values:Object={"configXML":"config.xml", "version":"1.0.0", "content":"index.html", "author":"Nick Coblentz", "description":"This application tests whether privileged APIs can be called without AppWorld reporting those permissions to the user.", "name":"Permissions Test", "foregroundSource":"index.html", "hasMultiAccess":true, "onFirstLaunch":false, "onRemotePageLoad":false, "onLocalPageLoad":false, "debugEnabled":true, "accessList":new Array(new webworks.access.Access(webworks.config.ConfigConstants.WIDGET_LOCAL_DOMAIN, true, new Array(&lt;b&gt;new webworks.access.Feature("blackberry.app", true, "", null)&lt;/b&gt;))), "widgetExtensions...lots more...&lt;br /&gt;&lt;br /&gt;and the isFeatureAllowed() method in webworks.config.ConfigData which is used by webworks.FunctionBroker to determine whether to service JavaScript JSON requests for privileged API access.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Request For Help&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;If anyone chooses to lend a hand, I would welcome help further understanding the inner workings of the generated flash file, validation that the vulnerability exists, and validation of the permissions reported by AppWorld and the Playbook device itself. &amp;nbsp;Feel free to add comments on the blog or email me directly.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-6050106191731275151?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/6050106191731275151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=6050106191731275151' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/6050106191731275151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/6050106191731275151'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2011/10/potential-blackberry-playbook.html' title='Potential BlackBerry Playbook Application Permissions Vulnerability - Need Help Confirming'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-9022951967123817567</id><published>2010-09-10T10:54:00.001-05:00</published><updated>2011-09-27T11:33:04.339-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft SDL'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>OWASP AppSec Ireland and DC</title><content type='html'>OWASP AppSec Ireland is a week away! If you happen to be in Dublin, Ireland next Friday, come by and say "Hi!" I will be presenting "Microsoft's Security Development Lifecycle for Agile Development".&amp;nbsp; More information is available here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.owasp.org/index.php/OWASP_IRELAND_2010#Agenda_and_Presentations_-_September_17"&gt;http://www.owasp.org/index.php/OWASP_IRELAND_2010#Agenda_and_Presentations_-_September_17&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I was also accepted to speak at OWASP AppSec DC on November 10th or 11th. This will be the first time I will give the SDL-Agile presentation at a conference in the United States!&amp;nbsp; The conference home page is: &lt;a href="http://www.owasp.org/index.php/OWASP_AppSec_DC_2010"&gt;http://www.owasp.org/index.php/OWASP_AppSec_DC_2010&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-9022951967123817567?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/9022951967123817567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=9022951967123817567' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/9022951967123817567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/9022951967123817567'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2010/09/owasp-appsec-ireland-and-dc.html' title='OWASP AppSec Ireland and DC'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-5380291159051977462</id><published>2010-08-30T08:27:00.002-05:00</published><updated>2011-09-27T11:20:52.274-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Secure Coding'/><title type='text'>Rails 3 HTML Encodes by Default</title><content type='html'>Rails 3 came out recently, and the developers made a significant change that really improves the security posture of Rails 3.&amp;nbsp; They really embraced the "secure by default" security principle in their efforts to eliminate cross-site scripting.&amp;nbsp; Previously, unsafe user data had to be explicitly HTML encoded in order to avoid cross-site scripting.&amp;nbsp; This was done using the "h" tag.&amp;nbsp; For example:&lt;br /&gt;&amp;lt;%= h(@unsafe_user_input) %&amp;gt;&lt;br /&gt;&lt;br /&gt;In Rails 3, the default is to automatically HTML encode.&amp;nbsp; The "h" tag is no longer necessary.&amp;nbsp; Instead, developers must go out of their way to output HTML content to the page using the "raw" tag.&amp;nbsp; For example:&lt;br /&gt;&amp;lt;%= raw(@unsafe_user_input) %&amp;gt;&lt;br /&gt;&lt;br /&gt;I think the Rails developers took a really strong stance on this issue and it will result in a safer Ruby on Rails ecosystem.&lt;br /&gt;&lt;br /&gt;Please see the video below for more details:&lt;br /&gt;&lt;a href="http://rubyonrails.org/screencasts/rails3/xss-ujs"&gt;http://rubyonrails.org/screencasts/rails3/xss-ujs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There is also a really great Rails security guide found here:&lt;br /&gt;&lt;a href="http://guides.rubyonrails.org/security.html"&gt;http://guides.rubyonrails.org/security.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-5380291159051977462?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/5380291159051977462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=5380291159051977462' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/5380291159051977462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/5380291159051977462'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2010/08/rails-3-html-encodes-by-default.html' title='Rails 3 HTML Encodes by Default'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-3645841515604705299</id><published>2010-07-23T09:53:00.001-05:00</published><updated>2011-09-27T11:33:04.327-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentations'/><title type='text'>OWASP AppSec Research 2010 Stockholm Conference Videos Posted!</title><content type='html'>The presentation videos from the OWASP AppSec Research 2010 Conference in Stockholm, Sweden are now available! &lt;br /&gt;&lt;br /&gt;My Presentation slides can be found here:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.owasp.org/images/4/44/OWASP_AppSec_Research_2010_Microsoft_SDL_Agile_by_Coblentz.pdf"&gt;http://www.owasp.org/images/4/44/OWASP_AppSec_Research_2010_Microsoft_SDL_Agile_by_Coblentz.pdf&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;A video of the presentation is also available:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://owasp.blip.tv/file/3918259/"&gt;http://owasp.blip.tv/file/3918259/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;The rest of the videos and presentation slides can be found here:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.owasp.org/index.php/OWASP_AppSec_Research_2010_-_Stockholm,_Sweden#tab=June_23"&gt;http://www.owasp.org/index.php/OWASP_AppSec_Research_2010_-_Stockholm,_Sweden#tab=June_23&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.owasp.org/index.php/OWASP_AppSec_Research_2010_-_Stockholm,_Sweden#tab=June_24%20"&gt;http://www.owasp.org/index.php/OWASP_AppSec_Research_2010_-_Stockholm,_Sweden#tab=June_24 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Martin Holst Swende and Alan Davidson, members of the organizing committee, took pictures at the OWASP AppSec Research 2010 Conference.&amp;nbsp; Those pictures can be found here:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.flickr.com/photos/holiman/sets/72157624428046528/"&gt;http://www.flickr.com/photos/holiman/sets/72157624428046528/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.flickr.com/photos/51810233@N04/sets/72157624316862061/"&gt;http://www.flickr.com/photos/51810233@N04/sets/72157624316862061/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.flickr.com/photos/51810233@N04/sets/72157624438812472/"&gt;http://www.flickr.com/photos/51810233@N04/sets/72157624438812472/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.flickr.com/photos/51810233@N04/sets/72157624441596030/"&gt;http://www.flickr.com/photos/51810233@N04/sets/72157624441596030/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;I will be giving this presentation again at the OWASP AppSec Ireleand 2010 Conference on September 17, 2010 (&lt;a href="http://www.owasp.org/index.php/OWASP_IRELAND_2010"&gt;http://www.owasp.org/index.php/OWASP_IRELAND_2010&lt;/a&gt;) .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-3645841515604705299?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/3645841515604705299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=3645841515604705299' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3645841515604705299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3645841515604705299'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2010/07/owasp-appsec-research-2010-stockholm.html' title='OWASP AppSec Research 2010 Stockholm Conference Videos Posted!'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-1376042282590797752</id><published>2010-06-24T15:23:00.001-05:00</published><updated>2011-09-27T11:33:04.322-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentations'/><title type='text'>OWASP AppSec Research 2010 Pictures</title><content type='html'>The OWASP AppSec Research 2010 Conference in Stockholm, Sweden ended today.  I took a quite a few pictures and I thought I would post a couple of them.  Please enjoy!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Aula Magna (Conference Venue)&lt;/h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_opzlukmJgHU/TCO4AaY2NlI/AAAAAAAAARA/SV_77pWmQbc/s1600/006.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_opzlukmJgHU/TCO4AaY2NlI/AAAAAAAAARA/SV_77pWmQbc/s400/006.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;Track 1&lt;/h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_opzlukmJgHU/TCO31yn9YdI/AAAAAAAAAQ4/C5JwiZmueUg/s1600/003.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_opzlukmJgHU/TCO31yn9YdI/AAAAAAAAAQ4/C5JwiZmueUg/s320/003.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;Day 1 Keynote with Chris Evans, Google&lt;/h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_opzlukmJgHU/TCO3pxSAMHI/AAAAAAAAAQw/t1No9m45h-s/s1600/002.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_opzlukmJgHU/TCO3pxSAMHI/AAAAAAAAAQw/t1No9m45h-s/s320/002.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;Day 2 Keynote with Steve Lipner, Microsoft&lt;/h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_opzlukmJgHU/TCO4T6x0w8I/AAAAAAAAARY/da7-gVicsa0/s1600/002.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_opzlukmJgHU/TCO4T6x0w8I/AAAAAAAAARY/da7-gVicsa0/s320/002.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;Gala Dinner at Stockholm City Hall&lt;/h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_opzlukmJgHU/TCO4G1aA_SI/AAAAAAAAARI/_vIv_Rr8Gck/s1600/036.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_opzlukmJgHU/TCO4G1aA_SI/AAAAAAAAARI/_vIv_Rr8Gck/s320/036.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_opzlukmJgHU/TCO4OJkxo2I/AAAAAAAAARQ/FB0O6etZ9lM/s1600/042.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_opzlukmJgHU/TCO4OJkxo2I/AAAAAAAAARQ/FB0O6etZ9lM/s320/042.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;Conference Closing Remarks and Thanks&lt;/h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_opzlukmJgHU/TCO4brG2COI/AAAAAAAAARg/MNkadvw3ljA/s1600/007.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_opzlukmJgHU/TCO4brG2COI/AAAAAAAAARg/MNkadvw3ljA/s320/007.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_opzlukmJgHU/TCO4hf22szI/AAAAAAAAARo/Z-J1xo2qWdU/s1600/008.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_opzlukmJgHU/TCO4hf22szI/AAAAAAAAARo/Z-J1xo2qWdU/s320/008.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-1376042282590797752?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/1376042282590797752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=1376042282590797752' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/1376042282590797752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/1376042282590797752'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2010/06/owasp-appsec-research-2010-pictures.html' title='OWASP AppSec Research 2010 Pictures'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_opzlukmJgHU/TCO4AaY2NlI/AAAAAAAAARA/SV_77pWmQbc/s72-c/006.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-9213449036788526072</id><published>2010-05-12T16:52:00.002-05:00</published><updated>2011-09-27T11:33:04.348-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft SDL'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>I'm Presenting at OWASP AppSec Research 2010 Conference</title><content type='html'>The OWASP AppSec Research 2010 conference is being held on June 23rd and 24th 2010 in Stockholm, Sweden.&amp;nbsp; I will be speaking on the 24th at 11:10 AM on "Microsoft's Security Development Lifecycle for Agile Development".&amp;nbsp; Here is a link to the schedule for June 24th: &lt;br /&gt;&lt;a href="http://www.owasp.org/index.php/OWASP_AppSec_Research_2010_-_Stockholm,_Sweden#tab=June_24"&gt;http://www.owasp.org/index.php/OWASP_AppSec_Research_2010_-_Stockholm,_Sweden#tab=June_24&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I hope to see lots of people there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-9213449036788526072?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/9213449036788526072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=9213449036788526072' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/9213449036788526072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/9213449036788526072'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2010/05/im-presenting-at-owasp-appsec-research.html' title='I&apos;m Presenting at OWASP AppSec Research 2010 Conference'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-8039830372755452336</id><published>2010-03-24T09:40:00.001-05:00</published><updated>2011-09-27T11:33:04.335-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft SDL'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>.NET User Group Presentation - Microsoft SDL-Agile</title><content type='html'>I had a great time giving my Microsoft SDL-Agile v2 presentation last night at the Kansas City .NET User Group Meeting.&amp;nbsp; Several people asked for the slides, so I made them available as a PDF document here: &lt;a href="http://dl.dropbox.com/u/1132296/Microsoft%20SDL-Agile%20Presentation%20-%20Nick%20Coblentz%20V2%202010-03-23.pdf"&gt;Microsoft SDL-Agile Presentation - Nick Coblentz V2 2010-03-23.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Many also wanted links to the tools I mentioned during the presentation.&amp;nbsp; Here is a list of those tools:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://go.microsoft.com/?linkid=9694872"&gt;SDL Process Guidance  4.1a&lt;/a&gt; (includes SDL-Agile towards the bottom of the document&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/securitytools/archive/2009/11/11/some-new-software-security-tools-for-web-developers-ctp-releases.aspx"&gt;CAT.NET v2, Web Protection Library (Includes Anti-XSS Library and Security Runtime Engine), and the Web Application Configuration Analyzer&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/wcsa/"&gt;web.config security analyzer&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=9AEAA970-F281-4FB0-ABA1-D59D7ED09772&amp;amp;displaylang=en"&gt;Microsoft FxCop 1.36&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=0178e2ef-9da8-445e-9348-c93f24cc9f9d&amp;amp;displaylang=en"&gt;Microsoft Code Analysis Tool .NET (CAT.NET) v1 CTP - 32 bit (Old version of CAT.NET)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=e0052bba-2d50-4214-b65b-37e5ef44f146&amp;amp;displaylang=en"&gt;Microsoft Code Analysis Tool .NET (CAT.NET) v1 CTP - 64 bit (Old version of CAT.NET)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=90e6181c-5905-4799-826a-772eafd4440a"&gt;BinScope Binary Analyzer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=b2307ca4-638f-4641-9946-dc0a5abe8513"&gt;MiniFuzz File Fuzzer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c4b44860-cfba-494a-ba43-13c4aecf86af&amp;amp;displaylang=en"&gt;MSF-Agile plus Security Development Lifecycle Process Template for VSTS 2008&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/security/sdl/getstarted/processtemplate.aspx"&gt;Microsoft SDL Process Template For Visual Studio Team System&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/security/sdl/getstarted/threatmodeling.aspx"&gt;Microsoft SDL Threat Modeling Tool&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Finally, here are links to the code used to demonstrate the Web Protection Library:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/1132296/WPL%20Demo%20Code/Default.aspx"&gt;Default.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/1132296/WPL%20Demo%20Code/Default.aspx.cs"&gt;Default.aspx.cs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/1132296/WPL%20Demo%20Code/Default.aspx.designer.cs"&gt;Default.aspx.designer.cs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dl.dropbox.com/u/1132296/WPL%20Demo%20Code/Web.config"&gt;Web.config&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Please feel free to email me with any questions or comments about the presentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-8039830372755452336?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/8039830372755452336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=8039830372755452336' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/8039830372755452336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/8039830372755452336'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2010/03/net-user-group-presentation-microsoft.html' title='.NET User Group Presentation - Microsoft SDL-Agile'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-5732452283704487962</id><published>2010-02-24T09:00:00.025-06:00</published><updated>2011-09-27T11:19:45.298-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Coding'/><title type='text'>Reducing Information Disclosure in WCF Data Services</title><content type='html'>Previously, I wrote an article titled "&lt;a href="http://nickcoblentz.blogspot.com/2010/02/reducing-information-disclosure-in.html"&gt;Reducing Information Disclosure in ASP.NET Web Services&lt;/a&gt;". &amp;nbsp;The article identified steps developers can take to eliminate detailed error messages, stack traces, web service description pages, and WSDLs from their production applications.&amp;nbsp;This article will offer similar recommendations for WCF Data Services. &amp;nbsp;Since this article builds of the previous one, I will not repeat the background information.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Reference WCF Service&lt;/span&gt;&lt;br /&gt;We will use the following WCF service as a starting point.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_opzlukmJgHU/S3Q4RdpsAmI/AAAAAAAAAN4/9CXzeE_nxdw/s1600-h/ICode01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="362" src="http://4.bp.blogspot.com/_opzlukmJgHU/S3Q4RdpsAmI/AAAAAAAAAN4/9CXzeE_nxdw/s400/ICode01.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_opzlukmJgHU/S3Q4UdXze-I/AAAAAAAAAOA/3EeKRhOzUS8/s1600-h/code01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="311" src="http://3.bp.blogspot.com/_opzlukmJgHU/S3Q4UdXze-I/AAAAAAAAAOA/3EeKRhOzUS8/s400/code01.png" style="border-bottom-color: black; border-left-color: black; border-right-color: black; border-top-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_opzlukmJgHU/S3Q4YK6jy1I/AAAAAAAAAOI/TZDYWBQunWk/s1600-h/webconfig01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="141" src="http://2.bp.blogspot.com/_opzlukmJgHU/S3Q4YK6jy1I/AAAAAAAAAOI/TZDYWBQunWk/s400/webconfig01.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Here is a successful SOAP request.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_opzlukmJgHU/S3Q5vg7C_rI/AAAAAAAAAOQ/UXN2iylR8xg/s1600-h/success01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="93" src="http://3.bp.blogspot.com/_opzlukmJgHU/S3Q5vg7C_rI/AAAAAAAAAOQ/UXN2iylR8xg/s400/success01.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The WCF Help Page and WSDL are accessible as shown below.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_opzlukmJgHU/S3Q7i5-9tfI/AAAAAAAAAOo/SyjZzIq29hc/s1600-h/Description01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="400" src="http://3.bp.blogspot.com/_opzlukmJgHU/S3Q7i5-9tfI/AAAAAAAAAOo/SyjZzIq29hc/s400/Description01.png" style="border-color: black;" width="381" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_opzlukmJgHU/S3Q7mhU41aI/AAAAAAAAAOw/EfPs2MtWezo/s1600-h/WSDL01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="182" src="http://1.bp.blogspot.com/_opzlukmJgHU/S3Q7mhU41aI/AAAAAAAAAOw/EfPs2MtWezo/s400/WSDL01.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The following two errors occur when parameters are omitted in the web service call or when we try to divide by zero.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_opzlukmJgHU/S3Q7GK_k6KI/AAAAAAAAAOY/E0x1N0l7rPk/s1600-h/MissingParameters01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="180" src="http://3.bp.blogspot.com/_opzlukmJgHU/S3Q7GK_k6KI/AAAAAAAAAOY/E0x1N0l7rPk/s400/MissingParameters01.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_opzlukmJgHU/S3Q7JrpDOQI/AAAAAAAAAOg/hAJWmJGW1MQ/s1600-h/dividebyzero01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="145" src="http://4.bp.blogspot.com/_opzlukmJgHU/S3Q7JrpDOQI/AAAAAAAAAOg/hAJWmJGW1MQ/s400/dividebyzero01.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;ASP.NET Custom Errors: No Help At All&lt;/span&gt;&lt;br /&gt;Unlike ASP.NET web services, exception handling in WCF data services is not the least bit affected by enabling custom errors. &amp;nbsp;When custom errors are enabled, full stack traces, local file paths, and other information is returned to the consumer.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Explicit Try/Catch Blocks: 100% Effective, But What If You Miss One&lt;/span&gt;&lt;br /&gt;Try/Catch blocks are just as effective as in ASP.NET Web Services. &amp;nbsp;Here's the code.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_opzlukmJgHU/S3Q9csNBANI/AAAAAAAAAPA/bmdFBmdUAHo/s1600-h/code02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="372" src="http://2.bp.blogspot.com/_opzlukmJgHU/S3Q9csNBANI/AAAAAAAAAPA/bmdFBmdUAHo/s400/code02.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;And the result.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_opzlukmJgHU/S3Q9Yk2vB8I/AAAAAAAAAO4/nVKBhUL0Aa4/s1600-h/dividebyzero02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="88" src="http://4.bp.blogspot.com/_opzlukmJgHU/S3Q9Yk2vB8I/AAAAAAAAAO4/nVKBhUL0Aa4/s400/dividebyzero02.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;As stated in the &lt;a href="http://nickcoblentz.blogspot.com/2010/02/reducing-information-disclosure-in.html"&gt;ASP.NET Web Services article&lt;/a&gt;, there is always a chance that we could miss a try/catch block. &amp;nbsp;We need some sort of backup solution to catch any exceptions that we miss.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;includeExceptionDetailInFaults="false": A Great Backup to Try/Catch Blocks&lt;/span&gt;&lt;br /&gt;In WCF Data Services, this functionality seems more complete and it is just as easy to implement as in the last article. &amp;nbsp;Simply set the "includeExceptionDetailInFaults" attribute to "false" in the "serviceDebug" XML element of the Web.config file.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_opzlukmJgHU/S3Q-afeehQI/AAAAAAAAAPI/a3zo9_qmrII/s1600-h/webconfig04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="135" src="http://2.bp.blogspot.com/_opzlukmJgHU/S3Q-afeehQI/AAAAAAAAAPI/a3zo9_qmrII/s400/webconfig04.png" style="border-bottom-color: black; border-left-color: black; border-right-color: black; border-top-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Stack traces and other detailed error information are now suppressed.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_opzlukmJgHU/S3Q-80q5uKI/AAAAAAAAAPQ/gmfMkOKoVhE/s1600-h/dividebyzero04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="63" src="http://3.bp.blogspot.com/_opzlukmJgHU/S3Q-80q5uKI/AAAAAAAAAPQ/gmfMkOKoVhE/s400/dividebyzero04.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_opzlukmJgHU/S3Q_AkPi32I/AAAAAAAAAPY/RB_vzb96l4M/s1600-h/MissingParameters04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="63" src="http://3.bp.blogspot.com/_opzlukmJgHU/S3Q_AkPi32I/AAAAAAAAAPY/RB_vzb96l4M/s400/MissingParameters04.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Removing the WSDL and WCF Help Pages&lt;/span&gt;&lt;br /&gt;Help pages and the WSDL can easily be removed for WCF services. &amp;nbsp;The "serviceMetadata" and "serviceDebug" XML elements in the Web.config file have attributes to specifically control these items.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_opzlukmJgHU/S3RAAN7cycI/AAAAAAAAAPg/jvR17K3ocdo/s1600-h/webconfig05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="141" src="http://3.bp.blogspot.com/_opzlukmJgHU/S3RAAN7cycI/AAAAAAAAAPg/jvR17K3ocdo/s400/webconfig05.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When the appropriate attributes are set to "false", the help page and the WSDL show up as blank pages.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_opzlukmJgHU/S3RAlVVicAI/AAAAAAAAAPo/l0JUYlarHKk/s1600-h/Description05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="166" src="http://2.bp.blogspot.com/_opzlukmJgHU/S3RAlVVicAI/AAAAAAAAAPo/l0JUYlarHKk/s400/Description05.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_opzlukmJgHU/S3RAmuKwxBI/AAAAAAAAAPw/aH29A3phHzo/s1600-h/WSDL05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="223" src="http://1.bp.blogspot.com/_opzlukmJgHU/S3RAmuKwxBI/AAAAAAAAAPw/aH29A3phHzo/s400/WSDL05.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Once this change has been made, it will be necessary to communicate WSDLs or web service signatures with partners through some other channel.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;WCF Metadata Exchange (MEX)&lt;/span&gt;&lt;br /&gt;There is one additional issue to address with WCF Data Services, and that is to disable the Metadata Exchange (MEX) endpoint. &amp;nbsp;Clients and attackers can query MEX endpoints to learn about web service signatures and configuration. &amp;nbsp;For more information about MEX, see the following articles:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://wcfsecurity.codeplex.com/wikipage?title=What%20is%20a%20metadata%20exchange%20(MEX)%20binding%3F"&gt;What is a metadata exchange (MEX) binding?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa751951.aspx"&gt;Publishing Metadata&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;An example HTTP request and response used to query a MEX endpoint is shown below.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_opzlukmJgHU/S3W3WP0CJDI/AAAAAAAAAQA/rAkbNaE8zT4/s1600-h/MEX06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="367" src="http://2.bp.blogspot.com/_opzlukmJgHU/S3W3WP0CJDI/AAAAAAAAAQA/rAkbNaE8zT4/s400/MEX06.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Additionally, an attacker can utilize the WCF Test Client to capture this data and query the service.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_opzlukmJgHU/S3W3silbjoI/AAAAAAAAAQI/zxJTSk425I8/s1600-h/WCFTestClient06a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="252" src="http://1.bp.blogspot.com/_opzlukmJgHU/S3W3silbjoI/AAAAAAAAAQI/zxJTSk425I8/s400/WCFTestClient06a.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_opzlukmJgHU/S3W3w_K4gMI/AAAAAAAAAQQ/KiWzAN-HNuE/s1600-h/WCFTestClient06b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="306" src="http://3.bp.blogspot.com/_opzlukmJgHU/S3W3w_K4gMI/AAAAAAAAAQQ/KiWzAN-HNuE/s400/WCFTestClient06b.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This behavior can be disabled by removing the MEX end-point. &amp;nbsp;In the Web.Config file below, the end-point is commented out.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_opzlukmJgHU/S3W4cZBjjiI/AAAAAAAAAQY/WF3bNqPOiM0/s1600-h/webconfig07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="138" src="http://4.bp.blogspot.com/_opzlukmJgHU/S3W4cZBjjiI/AAAAAAAAAQY/WF3bNqPOiM0/s400/webconfig07.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;After the configuration change, the MEX endpoint is no longer accessible.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_opzlukmJgHU/S3W5NqByfMI/AAAAAAAAAQg/diLQ-0-1EL4/s1600-h/MEX07.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="250" src="http://4.bp.blogspot.com/_opzlukmJgHU/S3W5NqByfMI/AAAAAAAAAQg/diLQ-0-1EL4/s400/MEX07.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-5732452283704487962?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/5732452283704487962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=5732452283704487962' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/5732452283704487962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/5732452283704487962'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2010/02/reducing-information-disclosure-in-wcf.html' title='Reducing Information Disclosure in WCF Data Services'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_opzlukmJgHU/S3Q4RdpsAmI/AAAAAAAAAN4/9CXzeE_nxdw/s72-c/ICode01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-8371972850386406759</id><published>2010-02-10T09:00:00.004-06:00</published><updated>2011-09-27T11:19:38.653-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Coding'/><title type='text'>Reducing Information Disclosure in ASP.NET Web Services</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;*Note: This article does not directly apply to WCF Data Services&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Many applications use external web services to allow partners, WPF/Silverlight applications, cloud components, or other entities to access information and functionality. &amp;nbsp;Trusted parties can use SOAP, REST, or AJAX requests to communicate with ASP.NET Web Service end-points.&lt;br /&gt;&lt;br /&gt;Since standard protocols are used to connect with these components, malicious users can also issue requests to your web services. &amp;nbsp;In some cases, web services provide detailed information regarding the method calls and parameters available, as well as detailed error messages for failed attacks. &amp;nbsp;It's important to reduce the amount of information provided to attackers by ASP.NET web services.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Reference Web Service&lt;/span&gt;&lt;br /&gt;First, let's start with a basic ASP.NET Web Service. &amp;nbsp;The code is provided below.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_opzlukmJgHU/S28tHTLUz7I/AAAAAAAAALQ/5_kUP0zI0E8/s1600-h/Code01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="338" src="http://3.bp.blogspot.com/_opzlukmJgHU/S28tHTLUz7I/AAAAAAAAALQ/5_kUP0zI0E8/s400/Code01.png" style="border-bottom-color: black; border-left-color: black; border-right-color: black; border-top-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This web service accepts a dividend and a divisor and it returns the quotient. &amp;nbsp;Since this is a simple demonstration, the code does not include any functionality or data that an attacker would likely target, but the concepts that are demonstrated still apply.&lt;br /&gt;&lt;br /&gt;If we run this application and visit the Math.asmx page, a description page is displayed. &amp;nbsp;The description page lists all the web service methods, parameters, and even provides example SOAP requests for calling the methods. &amp;nbsp;Since I am accessing the service locally, it also provides an HTML form to test the functionality. &amp;nbsp;Depending on the settings in the Web.Config file, this form may or may not be available to external users.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_opzlukmJgHU/S28uQXew7nI/AAAAAAAAALY/HyqTfJ_2sVk/s1600-h/DescriptionPage01a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="400" src="http://3.bp.blogspot.com/_opzlukmJgHU/S28uQXew7nI/AAAAAAAAALY/HyqTfJ_2sVk/s400/DescriptionPage01a.png" style="border-bottom-color: black; border-left-color: black; border-right-color: black; border-top-color: black;" width="365" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_opzlukmJgHU/S28uRQhWWII/AAAAAAAAALg/QQiqs8OXlxk/s1600-h/DescriptionPage01b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="400" src="http://1.bp.blogspot.com/_opzlukmJgHU/S28uRQhWWII/AAAAAAAAALg/QQiqs8OXlxk/s400/DescriptionPage01b.png" style="border-bottom-color: black; border-left-color: black; border-right-color: black; border-top-color: black;" width="311" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In addition to the description page, the WSDL document is also accessible.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_opzlukmJgHU/S28vf9bKdhI/AAAAAAAAAMA/9D0SqPId_CU/s1600-h/WSDL01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="400" src="http://3.bp.blogspot.com/_opzlukmJgHU/S28vf9bKdhI/AAAAAAAAAMA/9D0SqPId_CU/s400/WSDL01.png" style="border-color: black;" width="343" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;A client can call this service using a SOAP or REST request, as shown below.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_opzlukmJgHU/S28u629h61I/AAAAAAAAALw/K-ltShR1Crs/s1600-h/SOAPSuccess01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="275" src="http://2.bp.blogspot.com/_opzlukmJgHU/S28u629h61I/AAAAAAAAALw/K-ltShR1Crs/s400/SOAPSuccess01.png" style="border-bottom-color: black; border-left-color: black; border-right-color: black; border-top-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_opzlukmJgHU/S28u4665GgI/AAAAAAAAALo/hEcHWTuDaKc/s1600-h/RESTSuccess01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="400" src="http://2.bp.blogspot.com/_opzlukmJgHU/S28u4665GgI/AAAAAAAAALo/hEcHWTuDaKc/s400/RESTSuccess01.png" style="border-color: black;" width="382" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;By default, the application displays detailed error messages. &amp;nbsp;Two example exceptions are shown below. &amp;nbsp;The first exception is due to a divide by zero condition; the second is due to missing parameter values in the SOAP request.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_opzlukmJgHU/S28wQypU82I/AAAAAAAAAMQ/II2Lo7boVS4/s1600-h/SOAPDivideByZero01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="330" src="http://1.bp.blogspot.com/_opzlukmJgHU/S28wQypU82I/AAAAAAAAAMQ/II2Lo7boVS4/s400/SOAPDivideByZero01.png" style="border-bottom-color: black; border-left-color: black; border-right-color: black; border-top-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_opzlukmJgHU/S28wQypU82I/AAAAAAAAAMQ/II2Lo7boVS4/s1600-h/SOAPDivideByZero01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_opzlukmJgHU/S28wTG3GCmI/AAAAAAAAAMY/pC5yWj0EH3E/s1600-h/SOAPMissingValues01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="360" src="http://4.bp.blogspot.com/_opzlukmJgHU/S28wTG3GCmI/AAAAAAAAAMY/pC5yWj0EH3E/s400/SOAPMissingValues01.png" style="border-bottom-color: black; border-left-color: black; border-right-color: black; border-top-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;ASP.NET Custom Errors: 80% Effective&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ASP.NET applications have a Custom Error Handler that can be used to control the detail level of error messages provided to clients. &amp;nbsp;It is very easy to configure the Custom Error Handler in the Web.Config file. &amp;nbsp;See the "customErrors" XML element in the screenshot below.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_opzlukmJgHU/S28yAaKub9I/AAAAAAAAAMo/lGnNhnIGIH4/s1600-h/WebConfig03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="256" src="http://1.bp.blogspot.com/_opzlukmJgHU/S28yAaKub9I/AAAAAAAAAMo/lGnNhnIGIH4/s400/WebConfig03.png" style="border-bottom-color: black; border-left-color: black; border-right-color: black; border-top-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;After enabling Custom Error Handling, the error messages for the divide by zero condition shows much less detail.  We have eliminated the stack trace information; however the title of the error is still present.  In a real world web service, SQL Exceptions such as "Unclosed Quotation Mark" would still be shown.  Simply enabling Custom Errors is not enough to resolve this information disclosure issue.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_opzlukmJgHU/S28yaRn2rGI/AAAAAAAAAMw/TyxAxY_wNqA/s1600-h/SOAPDivideByZero03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="300" src="http://1.bp.blogspot.com/_opzlukmJgHU/S28yaRn2rGI/AAAAAAAAAMw/TyxAxY_wNqA/s400/SOAPDivideByZero03.png" style="border-bottom-color: black; border-left-color: black; border-right-color: black; border-top-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Explicit Try/Catch Blocks: 100% Effective, But What If You Miss One&lt;/span&gt;&lt;br /&gt;It's considered a best practice to catch and correctly handle any exceptions that occur within code. &amp;nbsp;This technique is also important for preventing detailed error messages from reaching the client. &amp;nbsp;Consider the code below.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_opzlukmJgHU/S28zJtRSEZI/AAAAAAAAAM4/ph7zGAEaxFY/s1600-h/Code02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="392" src="http://2.bp.blogspot.com/_opzlukmJgHU/S28zJtRSEZI/AAAAAAAAAM4/ph7zGAEaxFY/s400/Code02.png" style="border-bottom-color: black; border-left-color: black; border-right-color: black; border-top-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In this sample, we catch the divide by zero exception and then just return 0. &amp;nbsp;In a real world application, a much more robust solution should probably be implemented. &amp;nbsp;This new code results in no business functionality related exception being shown the user.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_opzlukmJgHU/S28zfK41hSI/AAAAAAAAANA/Hf7nwXfR3OY/s1600-h/SOAPDivideByZero02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="287" src="http://3.bp.blogspot.com/_opzlukmJgHU/S28zfK41hSI/AAAAAAAAANA/Hf7nwXfR3OY/s400/SOAPDivideByZero02.png" style="border-bottom-color: black; border-left-color: black; border-right-color: black; border-top-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;While this solution is effective at preventing verbose error messages from reaching the client, there are cases when a try/catch block could be missed. &amp;nbsp;One could wrap all code in a try/catch block for the generic Exception class, but this is not a very elegant solution.&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Suppress&amp;nbsp;Returning Exceptions: A Great Backup to Try/Catch Blocks&lt;/span&gt;&lt;br /&gt;Wouldn't it be nice if there was a "customErrors" style solution for web services? The "diagnostics" XML element within the web services section of the ASP.NET Web.Config file can provide this type of functionality.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_opzlukmJgHU/S281K5DkPKI/AAAAAAAAANQ/XR5DEit1l2M/s1600-h/WebConfig05b.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="181" src="http://1.bp.blogspot.com/_opzlukmJgHU/S281K5DkPKI/AAAAAAAAANQ/XR5DEit1l2M/s400/WebConfig05b.png" style="border-bottom-color: black; border-left-color: black; border-right-color: black; border-top-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This configuration change results in the following limited error message for the divide by zero condition.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_opzlukmJgHU/S281bfPASkI/AAAAAAAAANY/oOtKWvi5Kyk/s1600-h/SOAPDivideByZero05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="293" src="http://3.bp.blogspot.com/_opzlukmJgHU/S281bfPASkI/AAAAAAAAANY/oOtKWvi5Kyk/s400/SOAPDivideByZero05.png" style="border-bottom-color: black; border-left-color: black; border-right-color: black; border-top-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This solution is very effective; however there is one caveat. &amp;nbsp;Both explicit try/catch blocks and the Web.Config change still will not control error conditions that occur due to missing parameters or incorrect value types.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_opzlukmJgHU/S281uTZrXNI/AAAAAAAAANo/-OQSkLoYGM8/s1600-h/SOAPMissingValues05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="323" src="http://2.bp.blogspot.com/_opzlukmJgHU/S281uTZrXNI/AAAAAAAAANo/-OQSkLoYGM8/s400/SOAPMissingValues05.png" style="border-bottom-color: black; border-left-color: black; border-right-color: black; border-top-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This solution provides a great catch all for situations where an explicit try/catch block may be missed.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Removing the WSDL and Service Description Pages&lt;/span&gt;&lt;br /&gt;A quick Web.Config change can be used to disable WSDLs and description pages.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_opzlukmJgHU/S282SFtSPvI/AAAAAAAAANw/DzrzuxyipRg/s1600-h/WebConfig04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="1" height="231" src="http://4.bp.blogspot.com/_opzlukmJgHU/S282SFtSPvI/AAAAAAAAANw/DzrzuxyipRg/s400/WebConfig04.png" style="border-color: black;" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Once this change has been made, it will be&amp;nbsp;necessary&amp;nbsp;to communicate WSDLs or web service signatures with partners through some other channel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-8371972850386406759?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/8371972850386406759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=8371972850386406759' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/8371972850386406759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/8371972850386406759'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2010/02/reducing-information-disclosure-in.html' title='Reducing Information Disclosure in ASP.NET Web Services'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_opzlukmJgHU/S28tHTLUz7I/AAAAAAAAALQ/5_kUP0zI0E8/s72-c/Code01.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-2324416601989140299</id><published>2010-01-20T11:37:00.001-06:00</published><updated>2011-09-27T11:19:16.618-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>How Often Should I Reassess My Web Applications?</title><content type='html'>&lt;p&gt;There are a couple approaches for determining when an application should be undergo a security assessment.  First, organizations often require new tests after a fixed period of time.  This period of time may vary based on the risk level the organization has attributed to each application or application type.  It's common for organizations to conduct security assessments of high and medium risk applications every six months to one year.  For low risk applications, the time period is often a year to two years.  The risk level of an application is often determined based on the type of data and functionality within the application.  For example, an Internet facing application that handles credit card transactions would be considered high risk; while an application that simply provides product information and is not subject to regulatory, compliance, or legal requirements may be low risk. Periodic assessments usually supplement the next two approaches.&lt;/p&gt;&lt;p&gt;The second approach is associated with major changes implemented in the application.  There are a variety of changes that should trigger a new application assessment.  Any changes to a security mechanism should undergo validation.  Security mechanisms usually include things like authentication processes, authorization controls, session management features, and data validation and encoding components (think cross-site scripting, SQL injection, etc.).  Changes that add or modify a feature in the application should trigger a retest based on the risk level of the application and the sensitivity of data or functionality that the change effects.  So, a new feature that adds an “about” tab to a website probably doesn’t need to undergo rigorous security testing; however, a new feature that collects users’ social security numbers absolutely should undergo testing (including evaluation whether collection of this PII complies with the organization’s policies, that there is a need to know for this sensitive data, that the sensitive data is adequately protected at rest and in transit, and that only authorized, authenticated parties can reach this data).  Organization’s typically set up criteria and standards around PII, credit card information, and other sensitive data types that automatically trigger a reassessment when an application change related to those data types occurs.&lt;/p&gt;&lt;p&gt;The third approach is to use application security testing as a security gate within an organization’s development process.  In this case, specific application types or risk levels would require an assessment before they can be deployed to production.  This is usually one of the final steps in a secure software development process and acts as a sanity check or a process improvement opportunity rather than a catch-all for security issues.  These types of tests are often highly targeted and would not encompass an assessment of the whole application; instead the security assessment would focus on high risk, new, or updated components introduced in the application.&lt;/p&gt;&lt;p&gt;Previously, I wrote an ISSA article, Titled “&lt;a href="http://nickcoblentz.blogspot.com/2009/05/issa-journal-web-application-security.html"&gt;Web Application Security Portfolios&lt;/a&gt;”, which covered some of this detail.  An expanded version of this article can be found in my post &lt;a href="http://nickcoblentz.blogspot.com/2009/06/repost-web-application-security.html"&gt;here&lt;/a&gt;.  The article discusses ideas around managing portfolios for each application within an organization, identifying data types and compliance requirements, and tracking security activities.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-2324416601989140299?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/2324416601989140299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=2324416601989140299' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/2324416601989140299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/2324416601989140299'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2010/01/how-often-should-i-reassess-my-web.html' title='How Often Should I Reassess My Web Applications?'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-5122822790708716741</id><published>2009-12-10T22:17:00.005-06:00</published><updated>2011-09-27T11:33:04.331-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft SDL'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>Microsoft SDL-Agile Presentation Slides</title><content type='html'>I wanted to thank everyone who came to the OWASP Kansas City Chapter meeting tonight.  I had fun presenting.&lt;br /&gt;&lt;br /&gt;A copy of the slides are available here: &lt;a href="http://dl.dropbox.com/u/1132296/Microsoft%20SDL-Agile%20Presentation%20-%20Nick%20Coblentz%202009-12-01.pdf"&gt;OWASP Kansas City, Microsoft SDL-Agile Presentation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately the animations don't work in the PDF version, but I would be happy to present at other meetings, user groups, or for a group of developers/managers within a company.  If you are interested, please feel free to email me.  My contact information is listed in the sidebar of this blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-5122822790708716741?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/5122822790708716741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=5122822790708716741' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/5122822790708716741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/5122822790708716741'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/12/microsoft-sdl-agile-presentation-slides.html' title='Microsoft SDL-Agile Presentation Slides'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-9123049084128796992</id><published>2009-11-18T13:02:00.004-06:00</published><updated>2011-09-27T11:33:04.343-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft SDL'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>OWASP Presentation on Dec. 10: Microsoft SDL-Agile</title><content type='html'>I will be giving an OWASP presentation on December 10th over the Microsoft Security Development Lifecycle for Agile Development.  The presentation will be about 45 minutes and is scheduled to begin at 6PM in &lt;a href="http://www.jccc.edu/home/depts.php/1420/site/RentalSpaces/TheCube1"&gt;Regnier Center Room 270 at JCCC&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here is the original announcement from the OWASP Kansas City List: &lt;a href="https://lists.owasp.org/pipermail/owasp-kansascity/2009-November/000085.html"&gt;https://lists.owasp.org/pipermail/owasp-kansascity/2009-November/000085.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-9123049084128796992?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/9123049084128796992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=9123049084128796992' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/9123049084128796992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/9123049084128796992'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/11/owasp-presentation-on-dec-10-microsoft.html' title='OWASP Presentation on Dec. 10: Microsoft SDL-Agile'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-2730755144817314068</id><published>2009-11-10T15:11:00.006-06:00</published><updated>2011-09-27T11:18:36.482-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft SDL'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>Microsoft SDL for Agile Development</title><content type='html'>Microsoft recently released a document describing how to apply the SDL process to Agile development.  Take a look at their &lt;a href="http://blogs.msdn.com/sdl/archive/2009/11/10/announcing-sdl-for-agile-development-methodologies.aspx"&gt;blog post&lt;/a&gt; or download the document &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=d045a05a-c1fc-48c3-b4d5-b20353f97122&amp;amp;displaylang=en"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-2730755144817314068?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/2730755144817314068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=2730755144817314068' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/2730755144817314068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/2730755144817314068'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/11/microsoft-sdl-for-agile-development.html' title='Microsoft SDL for Agile Development'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-4503575811365833587</id><published>2009-10-26T10:00:00.001-05:00</published><updated>2011-09-27T11:18:25.833-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>Observed Secure Software Development Stages</title><content type='html'>A secure software development process cannot be built overnight. Organizations gradually adopt security activities based on factors like culture, customer demand, regulations, budget, and security incidents. Each organization adds security practices at different rates; however, most organizations do so in a predictable order. This common order is a reflection of how businesses today use trial and error to find an appropriate set of processes and practices to grow a secure development process.&lt;br /&gt;&lt;br /&gt;This order can be broken down into six stages. While few organizations fit exactly within one stage or another, this model can be used to facilitate discussions about an organization’s current progress. The model does not seek to validate whether the six stages constitute an appropriate secure software development roadmap, instead; it simply describes a common progression observed in organizations today. Models like the Software Assurance Maturity Model (SAMM) and Building Security In Maturity Model (BSIMM) are more appropriate models for determining the proper direction of an organization’s secure development process.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Stage 1: Focus on Functionality&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Initially, organizations are fairly ignorant of secure development practices. Computer science curriculum often does not include a class on security best practices or ways prevent cross-site scripting vulnerabilities. Developers are taught how to write code to satisfy business requirements.&lt;br /&gt;&lt;br /&gt;Secure software development also isn’t high on executives’ list of priorities. Their focus is on producing innovative products or services, being first to market, and making net income goals.&lt;br /&gt;&lt;br /&gt;Security usually does not become a priority until an incident occurs, whether a competitor has a data breach or the organization itself is hacked. Once this tipping point occurs, security dollars quickly become available. Organizations spend their new security budget on third-party application assessments, which provide an insight into the security posture of information technology assets.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Stage 2: Assessments Alone&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;Once an organization starts performing security assessments in response to a breach, it typically extends this activity for use as an approval mechanism. The organization requires sensitive or business critical applications to be assessed prior to new releases being deployed to production. This approach greatly reduces the number and severity of vulnerabilities in external facing applications; however, it doesn’t identify security weaknesses until after the application is fully developed.&lt;br /&gt;&lt;br /&gt;Vulnerabilities that highlight a systemic weakness or architectural flaw will often result in project delays and unanticipated costs. Additionally, this approach does not train developers to implement code securely during the initial development stage.&lt;br /&gt;&lt;br /&gt;After performing assessments as the only software security activity, the organization eventually realizes that a proactive approach is needed. They determine that issues should be identified early in the development process and opt for purchasing automated code review or penetration testing tools.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Stage 3: Ad-hoc Use of Security Tools and Activities&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;After providing automated code review or penetration testing tools to developers, organizations expect all their application security challenges to be solved. They tell developers that they need to run the tool on their code and fix all the issues. The organization’s goal is to have production ready software at the conclusion of the development process. The actual results of this approach vary.&lt;br /&gt;&lt;br /&gt;Development groups composed of security savvy members usually see an overall reduction in vulnerabilities. The other development groups may only see a moderate impact. There are a variety of reasons this happens. The primary reason is that the tools can identify plenty of problems, but the developers don’t have the knowledge necessary to understand all the risks or to apply security best practice recommendations. Other challenges include the inability of automated tools to find business logic, authorization, and authentication flaws; inconsistent company procedures and checkpoints associated with running the tools; and no minimum standard set for acceptable risk levels.&lt;br /&gt;&lt;br /&gt;Organizations also may adopt security activities such as threat modeling, secure requirements specification, and design reviews. These activities produce greater awareness of security issues facing applications, but the developers’ still lack the knowledge and experience necessary to really take advantage of these proactive security activities.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Stage 4: Application Security Training&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;The next logical step for organizations is to provide application security training to development groups. This comes in the form of in person classes, on-boarding training, and annual refreshers. The class content often includes a general background in application security, introduction to common vulnerabilities and attacks, and best practice approaches for eliminating preventing and remediating issues.&lt;br /&gt;&lt;br /&gt;Application security training greatly improves developers’ ability to succeed at the organizations continued use of automated tools and third party assessments. Developers gain a common language to discuss application security concerns, can understand and address vulnerabilities in a timely manner, and the training can inspire developers to pursue additional research.&lt;br /&gt;&lt;br /&gt;One aspect most organizations leave out is reinforcing and supplementing training with internal resources. Many developers receive training once a year in application security. After six months, most of the knowledge gained during the class is forgotten.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Stage 5: Creation of Resources, Formal Policies, Procedures and Standards&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;In order to ensure consistent use of security tools and activities, organizations choose to formalize the policies, procedures, and standards developed over the previous four stages. Criteria is created for evaluating the sensitivity or importance of applications, security activities are formally required for each of these categories, and security gates are put in place to ensure a minimum standard of security is met before software advances in the development process.&lt;br /&gt;&lt;br /&gt;An internal application security portal is also created to make these policies and additional resources available to developers. These resources communicate information about standardized methods for addressing vulnerabilities in code, approved development languages and frameworks, and internally developed secure libraries and architectures.&lt;br /&gt;&lt;br /&gt;Ultimately, this results in the elimination of ad-hoc security activities and promotes consistent development of applications with fewer security vulnerabilities.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Stage 6: Secure Software Assurance&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;In the last stage, organizations tailor security activities and requirements to satisfy business goals and leverage efforts as a competitive advantage. Before an application is developed, a set of security requirements is established. For each security activity, the organization defines a test procedure and criteria for determining whether the application passes or fails the security requirement. Test results are recorded and reported across the application’s lifetime to form an overall picture of the application’s security posture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-4503575811365833587?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/4503575811365833587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=4503575811365833587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/4503575811365833587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/4503575811365833587'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/10/observed-secure-software-development.html' title='Observed Secure Software Development Stages'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-8879222194392771720</id><published>2009-10-01T15:06:00.010-05:00</published><updated>2011-09-27T11:18:20.683-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>Turn Application Assessment Reports into Training Classes</title><content type='html'>So you had a third party application assessment and you have a report 10 miles long. There are cross-site scripting, SQL injection, authentication, authorization, and every other kind of vulnerability under the sun listed. Your development team gears up and remediates issues, often using trial and error (patch, retest, pray, and repeat) to fix issues over several iterations. Eventually, all the vulnerabilities have been addressed successfully and you file the report away forever...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Stop Right There!&lt;/strong&gt; There's an opportunity to use a real application within your organization to train developers to write secure code THE FIRST TIME! Here's how:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Taking the Time to Analyze Root Causes and Develop Standards&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now that the fire is out (the issues are fixed), let's take some time to understand how the vulnerabilities were created in the first place. Was it a result of missing output encoding practices, inconsistent page-level access controls, or some other issue? Gather a list of root causes that resulted in the identified weakness.&lt;br /&gt;&lt;br /&gt;Next, use security experts or online resources, like &lt;a href="http://www.owasp.org/"&gt;OWASP&lt;/a&gt;, to find security best practice solutions for eliminating these vulnerabilities. Some great examples are the &lt;a href="http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet"&gt;OWASP XSS Prevention Cheat Sheet&lt;/a&gt; or the &lt;a href="http://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet"&gt;OWASP SQL Injection Prevention Cheat Sheet&lt;/a&gt;. Finally, create a centralized application security portal or wiki that developers can access and add these root causes and best practice solutions as official company standards.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Bullet Points:&lt;/em&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create a centralized application security portal or wiki&lt;/li&gt;&lt;li&gt;As you analyze root causes and find security best practice approaches to fix them, add them as standards to the portal&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Archive the Vulnerable Application Code for Later Use&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After completing the third party assessment, you now possess real world vulnerability examples and a report that lists each issue, including the page and parameters vulnerable and a guide for exploiting them. This report and the vulnerable application will be a great learning tool to be leveraged later. Archive the vulnerable application code and any other related components. Make sure it is possible to restore this application to a working state within a test environment at a later date.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Bullet Points:&lt;/em&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Archive the application and related components to be deployed within a test environment at a later date&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Conduct Developer Training&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the weeks before hosting a training course, generate developer interest by deploying the vulnerable application within a well controlled, internal, isolated, secure... you get the idea... test environment. Send application URLs and credentials to developers and tell them what classes of vulnerabilities can be found (refer to your assessment report). Encourage developers to test and discover security issues individually until the training class.&lt;br /&gt;&lt;br /&gt;In the training class, go through each vulnerability class or root cause with developers. Demonstrate application security attacks against the weaknesses using the vulnerable application deployed to the test environment as a real world example. Once you have gone through each vulnerability type, ask developers to discuss other areas of the application they identified as vulnerable during the preceding weeks. After the discussion, have developers break up into groups to find any remaining issues. Give hints as the number of remaining vulnerabilities dwindles.&lt;br /&gt;&lt;br /&gt;Once all the issues have been found by developers or demonstrated by the instructor, ask developers for methods of addressing each vulnerability class. Intentionally choose suggestions that are missing key security best practice concepts. Have developers come up to the presentation computer and code solutions on the spot; then, discuss reasons why the solution is flawed, and prove it with an example attack.&lt;br /&gt;&lt;br /&gt;After going through a few proposed solutions, discuss the root cause that lead to the security weakness. Provide the best practice solution for eliminating the issue and preventing it in future code. Finally, show developers where they can access this company standard on the internal portal or wiki and have a developer implement the solution to fix the vulnerability on the spot.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Bullet Points:&lt;/em&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Generate developer interest in the training course by allowing them to hack the vulnerable application&lt;/li&gt;&lt;li&gt;During the training course, discuss vulnerability classes, root causes, incorrect remediation solutions, security best practice based recommendations, and where to find company standards&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Conclusion &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Turning application security reports into company security standards and training courses is a great way to increase the return on investment for third party assessments. The suggestions discussed in the article above will greatly help developers succeed at writing secure code in future web applications. The process also uses meaningful real world applications to demonstrate the concepts and promote interest.&lt;br /&gt;&lt;br /&gt;Some of these steps may require security savvy developers or security experts. &lt;strong&gt;If you would like assistance developing training courses, identifying root causes, or documenting security standards, please feel free to send me an email. I can be contacted at &amp;lt;My First Name&amp;gt;.&amp;lt;My Last Name&amp;gt;@gmail.com.&lt;br /&gt;&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-8879222194392771720?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/8879222194392771720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=8879222194392771720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/8879222194392771720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/8879222194392771720'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/10/turn-application-assessment-reports.html' title='Turn Application Assessment Reports into Training Classes'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-3432894821043643737</id><published>2009-10-01T12:08:00.004-05:00</published><updated>2009-10-01T12:28:36.584-05:00</updated><title type='text'>AT&amp;T Acquires VeriSign's Global Security Consulting Business</title><content type='html'>We've been acquired! I am now an AT&amp;amp;T employee. Check out the press release here: &lt;a href="http://www.att.com/gen/press-room?pid=4800&amp;amp;cdvn=news&amp;amp;newsarticleid=27183"&gt;http://www.att.com/gen/press-room?pid=4800&amp;amp;cdvn=news&amp;amp;newsarticleid=27183&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For a list of professional services offered related to security, see this page: &lt;a href="http://www.corp.att.com/consulting/security/"&gt;http://www.corp.att.com/consulting/security/&lt;/a&gt; (especially Application Security Services).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-3432894821043643737?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/3432894821043643737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=3432894821043643737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3432894821043643737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3432894821043643737'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/10/at-acquires-verisigns-global-security.html' title='AT&amp;T Acquires VeriSign&apos;s Global Security Consulting Business'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-56805795039893288</id><published>2009-09-19T12:35:00.015-05:00</published><updated>2011-09-27T11:31:07.107-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cross-site Scripting'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Coding'/><title type='text'>Using Microsoft's AntiXSS Library 3.1</title><content type='html'>&lt;span style="font-size:100%;"&gt;Microsoft recently released the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=051EE83C-5CCF-48ED-8463-02F56A6BFC09&amp;amp;displaylang=en"&gt;AntiXSS Library Version 3.1&lt;/a&gt;.  This library provides methods to output encode or escape untrusted user input within ASP.NET pages.  The &lt;a href="http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet"&gt;OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet&lt;/a&gt; provides a significant amount of detail regarding theory and proper use of output encoding methods.  The examples provided in this OWASP resource relate to the ESAPI library for Java and do not provide equivalent method calls for Microsoft's AntiXSS Library.&lt;br /&gt;&lt;br /&gt;The sections below are an attempt to provide one-to-one mappings of the ESAPI Encoder calls and the AntiXSS calls needed to satisfy each section of the OWASP XSS Prevention Cheat Sheet.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Setup&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Version 3.1 of the AntiXSS library can be obtained at the following URL:&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=051EE83C-5CCF-48ED-8463-02F56A6BFC09&amp;amp;displaylang=en"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=051EE83C-5CCF-48ED-8463-02F56A6BFC09&amp;amp;displaylang=en&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;By default, the installer places files in the "C:\Program Files\Microsoft Information Security\Microsoft Anti-Cross Site Scripting Library v3.1\" directory.&lt;br /&gt;&lt;br /&gt;In Visual Studio, developers can add a reference to the AntiXSS Library by selecting the DLL located at "C:\&amp;lt;AntiXSS Library Base Directory&amp;gt;\Library\AntiXSSLibrary.dll".&lt;br /&gt;&lt;br /&gt;Help files, complete with examples and theory, are located at "C:\&amp;lt;AntiXSS Library Base Directory&amp;gt;\Help\Anti-XSS_Library_Help.chm".&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Usage&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;The following sections should map rules and OWASP ESAPI Encoder calls listed in the XSS Prevention Cheat Sheet to Microsoft AntiXSS Library Calls.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: italic;"&gt;Rule #0: Never Insert Untrusted Data Except in Allowed Locations&lt;/span&gt;&lt;br /&gt;This rule holds true as described by the Cheat Sheet.  No mapping is required for the AntiXSS Library.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Rule #1: HTML Escape Before Inserting Untrusted Data into HTML Element Content &lt;/span&gt;&lt;br /&gt;ESAPI Encoder Example:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;String safe = ESAPI.encoder().encodeForHTML( request.getParameter( "input" ) );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;AntiXSS Equivalent:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;string safe = Microsoft.Security.Application.AntiXss.HtmlEncode( Request.QueryString[ "input" ] );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Rule #2: Attribute Escape Before Inserting Untrusted Data into HTML Common Attributes&lt;/span&gt;&lt;br /&gt;ESAPI Encoder Example:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;String safe = ESAPI.encoder().encodeForHTMLAttribute( request.getParameter( "input" ) );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;AntiXSS Equivalent:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;string safe = Microsoft.Security.Application.AntiXss.HtmlAttributeEncode( Request.QueryString[ "input" ] );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Rule #3: JavaScript Escape Before Inserting Untrusted Data into HTML JavaScript Data Values &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ESAPI Encoder Example:&lt;br /&gt;String safe = ESAPI.encoder().encodeForJavaScript( request.getParameter( "input" ) );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;AntiXSS Equivalent:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;string safe = Microsoft.Security.Application.AntiXss.JavaScriptEncode( Request.QueryString[ "input" ] );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Rule #4: CSS Escape Before Inserting Untrusted Data into HTML Style Property Values&lt;/span&gt;&lt;br /&gt;ESAPI Encoder Example:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;String safe = ESAPI.encoder().encodeForCSS( request.getParameter( "input" ) );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;AntiXSS Equivalent:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;No direct equivalent&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-56805795039893288?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/56805795039893288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=56805795039893288' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/56805795039893288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/56805795039893288'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/09/using-microsofts-antixss-library-31.html' title='Using Microsoft&apos;s AntiXSS Library 3.1'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-5466811594429711328</id><published>2009-08-28T10:00:00.003-05:00</published><updated>2011-09-27T11:27:15.176-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>Flash Remoting Support in Burp Suite Pro</title><content type='html'>Assessing applications that utilize flash remoting calls often require tools to analyze, manipulate, and replay requests.  These tools are required because flash remoting request and response payloads are encoded using the &lt;a href="http://opensource.adobe.com/wiki/download/attachments/1114283/amf3_spec_05_05_08.pdf"&gt;Action Message Format&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Previously, I have used &lt;a href="http://deblaze-tool.appspot.com/"&gt;Deblaze &lt;/a&gt;and &lt;a href="http://www.charlesproxy.com/"&gt;Charles Proxy&lt;/a&gt; to support these needs.  On August 12, &lt;a href="http://releases.portswigger.net/2009/08/v1214.html"&gt;a new version of Burp Suite Pro&lt;/a&gt; was released.  This version allows AMF messages to be encoded and decoded in the proxy, repeater, and other tabs (except Burp Intruder).  Burp Scanner also supports placing attack payloads in flash remoting calls.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-5466811594429711328?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/5466811594429711328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=5466811594429711328' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/5466811594429711328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/5466811594429711328'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/08/flash-remoting-support-in-burp-suite.html' title='Flash Remoting Support in Burp Suite Pro'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-3342329227629833339</id><published>2009-08-12T21:44:00.003-05:00</published><updated>2011-09-27T11:17:50.976-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cloud'/><title type='text'>Amazon EC2 and PCI Compliance</title><content type='html'>I saw a very informative forum post regarding Amazon's position on EC2 and S3 PCI compliance via a twitter update from &lt;a href="http://twitter.com/Beaker"&gt;@beaker&lt;/a&gt; (&lt;a href="http://twitter.com/Beaker/statuses/3277444460"&gt;http://twitter.com/Beaker/statuses/3277444460&lt;/a&gt;).  The &lt;a href="http://developer.amazonwebservices.com/connect/message.jspa?messageID=139547#139547"&gt;post&lt;/a&gt; states merchants can not achieve level 1 PCI compliance within Amazon's cloud infrastructure, because Amazon will not allow customers to perform on-site assessments.  Amazon recommends using their &lt;a href="http://aws.amazon.com/fps/"&gt;Flixible Payments Service&lt;/a&gt; to successfully handle credit card data within their cloud.  Mosso, now "Rackspace Cloud", took a similar approach as discussed in my &lt;a href="http://nickcoblentz.blogspot.com/2009/03/mosso-first-pci-compliant-customer.html"&gt;March 2009 blog post&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-3342329227629833339?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/3342329227629833339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=3342329227629833339' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3342329227629833339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3342329227629833339'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/08/amazon-ec2-and-pci-compliance.html' title='Amazon EC2 and PCI Compliance'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-2511057412622414920</id><published>2009-07-22T08:00:00.002-05:00</published><updated>2011-09-27T11:17:45.461-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>Vulnerability Tracking, Workflow, and Metrics With Redmine</title><content type='html'>&lt;span style="font-style: italic;"&gt;This article was inspired by real processes and software implemented in a client's environment.  This client has a very proactive approach to application security.  I would love to give specific attribution to some of these ideas, but I am not permitted in this case.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A functional defect is typically a set of undesirable behavior associated with an application feature.  A security vulnerability (security bug) consists of undesirable behavior that weakens the application's ability to resist attacks or protect data.  In terms of issue tracking and remediation, a security bug is really just a specific type of functional bug.  This is apparent when you consider the basic workflow for a functional defect:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;A developer or user reports a defect.&lt;/li&gt;&lt;li&gt;The project manager assigns the defect to a developer.&lt;/li&gt;&lt;li&gt;The developer implements code to resolve the issue.&lt;/li&gt;&lt;li&gt;The quality assurance team verifies that the implemented code successfully resolved the issue.&lt;/li&gt;&lt;li&gt;The project manager or team provides communication to executives, clients, or other entities regarding the successful resolution of the issue.&lt;/li&gt;&lt;li&gt;The issue is archived for use in metrics or other statistical analysis.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;The workflow for a security bug contains the same steps but differs in the roles associated with each step.  A security bug may require interaction or approval from security managers or security assessors in addition to developers and project managers.&lt;br /&gt;&lt;br /&gt;Development teams already use bug tracking software during development, why not utilize the same systems for tracking security vulnerabilities?  Project team's familiarity with the software and process will make it considerably easier to collaborate on remediation efforts.  Additionally, most organizations already have methods of collecting metrics about software defects.  These metrics can be extended to include vulnerabilities.&lt;br /&gt;&lt;br /&gt;In order to effectively track security vulnerabilities, a centralized, web-based bug tracking system needs to support the following features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Custom workflows per issue type&lt;/li&gt;&lt;li&gt;Custom fields within bug items&lt;/li&gt;&lt;li&gt;Roles and privileges controlling users' ability to change the status of security bugs&lt;/li&gt;&lt;/ul&gt;After a little research, I identified a bug tracking system called &lt;a href="http://www.redmine.org/"&gt;Redmine&lt;/a&gt; that satisfies all these requirements and more.  In Redmine, I was able to create an issue type called "Vulnerability" and associated a specific &lt;a href="http://www.redmine.org/wiki/redmine/RedmineIssueTrackingSetup"&gt;workflow&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_opzlukmJgHU/SlJ03zK8HTI/AAAAAAAAAKU/E436yHrrPks/s1600-h/Final+3.png"&gt;&lt;img style="border: thin solid black; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 306px;" src="http://4.bp.blogspot.com/_opzlukmJgHU/SlJ03zK8HTI/AAAAAAAAAKU/E436yHrrPks/s400/Final+3.png" alt="" id="BLOGGER_PHOTO_ID_5355471408874659122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The diagram below illustrates the custom workflow, roles, and purpose of each step.  This workflow can be created in Redmine and each transition can be associated with specific roles.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_opzlukmJgHU/SlIsTtkaxjI/AAAAAAAAAJ0/tF3lniHOGr0/s1600-h/Vulnerability+Tracking+States.png"&gt;&lt;img style="border: thin solid black; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 243px; height: 400px;" src="http://1.bp.blogspot.com/_opzlukmJgHU/SlIsTtkaxjI/AAAAAAAAAJ0/tF3lniHOGr0/s400/Vulnerability+Tracking+States.png" alt="" id="BLOGGER_PHOTO_ID_5355391624058422834" /&gt;&lt;/a&gt;&lt;br /&gt;Since the software supports custom fields within issue items, a security assessor can enter additional vulnerability information such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The vulnerability category&lt;/li&gt;&lt;li&gt;Whether the issue has a security impact&lt;/li&gt;&lt;li&gt;Whether the issue has a privacy impact&lt;/li&gt;&lt;li&gt;Whether the issue has a compliance impact&lt;/li&gt;&lt;li&gt;Which group identified the issue&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Whether the item was identified by an automated or manual process&lt;/li&gt;&lt;li&gt;Which activity was used to identify issues&lt;/li&gt;&lt;/ul&gt;Once many of these issues have been reported across an organization, this information can be used to evaluate the effectiveness of tools, processes, or security activities used throughout the development process.  An example of a Vulnerability item being created in Redmine is shown in the screenshot below.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_opzlukmJgHU/SlJ03mEPYLI/AAAAAAAAAKE/PtaEX_ELR8Q/s1600-h/Final+1.png"&gt;&lt;img style="border: thin solid black; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 341px;" src="http://2.bp.blogspot.com/_opzlukmJgHU/SlJ03mEPYLI/AAAAAAAAAKE/PtaEX_ELR8Q/s400/Final+1.png" alt="" id="BLOGGER_PHOTO_ID_5355471405356900530" border="0" /&gt;&lt;/a&gt;In addition to tracking vulnerabilities, this system could also be used to manage requests and the workflow associated with security services performed by an internal security team.  Organizations often may utilize security teams to assist in specifying security, privacy and compliance requirements or to perform activities like penetration testing and code review.  A custom workflow can be created in Redmine to handle this issue type as well.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_opzlukmJgHU/SlJgk8OkPVI/AAAAAAAAAJ8/PqUjyZ_SzeQ/s1600-h/SSG+Services+States.png"&gt;&lt;img style="border: thin solid black; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 278px; height: 400px;" src="http://4.bp.blogspot.com/_opzlukmJgHU/SlJgk8OkPVI/AAAAAAAAAJ8/PqUjyZ_SzeQ/s400/SSG+Services+States.png" alt="" id="BLOGGER_PHOTO_ID_5355449094655720786" /&gt;&lt;/a&gt;&lt;br /&gt;Here is an example of a security service request in Redmine:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_opzlukmJgHU/SlJ0320iNfI/AAAAAAAAAKM/QMIzQd03gI8/s1600-h/Final+2.png"&gt;&lt;img style="border: thin solid black; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 287px;" src="http://2.bp.blogspot.com/_opzlukmJgHU/SlJ0320iNfI/AAAAAAAAAKM/QMIzQd03gI8/s400/Final+2.png" alt="" id="BLOGGER_PHOTO_ID_5355471409854428658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Appendix&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Custom Fields:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_opzlukmJgHU/SlJ04JsETtI/AAAAAAAAAKc/uT9hE7pmezY/s1600-h/Final+4.png"&gt;&lt;img style="border: thin solid black; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 169px;" src="http://1.bp.blogspot.com/_opzlukmJgHU/SlJ04JsETtI/AAAAAAAAAKc/uT9hE7pmezY/s400/Final+4.png" alt="" id="BLOGGER_PHOTO_ID_5355471414919188178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Security Activities Custom Field:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_opzlukmJgHU/SlJ1B9KCM9I/AAAAAAAAALE/ajRkiuD_x6g/s1600-h/Final+9.png"&gt;&lt;img style="border: thin solid black; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 289px; height: 400px;" src="http://2.bp.blogspot.com/_opzlukmJgHU/SlJ1B9KCM9I/AAAAAAAAALE/ajRkiuD_x6g/s400/Final+9.png" alt="" id="BLOGGER_PHOTO_ID_5355471583353910226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Vulnerability Identification Method Source Custom Field:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_opzlukmJgHU/SlJ1BQQ1-3I/AAAAAAAAAK8/nja2FT-yWqU/s1600-h/Final+8.png"&gt;&lt;img style="border: thin solid black; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 343px; height: 400px;" src="http://3.bp.blogspot.com/_opzlukmJgHU/SlJ1BQQ1-3I/AAAAAAAAAK8/nja2FT-yWqU/s400/Final+8.png" alt="" id="BLOGGER_PHOTO_ID_5355471571302873970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Vulnerability Identification Method Custom Field:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_opzlukmJgHU/SlJ1BAcgHZI/AAAAAAAAAK0/SLJ6zwHVGiw/s1600-h/Final+7.png"&gt;&lt;img style="border: thin solid black; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 306px; height: 400px;" src="http://1.bp.blogspot.com/_opzlukmJgHU/SlJ1BAcgHZI/AAAAAAAAAK0/SLJ6zwHVGiw/s400/Final+7.png" alt="" id="BLOGGER_PHOTO_ID_5355471567056805266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Vulnerability Identified By Custom Field:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_opzlukmJgHU/SlJ1A1jKBGI/AAAAAAAAAKs/ZgVn1-WlR2E/s1600-h/Final+6.png"&gt;&lt;img style="border: thin solid black; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 301px; height: 400px;" src="http://2.bp.blogspot.com/_opzlukmJgHU/SlJ1A1jKBGI/AAAAAAAAAKs/ZgVn1-WlR2E/s400/Final+6.png" alt="" id="BLOGGER_PHOTO_ID_5355471564131927138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Vulnerability Category Custom Field:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_opzlukmJgHU/SlJ04VHSIOI/AAAAAAAAAKk/djPnnb4GewI/s1600-h/Final+5.png"&gt;&lt;img style="border: thin solid black; margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 338px; height: 400px;" src="http://4.bp.blogspot.com/_opzlukmJgHU/SlJ04VHSIOI/AAAAAAAAAKk/djPnnb4GewI/s400/Final+5.png" alt="" id="BLOGGER_PHOTO_ID_5355471417986130146" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-2511057412622414920?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/2511057412622414920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=2511057412622414920' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/2511057412622414920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/2511057412622414920'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/07/vulnerability-tracking-workflow-and.html' title='Vulnerability Tracking, Workflow, and Metrics With Redmine'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_opzlukmJgHU/SlJ03zK8HTI/AAAAAAAAAKU/E436yHrrPks/s72-c/Final+3.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-26623693819042027</id><published>2009-07-01T19:34:00.047-05:00</published><updated>2011-09-27T11:17:39.778-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>Internal AppSec Portals: Resources</title><content type='html'>&lt;span style="font-style: italic;"&gt;Attribution:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Many of these ideas build on Pravir Chandra's &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.opensamm.org/"&gt;Software Assurance Maturity Model&lt;/a&gt;&lt;span style="font-style: italic;"&gt; (Version 1.0) and the &lt;a href="http://www.bsi-mm.com/"&gt;Building Security In Maturity Model&lt;/a&gt; by Gary McGraw, Brian Chess, and Sammy Migues.  Both works are licensed under the &lt;a href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;Creative Commons Attribution-Share Alike 3.0&lt;/a&gt; License.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;This article was also heavily influenced by &lt;/span&gt;&lt;a style="font-style: italic;" href="http://msdn.microsoft.com/en-us/library/cc307748.aspx"&gt;Microsoft's SDL process&lt;/a&gt;&lt;span style="font-style: italic;"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;The next several blog entries will cover my current project: providing a template or starting point for organization's internal application security portal.  This post is the second of many to come.&lt;br /&gt;&lt;br /&gt;Previous Internal AppSec Portals Posts:&lt;br /&gt;&lt;a href="http://nickcoblentz.blogspot.com/2009/06/internal-appsec-portals-introduction.html"&gt;Introduction&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This post will cover providing application security resources for developers, including&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Policies&lt;/li&gt;&lt;li&gt;Guidance&lt;/li&gt;&lt;li&gt;Requirements&lt;/li&gt;&lt;li&gt;Vulnerabilities&lt;br /&gt;&lt;/li&gt;&lt;li&gt;and External Resources&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The following image is a screenshot of the table of contents for my TikiWiki Secure Software Assurance Resources structure.  As discussed in the previous post, a Wiki is a great way to document application security resources, because it allows for constant, collaborative updates and can link and organize information in user friendly way.  I recommend providing the resources discussed in this post in a similar format for project teams.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_opzlukmJgHU/SkwCJbQrtHI/AAAAAAAAAJs/VT_j0oevtYA/s1600-h/AppSecResourcesTOC.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 209px; height: 400px;" src="http://3.bp.blogspot.com/_opzlukmJgHU/SkwCJbQrtHI/AAAAAAAAAJs/VT_j0oevtYA/s400/AppSecResourcesTOC.PNG" alt="" id="BLOGGER_PHOTO_ID_5353656417996485746" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:130%;"&gt;Goals&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;The purpose behind this set of resources is to provide all the information a developer needs to write secure code.  Developers cannot be expected to pull secure code out of the air.  Guidelines, coding standards, and security requirements must be spelled out to ensure everyone understands their responsibilities and the organization's expectations.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Additionally, developers MUST be provided with security awareness training AND training against this material.  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Policies&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Security Policies&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Most organizations define a set of security policies that govern acceptable use of information systems, methods for labeling and handling confidential data, and procedures for addressing policy violations.  These same concepts should be extended to cover application security, compliance, and privacy policies.&lt;br /&gt;&lt;br /&gt;Security policies should express the organization's dedication to the topics below.  These topics do not necessarily have to define the process or implementation of each policy area, only statements mandating their use.&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Mandatory, periodic application security training&lt;/li&gt;&lt;li&gt;Adherence to application security guidance and coding standards&lt;/li&gt;&lt;li&gt;Use of a formal risk management process&lt;/li&gt;&lt;li&gt;Risk categorization of data and applications&lt;/li&gt;&lt;li&gt;Creation and maintenance of &lt;a href="http://nickcoblentz.blogspot.com/2009/06/repost-web-application-security.html"&gt;application security portfolios&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Use of approved secure development processes&lt;/li&gt;&lt;li&gt;Dedication to meeting regulatory and compliance standards in each application project&lt;/li&gt;&lt;li&gt;Inclusion and validation of security, privacy, and compliance requirements throughout the development process&lt;/li&gt;&lt;li&gt;Establishment of a minimum level of assurance for application security, privacy, and compliance&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Privacy Policies&lt;/span&gt;&lt;br /&gt;In addition to security policies, organizations should maintain policies governing how personally identifiable information such as social security numbers, account numbers, or other data is handled.  These policies should send a clear message to project teams that protecting users' private data is important.  These policies should cover topics such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Identification and categorization of private data&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Collection, storage, and transmission of private data&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Inclusion and validation of privacy requirements during the development process&lt;/li&gt;&lt;li&gt;Establishment of a minimum level of assurance for privacy data&lt;/li&gt;&lt;/ul&gt;Microsoft has released a great deal of resources on privacy related policies, requirements and process.  Those resources can be found below.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c48cf80f-6e87-48f5-83ec-a18d1ad2fc1f&amp;amp;displaylang=en"&gt;Microsoft's Privacy Guidelines for Developing Software Products and Services&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc307393.aspx"&gt;Microsoft SDL Privacy Questionnaire&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc307412.aspx#EC1"&gt;Microsoft SDL Privacy Requirements&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/cc307391.aspx"&gt;Microsoft SDL Privacy At A Glance&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Compliance Policies&lt;/span&gt;&lt;br /&gt;There are a wide variety of compliance and regulatory standards that apply to organizations, data, and functionality.  Project teams cannot spend all of their time researching these standards.  At the organization level, compliance standards should be identified and a process should be created to assist developers in determining which regulations apply to their project.  Compliance policies should include the following topics:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Identification of compliance and regulatory standards&lt;/li&gt;&lt;li&gt;Process for determining standards that apply to each software project&lt;/li&gt;&lt;li&gt;Inclusion and validation of compliance requirements during the development process&lt;/li&gt;&lt;li&gt;Establishment of a minimum level of assurance for software compliance&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;Guidance&lt;/span&gt;&lt;br /&gt;Organizations should collect and publish internal guidance to be consumed by project teams.  Guidance should not only include secure coding standards, but also approved frameworks, security services, architectures, and environments.  These items should be provided in a way that clearly communicates approaches or code that is approved, an organization standard, or unapproved.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Approved Libraries and Frameworks&lt;/span&gt;&lt;br /&gt;Software can be developed in a variety of languages and often includes external third party libraries.  ASP.NET applications often include libraries such as ASP.NET MVC and Microsoft's AntiXSS library.  Java applications may include Struts, Spring, Hibernate, Velocity, and many others.  Additionally, developers may want to develop software in PHP, Python, Ruby, Perl, and other languages.&lt;br /&gt;&lt;br /&gt;Organizations must communicate which of these languages and frameworks are approved for use in software projects.  Guidance should start with a simple list of languages and frameworks the organization has approved or disapproved.  As development groups request approval for additional 3rd party libraries and develop successful applications, a list of standards should be created for specific architecture or project types.&lt;br /&gt;&lt;br /&gt;For example, an organization may list the following standards for MVC applications in Java and ASP.NET (they typically would expand upon the descriptions as well):&lt;br /&gt;&lt;h4 class="showhide_heading" id="Database_Driven_MVC_Application"&gt;&lt;/h4&gt;&lt;blockquote&gt;&lt;h4 class="showhide_heading" id="Database_Driven_MVC_Application"&gt;&lt;/h4&gt;&lt;/blockquote&gt;&lt;span style="font-style: italic;"&gt;Database Driven Java MVC Application&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The organization has standardized on using the following frameworks for Database Driven J2EE MVC applications:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Language: Java 1.6&lt;/li&gt;&lt;li&gt;MVC Framework: Struts 2.x &lt;/li&gt;&lt;li&gt;Dependency Injection Framework: Spring 2.x&lt;/li&gt;&lt;li&gt;ORM Layer: Hibernate 3.x &lt;/li&gt;&lt;/ul&gt;&lt;h4 class="showhide_heading" id="Database_Driven_MVC_Application_2"&gt;&lt;/h4&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-style: italic;"&gt;Database Driven ASP.NET MVC Application&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The organization has standardized on using the following frameworks for Database Drive &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;ASP.NET&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; MVC applications:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;Language: ASP.NET 3.5&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt; MVC Framework: ASP.NET MVC 1.x&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;Other: Microsoft AntiXSS Library 2.x &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Finally, as the organization matures, a set of secure, shared libraries or frameworks should be created and utilized within software projects.  These shared libraries should be scrutinized for security defects and updated on a regular basis.  Since assessments and verifications occur on these libraries, teams may not need to spend time and money re-verifying them in their own projects.  Instead, only the appropriate usage or coupling of these libraries with custom code must be examined.&lt;br /&gt;&lt;br /&gt;Examples of frameworks an organization may produce are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Secure methods for accessing security services (discussed in the next section)&lt;/li&gt;&lt;li&gt;Secure methods for calling security resources (discussed in the next section)&lt;/li&gt;&lt;li&gt;Input validation frameworks&lt;/li&gt;&lt;li&gt;Unified authentication flows&lt;/li&gt;&lt;li&gt;Authorization or entitlement frameworks&lt;/li&gt;&lt;li&gt;and many more...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Security Services and Resources&lt;/span&gt;&lt;br /&gt;A collection of applications often utilize common web services, authentication servers, LDAP servers, or other entities.  Organizations should maintain a list of approved security services and resources, guidance informing project teams when it is appropriate to include the services or resources in a project, and the proper method for accessing or calling the service or resource.&lt;br /&gt;&lt;br /&gt;Standardization on central services or resources can greatly reduce efforts required to validate applications' security.  It also may eliminate the need to create an authentication or authorization strategy for each new project.&lt;br /&gt;&lt;br /&gt;Examples of security services organizations may standardize on are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Authentication/single sign-on servers&lt;/li&gt;&lt;li&gt;Web services providing entitlement or authorization details&lt;/li&gt;&lt;li&gt;Web services that serve as a central point for accessing encrypted credit card data&lt;/li&gt;&lt;li&gt;Web services that provide centralized auditing and logging capabilities&lt;/li&gt;&lt;li&gt;Web services that provide centralized key management and cryptography&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Security resources are often centralized data stores that applications can connect to and query.  A few examples are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;LDAP servers containing authentication and authorization information&lt;/li&gt;&lt;li&gt;Centralized, redundant file storage and backup&lt;/li&gt;&lt;/ul&gt;As the organization matures, custom frameworks should be created for accessing or calling functionality in these security services and resources (See the Approved Libraries and Frameworks section above).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Secure Coding Standards&lt;/span&gt;&lt;br /&gt;Developers are very good a developing software and implementing business requirements quickly and effectively; however, college, their programming textbook, or their expert programmer friend probably never taught them how to write secure code.   In order to ensure developers write secure and consistent code, organizations need to provide secure coding standards to teach and support secure coding practices.&lt;br /&gt;&lt;br /&gt;Secure coding standards should be presented in manner that can both teach developers and be used as a quick reference during the development process.  It should contain code examples in all approved languages and for each framework.  It should also provide examples of what NOT to do.  Here is a list of items to consider including within a secure coding standard:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Description of the standard&lt;/li&gt;&lt;li&gt;Statement of why its important&lt;/li&gt;&lt;li&gt;Explanation of when to use the approach or standard&lt;/li&gt;&lt;li&gt;Vulnerabilities that may result if the standard is not observed&lt;/li&gt;&lt;li&gt;Code examples in each language and framework&lt;/li&gt;&lt;li&gt;Code examples of what NOT to do&lt;/li&gt;&lt;li&gt;Links to external resources that provide additional information&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;A brief example is provided in my previous post "&lt;a href="http://nickcoblentz.blogspot.com/2009/05/secure-development-jump-start.html"&gt;Secure Development Jump Start&lt;/a&gt;."&lt;br /&gt;&lt;br /&gt;Once these standards are written, they can be matched up with security, compliance, and privacy requirements, which are discussed in the next section.  These coding standards allow organizations to hold project teams accountable for writing code that satisfies requirements.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Requirements&lt;/span&gt;&lt;br /&gt;A set of common security requirements should be created and shared throughout the organization.  These requirements should provide discrete, testable assertions which can be verified throughout the application development process (More on this idea in a later post).  An abbreviated example of a security requirement is:&lt;br /&gt;&lt;br /&gt;"Applications must use parameterized queries or prepared statements when querying relational databases.  Untrusted data must not be concatenated within dynamic SQL query strings."&lt;br /&gt;&lt;br /&gt;Another example related to integrating security services guidance is:&lt;br /&gt;&lt;br /&gt;"All external facing applications must utilize the organization's standard, centralized authentication server."&lt;br /&gt;&lt;br /&gt;The focus of these requirements is to provide a set of rules that developers can be and are held accountable for.  Developers often cannot be security experts, but they can be trained to follow and execute on software project requirements.  Assuming the organization documents the appropriate guidance and links this guidance to security requirements, development teams can be held accountable for security requirements in the same way they are held to business requirements.&lt;br /&gt;&lt;br /&gt;As business requirements are typically implemented based on a prioritized list, it will also be important to allow a member of the organization's security department help prioritize security requirements with project managers.&lt;br /&gt;&lt;br /&gt;In addition to security related requirements, privacy and compliance requirements must also be identified.  These requirements should be written to satisfy the policies discussed in the "Compliance Policies" and "Privacy Policies" sections above.&lt;br /&gt;&lt;br /&gt;Once a reasonable set of security, privacy, and compliance requirements have been established, a set of requirements profiles should be created for various project types.  For example, applications that must be PCI compliant will have many compliance requirements that overlap with security and privacy requirements.  The requirements profile "High Risk PCI Application" should contain a preprioritized list of requirements that combine and simplify items from the each category.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Vulnerabilities&lt;/span&gt;&lt;br /&gt;During the development process, application vulnerabilities are often identified and reported to project teams.  Typically, these reports provide a set of recommendations that will eliminate the vulnerability.  Depending on the source of these recommendations (a penetration testing tool, code review tool, internal security team, or third party consulting company) the prescriptive advice may or may not coincide with the organization's approved method for eliminating a vulnerability.  While general technical flaws like cross-site scripting are fairly straight forward, business logic, authentication, and authorization related issues may require organization specific approaches.&lt;br /&gt;&lt;br /&gt;Organizations should maintain a list of vulnerabilities and should link each vulnerability to security, compliance, and privacy requirements that address the issues.  This list of vulnerabilities should provide a short explanation of each issue and should label requirements with "Required", "Recommended", and "Optional."  The explanation for each issue does not need to be long, many application security sites like &lt;a href="http://www.owasp.org/index.php/Category:Vulnerability"&gt;OWASP&lt;/a&gt; already provide detailed descriptions for many vulnerabilities.  Below is an example of how an organization can document vulnerabilities within an internal AppSec Portal:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;SQL Injection&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SQL injection occurs when untrusted data is interpreted by the database as SQL commands.  This issue may allow users to read, modify, or destroy data without authorization.&lt;br /&gt;&lt;br /&gt;The following security, privacy, and compliance requirements should be used to address this vulnerability:&lt;br /&gt;&lt;br /&gt;Required:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Security: &amp;lt;link to parameterized queries and prepared statements requirement&amp;gt;&lt;/li&gt;&lt;li&gt;Compliance: &amp;lt;link to compliance requirement A&amp;gt;&lt;/li&gt;&lt;/ul&gt;Recommended:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Security: &amp;lt;link to input validation framework requirement&amp;gt;&lt;/li&gt;&lt;/ul&gt;Optional:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Security &amp;amp; Compliance: &amp;lt;link to auditing and logging requirement&amp;gt;&lt;/li&gt;&lt;/ul&gt;Resources:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.owasp.org/index.php/SQL_injection"&gt;OWASP -  SQL Injection&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.webappsec.org/projects/threat/classes/sql_injection.shtml"&gt;WASC - SQL Injection&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;External Resources&lt;/span&gt;&lt;br /&gt;Finally, the organization should provide a set of external resources that project and security teams can use to research application security topics and news.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-26623693819042027?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/26623693819042027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=26623693819042027' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/26623693819042027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/26623693819042027'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/07/internal-appsec-portals-resources.html' title='Internal AppSec Portals: Resources'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_opzlukmJgHU/SkwCJbQrtHI/AAAAAAAAAJs/VT_j0oevtYA/s72-c/AppSecResourcesTOC.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-4884084309331727677</id><published>2009-06-26T18:40:00.010-05:00</published><updated>2011-09-27T11:17:32.641-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>Internal AppSec Portals: Introduction</title><content type='html'>When creating an application security program, it can be difficult to make all the resources, policies, procedures, and expectations available to employees.  There should be a centralized location for developers, project managers, and auditors to look up application security best practices, the organization's secure development processes, and time lines for remediating vulnerabilities.&lt;br /&gt;&lt;br /&gt;The Software Assurance Maturity Model (SAMM) and Building Security In Maturity Model (BSIMM) recommend addressing these needs using an application security portal (See Software Assurance Maturity Model 1.0, EG3 "Create formal application security support portal" and Building Security In Maturity Model, SR1.2 "Create security portal."  This centralized internal website or application should be a one-stop shop for all the organization's secure development needs.&lt;br /&gt;&lt;br /&gt;So what kind of characteristics should this portal have?  Well, employees should be able to easily create and update information on the website.  Access controls need to be applied to specific content to ensure only approved guidance, policies, and procedures are included.  The portal should also allow collaboration within development groups as well as between development groups.  It would also be nice to be able to version documents to see how and when information changes over time.&lt;br /&gt;&lt;br /&gt;After reviewing these characteristics, I realized that a Wiki would provide all these features and could easily be placed within an organization's internal network.  Specifically, &lt;a href="http://tikiwiki.org/"&gt;TikiWiki&lt;/a&gt; provides collaboration through user pages, forums, blogs, chat, internal messages, and newsletters.  It also allows access controls to be applied to individual categories.  For example, a "Guidance" category can be created and pages can be grouped within this category.  Read only access can be granted to all users, and write access can be granted to specific individuals responsible for updating the organization's guidance documents.  A wiki also automatically versions pages so users can see when information is updated and how it changed.  Finally, TikiWiki also provides the concept of structures.  Structures group  pages in a meaningful way allowing easy navigation and well defined organization of information.&lt;br /&gt;&lt;br /&gt;The next several blog entries will cover my current project: providing a template or starting point for organization's internal application security portal.  The images below give you a sneak peek at the information that will be discussed in future posts.   Click on the images below to see each table of contents.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_opzlukmJgHU/SkY7u-P5j0I/AAAAAAAAAJk/KWbHzQ_iYuU/s1600-h/AppSecResourcesTOC.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 209px; height: 400px;" src="http://1.bp.blogspot.com/_opzlukmJgHU/SkY7u-P5j0I/AAAAAAAAAJk/KWbHzQ_iYuU/s400/AppSecResourcesTOC.PNG" alt="" id="BLOGGER_PHOTO_ID_5352030885346119490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_opzlukmJgHU/SkY7u-bzMKI/AAAAAAAAAJc/LW9qkxAu6FI/s1600-h/AppSecProjectsTOC.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 132px; height: 400px;" src="http://3.bp.blogspot.com/_opzlukmJgHU/SkY7u-bzMKI/AAAAAAAAAJc/LW9qkxAu6FI/s400/AppSecProjectsTOC.PNG" alt="" id="BLOGGER_PHOTO_ID_5352030885396033698" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-4884084309331727677?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/4884084309331727677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=4884084309331727677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/4884084309331727677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/4884084309331727677'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/06/internal-appsec-portals-introduction.html' title='Internal AppSec Portals: Introduction'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_opzlukmJgHU/SkY7u-P5j0I/AAAAAAAAAJk/KWbHzQ_iYuU/s72-c/AppSecResourcesTOC.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-1938968034494689691</id><published>2009-06-15T08:00:00.004-05:00</published><updated>2011-09-27T11:17:24.326-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Publications'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>*Repost* Web Application Security Portfolios</title><content type='html'>In anticipation of my article being published in the &lt;a href="http://nickcoblentz.blogspot.com/2009/05/issa-journal-web-application-security.html"&gt;May 2009 ISSA Journal&lt;/a&gt;, I removed posts for:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Application Security Portfolios: Part 1&lt;/li&gt;&lt;li&gt;Application Security Portfolios: Part 2&lt;/li&gt;&lt;/ul&gt;Now that the journal article has been out for a while, I wanted to repost those two blog entries.  The content in the blog entries is somewhat different than the journal article.  The blog entries include a few more images, examples, and additional discussion.  Here is that content:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Part 1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Managing an application security program can be a complex responsibility. Applications have a large number of moving parts and potential security risks. Security directors and managers must gather and organize a mountain of information in order to make informed decisions regarding allocating budget money for security and compliance efforts.&lt;br /&gt;&lt;br /&gt;This two part blog suggests types of information a security directory might collect about an organization's applications and introduces one of many methods to organize that information. The first article focuses on the collection of detailed information for one single application. The second article attempts to combine relevant information from each application into one single document in order to aide in make decisions.&lt;br /&gt;&lt;br /&gt;The goal is for these documents to be useful in at least the following situations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Maintaining a list of all web applications within the organization.&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Prioritizing application security assessment needs based on business and data importance, compliance requirements, and risk.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Identifying key personnel responsible for the security of systems or code associated with a particular application.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Determining network devices, servers, and components to target in an incident response investigation.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Identifying low importance applications that should be assessed due to the shared use of a database or other high importance component.&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Understanding the flow of sensitive data between applications and other components.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;Part 1: Loan Application Security Portfolio&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;First, one should gather a list of web applications within the organization. This should be done in a variety of ways including interviewing development managers and web server admins, logging into web servers and inventorying web applications, and by performing network scans over the internal and external network.&lt;br /&gt;&lt;br /&gt;Once applications have been identified, basic information should be collected such as the application's name and purpose, who developed the code, where the application is hosted, and business importance. This information can be organized in a variety of ways. A simple excel spreadsheet is shown below for simplicity.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_opzlukmJgHU/SZG6SrPDO7I/AAAAAAAAAHI/p73YMwkHCLo/s1600-h/Loan+Application+-+Overview.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 394px;" src="http://1.bp.blogspot.com/_opzlukmJgHU/SZG6SrPDO7I/AAAAAAAAAHI/p73YMwkHCLo/s400/Loan+Application+-+Overview.png" alt="" id="BLOGGER_PHOTO_ID_5301223066398047154" border="0" /&gt;&lt;/a&gt;(Click the image to enlarge)&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Detailed technical information should also be gathered. This includes items such as the language and framework the application was developed with and the authorization levels that exist. The information shown below is helpful for scoping application assessments with third parties or can be used to estimate time needed for an internal review.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_opzlukmJgHU/SZRDTCnwx9I/AAAAAAAAAIg/CMU4TuSjpTM/s1600-h/Technical.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 211px;" src="http://3.bp.blogspot.com/_opzlukmJgHU/SZRDTCnwx9I/AAAAAAAAAIg/CMU4TuSjpTM/s400/Technical.PNG" alt="" id="BLOGGER_PHOTO_ID_5301936655722137554" border="0" /&gt;&lt;/a&gt;(Click the image to enlarge)&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Once the technical information has been documented, security staff can dig into the type of data handled by the application and its data flow. In the example loan application, a table listing the data or event, data type, and relevant compliance requirements was created.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_opzlukmJgHU/SZG7jzjJniI/AAAAAAAAAHQ/za4YMZx9oH0/s1600-h/Loan+Application+-+Data.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 166px;" src="http://4.bp.blogspot.com/_opzlukmJgHU/SZG7jzjJniI/AAAAAAAAAHQ/za4YMZx9oH0/s400/Loan+Application+-+Data.PNG" alt="" id="BLOGGER_PHOTO_ID_5301224460199239202" border="0" /&gt;&lt;/a&gt;(Click the image to enlarge)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Through interviews with developers and direct observation, a data flow diagram can be created. The method used to collect and present this information was taken directly from Branden R. Williams' article in the ISSA Journal, March 2008 titled "&lt;a href="http://www.brandenwilliams.com/brwpubs/publishedversions/Williams%20-%20Data%20Flows%20Made%20Easy.pdf"&gt;Data Flows Made Easy&lt;/a&gt;." In the loans application, individual data flow diagrams were created for key functionality. Once individual diagrams were complete, the diagrams were combined into one compound diagram.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_opzlukmJgHU/SZG9UIaHl-I/AAAAAAAAAHY/4m4LeWkk9IU/s1600-h/Loan+Application+-+Individual+Data+Flow+Diagram.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 346px;" src="http://3.bp.blogspot.com/_opzlukmJgHU/SZG9UIaHl-I/AAAAAAAAAHY/4m4LeWkk9IU/s400/Loan+Application+-+Individual+Data+Flow+Diagram.PNG" alt="" id="BLOGGER_PHOTO_ID_5301226389943850978" border="0" /&gt;&lt;/a&gt;(Click the image to enlarge)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_opzlukmJgHU/SZG9UASW_GI/AAAAAAAAAHg/YOVOxbTrIFQ/s1600-h/Loan+Application+-+Compound+Data+Flow+Diagram.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 348px;" src="http://2.bp.blogspot.com/_opzlukmJgHU/SZG9UASW_GI/AAAAAAAAAHg/YOVOxbTrIFQ/s400/Loan+Application+-+Compound+Data+Flow+Diagram.PNG" alt="" id="BLOGGER_PHOTO_ID_5301226387763821666" border="0" /&gt;&lt;/a&gt;(Click the image to enlarge)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Next, the network devices, servers, and components that the application depends upon should be documented. These assets are also color coded based on how important the application or data is on the asset (this will be more important in part two of the article). Instructions and an example for the loans application is shown below.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_opzlukmJgHU/SZG-6sSKN6I/AAAAAAAAAHo/Chnp1OB2wLs/s1600-h/Loan+Application+-+Dependencies.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 383px; height: 400px;" src="http://4.bp.blogspot.com/_opzlukmJgHU/SZG-6sSKN6I/AAAAAAAAAHo/Chnp1OB2wLs/s400/Loan+Application+-+Dependencies.PNG" alt="" id="BLOGGER_PHOTO_ID_5301228151920801698" border="0" /&gt;&lt;/a&gt;(Click the image to enlarge)&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Using the dependency table above, pseudo firewall rules can also be defined.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_opzlukmJgHU/SZG_izfkrjI/AAAAAAAAAHw/grx0lMFqupg/s1600-h/Loan+Application+-+Firewall+Rules.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 49px;" src="http://3.bp.blogspot.com/_opzlukmJgHU/SZG_izfkrjI/AAAAAAAAAHw/grx0lMFqupg/s400/Loan+Application+-+Firewall+Rules.PNG" alt="" id="BLOGGER_PHOTO_ID_5301228841050877490" border="0" /&gt;&lt;/a&gt;(Click the image to enlarge)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;A couple other pieces of information that may be helpful to track are past, present, and future code bases, location of log files, and security related history.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_opzlukmJgHU/SZHAsy9zd6I/AAAAAAAAAII/T3dih_EUcVI/s1600-h/Loan+Application+-+code+bases.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 71px;" src="http://2.bp.blogspot.com/_opzlukmJgHU/SZHAsy9zd6I/AAAAAAAAAII/T3dih_EUcVI/s400/Loan+Application+-+code+bases.png" alt="" id="BLOGGER_PHOTO_ID_5301230112219559842" border="0" /&gt;&lt;/a&gt;(Click the image to enlarge)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_opzlukmJgHU/SZHAsszegdI/AAAAAAAAAH4/zPuKqt5-QhA/s1600-h/Loan+Application+-+logs.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 80px;" src="http://4.bp.blogspot.com/_opzlukmJgHU/SZHAsszegdI/AAAAAAAAAH4/zPuKqt5-QhA/s400/Loan+Application+-+logs.PNG" alt="" id="BLOGGER_PHOTO_ID_5301230110565630418" border="0" /&gt;&lt;/a&gt;(Click the image to enlarge)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_opzlukmJgHU/SZHAsmSe3AI/AAAAAAAAAIA/Unc8mXo4wPk/s1600-h/Loan+Application+-+history.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 273px; height: 79px;" src="http://4.bp.blogspot.com/_opzlukmJgHU/SZHAsmSe3AI/AAAAAAAAAIA/Unc8mXo4wPk/s400/Loan+Application+-+history.PNG" alt="" id="BLOGGER_PHOTO_ID_5301230108816628738" border="0" /&gt;&lt;/a&gt;(Click the image to enlarge)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Using the information in the following spreadsheet, one should be able to answer the following questions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Do we host that application or does a third party host it for us?&lt;/li&gt;&lt;li&gt;Who developed the application?&lt;/li&gt;&lt;li&gt;Does this application need to be assessed?&lt;/li&gt;&lt;li&gt;What additional network devices, systems, or components need to be assessed to assure the security of this application and its data?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Are there compliance requirements associated with this application?&lt;/li&gt;&lt;li&gt;What risk does this application present to the organization?&lt;/li&gt;&lt;li&gt;We've been hacked! Which development manager do I call?  Where are the log files?  What other systems might also be affected?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Where is the information I can use during scoping and the technical interview process of an assessment from &lt;a href="http://entsecurity.verisign.com/global_security_consulting/"&gt;VeriSign Global Security Consulting&lt;/a&gt;?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Google Docs Version: &lt;a href="http://dl.getdropbox.com/u/1132296/Web%20Application%20Security%20Portfolios/CCANCSA%20-%20Application%20Portfolio.xls"&gt;http://dl.getdropbox.com/u/1132296/Web%20Application%20Security%20Portfolios/CCANCSA%20-%20Application%20Portfolio.xls&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Part 2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Managing an application security program can be a complex responsibility. Applications have a large number of moving parts and potential security risks. Security directors and managers must gather and organize a mountain of information in order to make informed decisions regarding allocating budget money for security and compliance efforts.&lt;br /&gt;&lt;br /&gt;This two part blog suggests types of information a security directory might collect about an organization's applications and introduces one of many methods to organize that information. The first article focuses on the collection of detailed information for one single application. The second article attempts to combine relevant information from each application into one single document in order to aide in make decisions.&lt;br /&gt;&lt;br /&gt;The goal is for these documents to be useful in at least the following situations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Maintaining a list of all web applications within the organization.&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Prioritizing application security assessment needs based on business and data importance, compliance requirements, and risk.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Identifying key personnel responsible for the security of systems or code associated with a particular application.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Determining network devices, servers, and components to target in an incident response investigation.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Identifying low importance applications that should be assessed due to the shared use of a database or other high importance component.&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Understanding the flow of sensitive data between applications and other components.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;Part 2: Application Security Portfolios Summary&lt;/span&gt;&lt;br /&gt;In &lt;a href="http://nickcoblentz.blogspot.com/2009/02/application-security-portfolios-part-1.html"&gt;part 1&lt;/a&gt; of this series, an application security portfolio was created for an example loan application. Detailed information about the application was gathered including the sensitivity of data within the application, the data flow, and the application's dependencies on other network devices, servers, and components.&lt;br /&gt;&lt;br /&gt;In part 2, we will try to organize information about all the organization's applications into one high-level document. The aim is for this document to aid us in answering questions like:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;What applications do I have?&lt;/li&gt;&lt;li&gt;What data do I have?&lt;/li&gt;&lt;li&gt;How important is the application or its data to my business?&lt;/li&gt;&lt;li&gt;What risk level is that application or data at?&lt;/li&gt;&lt;li&gt;What Systems and network paths do these applications depend on?&lt;/li&gt;&lt;li&gt;How are these applications and its data interrelated?&lt;/li&gt;&lt;li&gt;Which applications, systems, and networks should I spend security budget money on for assessments?&lt;/li&gt;&lt;li&gt;If an incident occurs or an issue is identified, who is the contact person and what other related systems need to be analyzed?&lt;/li&gt;&lt;li&gt;What compliance regulations apply to my applications?&lt;/li&gt;&lt;li&gt;When was the last time these applications were found to be compliant with relevant regulations and standards?&lt;/li&gt;&lt;/ul&gt;In order to create this document, the effort described in &lt;a href="http://nickcoblentz.blogspot.com/2009/02/application-security-portfolios-part-1.html"&gt;Part 1&lt;/a&gt; of this series needs to be completed for all the organization's applications. Once that data has been gathered, we can combine the high-level portions into a spreadsheet like the one below.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_opzlukmJgHU/SZL9-EfyD8I/AAAAAAAAAIQ/x-_UhSimenQ/s1600-h/Compound+Application+Summary+Table.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 46px;" src="http://3.bp.blogspot.com/_opzlukmJgHU/SZL9-EfyD8I/AAAAAAAAAIQ/x-_UhSimenQ/s400/Compound+Application+Summary+Table.png" alt="" id="BLOGGER_PHOTO_ID_5301578954169257922" border="0" /&gt;&lt;/a&gt;(Click to enlarge the image)&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;If we are evaluating this information to determine which applications need assessments, we may make the observations listed below.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Loans Application&lt;/span&gt;&lt;br /&gt;The loans application and its data are critical to the business. We completed an application assessment recently on version 1.0, however a whole new version was pushed to production in the last few days (version 2.0). Since this application is so important and we have recently completed an assessment, it may be a good idea to engage the same third party to perform a follow up assessment. We will provide that third part with a list of changes or new features and ensure those items are assessed in depth. In addition, that third party will briefly review the rest of the application to ensure no security issues were introduced in existing functionality by the changes or new features.&lt;br /&gt;&lt;br /&gt;If we need a higher level of assurance, need to re-certify our PCI compliance, or drastic changes to the application were made in version 2.0 we may even have a whole new assessment completed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Company Home Page&lt;/span&gt;&lt;br /&gt;An assessment was completed approximate three years ago, and no new changes or features have been introduced since then. While it is important that a public facing website for the company is accessible externally, the data within the application is not terribly valuable.&lt;br /&gt;&lt;br /&gt;Depending on the level of assurance needed, we may want to run an automated web application scanner tool just to verify our assumption that the site is relatively secure. If issues are identified, it may be a good idea to perform an assessment internally. Since the company home page does not require users to login and contains only public information, an automated tool is a good choice because the types of vulnerabilities that are challenging to identify using these tools (authentication, authorization, and business logic rules) should not be present.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Online Banking&lt;/span&gt;&lt;br /&gt;The online banking application also has not been assessed in a while. This application and its data are critical to the business. The previous assessment occurred on version 3.0. Bug fixes, security updates, and other minor changes were introduced recently in version 3.1. A third party should be engaged to perform follow up testing to verify issues identified in the previous assessment have been addressed. The third party should also assess the minor changes to the application to ensure no additional issues have been introduced.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Internal Wiki&lt;/span&gt;&lt;br /&gt;The company's wiki page contains items such as HR policies, processes and procedures for completing day to day tasks, and also contains protected application areas containing private company information or intellectual property. The data associated with this application is critical. This application has never been assessed before. While this application is not a client-facing application, employees, contractors, and other users all access this critical information. This situation may warrant an assessment by a third party.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Employment Application&lt;/span&gt;&lt;br /&gt;The employment application is developed and hosted by a third party. Ideally, before this application/service was purchased, a third party assessment should have been performed, and the company should verify that the third party has a secure development process in place. Additionally, the contract between the third party and the company should include details about how assessments are handled, how the third party will respond to the identification of security issues, and other related topics.&lt;br /&gt;&lt;br /&gt;As is often the case, a business unit negotiated a contract and purchased service from the third party prior to an assessment being performed. While the employment application does not generate revenue for the company and will not hinder day to day operations if the application goes down, the data within the application includes PII. The compromise of this application and its data will affect the company's reputation and will require the company to spend resources on incident response.&lt;br /&gt;&lt;br /&gt;It is a good idea if this application undergoes a third party review.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Compound Dependency Table&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In addition to gathering the high-level data above, a dependency table can be created to show how all the applications, data, network devices, servers, and components are interrelated. This table follows the same rules as introduced in &lt;a href="http://nickcoblentz.blogspot.com/2009/02/application-security-portfolios-part-1.html"&gt;Part 1&lt;/a&gt; of this series, and can be used to determine how data flows between systems and networks. Additionally, this information may help to identify key systems that need to be assessed.&lt;br /&gt;&lt;br /&gt;For example, if a low importance application accesses data within a database that is also accessed by a high importance application, it may be important to assess the low importance application in terms of introducing or manipulating data to the detriment of the high importance application.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_opzlukmJgHU/SZL9-N9RqPI/AAAAAAAAAIY/UNgnA7DekWs/s1600-h/Compount+Dependencies+Table.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 222px; height: 400px;" src="http://2.bp.blogspot.com/_opzlukmJgHU/SZL9-N9RqPI/AAAAAAAAAIY/UNgnA7DekWs/s400/Compount+Dependencies+Table.png" alt="" id="BLOGGER_PHOTO_ID_5301578956708882674" border="0" /&gt;&lt;/a&gt;(Click to enlarge the image)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;This spreadsheet can be accessed via Google docs here:&lt;br /&gt;&lt;a href="http://dl.getdropbox.com/u/1132296/Web%20Application%20Security%20Portfolios/CCANCSA%20-%20Portfolios%20Summary.xls"&gt;http://dl.getdropbox.com/u/1132296/Web%20Application%20Security%20Portfolios/CCANCSA%20-%20Portfolios%20Summary.xls&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-1938968034494689691?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/1938968034494689691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=1938968034494689691' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/1938968034494689691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/1938968034494689691'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/06/repost-web-application-security.html' title='*Repost* Web Application Security Portfolios'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_opzlukmJgHU/SZG6SrPDO7I/AAAAAAAAAHI/p73YMwkHCLo/s72-c/Loan+Application+-+Overview.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-4063527019515413049</id><published>2009-06-07T12:16:00.006-05:00</published><updated>2011-09-27T11:34:04.424-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='SAMM'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>SAMM Inteview Template Version 1.0</title><content type='html'>Several individuals (including me) plan on proposing an effort to evaluate the &lt;a href="http://www.owasp.org/"&gt;OWASP&lt;/a&gt; organization using the &lt;a href="http://www.opensamm.org/"&gt;Software Assurance Maturity Model&lt;/a&gt; (SAMM).  One of the action items I took on was to create an interview template to help determine the organization's current maturity level.&lt;br /&gt;&lt;br /&gt;The first release of the SAMM Interview Template is available below.&lt;br /&gt;&lt;br /&gt;View the SAMM Interview Template here: &lt;a href="http://spreadsheets.google.com/pub?key=rYpVqQR3026Zu4DNg8LBIwg&amp;amp;output=html"&gt;http://spreadsheets.google.com/pub?key=rYpVqQR3026Zu4DNg8LBIwg&amp;amp;output=html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Download the SAMM Interview Template XLS here (Some formatting is lost): &lt;a href="http://spreadsheets.google.com/pub?key=rYpVqQR3026Zu4DNg8LBIwg&amp;amp;output=xls"&gt;http://spreadsheets.google.com/pub?key=rYpVqQR3026Zu4DNg8LBIwg&amp;amp;output=xls&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you have questions or comments about this template or you wish to help assess OWASP using SAMM, please send a message out on the &lt;a href="https://lists.owasp.org/mailman/listinfo/samm"&gt;OWASP SAMM Mailing List&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-4063527019515413049?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/4063527019515413049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=4063527019515413049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/4063527019515413049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/4063527019515413049'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/06/samm-inteview-template-version-10.html' title='SAMM Inteview Template Version 1.0'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-9060193927798621743</id><published>2009-05-29T12:52:00.006-05:00</published><updated>2011-09-27T11:16:56.702-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>Preparing For a Third Party Application Assessment</title><content type='html'>Organizations often contract with third party consulting companies to perform application assessments.  These companies usually have a predefined window for assessing applications and may charge by the hour.  These characteristics make it important for development groups to ensure the application and staff are adequately prepared for the assessment.&lt;br /&gt;&lt;br /&gt;For this discussion, we will assume an application assessment has already been scoped and scheduled.  Before the consulting company begins any testing, the development group should use a checklist to ensure the following items have been covered:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Appoint a technical contact to handle any questions about code, functionality, or security controls.&lt;/li&gt;&lt;li&gt;Appoint a contact to handle account lockouts or other technical difficulties with the environment or application.&lt;/li&gt;&lt;li&gt;Send contact information to the consulting company or consultants.&lt;/li&gt;&lt;li&gt;Identify and configure a test environment that closely mirrors production.&lt;/li&gt;&lt;li&gt;Create appropriate credentials for a range of organizations and privileged levels.&lt;/li&gt;&lt;li&gt;Populate the environment with adequate data to allow for testing of all functionality and features.&lt;/li&gt;&lt;li&gt;Provide a demonstration of the application and answer technical questions.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;Identify and Configure a Test Environment&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The test environment should mirror production as closely as possible including the configuration of the operating systems, application servers, back-end components, and the application itself.  However, the environment should not persist any transactions or changes in the real world.  For example, stock trades, money transfers, etc should appear to complete, but the transaction should not be persisted to any banks.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Create Appropriate Credentials&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Each consultant assigned to assess the application needs a range of accounts that allow for testing of horizontal and vertical access controls.  This means if the application separates data by organization, company, institution, or some other group, the consultants will need accounts in two or three of these organizational units.&lt;br /&gt;&lt;br /&gt;Additionally, within each of these organizational units, consultants require accounts that span several roles, permission, or entitlements.  If there are a small set of roles within the application, it may be possible to create test accounts for each role.  Otherwise, it may be sufficient to create a sample of accounts, one with no entitlements, one with all entitlements, and a handful of other accounts with varying permission-levels.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Populate the Environment with Adequate Data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In most applications, consultants cannot test functionality without having data associated with their user account.  Before consultants begin testing, the application should be populated with test data that allows users to interact with all functionality.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-9060193927798621743?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/9060193927798621743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=9060193927798621743' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/9060193927798621743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/9060193927798621743'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/05/preparing-for-third-party-application.html' title='Preparing For a Third Party Application Assessment'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-972021178660389696</id><published>2009-05-19T12:35:00.005-05:00</published><updated>2011-09-27T11:16:15.925-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft SDL'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>Microsoft SDL Process Template</title><content type='html'>Microsoft has released a Visual Studio module that helps developers adhere to Microsoft's SDL process.  This tool has a whole lot of things right such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ensuring developers complete security activities before checking in code&lt;/li&gt;&lt;li&gt;Providing a workflow for developers to follow&lt;/li&gt;&lt;li&gt;Providing SDL process steps, instructions, descriptions, and resources to developers&lt;/li&gt;&lt;/ul&gt;Tools, such a the SDL Process Template released by Microsoft, can greatly increase the success rate of an organization's migration towards a secure software development process.  Once organizations define their own custom secure development process, a similar approach should be used to help make adherence easier.&lt;br /&gt;&lt;br /&gt;Check out the video on the following page for more information:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/security/dd670265.aspx"&gt;http://msdn.microsoft.com/en-us/security/dd670265.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-972021178660389696?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/972021178660389696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=972021178660389696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/972021178660389696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/972021178660389696'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/05/microsoft-sdl-process-template.html' title='Microsoft SDL Process Template'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-1040118411134332190</id><published>2009-05-19T08:00:00.001-05:00</published><updated>2011-09-27T11:16:06.512-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>Secure Development Jump Start</title><content type='html'>Creating a secure development process for an organization is a huge undertaking.  There is a tremendous array of options for getting started and no certain metric for determining how long it should take to adopt the process.  Some of those options include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.opensamm.org/Home.html"&gt;Software Assurance Maturity Model&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.owasp.org/index.php/Category:OWASP_CLASP_Project"&gt;Comprehensive, Lightweight Application Security Process&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cigital.com/training/touchpoints/"&gt;Software Security Touchpoints&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/security/cc448177.aspx"&gt;Microsoft Secure Development Lifecycle&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.bsi-mm.com/"&gt;Building Security In Maturity Model&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Create your own custom process&lt;/li&gt;&lt;/ul&gt;There are some components that all of these processes agree on.  Executive level support is a must and security training is required (each process differs on the amount of training, however).&lt;br /&gt;&lt;br /&gt;In companies with a small number of developers that have been there for a long period of time, it may make sense to dedicate a large amount of time and money to make them both developers and security experts.  For organizations with a large number of developers or high developer turn over rate, it may be more cost efficient to simply provide security awareness training and a set of policies and coding standards to follow.&lt;br /&gt;&lt;br /&gt;In any of these situations, several steps you can take to jump start a secure development process for your organization are listed below.  It is assumed that your organization values and desires to develop secure code.&lt;ol&gt;&lt;li&gt;Create a policy document addressing application security.&lt;/li&gt;&lt;li&gt;Create a secure coding standard stating the organization's established, secure method for carrying out specific functions.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Provide security awareness training.&lt;/li&gt;&lt;li&gt;Provide training that specifically aims to introduce developers to the application security policies and secure coding standards for the organization.&lt;/li&gt;&lt;/ol&gt;These steps should fit in to any future secure development process and do not require organizations to spend any security budget dollars on tools.  These steps are a starting point and should be joined with a larger, strategic process once the appropriate research and planning is performed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Application Security Policies&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;An application security policy document should provide statements or policies that are as specific as possible.  A statement such as "All applications should use sufficiently strong cryptographic algorithms" does not provide a developer with enough information to select a secure algorithm.  Instead, a statement such as "ACME Bank Corp standardizes on the use of SHA256 as a secure symmetric cryptographic algorithm" should be used.&lt;br /&gt;&lt;br /&gt;Other examples include:&lt;br /&gt;"ACME Bank Corp requires all database queries to use parameterized queries or prepared statements.  Dynamic or concatenated SQL is prohibited.  The ACME Bank Corp secure coding standard provides examples of parameterized queries or prepared statements."&lt;br /&gt;&lt;br /&gt;"Untrusted data should be properly output encoded before being included within a web browser page.  The appropriate encoding method should be selected based on the context in which the data is being included.  The secure coding standard provides example contexts and methods."&lt;br /&gt;&lt;br /&gt;The authors of the application security policy document can get policy ideas from resources such as:&lt;br /&gt;&lt;a href="http://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project"&gt;OWASP Top 10&lt;/a&gt;&lt;br /&gt;&lt;a href="http://cwe.mitre.org/top25/"&gt;2009 CWE/SANS Top 25 Most Dangerous Programming Errors&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.owasp.org/index.php/Category:OWASP_Guide_Project"&gt;OWASP Guide Project&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa480474.aspx"&gt;&lt;/a&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms998249.aspx"&gt;ASP.NET 2.0 Check List&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa480474.aspx"&gt;&lt;/a&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa480473.aspx"&gt;ADO.NET 2.0 Check List&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa480474.aspx"&gt;.NET 2.0 Check List&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Secure Coding Standard&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Developers should be able to use the secure coding standard document as a reference guide for writing secure code.  The standard should provide the developer with enough information to know when and how to apply a particular code example.  An entry such as the following is a good starting point:&lt;br /&gt;&lt;br /&gt;Parameterized Queries and Prepared Statements&lt;br /&gt;&lt;br /&gt;Addressed Application Security Policy: Parameterized Queries or Stored Procedures, Section 2.1.3&lt;br /&gt;Prevents: SQL Injection&lt;br /&gt;References &lt;a href="http://www.owasp.org/index.php/Top_10_2007-A2"&gt;OWASP Top 10&lt;/a&gt;, &lt;a href="http://cwe.mitre.org/top25/#CWE-89"&gt;CWE/SANS Top 25&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/ms998264.aspx#pagguidelines0002_sqlinjection"&gt;Security Guidelines: ADO.NET 2.0&lt;/a&gt;, &lt;a href="http://www.owasp.org/index.php/Interpreter_Injection#SQL_Injection"&gt;OWASP Guide&lt;/a&gt;&lt;br /&gt;When to Apply: Anytime an application queries an SQL database&lt;br /&gt;Code Examples:&lt;br /&gt;&lt;br /&gt;.NET Parameterized Query, SELECT Statement (example taken from http://msdn.microsoft.com/en-us/library/ms998264.aspx#pagguidelines0002_sqlinjection)&lt;br /&gt;&lt;pre class="libCScode" style="white-space: pre-wrap;" id="ctl00_rs1_mainContentContainer_ctl09" space="preserve"&gt;using System.Data;&lt;br /&gt;using System.Data.SqlClient;&lt;br /&gt;&lt;br /&gt;using (SqlConnection connection = new SqlConnection(connectionString))&lt;br /&gt;{&lt;br /&gt;DataSet userDataset = new DataSet();&lt;br /&gt;SqlDataAdapter myDataAdapter = new SqlDataAdapter(&lt;br /&gt;"SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id",&lt;br /&gt;connection);&lt;br /&gt;myDataAdapter.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);&lt;br /&gt;myDataAdapter.SelectCommand.Parameters["@au_id"].Value = SSN.Text;&lt;br /&gt;myDataAdapter.Fill(userDataset);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;.NET Parameterized Query, UPDATE Statement&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;.NET Parameterized Query, INSERT Statement&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Java Prepared Statement, SELECT&lt;br /&gt;&lt;pre class="libCScode" style="white-space: pre-wrap;" id="ctl00_rs1_mainContentContainer_ctl09" space="preserve"&gt;String sql = "SELECT * FROM movies WHERE year_made = ?";&lt;br /&gt;prest = con.prepareStatement(sql);&lt;br /&gt;prest.setInt(1,2002);&lt;br /&gt;ResultSet rs1 = prest.executeQuery();&lt;br /&gt;&lt;/pre&gt;Java Prepared Statement, UPDATE&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Security Awareness Training&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Security awareness classes are typically used to introduce developers and managers to the types of vulnerabilities found in applications as well as the impact of those issues.  When a developer sees for the first time that an SQL injection attack on SQL Server can be used to read arbitrary files and execute DOS commands, a light bulb seems to come on inside their head and they realize they really do need to pay attention and prevent these vulnerabilities.&lt;br /&gt;&lt;br /&gt;While these classes often do not arm developers with the proper tools and knowledge for preventing vulnerabilities, a well written application security policy and secure coding standards document should be a great start.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Application Security Policies and Secure Coding Standard Training&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Following a security awareness class, it is beneficial to provide a more targeted training opportunity for developers.  This course should be focused upon going through the organizations application security policies and coding standards to ensure all developers are aware of these resources and understand how to use and apply them.  Following the course, developers can be held accountable for applying the examples in the secure coding standards to their projects.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Process Improvement&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It is likely that an application security policy and secure coding standard document will not include all the possible vulnerabilities that could be introduced into a web application.  As new issues are identified as part of an assessment, peer review process, or threat model (these steps are usually included within a complete secure development process), additions should be made to both documents.  These additions should reflect the organization's recommended approach for developing code without introducing the newly identified flaw.  The organization should also periodically review application security concepts and new additions to the policies and standards document with its developers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-1040118411134332190?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/1040118411134332190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=1040118411134332190' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/1040118411134332190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/1040118411134332190'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/05/secure-development-jump-start.html' title='Secure Development Jump Start'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-7568434861234779976</id><published>2009-05-08T10:23:00.005-05:00</published><updated>2011-09-27T11:15:58.614-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Publications'/><title type='text'>ISSA Journal: Web Application Security Portfolios</title><content type='html'>My article "Web Application Security Portfolios" was published in the May ISSA Journal!&lt;br /&gt;&lt;br /&gt;Check it out here (Must be an ISSA member): &lt;a href="http://www.issa.org/Members/Journals-Archive/2009.html#May"&gt;http://www.issa.org/Members/Journals-Archive/2009.html#May&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://nickcoblentz.blogspot.com/2009/06/repost-web-application-security.html"&gt;Here&lt;/a&gt; is another version of the same information.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-7568434861234779976?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/7568434861234779976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=7568434861234779976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/7568434861234779976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/7568434861234779976'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/05/issa-journal-web-application-security.html' title='ISSA Journal: Web Application Security Portfolios'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-7093600050824023649</id><published>2009-05-07T14:47:00.004-05:00</published><updated>2011-09-27T11:32:19.903-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts 2'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Coding'/><title type='text'>Struts 2 Security Addons Code Repository</title><content type='html'>I have created a code repository for the struts 2 security modules listed in the appendix section of paper "&lt;a href="http://www.owasp.org/index.php/Image:A_Gap_Analysis_of_Application_Security_in_Struts2.pdf"&gt;A Gap Analysis of Application Security in Struts2&lt;/a&gt;" by Arshan Dabirsiaghi and the &lt;a href="http://www.owasp.org/index.php/Category:Intrinsic_Security_Working_Group"&gt;OWASP ISWG&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The code repository can be found below, and it allows anyone to download the code and use it within their own project.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/struts2securityaddons/"&gt;http://code.google.com/p/struts2securityaddons/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Additionally, you can see discussion of these modules in my earlier blog posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-7093600050824023649?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/7093600050824023649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=7093600050824023649' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/7093600050824023649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/7093600050824023649'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/05/struts-2-security-addons-code.html' title='Struts 2 Security Addons Code Repository'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-6836085783122892525</id><published>2009-05-04T17:55:00.006-05:00</published><updated>2011-09-27T11:28:00.593-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Coding'/><title type='text'>Light-weight Code Review as You Program (Not After You're Done)</title><content type='html'>I have been working on a project lately to perform (some) code review as code is written, rather than waiting until it is checked in to cvs/svn/etc.  My solution was to create an IDE plug-in that leverages built in features to highlight insecure method calls and suggest alternate code.&lt;br /&gt;&lt;br /&gt;When the IDE starts up, it gets an updated list of insecure methods and hints from a web service.  Right now I am in the very early stages, so It isn't real pretty or refined yet.  For now, I am calling the project Just-in-Time (JIT) Secure Code.&lt;br /&gt;&lt;br /&gt;The video below demonstrates the concept in NetBeans.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/kai74fKEaXg&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/kai74fKEaXg&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-6836085783122892525?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/6836085783122892525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=6836085783122892525' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/6836085783122892525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/6836085783122892525'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/05/light-weight-code-review-as-you-program.html' title='Light-weight Code Review as You Program (Not After You&apos;re Done)'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-7265270169814177410</id><published>2009-05-04T11:46:00.006-05:00</published><updated>2011-09-27T11:32:19.913-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts 2'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Coding'/><title type='text'>OWASP ISWG: Struts 2/WebWork Gap Analysis</title><content type='html'>&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Arshan&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Dabirsiaghi&lt;/span&gt; recently published "A Gap Analysis of Application Security in Struts2/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;WebWork&lt;/span&gt;" for the &lt;a href="https://www.owasp.org/index.php/Intrinsic_Security_Working_Group"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;OWASP&lt;/span&gt; Intrinsic Security Working Group&lt;/a&gt;.  The paper evaluates the security controls/features that are either built into Struts 2 or can be added by extending the framework.&lt;br /&gt;&lt;br /&gt;I had the opportunity to contribute research and code to this paper.  The appendix section contains several code examples showing how one might:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Create an authentication interceptor&lt;/li&gt;&lt;li&gt;Create a roles interceptor (Enforced page-level access controls based on a user's privilege level)&lt;/li&gt;&lt;li&gt;Create a caching headers interceptor&lt;/li&gt;&lt;li&gt;Prevent &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;CSRF&lt;/span&gt; vulnerabilities using the built in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;tokenSession&lt;/span&gt; Interceptor&lt;/li&gt;&lt;li&gt;Implement a custom error handler&lt;/li&gt;&lt;li&gt;Create an interceptor that enforces &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;SSL&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Regenerate session IDs when users cross an authentication boundary&lt;/li&gt;&lt;/ul&gt;The paper can be found here:&lt;br /&gt;&lt;a href="http://www.owasp.org/index.php/Image:A_Gap_Analysis_of_Application_Security_in_Struts2.pdf"&gt;http://www.owasp.org/index.php/Image:A_Gap_Analysis_of_Application_Security_in_Struts2.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The code repository containing updated struts 2 modules can be found below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/struts2securityaddons/"&gt;http://code.google.com/p/struts2securityaddons/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Additionally, you can see discussion of these modules in my earlier blog posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-7265270169814177410?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/7265270169814177410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=7265270169814177410' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/7265270169814177410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/7265270169814177410'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/05/owasp-iswg-struts-2webwork-gap-analysis.html' title='OWASP ISWG: Struts 2/WebWork Gap Analysis'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-8584643358124731056</id><published>2009-04-17T09:08:00.008-05:00</published><updated>2011-09-27T11:15:21.023-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Injection'/><title type='text'>OWASP's SQL Injection Prevention Cheat Sheet</title><content type='html'>Recently, SQL injection has become a popular topic in the security world.  A quick look at the articles below show that many organizations are suffering from breaches due to SQL Injection.  These incidents have lead to the disclosure of credit card numbers, social security numbers, or other personal/sensitive information.&lt;br /&gt;&lt;br /&gt;Breach Information:&lt;br /&gt;&lt;a href="http://www.webappsec.org/projects/whid/byclass_class_attack_method_value_sql_injection.shtml"&gt;http://www.webappsec.org/projects/whid/byclass_class_attack_method_value_sql_injection.shtml&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://datalossdb.org/incidents/1230-sql-injection-hack-exposes-names-credit-card-numbers-cvv-codes-of-hundreds"&gt;http://datalossdb.org/incidents/1230-sql-injection-hack-exposes-names-credit-card-numbers-cvv-codes-of-hundreds&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://datalossdb.org/incidents/1364-sql-injection-hack-exposes-names-addresses-and-ccn"&gt;http://datalossdb.org/incidents/1364-sql-injection-hack-exposes-names-addresses-and-ccn&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Many development groups struggle to address these vulnerabilities within their software.  In March, OWASP released the "&lt;a href="http://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet"&gt;SQL Injection Prevention Cheat Sheet&lt;/a&gt;."  This short article discusses  developers' options for addressing SQL Injection.  If this article were to become required reading for all developers, I believe it would result in significantly fewer data breach incidents due to web application vulnerabilities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-8584643358124731056?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/8584643358124731056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=8584643358124731056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/8584643358124731056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/8584643358124731056'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/04/owasps-sql-injection-prevention-cheat.html' title='OWASP&apos;s SQL Injection Prevention Cheat Sheet'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-7293944822612243788</id><published>2009-03-26T15:18:00.009-05:00</published><updated>2011-09-27T11:34:04.429-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SAMM'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>Software Assurance Maturity Model 1.0 Released</title><content type='html'>Pravir Chandra recently released the 1.0 version of the Software Assurance Maturity Model (SAMM).  I recommend everyone visits the &lt;a href="http://www.opensamm.org"&gt;www.OpenSAMM.org&lt;/a&gt; website to review model.  Jim Manico also interviewed Pravir on &lt;a href="http://manicode.blogspot.com/2009/03/owasp-podcast-14-pravir-chandra-and.html"&gt;OWASP Podcast #14&lt;/a&gt;, where they discussed SAMM becoming an OWASP project and briefly discussed why two distinct models, the &lt;a href="http://www.bsi-mm.com"&gt;Building Security In Maturity Model (BSIMM)&lt;/a&gt; and SAMM have emerged.&lt;br /&gt;&lt;br /&gt;The newest version of SAMM provides new introductory content including an executive summary and a clear explanation of the model's focus on providing security activities centered around business functions.&lt;br /&gt;&lt;br /&gt;Version 1.0 also includes a guide for assessing organizations against the SAMM.  Companies can use the provided worksheet consisting of yes or no questions to acertain the maturity of a software security development process.  This could be applied to help:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Decide whether to purchase software from a vendor&lt;/li&gt;&lt;li&gt;Determine which software-as-a-service or cloud computing providers to select&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Choose whether to develop software in-house or to contract out the work&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Determine where the weaknesses in your organization's software security process are&lt;/li&gt;&lt;li&gt;Demonstrate progress in improving your organization's software security process&lt;/li&gt;&lt;/ul&gt;SAMM also includes roadmaps for various industry types.  These roadmaps demonstrate Pravir's assertion that all organizations do not necesarilly need to have a maturity of "3" in ALL security practices.  Sample roadmaps are defined for the following industry types:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Independent Software Vendor&lt;/li&gt;&lt;li&gt;Online Service Provider&lt;/li&gt;&lt;li&gt;Financial Services Organization (New)&lt;/li&gt;&lt;li&gt;Government Organization (New)&lt;/li&gt;&lt;/ul&gt;Again, I encourage everyone to review the Software Assurance Maturity Model at &lt;a href="http://www.opensamm.org"&gt;www.OpenSAMM.org&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-7293944822612243788?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/7293944822612243788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=7293944822612243788' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/7293944822612243788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/7293944822612243788'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/03/software-assurance-maturity-model-10.html' title='Software Assurance Maturity Model 1.0 Released'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-7722361028262597991</id><published>2009-03-24T08:00:00.005-05:00</published><updated>2011-09-27T11:14:56.998-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cloud'/><title type='text'>Cloud Computing Data Security</title><content type='html'>&lt;span style="font-style: italic;"&gt;Disclaimer: I am not a QSA and am in no way certified to determine whether a network, system, or application is PCI compliant. The information in this article is my opinion only.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A lot of people have voiced concerns about the security and control of data within the cloud.  Obviously organizations have significantly more control over data stored within their own infrastructure, but what about data hosted by a third party financial services organization that offers SaaS mobile banking or loan management services versus an implementation within a cloud computing provider's infrastructure?  This article analyzes security concerns and the ability to control data in both of the service provider situations.  This article will ONLY focus on the data storage aspect of this situation and will ignore things like vulnerabilities in developed applications.  In future posts, I may expand the scope.&lt;br /&gt;&lt;br /&gt;To set up the context in which these situations will be analyzed, we must first place each provider on equal footing.  In this example, both service providers place cardholder data within storage over an encrypted connection (SSL/TLS).  In addition, cardholder data is encrypted by the application before being placed within storage.  It is assumed that the secret key for the encrypted data is stored on the application server using an appropriate framework such as &lt;a href="http://msdn.microsoft.com/en-us/library/ms998280.aspx"&gt;Microsoft's DPAPI&lt;/a&gt;.  This means that users with appropriate domain credentials and permissions for the application server may be able to access the secret key.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Threats&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have chosen to analyze data security issues based on potential threats to data within a provider's infrastructure.  The following sections dig into each of these threats.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Data Loss or Destruction: Infrastructure Admin Deletes Data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A user with administrative privileges to the data storage infrastructure may maliciously or accidentally destroy the encrypted cardholder data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Amazon S3 and Third Party Financial Services Provider: Viable Threat&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is a viable threat in both scenarios.  A data administrator could delete data in each of these situations.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Data Loss or Destruction: One Data Center is Temporarily or Permanently Unavailable&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A natural disaster, power failure, or other situation could render one data center unavailable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Third Party Financial Services Provider:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My experience indicates that most of these providers utilize multiple data centers located in separate geographic locations within the United States.  Depending on whether the additional data center is regarded as a cold, warm, or hot site, data may or may not be immediately available.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Amazon S3:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Data stored within Amazon S3 is stored and immediately available in at least two data centers [1] [2].  If one data center becomes unavailable, data will still be accessible to applications in the other data center.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;All US Data Centers are Temporarily or Permanently Unavailable&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If some kind of significant event affects the US's Internet infrastructure, multiple data centers could become unavailable.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Third Party Financial Services Provider:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Third party providers may or may not have data centers in locations outside of the US.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Amazon S3:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Data in Amazon S3 is not automatically backed up to data centers outside of the US; however as a mitigating control, organizations can choose to periodically backup data to Amazon S3 buckets within the UK [5].&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Data Loss or Destruction: "Hacker" Destroys Data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A hacker could exploit a vulnerability within a system or network device that allows access to or control of data (remember, we are intentionally ignoring application level issues in this particular article).  The attacker may choose to delete, destroy, or render that data inaccessible.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Third Party Financial Services Provider:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Customers rely on the third party providers to place appropriate access controls around data and to apply security patches to network and system devices in a timely manner.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Amazon S3:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Customers can place bucket or object-level access controls around data within Amazon S3.  Customers directly control the application of security patches to virtual images.  Customers rely upon Amazon to apply patches to flaws identified within S3 or Amazon's API.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Unauthorized Data Access: Infrastructure Admin Accesses Data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A user with administrative privileges to the data storage infrastructure may attempt to access cardholder data for the purpose of financial gain.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Third Party Financial Services Provider: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Since the third party provider maintains the secret key for the encrypted data, it may be possible that an unauthorized individual may have domain privileges to access the secret key and the encrypted cardholder data.  This would directly result in a compromise of customers' credit cards.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Amazon S3:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;An administrator for Amazon S3 may be able to access the cipher-text for cardholder data; however the administrator would not have access to the secret key used to encrypt the data.  It would be very difficult for that administrator to discover or brute force the secret key associated with that data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Unauthorized Data Access: "Hacker" Accesses Data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A hacker could exploit a vulnerability within a system or network device that allows access to data (remember, we are intentionally ignoring application level issues in this particular article).  The attacker may choose to read or steal that data for financial gain.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Third Party Financial Services Provider:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Customers rely on the third party providers to place appropriate controls around data, to apply security patches in a timely manner, and to encrypt data at rest and while in transit.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Amazon S3:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Customers can place bucket or object-level access controls around data within Amazon S3. Customers directly control the application of security patches to virtual images. Data can be encrypted prior to being placed within cloud storage, rendering stolen data useless for an attacker.  Customers rely upon Amazon to apply patches to flaws identified within S3 or Amazon's API.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Unauthorized Data Modification: Infrastructure Admin Modifies Data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A user with administrative privileges to the data storage infrastructure may attempt to modify cardholder data for the purpose of financial gain.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; Third Party Financial Services Provider:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Since the third party provider maintains the secret key for the encrypted data, it may be possible that an unauthorized individual may have domain privileges to access the secret key and the encrypted cardholder data. This would allow an attacker to modify cardholder data or other assets within the data store.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; Amazon S3:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;An administrator for Amazon S3 may be able to access and modify the cipher-text for cardholder data, however the administrator would not have access to the secret key used to encrypt the data. It would be very difficult for that administrator to discover or brute force the secret key associated with that data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Unauthorized Data Modification: "Hacker" Modifies Data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A hacker could exploit a vulnerability within a system or network device that allows access to data (remember, we are intentionally ignoring application level issues in this particular article).  The attacker may choose to modify that data for financial gain.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; Third Party Financial Services Provider:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Customers rely on the third party providers to place appropriate controls around data, to apply security patches in a timely manner, and to encrypt data at rest and while in transit.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; Amazon S3:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Customers can place bucket or object-level access controls around data within Amazon S3. Customers directly control the application of security patches to virtual images. Data can be encrypted prior to being placed within cloud storage.  Customers rely upon Amazon to apply patches to flaws identified within S3 or Amazon's API.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Miscellaneous: Data Stored in Hostile Country&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It is important for customers to ensure sensitive data or intellectual property is properly protected.  Some countries do not have adequate laws or security standards in place to protect sensitive data or to restrict seizure of data by the government.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; Third Party Financial Services Provider:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Third party providers typically are aware of these concerns and likely will not host data within a hostile country.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; Amazon S3:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Customers of Amazon's S3 service may choose the country in which data is stored.  Customers can choose to create a bucket in the US or in the UK [5].&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Miscellaneous: Availability Issues&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When data or services are unavailable, companies may lose revenue during the down time and may loose customers concerned with reliability of data or applications.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; Third Party Financial Services Provider:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Availability and SLAs vary for each third party financial services providers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Amazon S3:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The S3 storage system is highly available and stores data redundantly in multiple geographic locations.  Amazon provides a SLA of 99.9% up time per month [4]; however they have had an issue or two in the past with availability [3].&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Conclusions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To summarize the findings above, I created a table listing threats, mitigating factors, and risk levels.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_opzlukmJgHU/SarqytW-37I/AAAAAAAAAIo/mnFThSdbji0/s1600-h/Threats+-+SP+vs+Amazon+S3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 234px;" src="http://1.bp.blogspot.com/_opzlukmJgHU/SarqytW-37I/AAAAAAAAAIo/mnFThSdbji0/s400/Threats+-+SP+vs+Amazon+S3.png" alt="" id="BLOGGER_PHOTO_ID_5308313267699900338" border="0" /&gt;&lt;/a&gt;(Click the image to enlarge)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;One major concern voiced regarding cloud computing is the control of data.  Organizations do not want sensitive data accessed by service providers or disclosed/stolen due to security issues related to the provider's infrastructure.  Surprisingly, the findings above show customers have a greater level of control over data stored within Amazon's S3 cloud storage service as compared to utilizing a third party financial services provider.&lt;br /&gt;&lt;br /&gt;When analyzing threats to data security, findings show customers have the &lt;span style="font-weight: bold; font-style: italic;"&gt;potential&lt;/span&gt; to implement stronger security controls around sensitive data stored in the cloud as compared to third party service providers.  These finding my be misleading; however as many financial service providers invest heavily into developing strong information security programs, typically have a range of security experts in house, and engage in independent assessments to verify the security of networks, systems, and applications.&lt;br /&gt;&lt;br /&gt;After considering all the data, I think the most important point to take away from this is actually not whether one solution is more secure than the other, but instead that data can be stored within the cloud in a secure and robust manner.  Organizations should evaluate the choice to adopt cloud storage on the basis of whether it improves the business or generates additional revenue and should not make the decision based on fear of customer data being compromised or stolen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;References&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;http://s3.amazonaws.com/aws_blog/AWS_Security_Whitepaper_2008_09.pdf&lt;br /&gt;&lt;br /&gt;"Data stored in Amazon S3, Amazon SimpleDB, or Amazon Elastic Block Store is redundantly stored in multiple physical locations as a normal part of those services and at no additional charge."&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;http://developer.amazonwebservices.com/connect/thread.jspa?threadID=11831&amp;amp;start=15&amp;amp;tstart=0&lt;br /&gt;&lt;br /&gt;"I guess in my last message I neglected to clearly reiterate what we've said before, which is consistent with what Jeff said in his talk -  we store multiple copies in multiple data centers.  Yes, that means at least two.  We don't ack a PUT until those multiple copies in multiple datacenters have been stored.  The only exception to this is if a datacenter receiving your PUT is totally isolated from other datacenters due to a network issue.  In that case, the multiple copies are stored in the single active datacenter, and then one or more of the copies are migrated to separate datacenters when connectivity is attained.  This is a very rare occurance though."&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;http://status.aws.amazon.com/s3-20080720.html&lt;/li&gt;&lt;li&gt;http://aws.amazon.com/s3-sla/&lt;/li&gt;&lt;li&gt;http://aws.amazon.com/s3/&lt;br /&gt;&lt;br /&gt;"A bucket can be located in the United States or in Europe. All objects within the bucket will be stored in the bucket’s location, but the objects can be accessed from anywhere."&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-7722361028262597991?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/7722361028262597991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=7722361028262597991' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/7722361028262597991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/7722361028262597991'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/03/cloud-computing-data-security.html' title='Cloud Computing Data Security'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_opzlukmJgHU/SarqytW-37I/AAAAAAAAAIo/mnFThSdbji0/s72-c/Threats+-+SP+vs+Amazon+S3.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-1502473881719206</id><published>2009-03-05T09:06:00.009-06:00</published><updated>2011-09-27T11:14:51.533-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cloud'/><title type='text'>Mosso - First PCI Compliant Customer Through Self Evaluation and Scanning</title><content type='html'>Mosso, a PaaS cloud provider, claims to be the first in enabling a customer to be PCI compliant within the cloud.  Naturally, this really excited me as I have spent a lot of time lately trying to figure out how to acomplish PCI compliance in the cloud.  I was somewhat disapointed, however, once I read the details.&lt;br /&gt;&lt;br /&gt;In this case, the application within the cloud does not actually store any credit card data.  The customer leverages a third party payment gateway to handle collection and storage of all cardholder data.&lt;br /&gt;&lt;br /&gt;Additionally, the customer did not gain PCI certification through an evaulation by a Qualified Security Assessor (&lt;a href="https://www.pcisecuritystandards.org/qsa_asv/become_qsa.shtml"&gt;QSA&lt;/a&gt;), but instead only needed to complete a "&lt;a href="https://www.pcisecuritystandards.org/saq/index.shtml"&gt;Self Assessment Questionaire&lt;/a&gt;" and pass a scan from an approved scanning vendor (&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="https://www.pcisecuritystandards.org/qsa_asv/become_asv.shtml"&gt;ASV&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Since the application used a third party payment gateway to handle collection and storage of cardholder data, only a subset of the PCI DSS controls applied to this application.  According to Mosso's article, only requirement 9 (Restrict physical access to cardholder data) and 12 (Maintain a policy that addresses information security) applied.&lt;br /&gt;&lt;br /&gt;It's wonderful that some level of PCI compliance has been achieved for applications within the cloud, but I feel like this isn't much different than Amazon EC2 + Amazon Flexible Payments Service, or even simpler any cloud provider + Paypal.  Hopefully in the future, we will have a case study in which an application that handles cardholder data will become PCI certified within a cloud computing provider's infrastructure.&lt;br /&gt;&lt;br /&gt;Resources:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.mosso.com/2009/03/cloud-hosting-is-secure-for-take-off-mosso-enables-the-spreadsheet-store-an-online-merchant-to-become-pci-compliant/"&gt;http://blog.mosso.com/2009/03/cloud-hosting-is-secure-for-take-off-mosso-enables-the-spreadsheet-store-an-online-merchant-to-become-pci-compliant/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mosso.com/docs/PCI_HowTo.pdf"&gt;http://www.mosso.com/docs/PCI_HowTo.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://aws.amazon.com/fps/"&gt;http://aws.amazon.com/fps/&lt;/a&gt;&lt;a href="http://www.theenterprisecloud.com/"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-1502473881719206?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/1502473881719206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=1502473881719206' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/1502473881719206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/1502473881719206'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/03/mosso-first-pci-compliant-customer.html' title='Mosso - First PCI Compliant Customer Through Self Evaluation and Scanning'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-385240098478689996</id><published>2009-02-26T09:20:00.029-06:00</published><updated>2011-09-27T11:14:39.276-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cloud'/><title type='text'>PCI Compliance and Cloud Computing</title><content type='html'>&lt;span style="font-style: italic;"&gt;Disclaimer: I am not a QSA and am in no way certified to determine whether a network, system, or application is PCI compliant.  The information in this article is my opinion only and is intended create an open discussion about how companies subject to PCI can leverage cloud computing in their overall business strategy.  If you disagree with any of my observations or conclusions, please add a comment and explain your argument, it's very likely that you are right ;-)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;a href="https://www.pcisecuritystandards.org/security_standards/pci_dss_download_agreement.html"&gt;PCI DSS version 1.2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://s3.amazonaws.com/aws_blog/AWS_Security_Whitepaper_2008_09.pdf"&gt;Amazon's AWS Security Whitepaper&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As I began researching cloud computing, one question I continually asked others is how payment card applications or data could be placed in a cloud computing provider's infrastructure in a PCI-compliant manner.  So far, I have not received a definitive answer to this question.&lt;br /&gt;&lt;br /&gt;In order to understand the implications of this question, I decided to read through the PCI standard and try to determine what controls would need to be in place for an example company and implementation.  In this example, a fictitious financial services company wishes to leverage &lt;a href="http://aws.amazon.com/"&gt;Amazon's EC2, EBS and S3&lt;/a&gt; offerings to host a loan payoff application and its data.  This application allows customers to view current loan information and pay balances using a credit or debit card.&lt;br /&gt;&lt;br /&gt;The network and server architecture for this system will be identical to the "&lt;a href="http://wiki.rightscale.com/2._References/02-Cloud_Infrastructures/01-Amazon_Web_Services_%28AWS%29/02-Amazon_EC2/Designing_Failover_Architectures_on_EC2/01-How_to_set_up_a_Basic_Failover_Architecture"&gt;Basic Failover Architecture&lt;/a&gt;" presented in RightScale's wiki.  The application will be written in Java and the database will be SQL Server 2005.  Database backups will be encrypted and archived using Amazon's S3 cloud storage.  Communication between the client and the web server, the web server and the database server, the master database server and the slave database server, and the database servers and Amazon's S3 service will be encrypted using SSL.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;PCI DSS Scope&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The PCI DSS document, page 5, states network segmentation of credit card data or activities may limit the scope of a PCI assessment.  The PCI assessor must evaluate the effectiveness of network segmentation controls and then make a decision based on these results.&lt;br /&gt;&lt;br /&gt;In a cloud computing environment, there are both physical and virtual infrastructure devices that provide segmentation.  Amazon's Security Whitepaper discusses the following components that provide segmentation:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Configurable firewall (implemented at the Hypervisor layer)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Strong separation of guest OS and Hypervisor&lt;/li&gt;&lt;li&gt;Instance isolation (separation of running virtual images)&lt;/li&gt;&lt;li&gt;Prevention of packet sniffing by other tenants&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Configurable "security groups" (similar to VLANs)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Based on these items, organizations should be able to limit the scope of assessments to "security groups" that contain payment applications or data.  It is unclear whether the scope must include Amazon's physical network devices or web services associated with managing or manipulating Amazon's EC2 or S3 services.  There is software segmentation between items like the host OS and the guest OS as well as between multiple guest OS's; however since payment data travels through all these systems, there may not be sufficient data segmentation to exclude the above Amazon components.&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Takeaway: "segmentation" needs to be evaluated as it applies to virtual infrastructure&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt; and Amazon's physical infrastructure.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;PCI DSS and Third Party Service Providers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Page 6 of the PCI standard discusses situations in which a company uses a third party service provider to provide cardholder data services.  This section states that an assessor must clearly state which third party components should be included within a PCI assessment. The third party must have a PCI assessment conducted; however this assessment can be conducted at the time of the assessment of the original company. This means that cooperation from cloud computing service providers may be required to gain PCI-compliance for components within the cloud.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Takeaway: Companies will need to establish compliance of at least some of the cloud provider's components AND companies will likely need cooperation from cloud providers in obtaining PCI compliance.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Requirement 1: Install and maintain a firewall configuration to protect cardholder data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are a number of items within this requirement that refer to creating network diagrams, implementing firewalls, and other similar network controls.  Organizations can easily fulfill these requirement as they apply to the virtual infrastructure within the cloud using the provided "security groups", Hypervisor firewall, and other similar features.&lt;br /&gt;&lt;br /&gt;The unanswered question is to what extent the requirement applies to Amazon's physical infrastructure.  This is particularly a problem if servers are constantly being spun up or down to automatically adjust based on needs/requirements.  In addition, Amazon's S3 storage mirrors data across a number of geographically diverse locations.  Documenting and assessing Amazon's the physical network for PCI is very tough.  On the other hand, it may be sufficient to assess a sample of Amazon's data centers or physical network devices where data or servers could potentially be located.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Takeaway: It is unclear to what degree the cloud provider's physical architecture will need to be assessed in addition to the organization's virtual infrastructure.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Requirement 2: Do not use vendor-supplied defaults for system passwords and other security parameters&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This section concerns default passwords, disabling unnecessary services, secure configuration of components, and the use of SSL.  Most of this information applies to the virtual infrastructure.&lt;br /&gt;&lt;br /&gt;However, item 2.4 and Appendix A list requirements that apply to shared hosting providers.  These rules are concerned with segmentation of cardholder data, logging and forensics.  Based on the controls implemented by the Hypervisor as well as authentication and authorization controls in place for accessing cloud storage, it is likely segmentation controls are satisfied.  Logging and forensics concerns may require the creation of virtual images suited for these purposes or may require cooperation from the cloud computing provider.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Takeaway: Companies may need to plan ahead and/or get cooperation from cloud providers regarding logging and forensics.  Specialized virtual images can be created to assist with forensics or incident investigation.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Requirement 3: Protect stored cardholder data and Requirement 4: Encrypt transmission of cardholder data across open, public networks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Secure storage and transportation of cardholder data is an important aspect of the PCI standard.  Controls outlined in the document can be easily accomplished by the company implementing the virtual infrastructure.  These companies are fully capable of encrypting data before storing it within EBS or S3, utilizing full disk encryption within virtual images, and leveraging SSL to securely send sensitive data between components.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Takeaway: This requirement can be satisfied without the cooperation of the cloud computing provider.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Requirement 5: Use and regularly update anti-virus software or programs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Anti-virus can easily be applied to virtual images.  It may also be necessary for companies verify and document the cloud provider's use of anti-virus as it applies to Host OS's, cloud storage, and other related components.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Takeaway: Companies should verify and document the cloud provider's use of anti-virus on Host OS's, cloud storage, and other components.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Requirement 6: Develop and maintain secure systems and applications&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I am going to separate this section into two parts.  One part is concerned with the secure development of custom applications.  While it is straight forward to understand how this applies to the company implementing the virtual infrastructure, its not as clear whether items like Amazon's web services need to be pen-tested or verified.  Hopefully, Amazon has already completed an assessment on these components and organizations can simply receive a high-level overview of the result.&lt;br /&gt;&lt;br /&gt;The second part is concerned with applying security updates in a timely manner.  This requirement can likely be satisfied by verifying and documenting Amazon's patch management procedures.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Takeaway: It's unclear whether the cloud computing provider's applications (like Amazon's web services) must be assessed.  Additionally, the cloud provider's patch management process should be verified and documented.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Requirement 7: Restrict access to cardholder data by business need to know&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Amazon has stated that they do not have shell or other similar access methods to organization's running virtual images.  So far, I am unable to find any literature from Amazon that explicitly states that the provider cannot read or modify companies' data with S3 or EBS. This concern should be addressed with the provider prior to a PCI assessment.  It's likely that even if this data is encrypted and Amazon can only access the cipher-text containing cardholder data, this will still not satisfy requirement 7.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Takeaway: Organizations should verify Amazon administrators cannot access or modify data (encrypted or unencrypted) within EBS or S3 storage.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Requirement 8: Assign a unique ID to each person with computer access.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While this section applies to standard items such as remote access user accounts and web application user accounts, it also applies to the management and manipulation of virtual images within Amazon EC2.  Currently, Amazon does not include the ability to create multiple user accounts to be assigned to various system or network administrators within an organization.  This means everyone must share a single account to turn on images, remove images, and make firewall changes.&lt;br /&gt;&lt;br /&gt;One way this can be addressed is by creating a custom interface to Amazon's API.  The custom interface should require users to login with unique user accounts.  Services such as RightScale provide this functionality as well.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Takeaway: Roll your own interface to Amazon's API or leverage third party services like RightScale for requiring unique accounts and assigning privileges to administrators of the company's virtual infrastructure.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Requirement 9: Restrict physical access to cardholder data.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Data centers containing cardholder data should have controls in place to ensure only authorized individuals can gain physical access to network devices and systems.  In order to be compliant, companies may need to verify and document how the cloud provider satisfies physical security concerns for requirement 9. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Takeaway: Organizations will need the cloud provider's cooperation to verify physical security requirements in the PCI standard are satisfied.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Requirement 10: Track and monitor all access to network resources and cardholder data.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tracking and monitoring data access, creation of logs, and retention of logs are all items that a company can control within the cloud without the service provider's help.  This section also requires internal/external network and application vulnerability scanning and penetration testing.  Organizations can create vulnerability scanning engines and remote penetration testing boxes to satisfy these requirements, however the cloud server provider should be notified before performing any of these tests. &lt;br /&gt;&lt;br /&gt;Implementation of a network intrusion detection/prevention system within the cloud may be difficult for organizations, but it may be sufficient to implement host intrusion detection software on each virtual image.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Takeaway: Create virtual images to complete tasks such as vulnerability scanning and penetration testing.  Investigate the ability to implement a network intrusion detection system.  If this is not possible evaluate whether host intrusion detection software is an appropriate mitigating control.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Requirement 12: Maintain a policy that addresses information security for employees and contractors.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Organizations will need to create security policies and procedures around management of resources within the cloud provider's infrastructure.  Since cloud computing is somewhat new, this may be easier said than done.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Takeaway: In addition to existing information security policies, documentation need to be written regarding appropriate use and management of resources within the organization's virtual infrastructure.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-385240098478689996?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/385240098478689996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=385240098478689996' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/385240098478689996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/385240098478689996'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/02/pci-compliance-and-cloud-computing.html' title='PCI Compliance and Cloud Computing'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-4527716289669117504</id><published>2009-02-19T09:39:00.008-06:00</published><updated>2011-09-27T11:14:34.690-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cloud'/><title type='text'>Create a Security Strategy Before Utilizing Cloud Computing</title><content type='html'>Cloud computing providers such as Amazon EC2/S3, Microsoft Azure, or Google AppEngine offer pay-as-you-go services for hosting data, applications, servers, or entire data centers using the provider’s infrastructure.  Cloud computing enables customers to scale resources up or down based on demand.  This allows large retail web sites like &lt;a href="http://www.inc.com/magazine/20090101/technology-when-the-forecast-calls-for-clouds.html"&gt;Target.com&lt;/a&gt; handle an exponential growth in web traffic during “Black Friday” sales without wasting money on additional hardware that will only be used a few times a year.&lt;br /&gt;&lt;br /&gt;Cloud computing resources are said to be elastic in that the customer can instantiate 5,000 machines within the cloud and only use (and pay for) the resources for two hours. HIPAA-compliant companies like &lt;a href="http://aws.amazon.com/solutions/case-studies/tc3-health/"&gt;TC3 Health&lt;/a&gt; use this strategy for processing months or years worth of healthcare claims in a short period of time.&lt;br /&gt;&lt;br /&gt;Cloud storage can be leveraged to store large amounts of data in a highly available, globally accessible, fault tolerant manner.  These benefits lead &lt;a href="http://www.wallstreetandtech.com/it-infrastructure/showArticle.jhtml?articleID=212700913"&gt;Nasdaq&lt;/a&gt; to add 30 to 80 gigabytes of data to Amazon’s S3 storage daily.&lt;br /&gt;&lt;br /&gt;Cloud service providers like Amazon are partnering with big technology players like IBM, Oracle, Sun, and RedHat to appeal to enterprise clients. Experts predict that as offerings and underlying technologies mature, Fortune 500 companies will soon incorporate cloud computing into their business and IT strategy.&lt;br /&gt;&lt;br /&gt;Companies who wish to adopt cloud computing should identify how their risk profile will change after moving from a traditional data center to a virtual one.  Examples of security and compliance risks companies should address before adopting cloud computing are listed below.  There are a large number of business risks to consider as well.  The list below does not include any business risks.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Compliance&lt;/span&gt; – When processing or storing credit card, banking, healthcare, or personally identifiable information within the cloud, organizations should create a strategy for ensuring the virtual implementation and the service provider will be compliant with relevant regulatory requirements or security standards.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Application Layer Security&lt;/span&gt; – Organizations should assess whether new vulnerabilities related to accessing cloud storage, cloud databases (Amazon’s simpleDB, Google’s BigTable, or Microsoft’s SQL Data Services), or other technologies have been introduced into application code.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Operational Security&lt;/span&gt; – A documented set of policies should be created regarding the use and management of cloud computing resources.  For example, most cloud computing providers utilize a single set of credentials for making changes to the virtual data center.  Organizations should not provide these credentials to every data center administrator nor should changes be made without proper approval.  In addition, organizations should discuss the service provider’s operation security policies to ensure an appropriate level of assurance is provided.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Incident Response&lt;/span&gt; – Organizations should identify a strategy for performing incident response within the cloud.  This may require cooperation from the cloud computing service provider, or a custom incident response machine image for services like Amazon EC2 or GoGrid.&lt;/li&gt;&lt;/ul&gt;Below is a list of companies leveraging cloud computing today:&lt;br /&gt;&lt;a href="http://video.new-app.com/customers/grid/IGT2008/Day1_part2/main_files/Default.htm#nopreload=1&amp;amp;event=1"&gt;Animoto&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.inc.com/magazine/20090101/technology-when-the-forecast-calls-for-clouds.html"&gt;Target.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://aws.amazon.com/solutions/case-studies/tc3-health/"&gt;TC3 Health&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.wallstreetandtech.com/it-infrastructure/showArticle.jhtml?articleID=212700913"&gt;Nasdaq&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here are several popular cloud computing providers:&lt;br /&gt;&lt;a href="http://aws.amazon.com/"&gt;Amazon AWS&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/azure/"&gt;Microsoft Azure&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/appengine/"&gt;Google AppEngine&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.salesforce.com/platform/"&gt;SalesForce.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.mosso.com/"&gt;Mosso Cloud Sites/Files&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.gogrid.com/"&gt;GoGrid&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cloud computing security papers:&lt;br /&gt;&lt;a href="http://www.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-28.pdf"&gt;Above the Clouds: A Berkeley View of Cloud Computing&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-4527716289669117504?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/4527716289669117504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=4527716289669117504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/4527716289669117504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/4527716289669117504'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/02/create-security-strategy-before.html' title='Create a Security Strategy Before Utilizing Cloud Computing'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-5195439498887174531</id><published>2009-01-23T08:49:00.004-06:00</published><updated>2011-09-27T11:31:07.103-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cross-site Scripting'/><title type='text'>OWASP's XSS Prevention Cheat Sheet</title><content type='html'>The Open Web Application Security Project (OWASP) has recently released a &lt;a href="https://www.owasp.org/index.php?title=XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet"&gt;XSS (Cross Site Scripting) Prevention Cheat Sheet&lt;/a&gt;.  This cheat sheet helps developers identify how and when to output encode or escape untrusted user data when including it within a page.  I am particularly excited about this resource because it not only discusses the case in which HTML encoding is necessary, but also helps layout rules or conditions for using JavaScript, CSS, Attribute, and other encoding schemes.&lt;br /&gt;&lt;br /&gt;It is important for developers to understand that the appropriate encoding scheme must be applied based on the context in which untrusted user data is being included within the page.&lt;br /&gt;&lt;br /&gt;As a side note, RSnake's &lt;a href="http://ha.ckers.org/xss.html"&gt;XSS cheat sheet&lt;/a&gt;, used by security staff to identify cross-site scripting attacks, has been around for a while.  These two cheat sheets seem to compliment each other well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-5195439498887174531?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/5195439498887174531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=5195439498887174531' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/5195439498887174531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/5195439498887174531'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2009/01/owasps-xss-prevention-cheat-sheet.html' title='OWASP&apos;s XSS Prevention Cheat Sheet'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-6558652469045167101</id><published>2008-12-19T10:00:00.002-06:00</published><updated>2011-09-27T11:32:19.894-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts 2'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Coding'/><title type='text'>Page-Level Access Controls in Struts 2 - Part 2</title><content type='html'>&lt;span style="font-size:130%;"&gt;Background&lt;/span&gt;&lt;br /&gt;&lt;p&gt;Applications should ensure users are properly authenticated and have sufficient permissions to access pages before content is displayed. Page-level access controls are one security control that enforces this behavior.&lt;br /&gt;&lt;/p&gt;Part 1 and 2 of this article describes one of many ways to implement a Struts 2 AuthenticationInterceptor and a RolesInterceptor to verify users have authenticated successfully and belong to an approved role before allowing access to pages. The key features targeted by both interceptors include a default deny policy and a centralized location for defining access control rules.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;Struts 2 RolesInterceptor&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In Part 2 of the page-level access controls article, a RolesInterceptor has been added to the struts.xml file.  The "roleActions" parameter, passed to the interceptor, contains a list of actions allowed for each role.  The "*" role indicates that any role can access the action.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Struts.xml&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_opzlukmJgHU/SQdlguxguYI/AAAAAAAAAD4/9l5rtKPvHN4/s1600-h/2.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 386px;" src="http://4.bp.blogspot.com/_opzlukmJgHU/SQdlguxguYI/AAAAAAAAAD4/9l5rtKPvHN4/s400/2.PNG" alt="" id="BLOGGER_PHOTO_ID_5262286302591629698" border="0" /&gt;&lt;/a&gt;(Click the image above to view the XML)&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;Similar to the AuthenticationInterceptor, the RolesInterceptor verifies all users are allowed access to a particular page or validates that the user's "role" session variable matches one of the roles allowed for the action requested.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;RolesInterceptor&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_opzlukmJgHU/SQdlgerpcOI/AAAAAAAAADw/ccR9TKfU_y4/s1600-h/1.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 283px; height: 400px;" src="http://4.bp.blogspot.com/_opzlukmJgHU/SQdlgerpcOI/AAAAAAAAADw/ccR9TKfU_y4/s400/1.PNG" alt="" id="BLOGGER_PHOTO_ID_5262286298272067810" border="0" /&gt;&lt;/a&gt;(Click the image above to view the code)&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;In the ProcessSimpleLogin action, the "role" session variable has been added to include the name of the role that the user belongs to.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ProcessSimpleLogin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_opzlukmJgHU/SQdlgnnCGlI/AAAAAAAAAEA/e5NLlLJ581k/s1600-h/3.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 371px; height: 400px;" src="http://2.bp.blogspot.com/_opzlukmJgHU/SQdlgnnCGlI/AAAAAAAAAEA/e5NLlLJ581k/s400/3.PNG" alt="" id="BLOGGER_PHOTO_ID_5262286300668631634" border="0" /&gt;&lt;/a&gt;(Click the image above to view the code)&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;The code repository containing updated struts 2 modules can be found below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/struts2securityaddons/"&gt;http://code.google.com/p/struts2securityaddons/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Additionally, you can see discussion of these modules in my earlier blog posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-6558652469045167101?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/6558652469045167101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=6558652469045167101' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/6558652469045167101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/6558652469045167101'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html' title='Page-Level Access Controls in Struts 2 - Part 2'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_opzlukmJgHU/SQdlguxguYI/AAAAAAAAAD4/9l5rtKPvHN4/s72-c/2.PNG' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-6095065691324594809</id><published>2008-11-20T12:51:00.002-06:00</published><updated>2011-09-27T11:32:19.890-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts 2'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Coding'/><title type='text'>Page-Level Access Controls in Struts 2 - Part 1</title><content type='html'>&lt;span style="font-size:130%;"&gt;Background&lt;/span&gt;&lt;br /&gt;&lt;p&gt;Applications should ensure users are properly authenticated and have sufficient permissions to access pages before content is displayed.  Page-level access controls are one security control that enforces this behavior.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Part 1 and 2 of this article describes one of many ways to implement a Struts 2 AuthenticationInterceptor and a RolesInterceptor to verify users have authenticated successfully and belong to an approved role before allowing access to pages.  The key features targeted by both interceptors include a default deny policy and a centralized location for defining access control rules.&lt;br /&gt;&lt;/p&gt;&lt;span style="font-size:130%;"&gt;Struts 2 AuthenticationInterceptor&lt;/span&gt;&lt;br /&gt;&lt;p&gt;In the struts.xml file below, the AuthenticationInterceptor is defined and included in the defaultSecurityStackWithAuthentication.  The "excludeActions" parameter provided to the interceptor lists the actions that do not require users to be authenticated.   In this case, the "Login" and "ProcessSimpleLogin" actions do not require authentication, however the "Internal" page does require authentication.&lt;br /&gt;&lt;/p&gt;&lt;span style="font-weight: bold;"&gt;Struts.xml&lt;/span&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_opzlukmJgHU/SQdfIPhRySI/AAAAAAAAADg/0qxaoqNxM3M/s1600-h/2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 257px;" src="http://3.bp.blogspot.com/_opzlukmJgHU/SQdfIPhRySI/AAAAAAAAADg/0qxaoqNxM3M/s400/2.png" alt="" id="BLOGGER_PHOTO_ID_5262279284815415586" border="0" /&gt;&lt;/a&gt;(Click the image above to view the XML)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;When the AuthenticationInterceptor is called, the interceptor verifies the requested action is in the exclude list or the user has the "authenticated" session variable set to "True."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;AuthenticationInterceptor&lt;/span&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_opzlukmJgHU/SQdfIj2NvFI/AAAAAAAAADo/0hAgMVQAZZI/s1600-h/3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 392px; height: 400px;" src="http://1.bp.blogspot.com/_opzlukmJgHU/SQdfIj2NvFI/AAAAAAAAADo/0hAgMVQAZZI/s400/3.png" alt="" id="BLOGGER_PHOTO_ID_5262279290271939666" border="0" /&gt;&lt;/a&gt;(Click the image above to view the code)&lt;/p&gt;&lt;p&gt;&lt;/p&gt;Finally, to allow users access to authenticated pages, the ProcessSimpleLogin action verifies the submitted credentials and then sets the "authenticated" session variable to "True."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ProcessSimpleLogin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_opzlukmJgHU/SQdfH-QJ1RI/AAAAAAAAADY/-_I7TFuvh_c/s1600-h/1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 371px; height: 400px;" src="http://2.bp.blogspot.com/_opzlukmJgHU/SQdfH-QJ1RI/AAAAAAAAADY/-_I7TFuvh_c/s400/1.png" alt="" id="BLOGGER_PHOTO_ID_5262279280180188434" border="0" /&gt;&lt;/a&gt;(Click the image above to view the code)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;The code repository containing updated struts 2 modules can be found below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/struts2securityaddons/"&gt;http://code.google.com/p/struts2securityaddons/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Additionally, you can see discussion of these modules in my earlier blog posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-6095065691324594809?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/6095065691324594809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=6095065691324594809' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/6095065691324594809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/6095065691324594809'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html' title='Page-Level Access Controls in Struts 2 - Part 1'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_opzlukmJgHU/SQdfIPhRySI/AAAAAAAAADg/0qxaoqNxM3M/s72-c/2.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-6636080172426639637</id><published>2008-11-10T09:23:00.003-06:00</published><updated>2011-09-27T11:32:19.899-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts 2'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Coding'/><title type='text'>CSRF Prevention in Struts 2</title><content type='html'>&lt;span style="font-size:130%;"&gt;Background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cross-site request forgery, one of the &lt;a href="http://www.owasp.org/index.php/Top_10_2007#Summary"&gt;OWASP Top 10 vulnerabilities for 2007&lt;/a&gt;, is an attack in which a malicious user causes a victim's browser to make a request without the user's consent.  This attack is generally propagated by a third party site.&lt;br /&gt;&lt;br /&gt;The example below shows how a CSRF attack might affect a web application that allows customers to request rental movies to be mailed to their house.&lt;br /&gt;&lt;br /&gt;A customer logs into her movie rental web site and selects some movies to add to her queue.  Next, instead of logging out of the application, she types in the address for her favorite news site, reads a few online comics, and does some research on used cars.&lt;br /&gt;&lt;br /&gt;Unfortunately, before the customer began her research, an attacker had discovered a persistent cross-site scripting vulnerability on one of the used car sites.  The attacker had also exploited this vulnerability to include a simple image tag containing a URL similar to the one below:&lt;br /&gt;&lt;br /&gt;&amp;lt;img src="http://www.fakemovierentalsite.com/addMovieToQueueBeginning?movieId=12345" /&amp;gt;&lt;br /&gt;&lt;br /&gt;When this image tag loaded in the customer's browser, a request was sent to the movie rental application to add an embarrassing movie to the beginning of the customer's queue.&lt;br /&gt;&lt;br /&gt;One strategy to address CSRF attacks is to require and validate one-time values included in requests to sensitive functionality.  For more information, please view the OWASP explanation found &lt;a href="http://www.owasp.org/index.php/Top_10_2007-A5#Protection"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Struts 2 tokenSessionInterceptor&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The tokenSessionInterceptor, provided by struts 2, allows developers to add CSRF protection quite easily.  In the example below, the tokenSessionInterceptor was added to the interceptor stack.  A parameter has been passed to the interceptor to ensure it will not be triggered on each request.&lt;br /&gt;&lt;br /&gt;In the ProcessSimpleLogin action, the tokenSessionInterceptor is referenced again.  In this case, a parameter is passed to the interceptor to ensure it verifies a valid token has been sent for this action only.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_opzlukmJgHU/SQHcW_fvWhI/AAAAAAAAADI/5tE6xgLpaAQ/s1600-h/1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 329px;" src="http://2.bp.blogspot.com/_opzlukmJgHU/SQHcW_fvWhI/AAAAAAAAADI/5tE6xgLpaAQ/s400/1.png" alt="" id="BLOGGER_PHOTO_ID_5260728127305243154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;(Click the image above to view the XML)&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;In order to include the proper token within the page, the &amp;lt;s:token /&amp;gt; tag is included as shown below.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_opzlukmJgHU/SQHcXPNBqfI/AAAAAAAAADQ/85pE0x2Ogho/s1600-h/2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 146px;" src="http://1.bp.blogspot.com/_opzlukmJgHU/SQHcXPNBqfI/AAAAAAAAADQ/85pE0x2Ogho/s400/2.png" alt="" id="BLOGGER_PHOTO_ID_5260728131521718770" border="0" /&gt;&lt;/a&gt;(Click the image above to view the code)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;This strategy ensures the ProcessSimpleLogin action executes only if a one-time token has been associated with the user's session, the request includes this token, and the token has been used only one time.&lt;br /&gt;&lt;br /&gt;The code repository containing updated struts 2 modules can be found below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/struts2securityaddons/"&gt;http://code.google.com/p/struts2securityaddons/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Additionally, you can see discussion of these modules in my earlier blog posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-6636080172426639637?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/6636080172426639637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=6636080172426639637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/6636080172426639637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/6636080172426639637'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html' title='CSRF Prevention in Struts 2'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_opzlukmJgHU/SQHcW_fvWhI/AAAAAAAAADI/5tE6xgLpaAQ/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-3406150861958482009</id><published>2008-11-02T16:33:00.003-06:00</published><updated>2011-09-27T11:32:19.879-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts 2'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Coding'/><title type='text'>Custom Error Pages in Struts 2</title><content type='html'>&lt;span style="font-size:130%;"&gt;Background&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;When attackers target a particular application, they typically spend some time gathering information about the application's components, framework, and architecture.  One way attackers may gather this type of information is through error messages.&lt;br /&gt;&lt;br /&gt;Error messages often disclose SQL queries, code fragments, file names, or other sensitive information.  An example is shown below.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;   xx.xx.xx.xx&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;   10/18/08 17:49:20&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;   clientid=&amp;amp;id=&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;http://www.google.com/search?q=&lt;/span&gt;&lt;/span&gt;&lt;p  style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt; [Microsoft][ODBC SQL Server Driver][SQL Server]Line 1: Incorrect syntax near '='.&lt;/span&gt;&lt;/p&gt;&lt;p  style="color: rgb(255, 0, 0); font-weight: bold;font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;SQL = "SELECT * FROM logins WHERE clientid ="&lt;/span&gt;&lt;/p&gt;&lt;p  style="color: rgb(255, 0, 0); font-weight: bold;font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;Data Source = "AFE2003"&lt;/span&gt;&lt;/p&gt;&lt;p  style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;The error occurred while processing an element with a general identifier of (CFQUERY), occupying document position (40:2) to (40:47) in the template file &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;E:\inetpub\i\somesite\showinv\Application.cfm&lt;/span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;The disclosure of this information can be avoided using custom error pages.  Applications, frameworks, or servers can be configured to redirect users to a custom error page that does not disclose stack traces, debugging information, or verbose error messages.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Struts 2 Custom Error Pages&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Struts 2 includes an Exception Interceptor in its default stack.  Developers can utilize this interceptor to catch errors and redirect users to a page containing a generic error message.  One example is shown below.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Custom Error Page&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_opzlukmJgHU/SPpbucWQ0vI/AAAAAAAAACA/O8A9extIcFM/s1600-h/customErrorPage.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_opzlukmJgHU/SPpbucWQ0vI/AAAAAAAAACA/O8A9extIcFM/s400/customErrorPage.PNG" alt="" id="BLOGGER_PHOTO_ID_5258616368350155506" border="0" /&gt;&lt;/a&gt;(Click the image above to view the code)&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Struts.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_opzlukmJgHU/SPpbuuegCKI/AAAAAAAAACI/dJzqjOgg4TQ/s1600-h/strutsExceptionInterceptor.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_opzlukmJgHU/SPpbuuegCKI/AAAAAAAAACI/dJzqjOgg4TQ/s400/strutsExceptionInterceptor.PNG" alt="" id="BLOGGER_PHOTO_ID_5258616373216544930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;(Click the image above to see the XML)&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: left; font-weight: bold;"&gt;Result&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_opzlukmJgHU/SPpcUH_heWI/AAAAAAAAACQ/F-nAl8NfoAQ/s1600-h/error+result.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_opzlukmJgHU/SPpcUH_heWI/AAAAAAAAACQ/F-nAl8NfoAQ/s400/error+result.PNG" alt="" id="BLOGGER_PHOTO_ID_5258617015721097570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The code repository containing updated struts 2 modules can be found below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/struts2securityaddons/"&gt;http://code.google.com/p/struts2securityaddons/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Additionally, you can see discussion of these modules in my earlier blog posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-3406150861958482009?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/3406150861958482009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=3406150861958482009' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3406150861958482009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3406150861958482009'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html' title='Custom Error Pages in Struts 2'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_opzlukmJgHU/SPpbucWQ0vI/AAAAAAAAACA/O8A9extIcFM/s72-c/customErrorPage.PNG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-7265211965425946408</id><published>2008-10-19T18:41:00.010-05:00</published><updated>2011-09-27T11:32:19.908-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts 2'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Coding'/><title type='text'>SSL/TLS in Struts 2</title><content type='html'>&lt;span style="font-size:130%;"&gt;Background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SSL/TLS provides an encrypted communication channel that a client and server can use to exchange messages without an attacker eavesdropping or manipulating data in transit. This is an important security control to include within a web application to ensure attackers cannot steal user's authentication session cookies or observe user's credentials as they are transmitted to the server.&lt;br /&gt;&lt;br /&gt;Web applications and their environments should ensure users can only access sensitive applications over an encrypted communication channel (https for example). Firewalls, application servers, or applications themselves can enforce this behavior.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Requiring SSL/TLS in Struts 2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One way to ensure users connect using SSL or TLS within struts is to create an interceptor to verify this connection. An example has been provided below.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SSLRequired.jsp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_opzlukmJgHU/SPvJJmKSz6I/AAAAAAAAACw/-VmOQ-wVhQg/s1600-h/1.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_opzlukmJgHU/SPvJJmKSz6I/AAAAAAAAACw/-VmOQ-wVhQg/s400/1.PNG" alt="" id="BLOGGER_PHOTO_ID_5259018156584914850" border="0" /&gt;&lt;/a&gt;(Click the image to view the code)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;RequireSSLInterceptor&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_opzlukmJgHU/SPvJKWMZZ2I/AAAAAAAAAC4/gjrwmKeWwOw/s1600-h/2.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_opzlukmJgHU/SPvJKWMZZ2I/AAAAAAAAAC4/gjrwmKeWwOw/s400/2.PNG" alt="" id="BLOGGER_PHOTO_ID_5259018169478637410" border="0" /&gt;&lt;/a&gt;(Click the image to view the code)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_opzlukmJgHU/SPvJKiwjeGI/AAAAAAAAADA/30U5E1Qflho/s1600-h/3.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_opzlukmJgHU/SPvJKiwjeGI/AAAAAAAAADA/30U5E1Qflho/s400/3.PNG" alt="" id="BLOGGER_PHOTO_ID_5259018172851517538" border="0" /&gt;&lt;/a&gt;(Click the image to view the XML)&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;The code repository containing updated struts 2 modules can be found below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/struts2securityaddons/"&gt;http://code.google.com/p/struts2securityaddons/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Additionally, you can see discussion of these modules in my earlier blog posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-7265211965425946408?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/7265211965425946408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=7265211965425946408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/7265211965425946408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/7265211965425946408'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html' title='SSL/TLS in Struts 2'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_opzlukmJgHU/SPvJJmKSz6I/AAAAAAAAACw/-VmOQ-wVhQg/s72-c/1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-3746050282692414893</id><published>2008-10-18T12:59:00.026-05:00</published><updated>2011-09-27T11:32:19.884-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts 2'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Coding'/><title type='text'>HTTP Caching Headers in Struts 2</title><content type='html'>&lt;span style="font-size:130%;"&gt;Background&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;In many cases, the users' web browsing experience can be made more efficient by allowing web browsers to cache pages, images, scripts, and other content.  This allows the web browser to retrieve content from the local disk rather than requesting data from the server every time.  The end result is a quicker, more responsive user interface.&lt;br /&gt;&lt;br /&gt;While this strategy is great for applications that handle public, non-sensitive information, it may not be appropriate for banking, investment, health care, or other similar applications.  In general, applications that contain sensitive or confidential information should have controls that reduce the likelihood of information being disclosed to unauthorized individuals.&lt;br /&gt;&lt;br /&gt;One way web applications can reduce the likelihood of browsers disclosing sensitive data through caching is to include the following HTTP headers within the server's response.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Cache-control: no-cache, no-store&lt;br /&gt;Pragma: no-cache&lt;br /&gt;Expires: -1&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;For more information, please see the &lt;a href="http://www.owasp.org/index.php/OWASP_AppSec_FAQ#Browser_Cache"&gt;OWASP AppSec FAQ&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Struts Interceptor Implementation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;One way these headers can be included within a Struts 2 application is to create a custom interceptor.  An example has been provided below.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CachingHeadersInterceptor Code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_opzlukmJgHU/SPovaE47lJI/AAAAAAAAABw/UVBZTk3-Jzs/s1600-h/1.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_opzlukmJgHU/SPovaE47lJI/AAAAAAAAABw/UVBZTk3-Jzs/s400/1.PNG" alt="" id="BLOGGER_PHOTO_ID_5258567639944107154" border="0" /&gt;&lt;/a&gt;(Click the image above to view the code)&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Struts.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_opzlukmJgHU/SPovqjakjXI/AAAAAAAAAB4/pV9RYrFBpBQ/s1600-h/2.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_opzlukmJgHU/SPovqjakjXI/AAAAAAAAAB4/pV9RYrFBpBQ/s400/2.PNG" alt="" id="BLOGGER_PHOTO_ID_5258567923016174962" border="0" /&gt;&lt;/a&gt;(Click the image above to view the XML)&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Results&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;Server: Apache-Coyote/1.1&lt;br /&gt;Cache-Control: no-cache, no-store&lt;br /&gt;Pragma: no-cache&lt;br /&gt;Expires: -1&lt;br /&gt;Content-Type: text/html&lt;br /&gt;Content-Length: 157&lt;br /&gt;Date: Sat, 18 Oct 2008 18:37:35 GMT&lt;br /&gt;&lt;br /&gt;200 OK&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;The code repository containing updated struts 2 modules can be found below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/struts2securityaddons/"&gt;http://code.google.com/p/struts2securityaddons/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Additionally, you can see discussion of these modules in my earlier blog posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-3746050282692414893?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/3746050282692414893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=3746050282692414893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3746050282692414893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3746050282692414893'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html' title='HTTP Caching Headers in Struts 2'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_opzlukmJgHU/SPovaE47lJI/AAAAAAAAABw/UVBZTk3-Jzs/s72-c/1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-3008592893248172939</id><published>2008-09-04T12:16:00.024-05:00</published><updated>2011-09-27T11:32:19.868-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Struts 2'/><category scheme='http://www.blogger.com/atom/ns#' term='Secure Coding'/><title type='text'>JSESSIONID Regeneration in Struts 2</title><content type='html'>&lt;span style="font-size:130%;"&gt;Background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Whenever a user crosses an authentication boundary, the user's session ID should be regenerated.  This concept applies to a user logging into an application, logging out, or when a user reauthenticates due to a risk-based authentication process.  The regeneration of session IDs is an important practice that helps eliminate session fixation vulnerabilities and may limit the impact of session theft vulnerabilities prior to authentication.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;For more information on Session Fixation vulnerabilities and Session ID regeneration practices, please see the OWASP pages below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.owasp.org/index.php/Session_Fixation"&gt;http://www.owasp.org/index.php/Session_Fixation&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.owasp.org/index.php/Session_Management#Regeneration_of_Session_Tokens"&gt;http://www.owasp.org/index.php/Session_Management#Regeneration_of_Session_Tokens&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;Session ID Regeneration in Traditional Java Web Applications&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;In a J2EE application, the user's JSESSIONID cookie should be regenerated and the previous session should be removed or deleted from the server. Example code below shows how this might be accomplished in a traditional Java web application.&lt;br /&gt;&lt;pre&gt;public class ExampleLoginServlet extends HttpServlet {&lt;br /&gt;public void doGet(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;throws ServletException, IOException {&lt;br /&gt;if( //authentication was successful ) {&lt;br /&gt;request.getSession().invalidate();&lt;br /&gt;HttpSession session = request.getSession(true);&lt;br /&gt;session.setAttribute("AUTHENTICATED", new Boolean(true));&lt;br /&gt;response.sendRedirect("PageRequiringAuthentication.jsp");&lt;br /&gt;//Additional Code Would Normally Follow&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;span style="font-size:130%;"&gt;Session ID Regeneration in Struts 2 Applications&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In Struts 2 applications, developers typically don't directly interact with the HttpServletRequest, HTTPServletResponse, or HttpSession objects.  With consideration of these factors, the solution discussed above for a traditional Java web application may not be appropriate for Struts 2.&lt;br /&gt;&lt;br /&gt;I did a little research and through trial an error I came up with a Struts 2 specific solution for regenerating JSESSIONIDs.  This solution utilizes the SessionAware interface.  Please excuse the unrealistic authentication code...&lt;br /&gt;&lt;pre&gt;package nickcoblentzblog.actions.sessions;&lt;br /&gt;&lt;br /&gt;import java.util.Map;&lt;br /&gt;import org.apache.struts2.interceptor.SessionAware;&lt;br /&gt;import com.opensymphony.xwork2.ActionContext;&lt;br /&gt;import com.opensymphony.xwork2.ActionSupport;&lt;br /&gt;import org.apache.struts2.dispatcher.SessionMap;&lt;br /&gt;&lt;br /&gt;public class Login extends ActionSupport implements SessionAware  {&lt;br /&gt;private String userid;&lt;br /&gt;private String password;&lt;br /&gt;private Map session;&lt;br /&gt;&lt;br /&gt;public String execute() {&lt;br /&gt;if(userid.equals("admin") &amp;amp;&amp;amp; password.equals("admin"))  {&lt;br /&gt;&lt;br /&gt;/* Session ID Regeneration: Try #4 */&lt;br /&gt;((SessionMap)this.session).invalidate();&lt;br /&gt;this.session = ActionContext.getContext().getSession();&lt;br /&gt;/* End Try #4 */&lt;br /&gt;&lt;br /&gt;session.put("AUTHENTICATED", new Boolean(true));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;return SUCCESS;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;return ERROR;&lt;br /&gt;}&lt;br /&gt;public String getUserid() {&lt;br /&gt;return userid;&lt;br /&gt;}&lt;br /&gt;public void setUserid(String userid) {&lt;br /&gt;this.userid = userid;&lt;br /&gt;}&lt;br /&gt;public String getPassword() {&lt;br /&gt;return password;&lt;br /&gt;}&lt;br /&gt;public void setPassword(String password) {&lt;br /&gt;this.password = password;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setSession(Map session) {&lt;br /&gt;this.session = session;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;To test this code, I followed the following procedure.&lt;br /&gt;&lt;br /&gt;1. Cleared all browser cookies&lt;br /&gt;2. Visited the Login JSP page&lt;br /&gt;3. Used the Web Developer Toolbar to view my initial JSESSIONID&lt;br /&gt;4. Logged into the application successfully&lt;br /&gt;5. Used the Web Developer Toolbar to view my final JSESSIONID&lt;br /&gt;&lt;br /&gt;The initial JSESSIONID value was:&lt;br /&gt;AA4996C5E24BB8221BB27B23EA599F34&lt;br /&gt;&lt;br /&gt;The final JSESSIONID value was:&lt;br /&gt;325ED18851B93EBA542D2AE7926E7F8E&lt;br /&gt;&lt;br /&gt;Based on these tests this solution appears to work successfully.&lt;br /&gt;&lt;br /&gt;In case anyone is curious, here are a couple other ideas I toyed with:&lt;br /&gt;&lt;pre&gt;/* Try # 1:&lt;br /&gt;this.request.getSession().invalidate();&lt;br /&gt;this.request.getSession(true);&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;/* Try #2:&lt;br /&gt;HTTPUtilities esapiHTTPUtilities = ESAPI.httpUtilities();&lt;br /&gt;esapiHTTPUtilities.setCurrentHTTP(request, response);&lt;br /&gt;try {&lt;br /&gt;esapiHTTPUtilities.changeSessionIdentifier();&lt;br /&gt;}&lt;br /&gt;catch(Exception e) {&lt;br /&gt;e.printStackTrace();&lt;br /&gt;}&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;/* Try #3:&lt;br /&gt;((SessionMap)ActionContext.getContext().getSession()).invalidate();&lt;br /&gt;*/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The code repository containing updated struts 2 modules can be found below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/struts2securityaddons/"&gt;http://code.google.com/p/struts2securityaddons/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Additionally, you can see discussion of these modules in my earlier blog posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/http-caching-headers-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/ssltls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/10/custom-error-pages-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/csrf-prevention-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/11/page-level-access-controls-in-struts-2.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html"&gt;http://nickcoblentz.blogspot.com/2008/12/page-level-access-controls-in-struts-2.html &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-3008592893248172939?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/3008592893248172939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=3008592893248172939' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3008592893248172939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3008592893248172939'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html' title='JSESSIONID Regeneration in Struts 2'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-7706946194667998295</id><published>2008-08-30T12:36:00.023-05:00</published><updated>2011-09-27T11:37:08.355-05:00</updated><title type='text'>Ubiquity Security Concerns Part 1: An Introduction</title><content type='html'>&lt;span style="font-size:130%;"&gt;Introduction&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I recently watched a short video about a Mozilla Labs project called &lt;a href="https://wiki.mozilla.org/Labs/Ubiquity"&gt;Ubiquity&lt;/a&gt;.  After watching this video, I became extremely excited about using the features presented and extremely scared of how the extension could be exploited to compromise personal data.  I wanted to both benefit from this awesome and fun extension and also find ways to execute arbitrary JavaScript within others' browsers (the same feeling I get whenever I use Google).  It may be helpful to briefly watch this video to understand this sentiment:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/1561578?pg=embed&amp;amp;sec=1561578"&gt;http://www.vimeo.com/1561578?pg=embed&amp;amp;sec=1561578&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After watching this video, my first thoughts were:&lt;br /&gt;&lt;br /&gt;1. I wonder if an attacker could write a command to send arbitrary GMail messages on the users' behalf, watch every page the users visit, steal passwords, and even compromise users' computers.&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;br /&gt;2. How difficult would it be for an attacker to trick a user into installing the command or cause the command to be installed in an automated fashion?&lt;br /&gt;&lt;br /&gt;The short answer to 1. is YES (details provided below)! Answering 2., specifically the automated portion, will require some research.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Ubiquity Developers' Awareness of Security Concerns&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Before anyone gets too worked up about these security issues, I should make sure it is clear that this project is far from being complete, the authors are well aware that there a significant security concerns, and they are in the process of determining a method to reduce the risk of malicious commands or other exploits.&lt;br /&gt;&lt;br /&gt;Examples of this awareness can be found in Atul's blog entries:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.toolness.com/wp/?p=64"&gt;Trusting Functionality&lt;/a&gt; and &lt;a href="http://www.toolness.com/wp/?p=94"&gt;Towards Inter-Community Trust&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"At present, because our &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;project is still in the prototyping stage, we’re opting for freedom of expressiveness and experimentation over security&lt;/span&gt;. That means that all the various verbs we write, while written in JavaScript, are always executed with Chrome privileges, meaning that they’re capable of doing whatever they want to the end-user’s computer."&lt;br /&gt;&lt;br /&gt;"So the particular dilemma that needs to be solved here is: how can an end-user trust that a verb won’t do anything harmful to their data or privacy—be it intentional or accidental—while still providing a low barrier of entry for aspiring authors to write and distribute their own verbs?"&lt;br /&gt;&lt;br /&gt;More specific concerns can be found in the Ubiquity Author Tutorial.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://wiki.mozilla.org/Labs/Ubiquity/Ubiquity_0.1_Author_Tutorial#Sharing_it_with_the_World"&gt;Ubiquity_0.1_Author_Tutorial#Sharing_it_with_the_World&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;"If the user chooses to subscribe to a command from an untrusted source, they will get a security warning message before they can install the command. (And in Ubiquity 0.1, ALL sources are considered untrusted, so don't take it personally!) Because &lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Ubiquity commands can execute arbitrary javascript with chrome privileges, subscribing to a command from a website means allowing that site full access to do whatever it wants to your browser&lt;/span&gt;&lt;/span&gt;. We want to make sure people understand the dangers before subscribing to commands, so we made the warning page pretty scary."&lt;br /&gt;&lt;br /&gt;"In the future, we're going to have something set up that we call a "trust network". When you try out a Ubiquity command from a website, and determine that the command is safe (or unsafe), you'll be able to leave an approval (or a warning). When your friends with Ubiquity installed visit the same site, they'll see the approval or the warning that you left. In this way, users will be able to rely on the judgement of other people they already know and trust in order to help them make decisions about whether a command is safe to install or not."&lt;br /&gt;&lt;br /&gt;"By the way, the reason we call it "subscribing" to a command, rather than "installing" a command, is that if the javascript file changes -- if the site owner adds new commands, removes old commands, or updates existing commands -- all users subscribed to that URL will automatically get the updates. This will be very convenient for both users and developers, but it will also introduce another type of security risk:&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt; just because you decided a command was safe at one point in time doesn't mean that the command will always remain safe&lt;/span&gt;. For this reason, we'll need to make sure that the trust network keeps track of when commands have been modified, and notifies users of changes that may make a command unsafe."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Possible topics for Part 2 - ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I plan on digging into these ideas in future posts, and have listed a few possibilities below.  If you have a preference or other suggestions, feel free to leave a comment.&lt;br /&gt;&lt;br /&gt;Using Ubiquity for Evil:&lt;br /&gt;Basically, a discussion of Ubiquity features and how they could be used maliciously.&lt;br /&gt;&lt;br /&gt;Subscription Exploits:&lt;br /&gt;Results of research into whether commands could be installed in an automated fashion without the user's permission.&lt;br /&gt;&lt;br /&gt;Ubiquity Trust Model:&lt;br /&gt;Examination of how the trust model protects users from subscribing to malicious commands.  This article may have to occur once that trust model has been determined by the project developers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-7706946194667998295?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/7706946194667998295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=7706946194667998295' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/7706946194667998295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/7706946194667998295'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2008/08/ubiquity-security-concerns-part-1.html' title='Ubiquity Security Concerns Part 1: An Introduction'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-2011450576948610831</id><published>2008-08-09T11:17:00.094-05:00</published><updated>2011-09-27T11:31:07.098-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cross-site Scripting'/><title type='text'>Presentation Layer Output Encoding: Apache Commons Lang StringEscapeUtils vs. OWASP Reform</title><content type='html'>&lt;b&gt;*Updated to include &lt;a href="http://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API"&gt;OWASP ESAPI&lt;/a&gt; Results on August 21, 2008&lt;/b&gt;*&lt;br /&gt;&lt;br /&gt;In order to compare the effectiveness of the &lt;a href="http://commons.apache.org/lang/api/org/apache/commons/lang/StringEscapeUtils.html"&gt;Apache Commons Lang StringEscapeUtils&lt;/a&gt; and the &lt;a href="http://www.owasp.org/index.php/Category:OWASP_Encoding_Project"&gt;OWASP Reform library&lt;/a&gt;, I created a JSP page that encodes ASCII values from 0 to 255.  I chose to examine the ability of each library to encode HTML and JavaScript values for the purpose of preventing cross-site scripting attacks.  The results are shown at the bottom of this post.&lt;br /&gt;&lt;br /&gt;In general, both the ESAPI and Reform libraries encode any value other than a-z, A-Z, and 0-9 (there are some exceptions).  This is a great approach to ensuring client-side input cannot be interpreted as HTML or JavaScript commands when it is redisplayed in the browser.&lt;br /&gt;&lt;br /&gt;ESAPI is under active development and boasts a variety of other security related functionality that may benefit an organization.  I encourage everyone to take a look at the &lt;a href="http://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API"&gt;ESAPI OWASP project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The rest of this post is provided as a reference.&lt;br /&gt;&lt;br /&gt;Apache Commons Lang StringEscapeUtils Methods:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;escapeHtml&lt;/li&gt;&lt;li&gt;escapeJava&lt;/li&gt;&lt;li&gt;escapeJavaScript&lt;/li&gt;&lt;li&gt;escapeSql&lt;/li&gt;&lt;li&gt;escapeXml&lt;/li&gt;&lt;li&gt;unescapeHtml&lt;/li&gt;&lt;li&gt;unescapeJava&lt;/li&gt;&lt;li&gt;unescapeJavaScript&lt;/li&gt;&lt;li&gt;unescapeXml&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;OWASP Reform Methods:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;HtmlEncode&lt;/li&gt;&lt;li&gt;HtmlAttributeEncode&lt;/li&gt;&lt;li&gt;XmlEncode&lt;/li&gt;&lt;li&gt;XmlAttributeEncode&lt;/li&gt;&lt;li&gt;JsString&lt;/li&gt;&lt;li&gt;VbsString&lt;/li&gt;&lt;/ul&gt;OWASP ESAPI (SVN Snapshot 2008-08-21) Methods:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;canonicalize&lt;/li&gt;&lt;li&gt;normalize&lt;/li&gt;&lt;li&gt;encodeForCSS&lt;/li&gt;&lt;li&gt;encodeForHTML&lt;/li&gt;&lt;li&gt;encodeForHTMLAttribute&lt;/li&gt;&lt;li&gt;encodeForJavaScript&lt;/li&gt;&lt;li&gt;encodeForVBScript&lt;/li&gt;&lt;li&gt;encodeForSQL&lt;/li&gt;&lt;li&gt;encodeForLDAP&lt;/li&gt;&lt;li&gt;encodeForDN&lt;/li&gt;&lt;li&gt;encodeForXPath&lt;/li&gt;&lt;li&gt;encodeForXML&lt;/li&gt;&lt;li&gt;encodeForXMLAttribute&lt;/li&gt;&lt;li&gt;encodeForURL&lt;/li&gt;&lt;li&gt;decodeFromURL&lt;/li&gt;&lt;li&gt;encodeForBase64&lt;/li&gt;&lt;li&gt;decodeFromBase64&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Legend:&lt;br /&gt;ASCII - The numerical ASCII value&lt;br /&gt;Char - The symbol or character associated with that ASCII value&lt;br /&gt;SEU HTML - org.apache.commons.lang.StringEscapeUtils.escapeHtml&lt;br /&gt;Reform HTML - org.owasp.reform.Reform.HtmlEncode&lt;br /&gt;ESAPI HTML - org.owasp.esapi.Encoder.encodeForHTML&lt;br /&gt;SEU JS - org.apache.commons.lang.StringEscapeUtils.escapeJavaScript&lt;br /&gt;Reform JS - org.owasp.reform.Reform.JsString&lt;br /&gt;ESAPI JS - org.owasp.esapi.Encoder.encodeForJavaScript&lt;br /&gt;&lt;br /&gt;&lt;table style="empty-cells: show;" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;ASCII&lt;/th&gt;&lt;th&gt;Char&lt;/th&gt;&lt;th&gt;SEU&lt;br /&gt;HTML&lt;/th&gt;&lt;th&gt;Reform&lt;br /&gt;HTML&lt;/th&gt;&lt;th&gt;ESAPI&lt;br /&gt;HTML&lt;/th&gt;&lt;th&gt;SEU&lt;br /&gt;JS&lt;/th&gt;&lt;th&gt;Reform&lt;br /&gt;JS&lt;/th&gt;&lt;th&gt;ESAPI&lt;br /&gt;JS&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&amp;amp;#0;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0000&lt;/td&gt;&lt;td&gt;'\x00'&lt;/td&gt;&lt;td&gt;\0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#1;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0001&lt;/td&gt;&lt;td&gt;'\x01'&lt;/td&gt;&lt;td&gt;\x01&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#2;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0002&lt;/td&gt;&lt;td&gt;'\x02'&lt;/td&gt;&lt;td&gt;\x02&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#3;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0003&lt;/td&gt;&lt;td&gt;'\x03'&lt;/td&gt;&lt;td&gt;\x03&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#4;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0004&lt;/td&gt;&lt;td&gt;'\x04'&lt;/td&gt;&lt;td&gt;\x04&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#5;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0005&lt;/td&gt;&lt;td&gt;'\x05'&lt;/td&gt;&lt;td&gt;\x05&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#6;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0006&lt;/td&gt;&lt;td&gt;'\x06'&lt;/td&gt;&lt;td&gt;\x06&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#7;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0007&lt;/td&gt;&lt;td&gt;'\x07'&lt;/td&gt;&lt;td&gt;\x07&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#8;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\b&lt;/td&gt;&lt;td&gt;'\x08'&lt;/td&gt;&lt;td&gt;\b&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&amp;amp;#9;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\t&lt;/td&gt;&lt;td&gt;'\x09'&lt;/td&gt;&lt;td&gt;\t&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&amp;amp;#10;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\n&lt;/td&gt;&lt;td&gt;'\x0a'&lt;/td&gt;&lt;td&gt;\n&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt; &amp;nbsp;&lt;/td&gt;&lt;td&gt; &amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;amp;#11;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u000B&lt;/td&gt;&lt;td&gt;'\x0b'&lt;/td&gt;&lt;td&gt;\v&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt; &amp;nbsp;&lt;/td&gt;&lt;td&gt; &amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;amp;#12;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\f&lt;/td&gt;&lt;td&gt;'\x0c'&lt;/td&gt;&lt;td&gt;\f&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&amp;amp;#13;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\r&lt;/td&gt;&lt;td&gt;'\x0d'&lt;/td&gt;&lt;td&gt;\r&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#14;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u000E&lt;/td&gt;&lt;td&gt;'\x0e'&lt;/td&gt;&lt;td&gt;\x0E&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#15;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u000F&lt;/td&gt;&lt;td&gt;'\x0f'&lt;/td&gt;&lt;td&gt;\x0F&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#16;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0010&lt;/td&gt;&lt;td&gt;'\x10'&lt;/td&gt;&lt;td&gt;\x10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#17;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0011&lt;/td&gt;&lt;td&gt;'\x11'&lt;/td&gt;&lt;td&gt;\x11&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#18;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0012&lt;/td&gt;&lt;td&gt;'\x12'&lt;/td&gt;&lt;td&gt;\x12&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#19;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0013&lt;/td&gt;&lt;td&gt;'\x13'&lt;/td&gt;&lt;td&gt;\x13&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#20;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0014&lt;/td&gt;&lt;td&gt;'\x14'&lt;/td&gt;&lt;td&gt;\x14&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#21;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0015&lt;/td&gt;&lt;td&gt;'\x15'&lt;/td&gt;&lt;td&gt;\x15&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#22;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0016&lt;/td&gt;&lt;td&gt;'\x16'&lt;/td&gt;&lt;td&gt;\x16&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#23;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0017&lt;/td&gt;&lt;td&gt;'\x17'&lt;/td&gt;&lt;td&gt;\x17&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#24;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0018&lt;/td&gt;&lt;td&gt;'\x18'&lt;/td&gt;&lt;td&gt;\x18&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#25;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0019&lt;/td&gt;&lt;td&gt;'\x19'&lt;/td&gt;&lt;td&gt;\x19&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#26;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u001A&lt;/td&gt;&lt;td&gt;'\x1a'&lt;/td&gt;&lt;td&gt;\x1A&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;27&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#27;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u001B&lt;/td&gt;&lt;td&gt;'\x1b'&lt;/td&gt;&lt;td&gt;\x1B&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;28&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#28;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u001C&lt;/td&gt;&lt;td&gt;'\x1c'&lt;/td&gt;&lt;td&gt;\x1C&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#29;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u001D&lt;/td&gt;&lt;td&gt;'\x1d'&lt;/td&gt;&lt;td&gt;\x1D&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;30&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#30;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u001E&lt;/td&gt;&lt;td&gt;'\x1e'&lt;/td&gt;&lt;td&gt;\x1E&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;31&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;&amp;amp;#31;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u001F&lt;/td&gt;&lt;td&gt;'\x1f'&lt;/td&gt;&lt;td&gt;\x1F&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;' '&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;33&lt;/td&gt;&lt;td&gt;!&lt;/td&gt;&lt;td&gt;!&lt;/td&gt;&lt;td&gt;&amp;amp;#33;&lt;/td&gt;&lt;td&gt;&amp;amp;#33;&lt;/td&gt;&lt;td&gt;!&lt;/td&gt;&lt;td&gt;'\x21'&lt;/td&gt;&lt;td&gt;\x21&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;"&lt;/td&gt;&lt;td&gt;&amp;amp;quot;&lt;/td&gt;&lt;td&gt;&amp;amp;#34;&lt;/td&gt;&lt;td&gt;&amp;amp;quot;&lt;/td&gt;&lt;td&gt;\"&lt;/td&gt;&lt;td&gt;'\x22'&lt;/td&gt;&lt;td&gt;\"&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;35&lt;/td&gt;&lt;td&gt;#&lt;/td&gt;&lt;td&gt;#&lt;/td&gt;&lt;td&gt;&amp;amp;#35;&lt;/td&gt;&lt;td&gt;&amp;amp;#35;&lt;/td&gt;&lt;td&gt;#&lt;/td&gt;&lt;td&gt;'\x23'&lt;/td&gt;&lt;td&gt;\x23&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;$&lt;/td&gt;&lt;td&gt;$&lt;/td&gt;&lt;td&gt;&amp;amp;#36;&lt;/td&gt;&lt;td&gt;&amp;amp;#36;&lt;/td&gt;&lt;td&gt;$&lt;/td&gt;&lt;td&gt;'\x24'&lt;/td&gt;&lt;td&gt;\x24&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;37&lt;/td&gt;&lt;td&gt;%&lt;/td&gt;&lt;td&gt;%&lt;/td&gt;&lt;td&gt;&amp;amp;#37;&lt;/td&gt;&lt;td&gt;&amp;amp;#37;&lt;/td&gt;&lt;td&gt;%&lt;/td&gt;&lt;td&gt;'\x25'&lt;/td&gt;&lt;td&gt;\x25&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;38&lt;/td&gt;&lt;td&gt;&amp;amp;&lt;/td&gt;&lt;td&gt;&amp;amp;amp;&lt;/td&gt;&lt;td&gt;&amp;amp;#38;&lt;/td&gt;&lt;td&gt;&amp;amp;amp;&lt;/td&gt;&lt;td&gt;&amp;amp;&lt;/td&gt;&lt;td&gt;'\x26'&lt;/td&gt;&lt;td&gt;\x26&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;39&lt;/td&gt;&lt;td&gt;'&lt;/td&gt;&lt;td&gt;'&lt;/td&gt;&lt;td&gt;&amp;amp;#39;&lt;/td&gt;&lt;td&gt;&amp;amp;#39;&lt;/td&gt;&lt;td&gt;\'&lt;/td&gt;&lt;td&gt;'\x27'&lt;/td&gt;&lt;td&gt;\'&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;40&lt;/td&gt;&lt;td&gt;(&lt;/td&gt;&lt;td&gt;(&lt;/td&gt;&lt;td&gt;&amp;amp;#40;&lt;/td&gt;&lt;td&gt;&amp;amp;#40;&lt;/td&gt;&lt;td&gt;(&lt;/td&gt;&lt;td&gt;'\x28'&lt;/td&gt;&lt;td&gt;\x28&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;41&lt;/td&gt;&lt;td&gt;)&lt;/td&gt;&lt;td&gt;)&lt;/td&gt;&lt;td&gt;&amp;amp;#41;&lt;/td&gt;&lt;td&gt;&amp;amp;#41;&lt;/td&gt;&lt;td&gt;)&lt;/td&gt;&lt;td&gt;'\x29'&lt;/td&gt;&lt;td&gt;\x29&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;42&lt;/td&gt;&lt;td&gt;*&lt;/td&gt;&lt;td&gt;*&lt;/td&gt;&lt;td&gt;&amp;amp;#42;&lt;/td&gt;&lt;td&gt;&amp;amp;#42;&lt;/td&gt;&lt;td&gt;*&lt;/td&gt;&lt;td&gt;'\x2a'&lt;/td&gt;&lt;td&gt;\x2A&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;43&lt;/td&gt;&lt;td&gt;+&lt;/td&gt;&lt;td&gt;+&lt;/td&gt;&lt;td&gt;&amp;amp;#43;&lt;/td&gt;&lt;td&gt;&amp;amp;#43;&lt;/td&gt;&lt;td&gt;+&lt;/td&gt;&lt;td&gt;'\x2b'&lt;/td&gt;&lt;td&gt;\x2B&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;44&lt;/td&gt;&lt;td&gt;,&lt;/td&gt;&lt;td&gt;,&lt;/td&gt;&lt;td&gt;,&lt;/td&gt;&lt;td&gt;,&lt;/td&gt;&lt;td&gt;,&lt;/td&gt;&lt;td&gt;','&lt;/td&gt;&lt;td&gt;,&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;45&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;&amp;amp;#45;&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;'\x2d'&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;46&lt;/td&gt;&lt;td&gt;.&lt;/td&gt;&lt;td&gt;.&lt;/td&gt;&lt;td&gt;.&lt;/td&gt;&lt;td&gt;.&lt;/td&gt;&lt;td&gt;.&lt;/td&gt;&lt;td&gt;'.'&lt;/td&gt;&lt;td&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;47&lt;/td&gt;&lt;td&gt;/&lt;/td&gt;&lt;td&gt;/&lt;/td&gt;&lt;td&gt;&amp;amp;#47;&lt;/td&gt;&lt;td&gt;&amp;amp;#47;&lt;/td&gt;&lt;td&gt;\/&lt;/td&gt;&lt;td&gt;'\x2f'&lt;/td&gt;&lt;td&gt;\x2F&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;48&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;'0'&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;49&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;'1'&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;50&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;'2'&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;51&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;'3'&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;52&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;'4'&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;53&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;'5'&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;54&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;'6'&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;55&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;'7'&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;56&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;'8'&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;57&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;'9'&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;58&lt;/td&gt;&lt;td&gt;:&lt;/td&gt;&lt;td&gt;:&lt;/td&gt;&lt;td&gt;&amp;amp;#58;&lt;/td&gt;&lt;td&gt;&amp;amp;#58;&lt;/td&gt;&lt;td&gt;:&lt;/td&gt;&lt;td&gt;'\x3a'&lt;/td&gt;&lt;td&gt;\x3A&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;59&lt;/td&gt;&lt;td&gt;;&lt;/td&gt;&lt;td&gt;;&lt;/td&gt;&lt;td&gt;&amp;amp;#59;&lt;/td&gt;&lt;td&gt;&amp;amp;#59;&lt;/td&gt;&lt;td&gt;;&lt;/td&gt;&lt;td&gt;'\x3b'&lt;/td&gt;&lt;td&gt;\x3B&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;60&lt;/td&gt;&lt;td&gt;&amp;lt;&lt;/td&gt;&lt;td&gt;&amp;amp;lt;&lt;/td&gt;&lt;td&gt;&amp;amp;#60;&lt;/td&gt;&lt;td&gt;&amp;amp;lt;&lt;/td&gt;&lt;td&gt;&amp;lt;&lt;/td&gt;&lt;td&gt;'\x3c'&lt;/td&gt;&lt;td&gt;\x3C&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;61&lt;/td&gt;&lt;td&gt;=&lt;/td&gt;&lt;td&gt;=&lt;/td&gt;&lt;td&gt;&amp;amp;#61;&lt;/td&gt;&lt;td&gt;&amp;amp;#61;&lt;/td&gt;&lt;td&gt;=&lt;/td&gt;&lt;td&gt;'\x3d'&lt;/td&gt;&lt;td&gt;\x3D&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;62&lt;/td&gt;&lt;td&gt;&amp;gt;&lt;/td&gt;&lt;td&gt;&amp;amp;gt;&lt;/td&gt;&lt;td&gt;&amp;amp;#62;&lt;/td&gt;&lt;td&gt;&amp;amp;gt;&lt;/td&gt;&lt;td&gt;&amp;gt;&lt;/td&gt;&lt;td&gt;'\x3e'&lt;/td&gt;&lt;td&gt;\x3E&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;63&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;td&gt;&amp;amp;#63;&lt;/td&gt;&lt;td&gt;&amp;amp;#63;&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;td&gt;'\x3f'&lt;/td&gt;&lt;td&gt;\x3F&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;64&lt;/td&gt;&lt;td&gt;@&lt;/td&gt;&lt;td&gt;@&lt;/td&gt;&lt;td&gt;&amp;amp;#64;&lt;/td&gt;&lt;td&gt;&amp;amp;#64;&lt;/td&gt;&lt;td&gt;@&lt;/td&gt;&lt;td&gt;'\x40'&lt;/td&gt;&lt;td&gt;\x40&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;65&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;td&gt;'A'&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;66&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;td&gt;'B'&lt;/td&gt;&lt;td&gt;B&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;67&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;td&gt;'C'&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;68&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;td&gt;'D'&lt;/td&gt;&lt;td&gt;D&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;69&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;td&gt;'E'&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;70&lt;/td&gt;&lt;td&gt;F&lt;/td&gt;&lt;td&gt;F&lt;/td&gt;&lt;td&gt;F&lt;/td&gt;&lt;td&gt;F&lt;/td&gt;&lt;td&gt;F&lt;/td&gt;&lt;td&gt;'F'&lt;/td&gt;&lt;td&gt;F&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;71&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;td&gt;'G'&lt;/td&gt;&lt;td&gt;G&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;72&lt;/td&gt;&lt;td&gt;H&lt;/td&gt;&lt;td&gt;H&lt;/td&gt;&lt;td&gt;H&lt;/td&gt;&lt;td&gt;H&lt;/td&gt;&lt;td&gt;H&lt;/td&gt;&lt;td&gt;'H'&lt;/td&gt;&lt;td&gt;H&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;73&lt;/td&gt;&lt;td&gt;I&lt;/td&gt;&lt;td&gt;I&lt;/td&gt;&lt;td&gt;I&lt;/td&gt;&lt;td&gt;I&lt;/td&gt;&lt;td&gt;I&lt;/td&gt;&lt;td&gt;'I'&lt;/td&gt;&lt;td&gt;I&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;74&lt;/td&gt;&lt;td&gt;J&lt;/td&gt;&lt;td&gt;J&lt;/td&gt;&lt;td&gt;J&lt;/td&gt;&lt;td&gt;J&lt;/td&gt;&lt;td&gt;J&lt;/td&gt;&lt;td&gt;'J'&lt;/td&gt;&lt;td&gt;J&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;75&lt;/td&gt;&lt;td&gt;K&lt;/td&gt;&lt;td&gt;K&lt;/td&gt;&lt;td&gt;K&lt;/td&gt;&lt;td&gt;K&lt;/td&gt;&lt;td&gt;K&lt;/td&gt;&lt;td&gt;'K'&lt;/td&gt;&lt;td&gt;K&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;76&lt;/td&gt;&lt;td&gt;L&lt;/td&gt;&lt;td&gt;L&lt;/td&gt;&lt;td&gt;L&lt;/td&gt;&lt;td&gt;L&lt;/td&gt;&lt;td&gt;L&lt;/td&gt;&lt;td&gt;'L'&lt;/td&gt;&lt;td&gt;L&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;77&lt;/td&gt;&lt;td&gt;M&lt;/td&gt;&lt;td&gt;M&lt;/td&gt;&lt;td&gt;M&lt;/td&gt;&lt;td&gt;M&lt;/td&gt;&lt;td&gt;M&lt;/td&gt;&lt;td&gt;'M'&lt;/td&gt;&lt;td&gt;M&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;78&lt;/td&gt;&lt;td&gt;N&lt;/td&gt;&lt;td&gt;N&lt;/td&gt;&lt;td&gt;N&lt;/td&gt;&lt;td&gt;N&lt;/td&gt;&lt;td&gt;N&lt;/td&gt;&lt;td&gt;'N'&lt;/td&gt;&lt;td&gt;N&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;79&lt;/td&gt;&lt;td&gt;O&lt;/td&gt;&lt;td&gt;O&lt;/td&gt;&lt;td&gt;O&lt;/td&gt;&lt;td&gt;O&lt;/td&gt;&lt;td&gt;O&lt;/td&gt;&lt;td&gt;'O'&lt;/td&gt;&lt;td&gt;O&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;80&lt;/td&gt;&lt;td&gt;P&lt;/td&gt;&lt;td&gt;P&lt;/td&gt;&lt;td&gt;P&lt;/td&gt;&lt;td&gt;P&lt;/td&gt;&lt;td&gt;P&lt;/td&gt;&lt;td&gt;'P'&lt;/td&gt;&lt;td&gt;P&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;81&lt;/td&gt;&lt;td&gt;Q&lt;/td&gt;&lt;td&gt;Q&lt;/td&gt;&lt;td&gt;Q&lt;/td&gt;&lt;td&gt;Q&lt;/td&gt;&lt;td&gt;Q&lt;/td&gt;&lt;td&gt;'Q'&lt;/td&gt;&lt;td&gt;Q&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;82&lt;/td&gt;&lt;td&gt;R&lt;/td&gt;&lt;td&gt;R&lt;/td&gt;&lt;td&gt;R&lt;/td&gt;&lt;td&gt;R&lt;/td&gt;&lt;td&gt;R&lt;/td&gt;&lt;td&gt;'R'&lt;/td&gt;&lt;td&gt;R&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;83&lt;/td&gt;&lt;td&gt;S&lt;/td&gt;&lt;td&gt;S&lt;/td&gt;&lt;td&gt;S&lt;/td&gt;&lt;td&gt;S&lt;/td&gt;&lt;td&gt;S&lt;/td&gt;&lt;td&gt;'S'&lt;/td&gt;&lt;td&gt;S&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;84&lt;/td&gt;&lt;td&gt;T&lt;/td&gt;&lt;td&gt;T&lt;/td&gt;&lt;td&gt;T&lt;/td&gt;&lt;td&gt;T&lt;/td&gt;&lt;td&gt;T&lt;/td&gt;&lt;td&gt;'T'&lt;/td&gt;&lt;td&gt;T&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;85&lt;/td&gt;&lt;td&gt;U&lt;/td&gt;&lt;td&gt;U&lt;/td&gt;&lt;td&gt;U&lt;/td&gt;&lt;td&gt;U&lt;/td&gt;&lt;td&gt;U&lt;/td&gt;&lt;td&gt;'U'&lt;/td&gt;&lt;td&gt;U&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;86&lt;/td&gt;&lt;td&gt;V&lt;/td&gt;&lt;td&gt;V&lt;/td&gt;&lt;td&gt;V&lt;/td&gt;&lt;td&gt;V&lt;/td&gt;&lt;td&gt;V&lt;/td&gt;&lt;td&gt;'V'&lt;/td&gt;&lt;td&gt;V&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;87&lt;/td&gt;&lt;td&gt;W&lt;/td&gt;&lt;td&gt;W&lt;/td&gt;&lt;td&gt;W&lt;/td&gt;&lt;td&gt;W&lt;/td&gt;&lt;td&gt;W&lt;/td&gt;&lt;td&gt;'W'&lt;/td&gt;&lt;td&gt;W&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;88&lt;/td&gt;&lt;td&gt;X&lt;/td&gt;&lt;td&gt;X&lt;/td&gt;&lt;td&gt;X&lt;/td&gt;&lt;td&gt;X&lt;/td&gt;&lt;td&gt;X&lt;/td&gt;&lt;td&gt;'X'&lt;/td&gt;&lt;td&gt;X&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;89&lt;/td&gt;&lt;td&gt;Y&lt;/td&gt;&lt;td&gt;Y&lt;/td&gt;&lt;td&gt;Y&lt;/td&gt;&lt;td&gt;Y&lt;/td&gt;&lt;td&gt;Y&lt;/td&gt;&lt;td&gt;'Y'&lt;/td&gt;&lt;td&gt;Y&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;90&lt;/td&gt;&lt;td&gt;Z&lt;/td&gt;&lt;td&gt;Z&lt;/td&gt;&lt;td&gt;Z&lt;/td&gt;&lt;td&gt;Z&lt;/td&gt;&lt;td&gt;Z&lt;/td&gt;&lt;td&gt;'Z'&lt;/td&gt;&lt;td&gt;Z&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;91&lt;/td&gt;&lt;td&gt;[&lt;/td&gt;&lt;td&gt;[&lt;/td&gt;&lt;td&gt;&amp;amp;#91;&lt;/td&gt;&lt;td&gt;&amp;amp;#91;&lt;/td&gt;&lt;td&gt;[&lt;/td&gt;&lt;td&gt;'\x5b'&lt;/td&gt;&lt;td&gt;\x5B&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;92&lt;/td&gt;&lt;td&gt;\&lt;/td&gt;&lt;td&gt;\&lt;/td&gt;&lt;td&gt;&amp;amp;#92;&lt;/td&gt;&lt;td&gt;&amp;amp;#92;&lt;/td&gt;&lt;td&gt;\\&lt;/td&gt;&lt;td&gt;'\x5c'&lt;/td&gt;&lt;td&gt;\\&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;93&lt;/td&gt;&lt;td&gt;]&lt;/td&gt;&lt;td&gt;]&lt;/td&gt;&lt;td&gt;&amp;amp;#93;&lt;/td&gt;&lt;td&gt;&amp;amp;#93;&lt;/td&gt;&lt;td&gt;]&lt;/td&gt;&lt;td&gt;'\x5d'&lt;/td&gt;&lt;td&gt;\x5D&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;94&lt;/td&gt;&lt;td&gt;^&lt;/td&gt;&lt;td&gt;^&lt;/td&gt;&lt;td&gt;&amp;amp;#94;&lt;/td&gt;&lt;td&gt;&amp;amp;#94;&lt;/td&gt;&lt;td&gt;^&lt;/td&gt;&lt;td&gt;'\x5e'&lt;/td&gt;&lt;td&gt;\x5E&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;95&lt;/td&gt;&lt;td&gt;_&lt;/td&gt;&lt;td&gt;_&lt;/td&gt;&lt;td&gt;&amp;amp;#95;&lt;/td&gt;&lt;td&gt;_&lt;/td&gt;&lt;td&gt;_&lt;/td&gt;&lt;td&gt;'\x5f'&lt;/td&gt;&lt;td&gt;_&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;96&lt;/td&gt;&lt;td&gt;`&lt;/td&gt;&lt;td&gt;`&lt;/td&gt;&lt;td&gt;&amp;amp;#96;&lt;/td&gt;&lt;td&gt;&amp;amp;#96;&lt;/td&gt;&lt;td&gt;`&lt;/td&gt;&lt;td&gt;'\x60'&lt;/td&gt;&lt;td&gt;\x60&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;97&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;td&gt;'a'&lt;/td&gt;&lt;td&gt;a&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;98&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;td&gt;'b'&lt;/td&gt;&lt;td&gt;b&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;99&lt;/td&gt;&lt;td&gt;c&lt;/td&gt;&lt;td&gt;c&lt;/td&gt;&lt;td&gt;c&lt;/td&gt;&lt;td&gt;c&lt;/td&gt;&lt;td&gt;c&lt;/td&gt;&lt;td&gt;'c'&lt;/td&gt;&lt;td&gt;c&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;100&lt;/td&gt;&lt;td&gt;d&lt;/td&gt;&lt;td&gt;d&lt;/td&gt;&lt;td&gt;d&lt;/td&gt;&lt;td&gt;d&lt;/td&gt;&lt;td&gt;d&lt;/td&gt;&lt;td&gt;'d'&lt;/td&gt;&lt;td&gt;d&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;101&lt;/td&gt;&lt;td&gt;e&lt;/td&gt;&lt;td&gt;e&lt;/td&gt;&lt;td&gt;e&lt;/td&gt;&lt;td&gt;e&lt;/td&gt;&lt;td&gt;e&lt;/td&gt;&lt;td&gt;'e'&lt;/td&gt;&lt;td&gt;e&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;102&lt;/td&gt;&lt;td&gt;f&lt;/td&gt;&lt;td&gt;f&lt;/td&gt;&lt;td&gt;f&lt;/td&gt;&lt;td&gt;f&lt;/td&gt;&lt;td&gt;f&lt;/td&gt;&lt;td&gt;'f'&lt;/td&gt;&lt;td&gt;f&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;103&lt;/td&gt;&lt;td&gt;g&lt;/td&gt;&lt;td&gt;g&lt;/td&gt;&lt;td&gt;g&lt;/td&gt;&lt;td&gt;g&lt;/td&gt;&lt;td&gt;g&lt;/td&gt;&lt;td&gt;'g'&lt;/td&gt;&lt;td&gt;g&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;104&lt;/td&gt;&lt;td&gt;h&lt;/td&gt;&lt;td&gt;h&lt;/td&gt;&lt;td&gt;h&lt;/td&gt;&lt;td&gt;h&lt;/td&gt;&lt;td&gt;h&lt;/td&gt;&lt;td&gt;'h'&lt;/td&gt;&lt;td&gt;h&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;105&lt;/td&gt;&lt;td&gt;i&lt;/td&gt;&lt;td&gt;i&lt;/td&gt;&lt;td&gt;i&lt;/td&gt;&lt;td&gt;i&lt;/td&gt;&lt;td&gt;i&lt;/td&gt;&lt;td&gt;'i'&lt;/td&gt;&lt;td&gt;i&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;106&lt;/td&gt;&lt;td&gt;j&lt;/td&gt;&lt;td&gt;j&lt;/td&gt;&lt;td&gt;j&lt;/td&gt;&lt;td&gt;j&lt;/td&gt;&lt;td&gt;j&lt;/td&gt;&lt;td&gt;'j'&lt;/td&gt;&lt;td&gt;j&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;107&lt;/td&gt;&lt;td&gt;k&lt;/td&gt;&lt;td&gt;k&lt;/td&gt;&lt;td&gt;k&lt;/td&gt;&lt;td&gt;k&lt;/td&gt;&lt;td&gt;k&lt;/td&gt;&lt;td&gt;'k'&lt;/td&gt;&lt;td&gt;k&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;108&lt;/td&gt;&lt;td&gt;l&lt;/td&gt;&lt;td&gt;l&lt;/td&gt;&lt;td&gt;l&lt;/td&gt;&lt;td&gt;l&lt;/td&gt;&lt;td&gt;l&lt;/td&gt;&lt;td&gt;'l'&lt;/td&gt;&lt;td&gt;l&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;109&lt;/td&gt;&lt;td&gt;m&lt;/td&gt;&lt;td&gt;m&lt;/td&gt;&lt;td&gt;m&lt;/td&gt;&lt;td&gt;m&lt;/td&gt;&lt;td&gt;m&lt;/td&gt;&lt;td&gt;'m'&lt;/td&gt;&lt;td&gt;m&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;110&lt;/td&gt;&lt;td&gt;n&lt;/td&gt;&lt;td&gt;n&lt;/td&gt;&lt;td&gt;n&lt;/td&gt;&lt;td&gt;n&lt;/td&gt;&lt;td&gt;n&lt;/td&gt;&lt;td&gt;'n'&lt;/td&gt;&lt;td&gt;n&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;111&lt;/td&gt;&lt;td&gt;o&lt;/td&gt;&lt;td&gt;o&lt;/td&gt;&lt;td&gt;o&lt;/td&gt;&lt;td&gt;o&lt;/td&gt;&lt;td&gt;o&lt;/td&gt;&lt;td&gt;'o'&lt;/td&gt;&lt;td&gt;o&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;112&lt;/td&gt;&lt;td&gt;p&lt;/td&gt;&lt;td&gt;p&lt;/td&gt;&lt;td&gt;p&lt;/td&gt;&lt;td&gt;p&lt;/td&gt;&lt;td&gt;p&lt;/td&gt;&lt;td&gt;'p'&lt;/td&gt;&lt;td&gt;p&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;113&lt;/td&gt;&lt;td&gt;q&lt;/td&gt;&lt;td&gt;q&lt;/td&gt;&lt;td&gt;q&lt;/td&gt;&lt;td&gt;q&lt;/td&gt;&lt;td&gt;q&lt;/td&gt;&lt;td&gt;'q'&lt;/td&gt;&lt;td&gt;q&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;114&lt;/td&gt;&lt;td&gt;r&lt;/td&gt;&lt;td&gt;r&lt;/td&gt;&lt;td&gt;r&lt;/td&gt;&lt;td&gt;r&lt;/td&gt;&lt;td&gt;r&lt;/td&gt;&lt;td&gt;'r'&lt;/td&gt;&lt;td&gt;r&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;115&lt;/td&gt;&lt;td&gt;s&lt;/td&gt;&lt;td&gt;s&lt;/td&gt;&lt;td&gt;s&lt;/td&gt;&lt;td&gt;s&lt;/td&gt;&lt;td&gt;s&lt;/td&gt;&lt;td&gt;'s'&lt;/td&gt;&lt;td&gt;s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;116&lt;/td&gt;&lt;td&gt;t&lt;/td&gt;&lt;td&gt;t&lt;/td&gt;&lt;td&gt;t&lt;/td&gt;&lt;td&gt;t&lt;/td&gt;&lt;td&gt;t&lt;/td&gt;&lt;td&gt;'t'&lt;/td&gt;&lt;td&gt;t&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;117&lt;/td&gt;&lt;td&gt;u&lt;/td&gt;&lt;td&gt;u&lt;/td&gt;&lt;td&gt;u&lt;/td&gt;&lt;td&gt;u&lt;/td&gt;&lt;td&gt;u&lt;/td&gt;&lt;td&gt;'u'&lt;/td&gt;&lt;td&gt;u&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;118&lt;/td&gt;&lt;td&gt;v&lt;/td&gt;&lt;td&gt;v&lt;/td&gt;&lt;td&gt;v&lt;/td&gt;&lt;td&gt;v&lt;/td&gt;&lt;td&gt;v&lt;/td&gt;&lt;td&gt;'v'&lt;/td&gt;&lt;td&gt;v&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;119&lt;/td&gt;&lt;td&gt;w&lt;/td&gt;&lt;td&gt;w&lt;/td&gt;&lt;td&gt;w&lt;/td&gt;&lt;td&gt;w&lt;/td&gt;&lt;td&gt;w&lt;/td&gt;&lt;td&gt;'w'&lt;/td&gt;&lt;td&gt;w&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;120&lt;/td&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;x&lt;/td&gt;&lt;td&gt;'x'&lt;/td&gt;&lt;td&gt;x&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;121&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;td&gt;'y'&lt;/td&gt;&lt;td&gt;y&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;122&lt;/td&gt;&lt;td&gt;z&lt;/td&gt;&lt;td&gt;z&lt;/td&gt;&lt;td&gt;z&lt;/td&gt;&lt;td&gt;z&lt;/td&gt;&lt;td&gt;z&lt;/td&gt;&lt;td&gt;'z'&lt;/td&gt;&lt;td&gt;z&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;123&lt;/td&gt;&lt;td&gt;{&lt;/td&gt;&lt;td&gt;{&lt;/td&gt;&lt;td&gt;&amp;amp;#123;&lt;/td&gt;&lt;td&gt;&amp;amp;#123;&lt;/td&gt;&lt;td&gt;{&lt;/td&gt;&lt;td&gt;'\x7b'&lt;/td&gt;&lt;td&gt;\x7B&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;124&lt;/td&gt;&lt;td&gt;|&lt;/td&gt;&lt;td&gt;|&lt;/td&gt;&lt;td&gt;&amp;amp;#124;&lt;/td&gt;&lt;td&gt;&amp;amp;#124;&lt;/td&gt;&lt;td&gt;|&lt;/td&gt;&lt;td&gt;'\x7c'&lt;/td&gt;&lt;td&gt;\x7C&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;125&lt;/td&gt;&lt;td&gt;}&lt;/td&gt;&lt;td&gt;}&lt;/td&gt;&lt;td&gt;&amp;amp;#125;&lt;/td&gt;&lt;td&gt;&amp;amp;#125;&lt;/td&gt;&lt;td&gt;}&lt;/td&gt;&lt;td&gt;'\x7d'&lt;/td&gt;&lt;td&gt;\x7D&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;126&lt;/td&gt;&lt;td&gt;~&lt;/td&gt;&lt;td&gt;~&lt;/td&gt;&lt;td&gt;&amp;amp;#126;&lt;/td&gt;&lt;td&gt;&amp;amp;#126;&lt;/td&gt;&lt;td&gt;~&lt;/td&gt;&lt;td&gt;'\x7e'&lt;/td&gt;&lt;td&gt;\x7E&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;127&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&amp;amp;#127;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;'\x7f'&lt;/td&gt;&lt;td&gt;\x7F&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;128&lt;/td&gt;&lt;td&gt;€&lt;/td&gt;&lt;td&gt;&amp;amp;#128;&lt;/td&gt;&lt;td&gt;&amp;amp;#128;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0080&lt;/td&gt;&lt;td&gt;'\u0080'&lt;/td&gt;&lt;td&gt;\x80&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;129&lt;/td&gt;&lt;td&gt;�&lt;/td&gt;&lt;td&gt;&amp;amp;#129;&lt;/td&gt;&lt;td&gt;&amp;amp;#129;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0081&lt;/td&gt;&lt;td&gt;'\u0081'&lt;/td&gt;&lt;td&gt;\x81&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;130&lt;/td&gt;&lt;td&gt;‚&lt;/td&gt;&lt;td&gt;&amp;amp;#130;&lt;/td&gt;&lt;td&gt;&amp;amp;#130;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0082&lt;/td&gt;&lt;td&gt;'\u0082'&lt;/td&gt;&lt;td&gt;\x82&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;131&lt;/td&gt;&lt;td&gt;ƒ&lt;/td&gt;&lt;td&gt;&amp;amp;#131;&lt;/td&gt;&lt;td&gt;&amp;amp;#131;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0083&lt;/td&gt;&lt;td&gt;'\u0083'&lt;/td&gt;&lt;td&gt;\x83&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;132&lt;/td&gt;&lt;td&gt;„&lt;/td&gt;&lt;td&gt;&amp;amp;#132;&lt;/td&gt;&lt;td&gt;&amp;amp;#132;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0084&lt;/td&gt;&lt;td&gt;'\u0084'&lt;/td&gt;&lt;td&gt;\x84&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;133&lt;/td&gt;&lt;td&gt;…&lt;/td&gt;&lt;td&gt;&amp;amp;#133;&lt;/td&gt;&lt;td&gt;&amp;amp;#133;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0085&lt;/td&gt;&lt;td&gt;'\u0085'&lt;/td&gt;&lt;td&gt;\x85&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;134&lt;/td&gt;&lt;td&gt;†&lt;/td&gt;&lt;td&gt;&amp;amp;#134;&lt;/td&gt;&lt;td&gt;&amp;amp;#134;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0086&lt;/td&gt;&lt;td&gt;'\u0086'&lt;/td&gt;&lt;td&gt;\x86&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;135&lt;/td&gt;&lt;td&gt;‡&lt;/td&gt;&lt;td&gt;&amp;amp;#135;&lt;/td&gt;&lt;td&gt;&amp;amp;#135;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0087&lt;/td&gt;&lt;td&gt;'\u0087'&lt;/td&gt;&lt;td&gt;\x87&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;136&lt;/td&gt;&lt;td&gt;ˆ&lt;/td&gt;&lt;td&gt;&amp;amp;#136;&lt;/td&gt;&lt;td&gt;&amp;amp;#136;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0088&lt;/td&gt;&lt;td&gt;'\u0088'&lt;/td&gt;&lt;td&gt;\x88&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;137&lt;/td&gt;&lt;td&gt;‰&lt;/td&gt;&lt;td&gt;&amp;amp;#137;&lt;/td&gt;&lt;td&gt;&amp;amp;#137;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0089&lt;/td&gt;&lt;td&gt;'\u0089'&lt;/td&gt;&lt;td&gt;\x89&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;138&lt;/td&gt;&lt;td&gt;Š&lt;/td&gt;&lt;td&gt;&amp;amp;#138;&lt;/td&gt;&lt;td&gt;&amp;amp;#138;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u008A&lt;/td&gt;&lt;td&gt;'\u008a'&lt;/td&gt;&lt;td&gt;\x8A&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;139&lt;/td&gt;&lt;td&gt;‹&lt;/td&gt;&lt;td&gt;&amp;amp;#139;&lt;/td&gt;&lt;td&gt;&amp;amp;#139;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u008B&lt;/td&gt;&lt;td&gt;'\u008b'&lt;/td&gt;&lt;td&gt;\x8B&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;140&lt;/td&gt;&lt;td&gt;Œ&lt;/td&gt;&lt;td&gt;&amp;amp;#140;&lt;/td&gt;&lt;td&gt;&amp;amp;#140;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u008C&lt;/td&gt;&lt;td&gt;'\u008c'&lt;/td&gt;&lt;td&gt;\x8C&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;141&lt;/td&gt;&lt;td&gt;�&lt;/td&gt;&lt;td&gt;&amp;amp;#141;&lt;/td&gt;&lt;td&gt;&amp;amp;#141;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u008D&lt;/td&gt;&lt;td&gt;'\u008d'&lt;/td&gt;&lt;td&gt;\x8D&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;142&lt;/td&gt;&lt;td&gt;Ž&lt;/td&gt;&lt;td&gt;&amp;amp;#142;&lt;/td&gt;&lt;td&gt;&amp;amp;#142;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u008E&lt;/td&gt;&lt;td&gt;'\u008e'&lt;/td&gt;&lt;td&gt;\x8E&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;143&lt;/td&gt;&lt;td&gt;�&lt;/td&gt;&lt;td&gt;&amp;amp;#143;&lt;/td&gt;&lt;td&gt;&amp;amp;#143;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u008F&lt;/td&gt;&lt;td&gt;'\u008f'&lt;/td&gt;&lt;td&gt;\x8F&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;144&lt;/td&gt;&lt;td&gt;�&lt;/td&gt;&lt;td&gt;&amp;amp;#144;&lt;/td&gt;&lt;td&gt;&amp;amp;#144;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0090&lt;/td&gt;&lt;td&gt;'\u0090'&lt;/td&gt;&lt;td&gt;\x90&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;145&lt;/td&gt;&lt;td&gt;‘&lt;/td&gt;&lt;td&gt;&amp;amp;#145;&lt;/td&gt;&lt;td&gt;&amp;amp;#145;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0091&lt;/td&gt;&lt;td&gt;'\u0091'&lt;/td&gt;&lt;td&gt;\x91&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;146&lt;/td&gt;&lt;td&gt;’&lt;/td&gt;&lt;td&gt;&amp;amp;#146;&lt;/td&gt;&lt;td&gt;&amp;amp;#146;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0092&lt;/td&gt;&lt;td&gt;'\u0092'&lt;/td&gt;&lt;td&gt;\x92&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;147&lt;/td&gt;&lt;td&gt;“&lt;/td&gt;&lt;td&gt;&amp;amp;#147;&lt;/td&gt;&lt;td&gt;&amp;amp;#147;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0093&lt;/td&gt;&lt;td&gt;'\u0093'&lt;/td&gt;&lt;td&gt;\x93&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;148&lt;/td&gt;&lt;td&gt;”&lt;/td&gt;&lt;td&gt;&amp;amp;#148;&lt;/td&gt;&lt;td&gt;&amp;amp;#148;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0094&lt;/td&gt;&lt;td&gt;'\u0094'&lt;/td&gt;&lt;td&gt;\x94&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;149&lt;/td&gt;&lt;td&gt;•&lt;/td&gt;&lt;td&gt;&amp;amp;#149;&lt;/td&gt;&lt;td&gt;&amp;amp;#149;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0095&lt;/td&gt;&lt;td&gt;'\u0095'&lt;/td&gt;&lt;td&gt;\x95&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;150&lt;/td&gt;&lt;td&gt;–&lt;/td&gt;&lt;td&gt;&amp;amp;#150;&lt;/td&gt;&lt;td&gt;&amp;amp;#150;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0096&lt;/td&gt;&lt;td&gt;'\u0096'&lt;/td&gt;&lt;td&gt;\x96&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;151&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;&amp;amp;#151;&lt;/td&gt;&lt;td&gt;&amp;amp;#151;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0097&lt;/td&gt;&lt;td&gt;'\u0097'&lt;/td&gt;&lt;td&gt;\x97&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;152&lt;/td&gt;&lt;td&gt;˜&lt;/td&gt;&lt;td&gt;&amp;amp;#152;&lt;/td&gt;&lt;td&gt;&amp;amp;#152;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0098&lt;/td&gt;&lt;td&gt;'\u0098'&lt;/td&gt;&lt;td&gt;\x98&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;153&lt;/td&gt;&lt;td&gt;™&lt;/td&gt;&lt;td&gt;&amp;amp;#153;&lt;/td&gt;&lt;td&gt;&amp;amp;#153;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u0099&lt;/td&gt;&lt;td&gt;'\u0099'&lt;/td&gt;&lt;td&gt;\x99&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;154&lt;/td&gt;&lt;td&gt;š&lt;/td&gt;&lt;td&gt;&amp;amp;#154;&lt;/td&gt;&lt;td&gt;&amp;amp;#154;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u009A&lt;/td&gt;&lt;td&gt;'\u009a'&lt;/td&gt;&lt;td&gt;\x9A&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;155&lt;/td&gt;&lt;td&gt;›&lt;/td&gt;&lt;td&gt;&amp;amp;#155;&lt;/td&gt;&lt;td&gt;&amp;amp;#155;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u009B&lt;/td&gt;&lt;td&gt;'\u009b'&lt;/td&gt;&lt;td&gt;\x9B&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;156&lt;/td&gt;&lt;td&gt;œ&lt;/td&gt;&lt;td&gt;&amp;amp;#156;&lt;/td&gt;&lt;td&gt;&amp;amp;#156;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u009C&lt;/td&gt;&lt;td&gt;'\u009c'&lt;/td&gt;&lt;td&gt;\x9C&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;157&lt;/td&gt;&lt;td&gt;�&lt;/td&gt;&lt;td&gt;&amp;amp;#157;&lt;/td&gt;&lt;td&gt;&amp;amp;#157;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u009D&lt;/td&gt;&lt;td&gt;'\u009d'&lt;/td&gt;&lt;td&gt;\x9D&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;158&lt;/td&gt;&lt;td&gt;ž&lt;/td&gt;&lt;td&gt;&amp;amp;#158;&lt;/td&gt;&lt;td&gt;&amp;amp;#158;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u009E&lt;/td&gt;&lt;td&gt;'\u009e'&lt;/td&gt;&lt;td&gt;\x9E&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;159&lt;/td&gt;&lt;td&gt;Ÿ&lt;/td&gt;&lt;td&gt;&amp;amp;#159;&lt;/td&gt;&lt;td&gt;&amp;amp;#159;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;\u009F&lt;/td&gt;&lt;td&gt;'\u009f'&lt;/td&gt;&lt;td&gt;\x9F&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;160&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&amp;amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;amp;#160;&lt;/td&gt;&lt;td&gt;&amp;amp;nbsp;&lt;/td&gt;&lt;td&gt;\u00A0&lt;/td&gt;&lt;td&gt;'\u00a0'&lt;/td&gt;&lt;td&gt;\xA0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;161&lt;/td&gt;&lt;td&gt;¡&lt;/td&gt;&lt;td&gt;&amp;amp;iexcl;&lt;/td&gt;&lt;td&gt;&amp;amp;#161;&lt;/td&gt;&lt;td&gt;&amp;amp;iexcl;&lt;/td&gt;&lt;td&gt;\u00A1&lt;/td&gt;&lt;td&gt;'\u00a1'&lt;/td&gt;&lt;td&gt;\xA1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;162&lt;/td&gt;&lt;td&gt;¢&lt;/td&gt;&lt;td&gt;&amp;amp;cent;&lt;/td&gt;&lt;td&gt;&amp;amp;#162;&lt;/td&gt;&lt;td&gt;&amp;amp;cent;&lt;/td&gt;&lt;td&gt;\u00A2&lt;/td&gt;&lt;td&gt;'\u00a2'&lt;/td&gt;&lt;td&gt;\xA2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;163&lt;/td&gt;&lt;td&gt;£&lt;/td&gt;&lt;td&gt;&amp;amp;pound;&lt;/td&gt;&lt;td&gt;&amp;amp;#163;&lt;/td&gt;&lt;td&gt;&amp;amp;pound;&lt;/td&gt;&lt;td&gt;\u00A3&lt;/td&gt;&lt;td&gt;'\u00a3'&lt;/td&gt;&lt;td&gt;\xA3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;164&lt;/td&gt;&lt;td&gt;¤&lt;/td&gt;&lt;td&gt;&amp;amp;curren;&lt;/td&gt;&lt;td&gt;&amp;amp;#164;&lt;/td&gt;&lt;td&gt;&amp;amp;curren;&lt;/td&gt;&lt;td&gt;\u00A4&lt;/td&gt;&lt;td&gt;'\u00a4'&lt;/td&gt;&lt;td&gt;\xA4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;165&lt;/td&gt;&lt;td&gt;¥&lt;/td&gt;&lt;td&gt;&amp;amp;yen;&lt;/td&gt;&lt;td&gt;&amp;amp;#165;&lt;/td&gt;&lt;td&gt;&amp;amp;yen;&lt;/td&gt;&lt;td&gt;\u00A5&lt;/td&gt;&lt;td&gt;'\u00a5'&lt;/td&gt;&lt;td&gt;\xA5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;166&lt;/td&gt;&lt;td&gt;¦&lt;/td&gt;&lt;td&gt;&amp;amp;brvbar;&lt;/td&gt;&lt;td&gt;&amp;amp;#166;&lt;/td&gt;&lt;td&gt;&amp;amp;brvbar;&lt;/td&gt;&lt;td&gt;\u00A6&lt;/td&gt;&lt;td&gt;'\u00a6'&lt;/td&gt;&lt;td&gt;\xA6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;167&lt;/td&gt;&lt;td&gt;§&lt;/td&gt;&lt;td&gt;&amp;amp;sect;&lt;/td&gt;&lt;td&gt;&amp;amp;#167;&lt;/td&gt;&lt;td&gt;&amp;amp;sect;&lt;/td&gt;&lt;td&gt;\u00A7&lt;/td&gt;&lt;td&gt;'\u00a7'&lt;/td&gt;&lt;td&gt;\xA7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;168&lt;/td&gt;&lt;td&gt;¨&lt;/td&gt;&lt;td&gt;&amp;amp;uml;&lt;/td&gt;&lt;td&gt;&amp;amp;#168;&lt;/td&gt;&lt;td&gt;&amp;amp;uml;&lt;/td&gt;&lt;td&gt;\u00A8&lt;/td&gt;&lt;td&gt;'\u00a8'&lt;/td&gt;&lt;td&gt;\xA8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;169&lt;/td&gt;&lt;td&gt;©&lt;/td&gt;&lt;td&gt;&amp;amp;copy;&lt;/td&gt;&lt;td&gt;&amp;amp;#169;&lt;/td&gt;&lt;td&gt;&amp;amp;copy;&lt;/td&gt;&lt;td&gt;\u00A9&lt;/td&gt;&lt;td&gt;'\u00a9'&lt;/td&gt;&lt;td&gt;\xA9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;170&lt;/td&gt;&lt;td&gt;ª&lt;/td&gt;&lt;td&gt;&amp;amp;ordf;&lt;/td&gt;&lt;td&gt;&amp;amp;#170;&lt;/td&gt;&lt;td&gt;&amp;amp;ordf;&lt;/td&gt;&lt;td&gt;\u00AA&lt;/td&gt;&lt;td&gt;'\u00aa'&lt;/td&gt;&lt;td&gt;\xAA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;171&lt;/td&gt;&lt;td&gt;«&lt;/td&gt;&lt;td&gt;&amp;amp;laquo;&lt;/td&gt;&lt;td&gt;&amp;amp;#171;&lt;/td&gt;&lt;td&gt;&amp;amp;laquo;&lt;/td&gt;&lt;td&gt;\u00AB&lt;/td&gt;&lt;td&gt;'\u00ab'&lt;/td&gt;&lt;td&gt;\xAB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;172&lt;/td&gt;&lt;td&gt;¬&lt;/td&gt;&lt;td&gt;&amp;amp;not;&lt;/td&gt;&lt;td&gt;&amp;amp;#172;&lt;/td&gt;&lt;td&gt;&amp;amp;not;&lt;/td&gt;&lt;td&gt;\u00AC&lt;/td&gt;&lt;td&gt;'\u00ac'&lt;/td&gt;&lt;td&gt;\xAC&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;173&lt;/td&gt;&lt;td&gt;­&lt;/td&gt;&lt;td&gt;&amp;amp;shy;&lt;/td&gt;&lt;td&gt;&amp;amp;#173;&lt;/td&gt;&lt;td&gt;&amp;amp;shy;&lt;/td&gt;&lt;td&gt;\u00AD&lt;/td&gt;&lt;td&gt;'\u00ad'&lt;/td&gt;&lt;td&gt;\xAD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;174&lt;/td&gt;&lt;td&gt;®&lt;/td&gt;&lt;td&gt;&amp;amp;reg;&lt;/td&gt;&lt;td&gt;&amp;amp;#174;&lt;/td&gt;&lt;td&gt;&amp;amp;reg;&lt;/td&gt;&lt;td&gt;\u00AE&lt;/td&gt;&lt;td&gt;'\u00ae'&lt;/td&gt;&lt;td&gt;\xAE&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;175&lt;/td&gt;&lt;td&gt;¯&lt;/td&gt;&lt;td&gt;&amp;amp;macr;&lt;/td&gt;&lt;td&gt;&amp;amp;#175;&lt;/td&gt;&lt;td&gt;&amp;amp;macr;&lt;/td&gt;&lt;td&gt;\u00AF&lt;/td&gt;&lt;td&gt;'\u00af'&lt;/td&gt;&lt;td&gt;\xAF&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;176&lt;/td&gt;&lt;td&gt;°&lt;/td&gt;&lt;td&gt;&amp;amp;deg;&lt;/td&gt;&lt;td&gt;&amp;amp;#176;&lt;/td&gt;&lt;td&gt;&amp;amp;deg;&lt;/td&gt;&lt;td&gt;\u00B0&lt;/td&gt;&lt;td&gt;'\u00b0'&lt;/td&gt;&lt;td&gt;\xB0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;177&lt;/td&gt;&lt;td&gt;±&lt;/td&gt;&lt;td&gt;&amp;amp;plusmn;&lt;/td&gt;&lt;td&gt;&amp;amp;#177;&lt;/td&gt;&lt;td&gt;&amp;amp;plusmn;&lt;/td&gt;&lt;td&gt;\u00B1&lt;/td&gt;&lt;td&gt;'\u00b1'&lt;/td&gt;&lt;td&gt;\xB1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;178&lt;/td&gt;&lt;td&gt;²&lt;/td&gt;&lt;td&gt;&amp;amp;sup2;&lt;/td&gt;&lt;td&gt;&amp;amp;#178;&lt;/td&gt;&lt;td&gt;&amp;amp;sup2;&lt;/td&gt;&lt;td&gt;\u00B2&lt;/td&gt;&lt;td&gt;'\u00b2'&lt;/td&gt;&lt;td&gt;\xB2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;179&lt;/td&gt;&lt;td&gt;³&lt;/td&gt;&lt;td&gt;&amp;amp;sup3;&lt;/td&gt;&lt;td&gt;&amp;amp;#179;&lt;/td&gt;&lt;td&gt;&amp;amp;sup3;&lt;/td&gt;&lt;td&gt;\u00B3&lt;/td&gt;&lt;td&gt;'\u00b3'&lt;/td&gt;&lt;td&gt;\xB3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;180&lt;/td&gt;&lt;td&gt;´&lt;/td&gt;&lt;td&gt;&amp;amp;acute;&lt;/td&gt;&lt;td&gt;&amp;amp;#180;&lt;/td&gt;&lt;td&gt;&amp;amp;acute;&lt;/td&gt;&lt;td&gt;\u00B4&lt;/td&gt;&lt;td&gt;'\u00b4'&lt;/td&gt;&lt;td&gt;\xB4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;181&lt;/td&gt;&lt;td&gt;µ&lt;/td&gt;&lt;td&gt;&amp;amp;micro;&lt;/td&gt;&lt;td&gt;&amp;amp;#181;&lt;/td&gt;&lt;td&gt;&amp;amp;micro;&lt;/td&gt;&lt;td&gt;\u00B5&lt;/td&gt;&lt;td&gt;'\u00b5'&lt;/td&gt;&lt;td&gt;\xB5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;182&lt;/td&gt;&lt;td&gt;¶&lt;/td&gt;&lt;td&gt;&amp;amp;para;&lt;/td&gt;&lt;td&gt;&amp;amp;#182;&lt;/td&gt;&lt;td&gt;&amp;amp;para;&lt;/td&gt;&lt;td&gt;\u00B6&lt;/td&gt;&lt;td&gt;'\u00b6'&lt;/td&gt;&lt;td&gt;\xB6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;183&lt;/td&gt;&lt;td&gt;·&lt;/td&gt;&lt;td&gt;&amp;amp;middot;&lt;/td&gt;&lt;td&gt;&amp;amp;#183;&lt;/td&gt;&lt;td&gt;&amp;amp;middot;&lt;/td&gt;&lt;td&gt;\u00B7&lt;/td&gt;&lt;td&gt;'\u00b7'&lt;/td&gt;&lt;td&gt;\xB7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;184&lt;/td&gt;&lt;td&gt;¸&lt;/td&gt;&lt;td&gt;&amp;amp;cedil;&lt;/td&gt;&lt;td&gt;&amp;amp;#184;&lt;/td&gt;&lt;td&gt;&amp;amp;cedil;&lt;/td&gt;&lt;td&gt;\u00B8&lt;/td&gt;&lt;td&gt;'\u00b8'&lt;/td&gt;&lt;td&gt;\xB8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;185&lt;/td&gt;&lt;td&gt;¹&lt;/td&gt;&lt;td&gt;&amp;amp;sup1;&lt;/td&gt;&lt;td&gt;&amp;amp;#185;&lt;/td&gt;&lt;td&gt;&amp;amp;sup1;&lt;/td&gt;&lt;td&gt;\u00B9&lt;/td&gt;&lt;td&gt;'\u00b9'&lt;/td&gt;&lt;td&gt;\xB9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;186&lt;/td&gt;&lt;td&gt;º&lt;/td&gt;&lt;td&gt;&amp;amp;ordm;&lt;/td&gt;&lt;td&gt;&amp;amp;#186;&lt;/td&gt;&lt;td&gt;&amp;amp;ordm;&lt;/td&gt;&lt;td&gt;\u00BA&lt;/td&gt;&lt;td&gt;'\u00ba'&lt;/td&gt;&lt;td&gt;\xBA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;187&lt;/td&gt;&lt;td&gt;»&lt;/td&gt;&lt;td&gt;&amp;amp;raquo;&lt;/td&gt;&lt;td&gt;&amp;amp;#187;&lt;/td&gt;&lt;td&gt;&amp;amp;raquo;&lt;/td&gt;&lt;td&gt;\u00BB&lt;/td&gt;&lt;td&gt;'\u00bb'&lt;/td&gt;&lt;td&gt;\xBB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;188&lt;/td&gt;&lt;td&gt;¼&lt;/td&gt;&lt;td&gt;&amp;amp;frac14;&lt;/td&gt;&lt;td&gt;&amp;amp;#188;&lt;/td&gt;&lt;td&gt;&amp;amp;frac14;&lt;/td&gt;&lt;td&gt;\u00BC&lt;/td&gt;&lt;td&gt;'\u00bc'&lt;/td&gt;&lt;td&gt;\xBC&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;189&lt;/td&gt;&lt;td&gt;½&lt;/td&gt;&lt;td&gt;&amp;amp;frac12;&lt;/td&gt;&lt;td&gt;&amp;amp;#189;&lt;/td&gt;&lt;td&gt;&amp;amp;frac12;&lt;/td&gt;&lt;td&gt;\u00BD&lt;/td&gt;&lt;td&gt;'\u00bd'&lt;/td&gt;&lt;td&gt;\xBD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;190&lt;/td&gt;&lt;td&gt;¾&lt;/td&gt;&lt;td&gt;&amp;amp;frac34;&lt;/td&gt;&lt;td&gt;&amp;amp;#190;&lt;/td&gt;&lt;td&gt;&amp;amp;frac34;&lt;/td&gt;&lt;td&gt;\u00BE&lt;/td&gt;&lt;td&gt;'\u00be'&lt;/td&gt;&lt;td&gt;\xBE&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;191&lt;/td&gt;&lt;td&gt;¿&lt;/td&gt;&lt;td&gt;&amp;amp;iquest;&lt;/td&gt;&lt;td&gt;&amp;amp;#191;&lt;/td&gt;&lt;td&gt;&amp;amp;iquest;&lt;/td&gt;&lt;td&gt;\u00BF&lt;/td&gt;&lt;td&gt;'\u00bf'&lt;/td&gt;&lt;td&gt;\xBF&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;192&lt;/td&gt;&lt;td&gt;À&lt;/td&gt;&lt;td&gt;&amp;amp;Agrave;&lt;/td&gt;&lt;td&gt;&amp;amp;#192;&lt;/td&gt;&lt;td&gt;&amp;amp;Agrave;&lt;/td&gt;&lt;td&gt;\u00C0&lt;/td&gt;&lt;td&gt;'\u00c0'&lt;/td&gt;&lt;td&gt;\xC0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;193&lt;/td&gt;&lt;td&gt;Á&lt;/td&gt;&lt;td&gt;&amp;amp;Aacute;&lt;/td&gt;&lt;td&gt;&amp;amp;#193;&lt;/td&gt;&lt;td&gt;&amp;amp;Aacute;&lt;/td&gt;&lt;td&gt;\u00C1&lt;/td&gt;&lt;td&gt;'\u00c1'&lt;/td&gt;&lt;td&gt;\xC1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;194&lt;/td&gt;&lt;td&gt;Â&lt;/td&gt;&lt;td&gt;&amp;amp;Acirc;&lt;/td&gt;&lt;td&gt;&amp;amp;#194;&lt;/td&gt;&lt;td&gt;&amp;amp;Acirc;&lt;/td&gt;&lt;td&gt;\u00C2&lt;/td&gt;&lt;td&gt;'\u00c2'&lt;/td&gt;&lt;td&gt;\xC2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;195&lt;/td&gt;&lt;td&gt;Ã&lt;/td&gt;&lt;td&gt;&amp;amp;Atilde;&lt;/td&gt;&lt;td&gt;&amp;amp;#195;&lt;/td&gt;&lt;td&gt;&amp;amp;Atilde;&lt;/td&gt;&lt;td&gt;\u00C3&lt;/td&gt;&lt;td&gt;'\u00c3'&lt;/td&gt;&lt;td&gt;\xC3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;196&lt;/td&gt;&lt;td&gt;Ä&lt;/td&gt;&lt;td&gt;&amp;amp;Auml;&lt;/td&gt;&lt;td&gt;&amp;amp;#196;&lt;/td&gt;&lt;td&gt;&amp;amp;Auml;&lt;/td&gt;&lt;td&gt;\u00C4&lt;/td&gt;&lt;td&gt;'\u00c4'&lt;/td&gt;&lt;td&gt;\xC4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;197&lt;/td&gt;&lt;td&gt;Å&lt;/td&gt;&lt;td&gt;&amp;amp;Aring;&lt;/td&gt;&lt;td&gt;&amp;amp;#197;&lt;/td&gt;&lt;td&gt;&amp;amp;Aring;&lt;/td&gt;&lt;td&gt;\u00C5&lt;/td&gt;&lt;td&gt;'\u00c5'&lt;/td&gt;&lt;td&gt;\xC5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;198&lt;/td&gt;&lt;td&gt;Æ&lt;/td&gt;&lt;td&gt;&amp;amp;AElig;&lt;/td&gt;&lt;td&gt;&amp;amp;#198;&lt;/td&gt;&lt;td&gt;&amp;amp;AElig;&lt;/td&gt;&lt;td&gt;\u00C6&lt;/td&gt;&lt;td&gt;'\u00c6'&lt;/td&gt;&lt;td&gt;\xC6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;199&lt;/td&gt;&lt;td&gt;Ç&lt;/td&gt;&lt;td&gt;&amp;amp;Ccedil;&lt;/td&gt;&lt;td&gt;&amp;amp;#199;&lt;/td&gt;&lt;td&gt;&amp;amp;Ccedil;&lt;/td&gt;&lt;td&gt;\u00C7&lt;/td&gt;&lt;td&gt;'\u00c7'&lt;/td&gt;&lt;td&gt;\xC7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;È&lt;/td&gt;&lt;td&gt;&amp;amp;Egrave;&lt;/td&gt;&lt;td&gt;&amp;amp;#200;&lt;/td&gt;&lt;td&gt;&amp;amp;Egrave;&lt;/td&gt;&lt;td&gt;\u00C8&lt;/td&gt;&lt;td&gt;'\u00c8'&lt;/td&gt;&lt;td&gt;\xC8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;201&lt;/td&gt;&lt;td&gt;É&lt;/td&gt;&lt;td&gt;&amp;amp;Eacute;&lt;/td&gt;&lt;td&gt;&amp;amp;#201;&lt;/td&gt;&lt;td&gt;&amp;amp;Eacute;&lt;/td&gt;&lt;td&gt;\u00C9&lt;/td&gt;&lt;td&gt;'\u00c9'&lt;/td&gt;&lt;td&gt;\xC9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;202&lt;/td&gt;&lt;td&gt;Ê&lt;/td&gt;&lt;td&gt;&amp;amp;Ecirc;&lt;/td&gt;&lt;td&gt;&amp;amp;#202;&lt;/td&gt;&lt;td&gt;&amp;amp;Ecirc;&lt;/td&gt;&lt;td&gt;\u00CA&lt;/td&gt;&lt;td&gt;'\u00ca'&lt;/td&gt;&lt;td&gt;\xCA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;203&lt;/td&gt;&lt;td&gt;Ë&lt;/td&gt;&lt;td&gt;&amp;amp;Euml;&lt;/td&gt;&lt;td&gt;&amp;amp;#203;&lt;/td&gt;&lt;td&gt;&amp;amp;Euml;&lt;/td&gt;&lt;td&gt;\u00CB&lt;/td&gt;&lt;td&gt;'\u00cb'&lt;/td&gt;&lt;td&gt;\xCB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;204&lt;/td&gt;&lt;td&gt;Ì&lt;/td&gt;&lt;td&gt;&amp;amp;Igrave;&lt;/td&gt;&lt;td&gt;&amp;amp;#204;&lt;/td&gt;&lt;td&gt;&amp;amp;Igrave;&lt;/td&gt;&lt;td&gt;\u00CC&lt;/td&gt;&lt;td&gt;'\u00cc'&lt;/td&gt;&lt;td&gt;\xCC&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;205&lt;/td&gt;&lt;td&gt;Í&lt;/td&gt;&lt;td&gt;&amp;amp;Iacute;&lt;/td&gt;&lt;td&gt;&amp;amp;#205;&lt;/td&gt;&lt;td&gt;&amp;amp;Iacute;&lt;/td&gt;&lt;td&gt;\u00CD&lt;/td&gt;&lt;td&gt;'\u00cd'&lt;/td&gt;&lt;td&gt;\xCD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;206&lt;/td&gt;&lt;td&gt;Î&lt;/td&gt;&lt;td&gt;&amp;amp;Icirc;&lt;/td&gt;&lt;td&gt;&amp;amp;#206;&lt;/td&gt;&lt;td&gt;&amp;amp;Icirc;&lt;/td&gt;&lt;td&gt;\u00CE&lt;/td&gt;&lt;td&gt;'\u00ce'&lt;/td&gt;&lt;td&gt;\xCE&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;207&lt;/td&gt;&lt;td&gt;Ï&lt;/td&gt;&lt;td&gt;&amp;amp;Iuml;&lt;/td&gt;&lt;td&gt;&amp;amp;#207;&lt;/td&gt;&lt;td&gt;&amp;amp;Iuml;&lt;/td&gt;&lt;td&gt;\u00CF&lt;/td&gt;&lt;td&gt;'\u00cf'&lt;/td&gt;&lt;td&gt;\xCF&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;208&lt;/td&gt;&lt;td&gt;Ð&lt;/td&gt;&lt;td&gt;&amp;amp;ETH;&lt;/td&gt;&lt;td&gt;&amp;amp;#208;&lt;/td&gt;&lt;td&gt;&amp;amp;ETH;&lt;/td&gt;&lt;td&gt;\u00D0&lt;/td&gt;&lt;td&gt;'\u00d0'&lt;/td&gt;&lt;td&gt;\xD0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;209&lt;/td&gt;&lt;td&gt;Ñ&lt;/td&gt;&lt;td&gt;&amp;amp;Ntilde;&lt;/td&gt;&lt;td&gt;&amp;amp;#209;&lt;/td&gt;&lt;td&gt;&amp;amp;Ntilde;&lt;/td&gt;&lt;td&gt;\u00D1&lt;/td&gt;&lt;td&gt;'\u00d1'&lt;/td&gt;&lt;td&gt;\xD1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;210&lt;/td&gt;&lt;td&gt;Ò&lt;/td&gt;&lt;td&gt;&amp;amp;Ograve;&lt;/td&gt;&lt;td&gt;&amp;amp;#210;&lt;/td&gt;&lt;td&gt;&amp;amp;Ograve;&lt;/td&gt;&lt;td&gt;\u00D2&lt;/td&gt;&lt;td&gt;'\u00d2'&lt;/td&gt;&lt;td&gt;\xD2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;211&lt;/td&gt;&lt;td&gt;Ó&lt;/td&gt;&lt;td&gt;&amp;amp;Oacute;&lt;/td&gt;&lt;td&gt;&amp;amp;#211;&lt;/td&gt;&lt;td&gt;&amp;amp;Oacute;&lt;/td&gt;&lt;td&gt;\u00D3&lt;/td&gt;&lt;td&gt;'\u00d3'&lt;/td&gt;&lt;td&gt;\xD3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;212&lt;/td&gt;&lt;td&gt;Ô&lt;/td&gt;&lt;td&gt;&amp;amp;Ocirc;&lt;/td&gt;&lt;td&gt;&amp;amp;#212;&lt;/td&gt;&lt;td&gt;&amp;amp;Ocirc;&lt;/td&gt;&lt;td&gt;\u00D4&lt;/td&gt;&lt;td&gt;'\u00d4'&lt;/td&gt;&lt;td&gt;\xD4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;213&lt;/td&gt;&lt;td&gt;Õ&lt;/td&gt;&lt;td&gt;&amp;amp;Otilde;&lt;/td&gt;&lt;td&gt;&amp;amp;#213;&lt;/td&gt;&lt;td&gt;&amp;amp;Otilde;&lt;/td&gt;&lt;td&gt;\u00D5&lt;/td&gt;&lt;td&gt;'\u00d5'&lt;/td&gt;&lt;td&gt;\xD5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;214&lt;/td&gt;&lt;td&gt;Ö&lt;/td&gt;&lt;td&gt;&amp;amp;Ouml;&lt;/td&gt;&lt;td&gt;&amp;amp;#214;&lt;/td&gt;&lt;td&gt;&amp;amp;Ouml;&lt;/td&gt;&lt;td&gt;\u00D6&lt;/td&gt;&lt;td&gt;'\u00d6'&lt;/td&gt;&lt;td&gt;\xD6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;215&lt;/td&gt;&lt;td&gt;×&lt;/td&gt;&lt;td&gt;&amp;amp;times;&lt;/td&gt;&lt;td&gt;&amp;amp;#215;&lt;/td&gt;&lt;td&gt;&amp;amp;times;&lt;/td&gt;&lt;td&gt;\u00D7&lt;/td&gt;&lt;td&gt;'\u00d7'&lt;/td&gt;&lt;td&gt;\xD7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;216&lt;/td&gt;&lt;td&gt;Ø&lt;/td&gt;&lt;td&gt;&amp;amp;Oslash;&lt;/td&gt;&lt;td&gt;&amp;amp;#216;&lt;/td&gt;&lt;td&gt;&amp;amp;Oslash;&lt;/td&gt;&lt;td&gt;\u00D8&lt;/td&gt;&lt;td&gt;'\u00d8'&lt;/td&gt;&lt;td&gt;\xD8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;217&lt;/td&gt;&lt;td&gt;Ù&lt;/td&gt;&lt;td&gt;&amp;amp;Ugrave;&lt;/td&gt;&lt;td&gt;&amp;amp;#217;&lt;/td&gt;&lt;td&gt;&amp;amp;Ugrave;&lt;/td&gt;&lt;td&gt;\u00D9&lt;/td&gt;&lt;td&gt;'\u00d9'&lt;/td&gt;&lt;td&gt;\xD9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;218&lt;/td&gt;&lt;td&gt;Ú&lt;/td&gt;&lt;td&gt;&amp;amp;Uacute;&lt;/td&gt;&lt;td&gt;&amp;amp;#218;&lt;/td&gt;&lt;td&gt;&amp;amp;Uacute;&lt;/td&gt;&lt;td&gt;\u00DA&lt;/td&gt;&lt;td&gt;'\u00da'&lt;/td&gt;&lt;td&gt;\xDA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;219&lt;/td&gt;&lt;td&gt;Û&lt;/td&gt;&lt;td&gt;&amp;amp;Ucirc;&lt;/td&gt;&lt;td&gt;&amp;amp;#219;&lt;/td&gt;&lt;td&gt;&amp;amp;Ucirc;&lt;/td&gt;&lt;td&gt;\u00DB&lt;/td&gt;&lt;td&gt;'\u00db'&lt;/td&gt;&lt;td&gt;\xDB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;220&lt;/td&gt;&lt;td&gt;Ü&lt;/td&gt;&lt;td&gt;&amp;amp;Uuml;&lt;/td&gt;&lt;td&gt;&amp;amp;#220;&lt;/td&gt;&lt;td&gt;&amp;amp;Uuml;&lt;/td&gt;&lt;td&gt;\u00DC&lt;/td&gt;&lt;td&gt;'\u00dc'&lt;/td&gt;&lt;td&gt;\xDC&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;221&lt;/td&gt;&lt;td&gt;Ý&lt;/td&gt;&lt;td&gt;&amp;amp;Yacute;&lt;/td&gt;&lt;td&gt;&amp;amp;#221;&lt;/td&gt;&lt;td&gt;&amp;amp;Yacute;&lt;/td&gt;&lt;td&gt;\u00DD&lt;/td&gt;&lt;td&gt;'\u00dd'&lt;/td&gt;&lt;td&gt;\xDD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;222&lt;/td&gt;&lt;td&gt;Þ&lt;/td&gt;&lt;td&gt;&amp;amp;THORN;&lt;/td&gt;&lt;td&gt;&amp;amp;#222;&lt;/td&gt;&lt;td&gt;&amp;amp;THORN;&lt;/td&gt;&lt;td&gt;\u00DE&lt;/td&gt;&lt;td&gt;'\u00de'&lt;/td&gt;&lt;td&gt;\xDE&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;223&lt;/td&gt;&lt;td&gt;ß&lt;/td&gt;&lt;td&gt;&amp;amp;szlig;&lt;/td&gt;&lt;td&gt;&amp;amp;#223;&lt;/td&gt;&lt;td&gt;&amp;amp;szlig;&lt;/td&gt;&lt;td&gt;\u00DF&lt;/td&gt;&lt;td&gt;'\u00df'&lt;/td&gt;&lt;td&gt;\xDF&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;224&lt;/td&gt;&lt;td&gt;à&lt;/td&gt;&lt;td&gt;&amp;amp;agrave;&lt;/td&gt;&lt;td&gt;&amp;amp;#224;&lt;/td&gt;&lt;td&gt;&amp;amp;agrave;&lt;/td&gt;&lt;td&gt;\u00E0&lt;/td&gt;&lt;td&gt;'\u00e0'&lt;/td&gt;&lt;td&gt;\xE0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;225&lt;/td&gt;&lt;td&gt;á&lt;/td&gt;&lt;td&gt;&amp;amp;aacute;&lt;/td&gt;&lt;td&gt;&amp;amp;#225;&lt;/td&gt;&lt;td&gt;&amp;amp;aacute;&lt;/td&gt;&lt;td&gt;\u00E1&lt;/td&gt;&lt;td&gt;'\u00e1'&lt;/td&gt;&lt;td&gt;\xE1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;226&lt;/td&gt;&lt;td&gt;â&lt;/td&gt;&lt;td&gt;&amp;amp;acirc;&lt;/td&gt;&lt;td&gt;&amp;amp;#226;&lt;/td&gt;&lt;td&gt;&amp;amp;acirc;&lt;/td&gt;&lt;td&gt;\u00E2&lt;/td&gt;&lt;td&gt;'\u00e2'&lt;/td&gt;&lt;td&gt;\xE2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;227&lt;/td&gt;&lt;td&gt;ã&lt;/td&gt;&lt;td&gt;&amp;amp;atilde;&lt;/td&gt;&lt;td&gt;&amp;amp;#227;&lt;/td&gt;&lt;td&gt;&amp;amp;atilde;&lt;/td&gt;&lt;td&gt;\u00E3&lt;/td&gt;&lt;td&gt;'\u00e3'&lt;/td&gt;&lt;td&gt;\xE3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;228&lt;/td&gt;&lt;td&gt;ä&lt;/td&gt;&lt;td&gt;&amp;amp;auml;&lt;/td&gt;&lt;td&gt;&amp;amp;#228;&lt;/td&gt;&lt;td&gt;&amp;amp;auml;&lt;/td&gt;&lt;td&gt;\u00E4&lt;/td&gt;&lt;td&gt;'\u00e4'&lt;/td&gt;&lt;td&gt;\xE4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;229&lt;/td&gt;&lt;td&gt;å&lt;/td&gt;&lt;td&gt;&amp;amp;aring;&lt;/td&gt;&lt;td&gt;&amp;amp;#229;&lt;/td&gt;&lt;td&gt;&amp;amp;aring;&lt;/td&gt;&lt;td&gt;\u00E5&lt;/td&gt;&lt;td&gt;'\u00e5'&lt;/td&gt;&lt;td&gt;\xE5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;230&lt;/td&gt;&lt;td&gt;æ&lt;/td&gt;&lt;td&gt;&amp;amp;aelig;&lt;/td&gt;&lt;td&gt;&amp;amp;#230;&lt;/td&gt;&lt;td&gt;&amp;amp;aelig;&lt;/td&gt;&lt;td&gt;\u00E6&lt;/td&gt;&lt;td&gt;'\u00e6'&lt;/td&gt;&lt;td&gt;\xE6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;231&lt;/td&gt;&lt;td&gt;ç&lt;/td&gt;&lt;td&gt;&amp;amp;ccedil;&lt;/td&gt;&lt;td&gt;&amp;amp;#231;&lt;/td&gt;&lt;td&gt;&amp;amp;ccedil;&lt;/td&gt;&lt;td&gt;\u00E7&lt;/td&gt;&lt;td&gt;'\u00e7'&lt;/td&gt;&lt;td&gt;\xE7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;232&lt;/td&gt;&lt;td&gt;è&lt;/td&gt;&lt;td&gt;&amp;amp;egrave;&lt;/td&gt;&lt;td&gt;&amp;amp;#232;&lt;/td&gt;&lt;td&gt;&amp;amp;egrave;&lt;/td&gt;&lt;td&gt;\u00E8&lt;/td&gt;&lt;td&gt;'\u00e8'&lt;/td&gt;&lt;td&gt;\xE8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;233&lt;/td&gt;&lt;td&gt;é&lt;/td&gt;&lt;td&gt;&amp;amp;eacute;&lt;/td&gt;&lt;td&gt;&amp;amp;#233;&lt;/td&gt;&lt;td&gt;&amp;amp;eacute;&lt;/td&gt;&lt;td&gt;\u00E9&lt;/td&gt;&lt;td&gt;'\u00e9'&lt;/td&gt;&lt;td&gt;\xE9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;234&lt;/td&gt;&lt;td&gt;ê&lt;/td&gt;&lt;td&gt;&amp;amp;ecirc;&lt;/td&gt;&lt;td&gt;&amp;amp;#234;&lt;/td&gt;&lt;td&gt;&amp;amp;ecirc;&lt;/td&gt;&lt;td&gt;\u00EA&lt;/td&gt;&lt;td&gt;'\u00ea'&lt;/td&gt;&lt;td&gt;\xEA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;235&lt;/td&gt;&lt;td&gt;ë&lt;/td&gt;&lt;td&gt;&amp;amp;euml;&lt;/td&gt;&lt;td&gt;&amp;amp;#235;&lt;/td&gt;&lt;td&gt;&amp;amp;euml;&lt;/td&gt;&lt;td&gt;\u00EB&lt;/td&gt;&lt;td&gt;'\u00eb'&lt;/td&gt;&lt;td&gt;\xEB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;236&lt;/td&gt;&lt;td&gt;ì&lt;/td&gt;&lt;td&gt;&amp;amp;igrave;&lt;/td&gt;&lt;td&gt;&amp;amp;#236;&lt;/td&gt;&lt;td&gt;&amp;amp;igrave;&lt;/td&gt;&lt;td&gt;\u00EC&lt;/td&gt;&lt;td&gt;'\u00ec'&lt;/td&gt;&lt;td&gt;\xEC&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;237&lt;/td&gt;&lt;td&gt;í&lt;/td&gt;&lt;td&gt;&amp;amp;iacute;&lt;/td&gt;&lt;td&gt;&amp;amp;#237;&lt;/td&gt;&lt;td&gt;&amp;amp;iacute;&lt;/td&gt;&lt;td&gt;\u00ED&lt;/td&gt;&lt;td&gt;'\u00ed'&lt;/td&gt;&lt;td&gt;\xED&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;238&lt;/td&gt;&lt;td&gt;î&lt;/td&gt;&lt;td&gt;&amp;amp;icirc;&lt;/td&gt;&lt;td&gt;&amp;amp;#238;&lt;/td&gt;&lt;td&gt;&amp;amp;icirc;&lt;/td&gt;&lt;td&gt;\u00EE&lt;/td&gt;&lt;td&gt;'\u00ee'&lt;/td&gt;&lt;td&gt;\xEE&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;239&lt;/td&gt;&lt;td&gt;ï&lt;/td&gt;&lt;td&gt;&amp;amp;iuml;&lt;/td&gt;&lt;td&gt;&amp;amp;#239;&lt;/td&gt;&lt;td&gt;&amp;amp;iuml;&lt;/td&gt;&lt;td&gt;\u00EF&lt;/td&gt;&lt;td&gt;'\u00ef'&lt;/td&gt;&lt;td&gt;\xEF&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;240&lt;/td&gt;&lt;td&gt;ð&lt;/td&gt;&lt;td&gt;&amp;amp;eth;&lt;/td&gt;&lt;td&gt;&amp;amp;#240;&lt;/td&gt;&lt;td&gt;&amp;amp;eth;&lt;/td&gt;&lt;td&gt;\u00F0&lt;/td&gt;&lt;td&gt;'\u00f0'&lt;/td&gt;&lt;td&gt;\xF0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;241&lt;/td&gt;&lt;td&gt;ñ&lt;/td&gt;&lt;td&gt;&amp;amp;ntilde;&lt;/td&gt;&lt;td&gt;&amp;amp;#241;&lt;/td&gt;&lt;td&gt;&amp;amp;ntilde;&lt;/td&gt;&lt;td&gt;\u00F1&lt;/td&gt;&lt;td&gt;'\u00f1'&lt;/td&gt;&lt;td&gt;\xF1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;242&lt;/td&gt;&lt;td&gt;ò&lt;/td&gt;&lt;td&gt;&amp;amp;ograve;&lt;/td&gt;&lt;td&gt;&amp;amp;#242;&lt;/td&gt;&lt;td&gt;&amp;amp;ograve;&lt;/td&gt;&lt;td&gt;\u00F2&lt;/td&gt;&lt;td&gt;'\u00f2'&lt;/td&gt;&lt;td&gt;\xF2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;243&lt;/td&gt;&lt;td&gt;ó&lt;/td&gt;&lt;td&gt;&amp;amp;oacute;&lt;/td&gt;&lt;td&gt;&amp;amp;#243;&lt;/td&gt;&lt;td&gt;&amp;amp;oacute;&lt;/td&gt;&lt;td&gt;\u00F3&lt;/td&gt;&lt;td&gt;'\u00f3'&lt;/td&gt;&lt;td&gt;\xF3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;244&lt;/td&gt;&lt;td&gt;ô&lt;/td&gt;&lt;td&gt;&amp;amp;ocirc;&lt;/td&gt;&lt;td&gt;&amp;amp;#244;&lt;/td&gt;&lt;td&gt;&amp;amp;ocirc;&lt;/td&gt;&lt;td&gt;\u00F4&lt;/td&gt;&lt;td&gt;'\u00f4'&lt;/td&gt;&lt;td&gt;\xF4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;245&lt;/td&gt;&lt;td&gt;õ&lt;/td&gt;&lt;td&gt;&amp;amp;otilde;&lt;/td&gt;&lt;td&gt;&amp;amp;#245;&lt;/td&gt;&lt;td&gt;&amp;amp;otilde;&lt;/td&gt;&lt;td&gt;\u00F5&lt;/td&gt;&lt;td&gt;'\u00f5'&lt;/td&gt;&lt;td&gt;\xF5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;246&lt;/td&gt;&lt;td&gt;ö&lt;/td&gt;&lt;td&gt;&amp;amp;ouml;&lt;/td&gt;&lt;td&gt;&amp;amp;#246;&lt;/td&gt;&lt;td&gt;&amp;amp;ouml;&lt;/td&gt;&lt;td&gt;\u00F6&lt;/td&gt;&lt;td&gt;'\u00f6'&lt;/td&gt;&lt;td&gt;\xF6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;247&lt;/td&gt;&lt;td&gt;÷&lt;/td&gt;&lt;td&gt;&amp;amp;divide;&lt;/td&gt;&lt;td&gt;&amp;amp;#247;&lt;/td&gt;&lt;td&gt;&amp;amp;divide;&lt;/td&gt;&lt;td&gt;\u00F7&lt;/td&gt;&lt;td&gt;'\u00f7'&lt;/td&gt;&lt;td&gt;\xF7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;248&lt;/td&gt;&lt;td&gt;ø&lt;/td&gt;&lt;td&gt;&amp;amp;oslash;&lt;/td&gt;&lt;td&gt;&amp;amp;#248;&lt;/td&gt;&lt;td&gt;&amp;amp;oslash;&lt;/td&gt;&lt;td&gt;\u00F8&lt;/td&gt;&lt;td&gt;'\u00f8'&lt;/td&gt;&lt;td&gt;\xF8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;249&lt;/td&gt;&lt;td&gt;ù&lt;/td&gt;&lt;td&gt;&amp;amp;ugrave;&lt;/td&gt;&lt;td&gt;&amp;amp;#249;&lt;/td&gt;&lt;td&gt;&amp;amp;ugrave;&lt;/td&gt;&lt;td&gt;\u00F9&lt;/td&gt;&lt;td&gt;'\u00f9'&lt;/td&gt;&lt;td&gt;\xF9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;250&lt;/td&gt;&lt;td&gt;ú&lt;/td&gt;&lt;td&gt;&amp;amp;uacute;&lt;/td&gt;&lt;td&gt;&amp;amp;#250;&lt;/td&gt;&lt;td&gt;&amp;amp;uacute;&lt;/td&gt;&lt;td&gt;\u00FA&lt;/td&gt;&lt;td&gt;'\u00fa'&lt;/td&gt;&lt;td&gt;\xFA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;251&lt;/td&gt;&lt;td&gt;û&lt;/td&gt;&lt;td&gt;&amp;amp;ucirc;&lt;/td&gt;&lt;td&gt;&amp;amp;#251;&lt;/td&gt;&lt;td&gt;&amp;amp;ucirc;&lt;/td&gt;&lt;td&gt;\u00FB&lt;/td&gt;&lt;td&gt;'\u00fb'&lt;/td&gt;&lt;td&gt;\xFB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;252&lt;/td&gt;&lt;td&gt;ü&lt;/td&gt;&lt;td&gt;&amp;amp;uuml;&lt;/td&gt;&lt;td&gt;&amp;amp;#252;&lt;/td&gt;&lt;td&gt;&amp;amp;uuml;&lt;/td&gt;&lt;td&gt;\u00FC&lt;/td&gt;&lt;td&gt;'\u00fc'&lt;/td&gt;&lt;td&gt;\xFC&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;253&lt;/td&gt;&lt;td&gt;ý&lt;/td&gt;&lt;td&gt;&amp;amp;yacute;&lt;/td&gt;&lt;td&gt;&amp;amp;#253;&lt;/td&gt;&lt;td&gt;&amp;amp;yacute;&lt;/td&gt;&lt;td&gt;\u00FD&lt;/td&gt;&lt;td&gt;'\u00fd'&lt;/td&gt;&lt;td&gt;\xFD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;254&lt;/td&gt;&lt;td&gt;þ&lt;/td&gt;&lt;td&gt;&amp;amp;thorn;&lt;/td&gt;&lt;td&gt;&amp;amp;#254;&lt;/td&gt;&lt;td&gt;&amp;amp;thorn;&lt;/td&gt;&lt;td&gt;\u00FE&lt;/td&gt;&lt;td&gt;'\u00fe'&lt;/td&gt;&lt;td&gt;\xFE&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;255&lt;/td&gt;&lt;td&gt;ÿ&lt;/td&gt;&lt;td&gt;&amp;amp;yuml;&lt;/td&gt;&lt;td&gt;&amp;amp;#255;&lt;/td&gt;&lt;td&gt;&amp;amp;yuml;&lt;/td&gt;&lt;td&gt;\u00FF&lt;/td&gt;&lt;td&gt;'\u00ff'&lt;/td&gt;&lt;td&gt;\xFF&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-2011450576948610831?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/2011450576948610831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=2011450576948610831' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/2011450576948610831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/2011450576948610831'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2008/08/presentation-layer-output-encoding.html' title='Presentation Layer Output Encoding: Apache Commons Lang StringEscapeUtils vs. OWASP Reform'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-3380840868589440695</id><published>2008-08-07T09:18:00.024-05:00</published><updated>2011-09-27T11:12:12.881-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SAML'/><title type='text'>SAML Research Road Map</title><content type='html'>Recently, I have been asked by several people about SAML as it pertains to single sign-on for web applications.  At the time, I was not familiar with this standard or the technology surrounding it and decided to do some research.  I discovered there were a lot of valuable resources on the web, but there was not an easy to understand road map describing the order in which to read these items.&lt;br /&gt;&lt;br /&gt;This article is an attempt to provide that road map, so others can understand and appreciate SAML.&lt;br /&gt;&lt;br /&gt;Note: This article pertains to SAML 2.0 and not SAML 1.x.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Introduction&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;From the OASIS SAML Technical Overview Document:&lt;br /&gt;&lt;br /&gt;“The OASIS Security Assertion Markup Language (SAML) standard defines an XML-based framework for describing and exchanging security information between on-line business partners.”&lt;br /&gt;&lt;br /&gt;While this description makes sense to those already familiar with SAML, it may be incomprehensible to everyone else.  To help everyone else, I’m going to provide a simplified, high-level overview.  Then, once some of the basics have been established, I will provide a resource from the OASIS site that describes the technical details of the SAML standard.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;High-level Overview&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The SAML standard can be broken down into several components, some of which are listed below.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SAML Assertions&lt;/li&gt;&lt;li&gt;SAML Protocols&lt;/li&gt;&lt;li&gt;SAML Bindings&lt;/li&gt;&lt;li&gt;SAML Profiles&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;SAML Profiles or Use Cases&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SAML Profiles are a collection of SAML components organized into use cases suited to solve a business problem or need.  Examples of major profiles or use cases defined within the SAML Standard are listed below.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Web Browser Single Sign-On Profile (Web Browser SSO)&lt;/li&gt;&lt;li&gt;Single Logout Profile&lt;/li&gt;&lt;li&gt;Web Services Security (WS-Security) and SAML&lt;/li&gt;&lt;/ul&gt;The goal of the Web Browser SSO profile is to provide a single sign-on experience for users to move seamlessly between web applications of disparate organizations or companies.  For example, if three distinct companies providing complimentary services (such as a hotel booking, flight booking, and car rental service) wish to form a partnership, they can create a single sign-on experience for their users (and share information) without the consolidation of servers or data.&lt;br /&gt;&lt;br /&gt;The Single Logout Profile provides a mechanism to simultaneously log a user out of all sites participating in a particular single sign-on experience.&lt;br /&gt;&lt;br /&gt;The combination of WS-Security and SAML is actually an extension of SAML and not directly defined as a profile.  However, this use case is a valuable way to use SAML as a security token for authentication and authorization of a principle interacting with a system through SOAP web services.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;SAML Assertions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SAML Assertions consist of XML data that contains authentication, authorization, or additional attributes about a principal (a user, application, or other subject wishing to access a resource).  SAML assertions are often provided by an identity provider or authentication service to a service provider.  The service provider can understand the Assertions and trusts the identity provider due to agreements made between the organizations that own or operate the services.&lt;br /&gt;&lt;br /&gt;An example assertion is shown below.  Discussion of the structure of a SAML Assertion will be addressed by a resource provided later in this article.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_opzlukmJgHU/SJx2ppaeOZI/AAAAAAAAAAs/GtD5AgrOzeg/s1600-h/SAML+Assertion.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_opzlukmJgHU/SJx2ppaeOZI/AAAAAAAAAAs/GtD5AgrOzeg/s400/SAML+Assertion.PNG" alt="" id="BLOGGER_PHOTO_ID_5232187324961274258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;saml assertion="" example="" here=""&gt;&lt;span style="font-weight: bold;"&gt;SAML Protocols&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SAML Protocols define mechanisms for communicating SAML Assertions between identity providers, principals, and service providers.  The standard provides a detailed set of request and response strategies to suit a variety of business and technical requirements.&lt;br /&gt;&lt;br /&gt;SAML 2.0 includes the following protocols:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Assertion Query and Request Protocol&lt;/li&gt;&lt;li&gt;Authentication Request Protocol&lt;/li&gt;&lt;li&gt;Artifact Resolution Protocol&lt;/li&gt;&lt;li&gt;Name Identifier Management Protocol&lt;/li&gt;&lt;li&gt;Single Logout Protocol&lt;/li&gt;&lt;li&gt;Name Identifier Mapping Protocol&lt;/li&gt;&lt;/ul&gt;An example request and response is shown below.  Discussion of the SAML Protocol sequences and the structure of the request and response below will be addressed by a resource provided later in this article.&lt;br /&gt;&lt;br /&gt;SAML Protocol Authentication Request:&lt;br /&gt;&lt;br /&gt;&lt;protocol request=""&gt;&lt;/protocol&gt;&lt;/saml&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_opzlukmJgHU/SJx2-4BSNCI/AAAAAAAAAA0/MTRUp1ckeUo/s1600-h/saml+protocol+request.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_opzlukmJgHU/SJx2-4BSNCI/AAAAAAAAAA0/MTRUp1ckeUo/s400/saml+protocol+request.PNG" alt="" id="BLOGGER_PHOTO_ID_5232187689659413538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;SAML Protocol Authentication Response:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_opzlukmJgHU/SJx2-_Vgc_I/AAAAAAAAAA8/k5t1-WAtSz8/s1600-h/saml+protocol+response.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_opzlukmJgHU/SJx2-_Vgc_I/AAAAAAAAAA8/k5t1-WAtSz8/s400/saml+protocol+response.PNG" alt="" id="BLOGGER_PHOTO_ID_5232187691623281650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;saml assertion="" example="" here=""&gt;&lt;protocol request=""&gt;&lt;protocol response=""&gt;&lt;span style="font-weight: bold;"&gt;SAML Bindings&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SAML Bindings determine how SAML messages are encapsulated within other protocols such as HTTP or SOAP.  SAML 2.0 describes the following bindings:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SAML SOAP Binding&lt;/li&gt;&lt;li&gt;Reverse SOAP (PAOS) Binding&lt;/li&gt;&lt;li&gt;HTTP Redirect (GET) Binding&lt;/li&gt;&lt;li&gt;HTTP POST Binding&lt;/li&gt;&lt;li&gt;HTTP Artifact Binding&lt;/li&gt;&lt;li&gt;SAML URI Binding&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Next Step&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now that a basic understanding of SAML has been established, I suggest reading the &lt;a href="http://www.oasis-open.org/committees/download.php/22553/sstc-saml-tech-overview-2%200-draft-13.pdf"&gt;Security Assertion Markup Language (SAML) V2.0 Technical Overview&lt;/a&gt;.  This document is written by OASIS and summarizes the SAML standard in a way that is easy to understand.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;What About Security?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are many security considerations that must be analyzed before the implementation of a product leveraging SAML takes place.  Often authentication or authorization information is allowed to pass through untrusted users or may be intercepted by attackers.  The &lt;a href="http://docs.oasis-open.org/security/saml/v2.0/saml-sec-consider-2.0-os.pdf"&gt;Security and Privacy Considerations for the OASIS &lt;/a&gt;&lt;/protocol&gt;&lt;/protocol&gt;&lt;/saml&gt;&lt;a href="http://docs.oasis-open.org/security/saml/v2.0/saml-sec-consider-2.0-os.pdf"&gt;Security Assertion Markup Language (SAML) V2.0&lt;/a&gt; &lt;saml assertion="" example="" here=""&gt;&lt;protocol request=""&gt;&lt;protocol response=""&gt;document provides a detailed discussion of these issues and appropriate mitigation techniques.&lt;br /&gt;&lt;br /&gt;If I was asked to summarize the mitigation strategies described in this document, I would provide the following recommendations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Use TLS/SSL 3.0 with strong ciphers and verifiable certificates (usually for just the server, but sometimes needed for the client as well).&lt;/li&gt;&lt;li&gt;If the application must ensure data integrity remains intact, use XML Signature to ensure it is not manipulated while in transit.&lt;/li&gt;&lt;li&gt;If confidential, sensitive, or private data passes through the client use XML Encryption to ensure it is not disclosed to unauthorized parties.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/protocol&gt;&lt;/protocol&gt;&lt;/saml&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-3380840868589440695?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/3380840868589440695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=3380840868589440695' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3380840868589440695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3380840868589440695'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2008/08/saml-research-road-map.html' title='SAML Research Road Map'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_opzlukmJgHU/SJx2ppaeOZI/AAAAAAAAAAs/GtD5AgrOzeg/s72-c/SAML+Assertion.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-3725267614659390044</id><published>2008-08-06T20:36:00.022-05:00</published><updated>2011-09-27T11:11:57.108-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>Threat Modeling as the Only Secure Development Activity</title><content type='html'>&lt;span style="font-size:130%;"&gt;Purpose&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This article discusses why it is important for threat modeling to be supported by a full secure development process within an organization.  If threat modeling is the only secure development activity performed, it will be difficult to identify threats, mitigate risks, and leverage knowledge gained during threat modeling efforts in future projects.&lt;br /&gt;&lt;br /&gt;This article does NOT describe how to perform threat modeling, however it does provide a brief introduction to ensure it is clear what the author means by the term "threat modeling."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Introduction to Threat Modeling&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;At its core, threat modeling is a secure development activity in which developers, architects, designers, security personnel, and sometimes managers consider possible attack scenarios or threats against an application.  This process typically occurs during a planning or design phase of development before any code is written.&lt;br /&gt;&lt;br /&gt;One threat modeling strategy may include the following steps:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;1. Resource &lt;-  2. Capability &lt;- 3. Use Case &lt;- User &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);font-family:courier new;" &gt;&lt;br /&gt;1. Resource &lt;-  2. Capability &lt;- 4. Threats &lt;- Attacker&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Identify resources within the application, such as database tables, file systems, and application servers.&lt;/li&gt;&lt;li&gt;   Determine the capabilities or actions that can be performed on each item.  One example for a database table may be to read checking account transaction data.&lt;/li&gt;&lt;li&gt;   Consider the proper way in which a valid user may invoke a capability.  Following with the previous example, a customer may login to Online Banking and access their checking account details.&lt;/li&gt;&lt;li&gt;   Consider the threats to a particular resource based on the associated capabilities.  Threat modeling participants can base threats on defined use cases or by brainstorming in a free form manner.  Example: An attacker may wish to access another user's checking account data.&lt;/li&gt;&lt;li&gt;   Assign a risk level to each threat, such as high, medium, and low.&lt;/li&gt;&lt;li&gt;   Define countermeasures based on the analysis of the risk level vs. the cost of implementing the solution&lt;/li&gt;&lt;/ol&gt;There are many ways threat modeling can be performed.  For more information, please visit the &lt;a href="http://www.owasp.org/index.php/Threat_Risk_Modeling"&gt;OWASP Threat Modeling page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Threat Modeling as the Only Secure Development Activity&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Threat modeling is a necessary component within a secure development process.  However, if threat modeling is the only security activity your organization has implemented, you may not be realizing its full value or potential.&lt;br /&gt;&lt;br /&gt;During the threat modeling process, threats and countermeasures must be defined.  Typically, it is difficult for threat modeling participants to think from an attacker's perspective without basic application security awareness training.  Often, the end result will be an incomplete threat model that does not include enough of the relevant application attack scenarios or threats.&lt;br /&gt;&lt;br /&gt;Once threats have been enumerated, participants must identify viable and effective countermeasures.  The most effective countermeasures are those based on application security best practices.  Often, developers are not familiar with these best practices leading to the creation of countermeasures that only partial protect resources. Security training is necessary to provide application security knowledge and these essential best practices.&lt;br /&gt;&lt;br /&gt;Once appropriate countermeasures have been designed, implemented, and tested to ensure they are complete and effective solutions for eliminating risks, this knowledge should be captured to be reused in future projects.  If this knowledge is not captured, the organization will be forced to start from scratch each and every time threat modeling is performed.  This can be an unnecessary allocation of time or money.&lt;br /&gt;&lt;br /&gt;To effectively capture and reuse this knowledge, an organization should wrap security best practices and solutions into the organization's security policies and secure coding standards.  In future projects, the designer or requirements specifier can create security requirements based on this documentation.  During the threat modeling process, threats can be matched up with defined security requirements allowing participants to focus on threats that have not been mitigated in past efforts.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Threat modeling should not be the only secure development activity used within an organization.  It must be supported by a full process including security training, security policies, secure coding standards, and many more activities.  The OWASP &lt;a href="http://www.owasp.org/index.php/Category:OWASP_CLASP_Project"&gt;Comprehensive, Lightweight Application Security Process&lt;/a&gt; is one fully featured secure development process that should be considered.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-3725267614659390044?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/3725267614659390044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=3725267614659390044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3725267614659390044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/3725267614659390044'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2008/08/threat-modeling-as-only-secure.html' title='Threat Modeling as the Only Secure Development Activity'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2511631377600597263.post-419741238090270198</id><published>2008-08-06T16:05:00.014-05:00</published><updated>2011-09-27T11:11:37.177-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Secure Software Development Process'/><title type='text'>OWASP CLASP Overview Presentation</title><content type='html'>The &lt;a href="http://www.owasp.org/"&gt;OWASP&lt;/a&gt; &lt;a href="http://www.owasp.org/index.php/Category:OWASP_CLASP_Project"&gt;Comprehensive, Lightweight Application Security Process (CLASP)&lt;/a&gt;  is an "Activity driven, role-based set of process components whose core contains formalized best practices for building security into your existing or new-start software development life cycles in a structured, repeatable, and measurable way"&lt;br /&gt;&lt;br /&gt;In other words, it is one method of many (others examples are Microsoft SDL and Software Security Touchpoints) for implementing a secure development process.&lt;br /&gt;&lt;br /&gt;A couple months ago, I created a presentation that gave a high-level overview of CLASP.  I wanted to make this presentation available to the community as well as gather input from industry practitioners regarding how feasible this model is within their environment.  I encourage anyone who is interested to join the &lt;a href="https://lists.owasp.org/mailman/listinfo/owasp-clasp"&gt;OWASP CLASP mailing list&lt;/a&gt; or comment directly.&lt;br /&gt;&lt;br /&gt;The presentation can be found here: &lt;a href="http://docs.google.com/Presentation?id=dd2sth54_2425skgxk9"&gt;OWASP CLASP Overview&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2511631377600597263-419741238090270198?l=nickcoblentz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://nickcoblentz.blogspot.com/feeds/419741238090270198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2511631377600597263&amp;postID=419741238090270198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/419741238090270198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2511631377600597263/posts/default/419741238090270198'/><link rel='alternate' type='text/html' href='http://nickcoblentz.blogspot.com/2008/08/owasp-clasp-overview-presentation.html' title='OWASP CLASP Overview Presentation'/><author><name>Nick Coblentz</name><uri>http://www.blogger.com/profile/02039723015167872217</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='31' src='http://1.bp.blogspot.com/_opzlukmJgHU/SgNDvk1lG9I/AAAAAAAAAI0/daWDZuEPXA4/S220/IMGP0538.JPG'/></author><thr:total>0</thr:total></entry></feed>
