From 441db376848e3bd19448b3d51649a37a12ff5dff Mon Sep 17 00:00:00 2001 From: Alejandro Romero Herrera Date: Mon, 21 Sep 2020 12:56:18 +0300 Subject: [PATCH 1/2] Fix Arbitary Code Execution --- index.js | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/index.js b/index.js index 6038599..77831f6 100644 --- a/index.js +++ b/index.js @@ -2,7 +2,7 @@ var fs = require('fs'); var http = require('http'); -var exec = require('child_process').exec; +var execFile = require('child_process').execFile; var serialNumber = function (cb, cmdPrefix) { var delimiter = ': '; @@ -45,6 +45,32 @@ var serialNumber = function (cb, cmdPrefix) { return result; }; + var filterOutput = function (input, search) { + var result = []; + input = input.split('\n').filter(i => i); + input.forEach( line => { + if(line.includes(search))result.push(line); + }); + return result.join('\n'); + }; + + var execCmd = function (cmdPrefix, cmd, val, callback) { + if (cmdPrefix.endsWith(' ')) { // If ends with space is treated as a comand, like sudo + var cmdArgs = cmd; + cmd = cmdPrefix.trim(); + } else { // Else path, apend + var cmdArgs = cmd.slice(1); + cmd = cmdPrefix + cmd[0]; + } + if (process.platform == 'win32') { + args.push(val); + } + execFile(cmd, cmdArgs, (error, stdout) => { + if(process.platform != 'win32') stdout = filterOutput(stdout, val); + if(callback) callback(error, stdout); + }); + } + var attemptEC2 = function (failCb) { var data = ''; var failHandler = function () { @@ -77,25 +103,25 @@ var serialNumber = function (cb, cmdPrefix) { case 'win32': delimiter = '\r\n'; vals[0] = 'IdentifyingNumber'; - cmd = 'wmic csproduct get '; + cmd = ['wmic', 'csproduct', 'get']; break; case 'darwin': - cmd = 'system_profiler SPHardwareDataType | grep '; + cmd = ['system_profiler', 'SPHardwareDataType']; break; case 'linux': if (process.arch === 'arm') { vals[1] = 'Serial'; - cmd = 'cat /proc/cpuinfo | grep '; + cmd = ['cat', '/proc/cpuinfo']; } else { - cmd = 'dmidecode -t system | grep '; + cmd = ['dmidecode', '-t', 'system']; } break; case 'freebsd': - cmd = 'dmidecode -t system | grep '; + cmd = ['dmidecode', '-t', 'system']; break; } @@ -103,11 +129,11 @@ var serialNumber = function (cb, cmdPrefix) { if (serialNumber.preferUUID) vals.reverse(); - exec(cmdPrefix + cmd + vals[0], function (error, stdout) { + execCmd(cmdPrefix, cmd, vals[0], (error, stdout) => { if (error || parseResult(stdout).length > 1) { stdoutHandler(error, stdout); } else { - exec(cmdPrefix + cmd + vals[1], stdoutHandler); + execCmd(cmdPrefix, cmd, vals[1], stdoutHandler); } }); }; From a6f0dd1d9d5927f0ba5bc5386276e6afb44a1a6d Mon Sep 17 00:00:00 2001 From: Alejandro Romero Herrera Date: Fri, 9 Oct 2020 16:39:57 +0300 Subject: [PATCH 2/2] Updated to use spawn on non win systems --- index.js | 47 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/index.js b/index.js index 77831f6..b012e4d 100644 --- a/index.js +++ b/index.js @@ -3,6 +3,7 @@ var fs = require('fs'); var http = require('http'); var execFile = require('child_process').execFile; +var spawn = require('child_process').spawn; var serialNumber = function (cb, cmdPrefix) { var delimiter = ': '; @@ -45,15 +46,6 @@ var serialNumber = function (cb, cmdPrefix) { return result; }; - var filterOutput = function (input, search) { - var result = []; - input = input.split('\n').filter(i => i); - input.forEach( line => { - if(line.includes(search))result.push(line); - }); - return result.join('\n'); - }; - var execCmd = function (cmdPrefix, cmd, val, callback) { if (cmdPrefix.endsWith(' ')) { // If ends with space is treated as a comand, like sudo var cmdArgs = cmd; @@ -64,11 +56,40 @@ var serialNumber = function (cb, cmdPrefix) { } if (process.platform == 'win32') { args.push(val); + execFile(cmd, cmdArgs, (error, stdout) => { + if(callback) callback(error, stdout); + }); + } else { // If not win32 use spawn for grep + let stdout = ''; + let stderr = ''; + const spCmd1 = spawn(cmd, cmdArgs); + const spCmd2 = spawn('grep', [val]); + + spCmd1.stdout.on('data', (data) => { + spCmd2.stdin.write(data); + }); + spCmd1.stderr.on('data', (data) => { + stderr += data; + }); + spCmd1.on('close', (code) => { + if (code !== 0) { + console.error(`${cmd1} process exited with code ${code}`); + } + spCmd2.stdin.end(); + }); + spCmd2.stdout.on('data', (data) => { + stdout += data.toString(); + }); + spCmd2.stderr.on('data', (data) => { + stderr+= data; + }); + spCmd2.on('close', (code) => { + if (code !== 0) { + console.error(`${cmd2} process exited with code ${code}`); + } + if(callback) callback(stderr, stdout); + }); } - execFile(cmd, cmdArgs, (error, stdout) => { - if(process.platform != 'win32') stdout = filterOutput(stdout, val); - if(callback) callback(error, stdout); - }); } var attemptEC2 = function (failCb) {