Skip to content

Commit

Permalink
Disallow loading JS/CSS/Json subpages from unregistered users and log
Browse files Browse the repository at this point in the history
Loading JS from an unregistered user's JS subpage is a severe
security risk as someone could potentially register that account
and then modify the JS.

Bug: T194204
Change-Id: I741736e12b0ed49e95f22c869a2b53e2c97b31f0
  • Loading branch information
bawolff committed May 15, 2018
1 parent 10fcb52 commit 0be838e
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 3 deletions.
30 changes: 29 additions & 1 deletion includes/actions/RawAction.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
* @file
*/

use MediaWiki\Logger\LoggerFactory;

/**
* A simple method to retrieve the plain source of an article,
* using "action=raw" in the GET request string.
Expand Down Expand Up @@ -85,7 +87,6 @@ function onView() {
$response->header( $this->getOutput()->getKeyHeader() );
}

$response->header( 'Content-type: ' . $contentType . '; charset=UTF-8' );
// Output may contain user-specific data;
// vary generated content for open sessions on private wikis
$privateCache = !User::isEveryoneAllowed( 'read' ) &&
Expand All @@ -97,6 +98,33 @@ function onView() {
'Cache-Control: ' . $mode . ', s-maxage=' . $smaxage . ', max-age=' . $maxage
);

// In the event of user JS, don't allow loading a user JS/CSS/Json
// subpage that has no registered user associated with, as
// someone could register the account and take control of the
// JS/CSS/Json page.
$title = $this->getTitle();
if ( $title->isUserConfigPage() && $contentType !== 'text/x-wiki' ) {
// not using getRootText() as we want this to work
// even if subpages are disabled.
$rootPage = strtok( $title->getText(), '/' );
$userFromTitle = User::newFromName( $rootPage, 'usable' );
if ( !$userFromTitle || $userFromTitle->getId() === 0 ) {
$log = LoggerFactory::getInstance( "security" );
$log->warning(
"Unsafe JS/CSS/Json load - {user} loaded {title} with {ctype}",
[
'user' => $this->getUser()->getName(),
'title' => $title->getPrefixedDBKey(),
'ctype' => $contentType,
]
);
$msg = wfMessage( 'unregistered-user-config' );
throw new HttpError( 403, $msg );
}
}

$response->header( 'Content-type: ' . $contentType . '; charset=UTF-8' );

$text = $this->getRawText();

// Don't return a 404 response for CSS or JavaScript;
Expand Down
3 changes: 2 additions & 1 deletion languages/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -4466,5 +4466,6 @@
"pagedata-title": "Page data",
"pagedata-text": "This page provides a data interface to pages. Please provide the page title in the URL, using subpage syntax.\n* Content negotiation applies based on your client's Accept header. This means that the page data will be provided in the format preferred by your client.",
"pagedata-not-acceptable": "No matching format found. Supported MIME types: $1",
"pagedata-bad-title": "Invalid title: $1."
"pagedata-bad-title": "Invalid title: $1.",
"unregistered-user-config": "For security reasons JavaScript, CSS and JSON user subpages cannot be loaded for unregistered users."
}
3 changes: 2 additions & 1 deletion languages/i18n/qqq.json
Original file line number Diff line number Diff line change
Expand Up @@ -4664,5 +4664,6 @@
"pagedata-title": "Title shown on the special page when a form or text is presented",
"pagedata-text": "Error shown when none of the formats acceptable to the client is supported (HTTP error 406). Parameters:\n* $1 - the list of supported MIME types",
"pagedata-not-acceptable": "No matching format found. Supported MIME types: $1",
"pagedata-bad-title": "Error shown when the requested title is invalid. Parameters:\n* $1: the malformed ID"
"pagedata-bad-title": "Error shown when the requested title is invalid. Parameters:\n* $1: the malformed ID",
"unregistered-user-config": "Shown when viewing a user JS, CSS or JSON subpage with ?action=raw&ctype=<mime type> where there is no such user. It is shown as a paragraph after a header saying 'Forbidden'."
}

0 comments on commit 0be838e

Please sign in to comment.