From 17c09db6952a04020df93f8d3013501a4b0fd6b4 Mon Sep 17 00:00:00 2001 From: svrjs Date: Sun, 30 Jul 2023 02:24:20 +0200 Subject: [PATCH] Security updates --- index.js | 61 +++++++++++++++++++++++++++++++------------------------- mod.info | 2 +- 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/index.js b/index.js index d35ed0e..9e946d1 100644 --- a/index.js +++ b/index.js @@ -4,13 +4,11 @@ var http = require("http"); var url = require("url"); var fs = require("fs"); var path = require("path"); -var { - spawn -} = require("child_process"); +var childProcess = require("child_process"); var version = "UNKNOWN"; try { version = JSON.parse(fs.readFileSync(__dirname + "/mod.info")).version; -} catch(ex) { +} catch (ex) { //Can"t determine version } var configJSONS = JSON.parse(fs.readFileSync("config.json")); //Read configuration JSON @@ -25,10 +23,12 @@ Mod.prototype.callback = function callback(req, res, serverconsole, responseEnd, } bheaders["Content-Type"] = "text/html" //HTML output if (!getCustomHeaders) bheaders["Server"] = "SVR.JS/" + configJSON.version + " (" + os.platform()[0].toUpperCase() + os.platform().slice(1) + ")"; //Add Server header + var abheaders = JSON.parse(JSON.stringify(bheaders)); + function executeCGI(fname, req, res, dh, nEnv) { var env = JSON.parse(JSON.stringify(process.env)); var nEnvKeys = Object.keys(nEnv); - for(var i=0;i { - if(!cned && (signal || code !== 0)) { - var ex = new Error("Process execution failed!" + (stderr ? " Reason: " + stderr.trim() : "")); - if (!callServerError) { - res.writeHead(500); - res.end(ex.stack); - } else { - callServerError(500, "RedBrick/" + version, ex); - } + if (!cned && (signal || code !== 0)) { + var ex = new Error("Process execution failed!" + (stderr ? " Reason: " + stderr.trim() : "")); + if (!callServerError) { + res.writeHead(500); + res.end(ex.stack); } else { - res.end(); + callServerError(500, "RedBrick/" + version, ex); } + } else { + res.end(); + } }); } } @@ -203,7 +203,7 @@ Mod.prototype.callback = function callback(req, res, serverconsole, responseEnd, nEnv["REQUEST_METHOD"] = req.method; nEnv["GATEWAY_INTERFACE"] = "CGI/1.1"; nEnv["REQUEST_URI"] = req.url; - nEnv["REMOTE_ADDR"] = (req.socket.realRemoteAddress ? req.socket.realRemoteAddress : ((req.headers["x-forwarded-for"] && configJSON.enableIPSpoofing) ? req.headers["x-forwarded-for"].split(",")[0].replace(/ /g,"") : req.socket.remoteAddress)).replace(/^::ffff:/i, ""); + nEnv["REMOTE_ADDR"] = (req.socket.realRemoteAddress ? req.socket.realRemoteAddress : ((req.headers["x-forwarded-for"] && configJSON.enableIPSpoofing) ? req.headers["x-forwarded-for"].split(",")[0].replace(/ /g, "") : req.socket.remoteAddress)).replace(/^::ffff:/i, ""); nEnv["REMOTE_PORT"] = (req.socket.realRemotePort ? req.socket.realRemotePort : req.socket.remoteAddress); nEnv["SCRIPT_NAME"] = a; nEnv["SCRIPT_FILENAME"] = (process.cwd() + (require("os").platform == "win32" ? a.replace(/\//g, "\\") : a)).replace((require("os").platform == "win32" ? /\\\\/g : /\/\//g), (require("os").platform == "win32" ? "\\" : "/")); @@ -224,7 +224,7 @@ Mod.prototype.callback = function callback(req, res, serverconsole, responseEnd, var invokeElseCallback = false; try { invokeElseCallback = !fs.statSync("." + href).isFile(); - } catch(ex) { } + } catch (ex) {} if (invokeElseCallback) { elseCallback(); } else { @@ -253,7 +253,7 @@ Mod.prototype.callback = function callback(req, res, serverconsole, responseEnd, function checkPath(pth, a) { var cpth = pth.split("/"); if (cpth.length < 3) return false; - if(!a) b = []; + if (!a) b = []; else var b = a.split("/"); var isFile = false; try { @@ -286,7 +286,6 @@ Mod.prototype.callback = function callback(req, res, serverconsole, responseEnd, } } } - } catch (ex) { if (!callServerError) { res.writeHead(500, "Internal Server Error", abheaders); @@ -296,6 +295,14 @@ Mod.prototype.callback = function callback(req, res, serverconsole, responseEnd, callServerError(500, "RedBrick/" + version, ex); } } + } else if (href == "/redbrick-interpreters.json" && path.normalize(__dirname + "/../../..") == process.cwd()) { + if (!callServerError) { + res.writeHead(403, "Forbidden", abheaders); + res.write("403 Forbidden

403 Forbidden

You don't have access to specific page.

SVR.JS " + configJSON.version + " (" + os.platform()[0].toUpperCase() + os.platform().slice(1) + "; Node.JS/" + process.version + ") RedBrick/" + version + " " + (req.headers.host == undefined ? "" : " on " + req.headers.host) + "

"); + res.end(); + } else { + callServerError(403, "RedBrick/" + version); + } } else { elseCallback(); } diff --git a/mod.info b/mod.info index 3f975f9..38a2bf6 100755 --- a/mod.info +++ b/mod.info @@ -1,4 +1,4 @@ { "name": "DorianTech RedBrick CGI engine for SVR.JS", - "version": "2.1.0" + "version": "2.1.1" }