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 forum.antichat.ru, 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:
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.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 Environment.pm, as
follows:
diff -U3 -r1.224 -r1.225 --- Slash/Utility/Environment/Environment.pm 4 Jan 2008 19:14:07 -0000 1.224 +++ Slash/Utility/Environment/Environment.pm 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 comments_control ), # 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 slashcode.com story, or to email me (Jamie McCarthy) with private concerns at jamie@slashdot.org. To notify us of additional security issues we may not be aware of, please email security@slashcode.com. If you are a Slash site administrator, please subscribe to slashcode-general (it's low-traffic). Thank you.
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 Environment.pm. 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/Environment.pm 24 Oct 2007 21:19:34 -0000 1.223 +++ Slash/Utility/Environment/Environment.pm 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 Slashcode.com 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.
REPLACE INTO dst (region, selectable, start_hour, start_wnum, start_wday, start_month, end_hour, end_wnum, end_wday, end_month) VALUES ('America', 1, 2, 2, 0, 2, 2, 1, 0, 10);
Don't forget to run it before DST starts again, at 2 a.m. on the second Sunday in March (March 11 this coming year).
This weekend, a bugfix for R_2_5_0_94 was committed. The commit has been retagged so that a checkout of R_2_5_0_94 will give the fixed code. This is still the version that we recommend for new installs of Slash -- see previous story for details of how to install _94.
This fixes the issue that had been reported months ago that we never got around to fixing, namely, of the stray punctuation in slashschema_create.sql:
@@ -456,7 +456,7 @@ dkid TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(30) NOT NULL DEFAULT '', PRIMARY KEY (dkid), - UNIQUE name (name), + UNIQUE name (name) ) TYPE=InnoDB; #
We apologize for this solution taking much, much longer than we'd initially thought. This has been a particularly persistent bug. But we are confident that when the final history of Slash 2.5 is written, it will look like just a comma.
As you may know, Slash development for the past several years has all been in CVS, with no tarball releases. We may do a tarball at some point, but for now, we recommend installing the most recent R_ tagged code from CVS.
We tag the code with T_ for our own use (on Slashdot, slashcode.com and use.perl.org) and when we feel one of those weekly test builds is stable enough, we also slap an R_ tag on it. A complete list of tags can always be found on sourceforge.net (in the "Show files using tag" menu).
If you are running a site on a very old version of Slash pre-2.2.6, we still recommend that you upgrade to 2.2.6, but the upgrade path beyond that to a recent CVS version will be long and difficult. We recommend you research whether you want to do that.
On the other hand, if you have not already invested a lot of time into a Slash site, we strongly recommend that you begin with the most recent R_ tag.
Today we made a new R_ tag, our version of Slash from January 11, 2006: R_2_5_0_94. This is the most recent since R_2_5_0_74, which dates from June 2005.
The biggest change is CSS, which was implemented just a few weeks after _74. Other changes include reskeys (which largely replace formkeys), and public logtokens (which improve security).
So the current recommended process to build Slash is:
cvs -d:pserver:anonymous@slashcode.cvs.sourceforge.net:/cvsroot/slashcode login
(password is blank)
cvs -d:pserver:anonymous@slashcode.cvs.sourceforge.net:/cvsroot/slashcode co -P -r R_2_5_0_94 slash
In the slash directory created, read the INSTALL file (the entire file, especially REQUIREMENTS). Then, if you still want to install Slash, follow the instructions in that file carefully!