Skip to content

Commit

Permalink
Fixed path traversal issue
Browse files Browse the repository at this point in the history
  • Loading branch information
bbyars committed Sep 27, 2020
1 parent 873b218 commit 479d03c
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 1 deletion.
7 changes: 6 additions & 1 deletion src/controllers/feedController.js
Expand Up @@ -24,6 +24,11 @@ function create (releases, options) {
return path.join(__dirname, '/../views/', releaseViewFor(version));
};

function versionInWhitelist (version) {
// Prevent path traversal attack like v2.3.0%2f..%2f..%2f_header
return feedReleases.some(release => version.toLowerCase() === release.version);
}

/**
* The function that responds to GET /feed
* @memberOf module:controllers/feedController#
Expand Down Expand Up @@ -86,7 +91,7 @@ function create (releases, options) {
releaseVersion: version.replace('v', '')
};

if (fs.existsSync(releaseFilenameFor(version))) {
if (versionInWhitelist(version) && fs.existsSync(releaseFilenameFor(version))) {
response.render('_header', config, (headerError, header) => {
if (headerError) { throw headerError; }
response.render(releaseViewFor(version), config, (bodyError, body) => {
Expand Down
23 changes: 23 additions & 0 deletions test/controllers/feedControllerTest.js
@@ -0,0 +1,23 @@
'use strict';

const Controller = require('../../src/controllers/feedController'),
assert = require('assert'),
mock = require('../mock').mock;

describe('feedController', function () {
describe('#getRelease', function () {
it('should prevent path traversal attacks', function () {
const response = { status: mock().returns({ send: mock() }) },
releases = [{ version: 'v2.3.0', date: '2020-09-07' }],
controller = Controller.create(releases, { heroku: false }),
request = {
headers: { host: 'localhost' },
params: { version: 'v2.3.0%2f..%2f..%2f_header' }
};

controller.getRelease(request, response);

assert.ok(response.status.wasCalledWith(404));
});
});
});

0 comments on commit 479d03c

Please sign in to comment.