Slash Boxes

Slash Open Source Project

Full disclosure on Friday's security issue, and new patch

posted by jamiemccarthy on Monday January 07, @06:25PM   Printer-friendly   Email story

On Friday, January 4, 2008, a serious security vulnerability was discovered, and an exploit demonstrated, in the then-current version of Slash. The vulnerability was an SQL injection. Its effect was to allow a user with no special authorization to read any information from any table the Slash site's mysql user was authorized to read (which may include other databases, including information_schema).

This vulnerability has been present in Slash for years. We are not going to list which specific versions of Slash are vulnerable, because as far as we know, they all are. Fortunately for those of you who are not running near-current CVS, the patch is easy to apply to all versions of Slash.

The Slash programming team would like to thank blackybr, of the Russian web-security portal site, for bringing this to our attention in a responsible manner.

The ability of an attacker to read the users table is why we urged Slash sites on Friday to change their admins' passwords. Whether the threat rises to the level of requiring all your users to change their passwords, we leave up to site administrators. Mitigating factors include:

  • We are not aware of this attack actually having been used. Of course, since we are providing full information today, every Slash site administrator should assume that attackers are now actively trying to penetrate your site using this information.
  • Passwords are MD5'd in the users table, so an attacker does not learn them directly. (It is of course likely that one or more of your users has an MD5 that shows up in a dictionary hash table, and/or than an attacker can brute-force the hashes offline.)
  • If your site is running MySQL 4.0 or earlier, we do not know of any way that significant data could be retrieved. SQL injections on MySQL do not allow for multiple queries in the default configuration, so the way to retrieve data is to inject an ANDed subquery into a WHERE clause known to be true and see whether the expected data is successfully returned. This tells the attacker one bit of information, for example, whether ASCII(SUBSTRING((SELECT x FROM y WHERE z), 1, 1)) > 90. Absent subqueries, which were added in MySQL 4.1, only data from the main query's table can be retrieved. In this case, the only known exploitable table is journals, from which not much interesting can be learned.
  • As far as we know, numerous requests in this fashion are required to obtain each byte of data. On the order of 100 requests are needed to obtain a user password. You may be able to scan your site's web logs to see if you can locate multiple suspicious-looking requests, especially to The word "select" in a query string would be a giveaway.

One of the first things that an attacker would likely do is to obtain an administrator's password. Since Slash keeps permanent records of all administrator accesses, you may wish to scan that log for unexpected and possibly unauthorized logins. For example:

mysql> SELECT uid, host_addr, MIN(ts), MAX(ts), COUNT(*) FROM accesslog_admin WHERE ts >= '2007-12-01 00:00:00' GROUP BY uid, host_addr;

Today, I have committed two more fields in the $form hashref to be run through filter_params. They are content_type, for which I could find no vulnerabilities, and userfield, for which a XSS vulnerability (less serious than blackybr's) was found. We therefore again urge Slash site administrators to either update to the latest version in CVS, or to manually add those two fields to the alphanumeric $form field filtering done in, as follows:

diff -U3 -r1.224 -r1.225
--- Slash/Utility/Environment/	4 Jan 2008 19:14:07 -0000	1.224
+++ Slash/Utility/Environment/	7 Jan 2008 21:30:09 -0000	1.225
@@ -1856,8 +1856,8 @@

 	# fields that have ONLY a-zA-Z0-9_
 	my %alphas = map {($_ => 1)} qw(
-		fieldname formkey commentstatus filter
-		hcanswer mode op section thisname type reskey
+		content_type fieldname formkey commentstatus filter
+		hcanswer mode op section thisname type reskey userfield
 	# Survey

Again, this is in addition to the patch mentioned on Friday, which added id.

As a personal note: none of us who work on Slash are very pleased with this, of course. The last time we made this kind of announcment was just over three years ago, which, while long, is not long enough.

We regret the oversight, and we will be taking additional steps in the coming weeks to make similar types of vulnerability both less likely and less serious. Please feel free to post any questions on this story, or to email me (Jamie McCarthy) with private concerns at To notify us of additional security issues we may not be aware of, please email If you are a Slash site administrator, please subscribe to slashcode-general (it's low-traffic). Thank you.

Related Stories

Full Disclosure and Patches on CVS Vulnerability 1 comment [+]
The "security issue" described on the morning of Dec. 15th is actually two separate and unrelated cross-site scripting (XSS) bugs. We're disclosing all of what we know about them at this point to allow site admins to patch sites which cannot reasonably be upgraded to the latest, fixed version of the code, the Dec. 8th build R_2_5_0_41.

Both of these issues were found by Michael Krax who we understand will be publishing something about them shortly. Again, we thank Mr. Krax for responsibly reporting these issues to us and letting us give administrators running Slash time to upgrade their code.

The first security bug was introduced to Slash in May 2002. The second was introduced in October 2004. Both have been fixed in CVS since Dec. 8, 2004. Neither is present in our last official release, version 2.2.6.

Security: add 'id' to filter_params [+]

Whatever version of Slash you are running, please add 'id' to the list of numeric filtered parameters. This list can be found in the filter_params subroutine in If you are on near-current code, you can just update to current code, as the fix is in CVS. If not, here is the (extremely simple) diff:

diff -U3 -r1.223 -r1.224
--- Slash/Utility/Environment/	24 Oct 2007 21:19:34 -0000	1.223
+++ Slash/Utility/Environment/	4 Jan 2008 19:14:07 -0000	1.224
@@ -1823,7 +1823,7 @@

 	# fields that are numeric only
 	my %nums = map {($_ => 1)} qw(
-		approved artcount art_offset bseclev
+		approved artcount art_offset bseclev id
 		buymore cid clbig clsmall cm_offset
 		commentlimit commentsort commentspill
 		del displaystatus limit

You should also change the passwords for all your admin user accounts.

We are working on a more complete writeup of this issue, and we will append it to this story on Monday morning, Jan. 7. Please check back then. This message is also being sent to our slashcode-general mailing list (which all Slash site administrators should be reading).

Monday Update: Please see today's story with more information and a new (also small) patch.

Display Options Threshold:
The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
  • by penang (7873) on Sunday January 13, @03:39AM (#6415)
    To all it may concern:

    Just went to the slashcode place at _id=4421 [] and I couldn't find any new package commit.

    The latest package listed there is Bundle-Slash, version 2.52, dated 2006-08-18

    And the latest Slashcode listed there is version 2.1.1 dated 2001-10-30

    Would someone please kindly point me to the most updated version, containing the fix that is mentioned in the main message?

    Thank you !
  • by Anonymous Coward on Saturday January 19, @03:09AM (#6424)
    I love slashdot and I like slashcode. Please, I mean no disrespect for bringing up the following thread. I do not mean to give any weight to one side of the argument (prepared statements) or the other (sanitized data access layers). Personally, I feel both arguments are very strong.

    I just think the following thread is relevant to this article. And it may perhaps help code authors and contributors to think about future SQL injection problems. (In slashcode and other code.) d=21131105 []