资讯动态

SecGPT:为LLM智能体构建执行隔离架构的安全实践

发布时间:2026/9/27 14:37:33 来源:尧图企业网站定制
1. 项目概述为什么我们需要为LLM应用套上“安全笼”最近在折腾各种基于大语言模型的智能体应用从个人助理到自动化工作流玩得不亦乐乎。但玩得越深心里越不踏实这些应用动辄就能访问我的邮箱、网盘、日程表甚至能替我发邮件、改文件。一个不小心或者模型“抽风”理解错了我的指令会不会把我的私人邮件误发给了所有人或者被一个恶意应用“带坏”窃取其他应用的数据这可不是危言耸听随着LLM Agent的复杂度提升其安全边界模糊的问题日益凸显。这正是SecGPT也叫IsolateGPT这个项目要解决的核心问题。简单来说它是一套为基于LLM的智能体系统设计的执行隔离架构。你可以把它想象成给每个LLM应用他们称之为“Spoke”辐条套上一个独立的“安全笼”Sandbox让它们在一个受控的沙箱环境里运行。所有应用与核心系统“Hub”轮毂的通信都必须经过明确定义的接口并且需要用户的显式授权。这样一来即使某个应用被攻破或者行为异常它的破坏力也被限制在自己的笼子里无法波及其他应用和系统核心数据。我最初是在NDSS 2025的录用论文列表里注意到这个工作的它来自华盛顿大学和圣路易斯华盛顿大学的安全研究团队。他们不仅提出了架构还把代码开源了基于流行的LlamaIndex和LangChain框架构建这让它不再只是一个学术原型而是具备了工程上的可实践性。对于像我这样既想享受AI智能体带来的便利又对数据安全和隐私如履薄冰的开发者来说这无疑是一个值得深挖的宝藏项目。2. 核心架构解析Hub与Spoke的隔离哲学SecGPT的架构设计非常直观其核心思想借鉴了操作系统中的微内核或沙箱概念。整个系统可以看作一个“轮毂-辐条”模型其中包含一个中心调度器Hub和多个独立运行的应用单元Spoke。2.1 核心组件分工Hub轮毂/中心调度器这是系统的大脑和指挥中心。它的职责包括理解用户意图接收用户的自然语言查询并利用LLM默认是GPT-4进行规划决定需要调用哪些工具即Spoke应用来完成任务。任务规划与分解将复杂的用户请求分解成一系列有序的子任务或工具调用序列。权限管理与协调维护一个权限系统当Spoke需要执行涉及用户数据的操作如读取Gmail时Hub会向用户请求授权。它也是所有Spoke之间通信的唯一中介禁止Spoke直接对话。记忆管理通过Redis数据库维护对话的长期记忆使得智能体能够拥有上下文感知能力。Spoke辐条/应用单元这是具体执行某项功能的应用比如“读取Google Drive文件”、“发送Gmail邮件”、“查询天气”等。每个Spoke都运行在独立的进程中关键点在于严格隔离每个Spoke进程都被放置在一个自定义的沙箱环境中。这意味着即使某个Spoke的代码存在漏洞或被恶意指令操控它也无法直接访问其他Spoke的内存、文件或网络资源。能力受限Spoke只能访问Hub明确授予其权限的资源和数据。它看不到系统的其他部分。明确定义的接口每个Spoke的功能都通过一个清晰的“规格说明”文件来定义其中描述了它的输入、输出以及所需权限。Hub只通过这些定义好的接口与Spoke交互。Sandbox沙箱这是实现隔离的技术基石。项目利用操作系统的底层机制来限制每个Spoke进程的能力seccompLinux用于限制进程可以调用的系统调用。例如可以禁止Spoke进程执行fork创建新进程或者禁止使用某些网络相关的系统调用。setrlimit用于设置资源限制包括CPU时间、最大虚拟内存大小、进程可以创建的文件大小等。这可以防止某个Spoke因bug或恶意行为耗尽系统资源类似DoS攻击。网络域限制Spoke发起的网络请求会被限制在其被允许的根域名内。例如一个用于Google Drive的Spoke其网络请求只能发往*.googleapis.com而不能随意连接其他地址。这种架构的优势在于它将“智能”规划、决策与“执行”具体操作分离。Hub作为可信的智能核心负责高层次的、无害的规划工作而所有具有潜在风险的具体操作都被推到不可信的、但被严格隔离的Spoke中去执行。即使Spoke被“黑”损失也仅限于该Spoke被授权的有限范围。2.2 安全威胁模型与防御机制SecGPT论文中明确针对四类攻击场景进行了设计应用劫持一个恶意或存在漏洞的Spoke试图破坏其他Spoke或Hub。防御进程级隔离确保了一个Spoke的崩溃或被控不会影响其他组件。数据窃取一个Spoke试图越权访问其他Spoke或系统的敏感数据。防御基于权限的访问控制。Spoke只能访问Hub明确告知并经过用户同意的数据。内存和进程空间隔离使得直接读取其他进程数据变得极其困难。无意数据暴露由于自然语言的歧义用户本意是操作A数据但LLM错误理解导致去操作了B数据。防御权限确认流程。即使LLM规划要操作某个数据Hub也会在具体执行前向用户请求对该操作的授权让用户有机会纠正。失控系统篡改LLM被诱导执行破坏性系统指令如删除所有文件。防御沙箱限制。Spoke的运行环境受到严格限制它无法执行诸如rm -rf /这样的危险系统命令因为对应的系统调用已被seccomp阻断或者其访问的文件系统路径受到控制。注意SecGPT提供的是一种“运行时隔离”安全。它假设Spoke的代码本身可能是不可信的。但它不解决Spoke代码本身的静态漏洞如代码注入也不防止Hub本身的提示词注入或越权规划问题。它的价值在于将安全边界从“整个智能体系统”缩小到了“每个功能单元”实现了攻击面的最小化。3. 从零开始部署与配置SecGPT纸上谈兵终觉浅绝知此事要躬行。下面我就带大家走一遍SecGPT的部署和配置流程其中会穿插一些我实际操作中遇到的坑和解决技巧。3.1 基础环境搭建项目推荐使用Conda管理Python环境这能很好地解决依赖冲突问题。我的实验环境是Ubuntu 22.04但macOS和WSL下的步骤基本一致。# 1. 创建并激活Conda环境使用Python 3.9这是许多LLM库兼容性较好的版本 conda create -n secgpt python3.9 -y conda activate secgpt # 2. 克隆仓库并安装依赖 git clone https://github.com/llm-platform-security/SecGPT cd SecGPT pip install -r requirements.txt这里有个小坑requirements.txt里包含的llama-index和langchain版本可能比较新或比较特定。如果安装后运行报错可能是某个子包API发生了变动。我的经验是先尝试原样安装如果出错再根据错误信息去项目issue里找找或者尝试锁定论文发表时的大致版本。例如可以尝试pip install llama-index0.9.x langchain0.1.x。3.2 数据库与核心配置SecGPT使用Redis作为长期记忆的存储后端。# 在Ubuntu上安装并启动Redis sudo apt update sudo apt install redis-server -y sudo systemctl start redis-server sudo systemctl enable redis-server # 检查Redis是否运行 redis-cli ping # 应该返回 PONG接下来是关键的配置环节这决定了你的SecGPT能做什么。第一步设置LLM API密钥。项目默认使用OpenAI的GPT-4。你需要准备一个API Key。# 编辑环境变量文件 nano data/env_variables.json将内容修改为{ OPENAI_API_KEY: 你的-OpenAI-API-KEY }实操心得千万不要把这个文件提交到Git仓库最好在.gitignore里加上data/env_variables.json。我习惯用python-dotenv来管理环境变量但项目目前用的是JSON文件所以务必注意本地文件安全。第二步设置项目根路径。这个路径用于内部模块导入和资源定位。# 编辑 helpers/configs/configuration.py nano helpers/configs/configuration.py找到root_path变量将其设置为你的SecGPT目录的绝对路径。root_path /home/your_username/projects/SecGPT # 示例请替换为你的实际路径如果这里设置不对运行时会报模块导入错误。3.3 功能启用与授权管理SecGPT的魅力在于可以灵活插拔各种“技能”Spoke。这些技能定义在data/functionalities.json中。{ installed_functionalities: [ google_drive_retrieve, send_gmail_message, creative_muse ] }available_functionalities列表里是所有预定义的功能你不需要动它。installed_functionalities是你想启用的功能列表。你可以从available列表里挑选名字放进来。以启用Google Drive和Gmail为例需要完成OAuth授权Google Cloud项目设置你需要去Google Cloud Console创建一个项目启用Google Drive API和Gmail API然后创建OAuth 2.0客户端ID类型为“桌面应用”。下载生成的credentials.json文件。放置凭证文件将下载的credentials.json文件重命名并放到data/credentials.json。注意项目代码里写死了这个路径。首次运行授权当你第一次运行涉及Google API的Spoke时程序会自动打开浏览器让你登录谷歌账号并授权应用访问相应的范围如读写Drive、发送邮件。授权后会生成一个token.json文件存储在本地默认路径在helpers/configs/configuration.py中的token_path指定后续运行就无需再次授权。踩坑记录这里最容易出问题的是Google Cloud控制台上的“OAuth同意屏幕”配置。如果你只是自己测试可以将测试用户添加为自己的邮箱。credentials.json中的redirect_uris必须包含http://localhost:8080/这是LangChain工具包默认的。如果授权时页面报错“redirect_uri_mismatch”请仔细检查。关于那个棘手的Callbacks错误如果你在启用Google Drive功能后运行遇到NameError: name Callbacks is not defined这是LangChain版本更新导致的接口变动。按照项目README的提示你需要修改本地LangChain库的源码找到文件位置你的Python环境路径/site-packages/langchain_core/retrievers.py找到get_relevant_documents方法定义。将其参数callbacks: Callbacks None中的Callbacks类型注解改为Any。def get_relevant_documents( self, query: str, *, callbacks: Any None, # 将 Callbacks 改为 Any tags: Optional[List[str]] None, metadata: Optional[Dict[str, Any]] None, run_name: Optional[str] None, **kwargs: Any, ) - List[Document]:这是一个临时解决方案最好的方式是项目后续能更新依赖或提供补丁。4. 深入代码理解隔离机制如何实现配置好环境后我们深入核心代码看看隔离到底是怎么做的。这有助于我们未来扩展自己的Spoke。4.1 Spoke的沙箱化执行关键文件在helpers/sandbox/sandbox.py。其中run_restricted函数是核心。# 节选并简化自 sandbox.py def run_restricted(func, args(), kwargs{}, resource_limitsNone, seccomp_profileNone): 在资源限制和系统调用过滤下运行一个函数。 # 1. 设置资源限制 (setrlimit) if resource_limits: for resource, limit in resource_limits.items(): # 例如设置CPU时间、内存、文件大小等 soft, hard limit if isinstance(limit, tuple) else (limit, limit) resource_id getattr(resource_module, resource) libc.setrlimit(resource_id, (soft, hard)) # 2. 加载seccomp过滤器 if seccomp_profile: filter libseccomp.seccomp_init(libseccomp.SCMP_ACT_ALLOW) for call in seccomp_profile[allowed_syscalls]: libseccomp.seccomp_rule_add(filter, libseccomp.SCMP_ACT_ALLOW, resolve_syscall(call), 0) libseccomp.seccomp_load(filter) # 3. 在子进程中运行目标函数 def child_func(): # 应用限制 apply_limits(resource_limits) apply_seccomp(seccomp_profile) return func(*args, **kwargs) with Pool(processes1) as pool: result pool.apply(child_func) return result这个函数做了以下几件事创建子进程使用multiprocessing.Pool在一个全新的子进程中运行目标函数即Spoke的核心逻辑。这是隔离的基础。应用资源限制在子进程执行前通过setrlimit设置其能使用的CPU时间、内存、文件描述符数量等上限。加载Seccomp过滤器在子进程中通过libseccomp库只允许进程调用白名单内的系统调用。例如一个只做计算的Spoke可以禁止所有的网络相关系统调用如socket,connect,sendto。默认的沙箱配置在同一个文件中定义例如DEFAULT_RESOURCE_LIMITS可能限制进程CPU时间为10秒内存为100MB。DEFAULT_SECCOMP_PROFILE则定义了一个相对宽松但已排除危险调用的白名单。4.2 Hub与Spoke的通信机制由于Spoke运行在独立的、受限制的进程中Hub如何与它通信项目实现了一个简单的基于本地Socket的进程间通信IPC机制代码在helpers/isc/Inter-Spoke Communication目录下。socket.py建立了ServerHub端和ClientSpoke端的通信框架。message.py定义了通信的消息格式包括请求、响应、错误等。当一个用户查询到来时大致流程如下Hubhub_operator.py的LLM规划器分析请求决定调用哪个Spoke工具。Hub检查该工具所需的权限定义在helpers/tools/specifications/下的JSON文件中。如果涉及敏感操作且未授权则向用户请求许可。获得授权后Hub通过IPC向对应的Spoke进程发送执行请求消息中包含操作指令和必要的参数。Spoke进程在自己的沙箱内执行操作如读取文件、调用API。Spoke将执行结果或错误通过IPC返回给Hub。Hub收集结果可能继续规划下一步或整合结果返回给用户。这种设计的精妙之处在于Spoke进程是“无状态”或“轻状态”的。它每次执行完一个任务后可以被终止。下次需要时Hub再重新启动一个新的沙箱进程。这进一步确保了即使某次执行被污染也不会影响后续任务。4.3 如何添加一个新的Spoke应用假设你想添加一个“查询天气”的Spoke。定义工具规格在helpers/tools/specifications/下创建一个JSON文件例如weather_checker.json。{ name: weather_checker, description: Get the current weather for a given city., parameters: { type: object, properties: { city: { type: string, description: The city name, e.g., Seattle } }, required: [city] }, permissions: [network_access], // 声明需要网络权限 returns: A string describing the weather. }这个文件定义了工具的名字、描述、输入参数、所需权限和返回类型。Hub的权限系统会检查permissions字段。实现工具逻辑在helpers/tools/tool_importer.py中添加一个函数来创建这个工具。通常你会基于LangChain的BaseTool类来封装。# 在 tool_importer.py 中 from langchain.tools import BaseTool import requests class WeatherCheckerTool(BaseTool): name weather_checker description Get the current weather for a given city. def _run(self, city: str): # 这里是你的天气API调用逻辑 # 注意这个函数将在沙箱进程中运行 api_key your_weather_api_key # 密钥应从安全的地方注入 # 模拟请求 # response requests.get(fhttps://api.weatherapi.com/v1/current.json?key{api_key}q{city}) # return response.json()[current][condition][text] return fThe weather in {city} is sunny. # 示例返回 async def _arun(self, city: str): raise NotImplementedError(Async not supported) def import_weather_checker(): return WeatherCheckerTool()然后在同一个文件的import_tool函数里添加一个条件分支def import_tool(tool_name): if tool_name weather_checker: return import_weather_checker() # ... 其他已有工具的判断注册功能在data/functionalities.json的available_functionalities列表末尾添加weather_checker。当你想启用它时再把它的名字加入到installed_functionalities中。配置沙箱规则由于这个工具需要网络访问你需要在启动这个Spoke时为其配置允许网络相关的系统调用如socket,connect并在网络域限制中允许其访问天气API的域名如api.weatherapi.com。这需要在sandbox.py或Spoke的启动逻辑中进行更精细的配置。重要提示添加需要网络或文件访问的Spoke时必须仔细考虑其沙箱配置。过松则失去隔离意义过紧则功能无法工作。原则是按需授权最小权限。5. 运行与测试对比SecGPT与普通智能体项目提供了两个主要的运行入口secgpt_main.py和vanillagpt_main.py。后者是一个没有隔离措施的基线系统用于对比。5.1 启动安全智能体运行SecGPT非常简单# 在 secgpt_main.py 中修改main函数调用参数 if __name__ __main__: main(user_id0, debugFalse)user_id: 用于区分不同用户的记忆和权限。debug: 设为True会打印更详细的日志包括Hub和Spoke之间的通信消息对于调试非常有用。在终端运行python secgpt_main.py程序启动后会加载所有已安装的功能初始化Hub和Spoke然后进入一个交互式循环等待你的自然语言输入。一个典型的交互流程可能如下你 帮我从Google Drive里找到关于“项目报告”的文档然后总结一下核心内容。 Hub思考用户需要两个步骤1. 搜索Google Drive。2. 总结文档内容。第一步需要调用google_drive_retrieve工具这需要读取Drive的权限。 Hub向你请求授权应用“google_drive_retrieve”需要访问你的Google Drive文件以进行搜索。是否授权(yes/no) 你 yes Hub 已授权。正在执行... Hub通过IPC启动Google Drive Spoke沙箱进程发送搜索指令 Google Drive Spoke在沙箱内调用Google API搜索文件将结果列表返回给Hub Hub思考找到了几个文档。现在需要总结内容这需要读取文件内容。需要调用google_drive_retrieve的读取文件内容功能这需要进一步授权。 Hub向你请求授权应用“google_drive_retrieve”需要读取文件“项目报告_v3.docx”的内容。是否授权(yes/no) 你 yes Hub再次指令Spoke读取具体文件内容然后可能将内容发送给LLM进行总结或调用另一个总结专用的Spoke Hub 已为你总结“项目报告_v3.docx”的核心内容...你可以看到每一步涉及数据访问的操作都会停顿并请求用户确认。这是防止“无意数据暴露”的关键。5.2 案例研究亲眼见证隔离的价值项目最精彩的部分是四个预设的案例研究它们生动演示了SecGPT如何防御特定攻击。运行案例对比脚本能让你有最直观的感受。# 运行SecGPT的案例测试 python secgpt_case_studies.py # 运行基线系统无隔离的案例测试 python vanillagpt_case_studies.py运行后会让你选择案例1-4。我们以案例1应用劫持为例看看发生了什么攻击场景假设有一个恶意应用“Spoke A”它被植入了恶意代码试图删除另一个应用“Spoke B”的重要配置文件。在VanillaGPT无隔离中所有应用运行在同一个进程或宽松的环境中。Spoke A可能通过文件系统路径直接找到并删除Spoke B的配置文件攻击成功。在SecGPT中每个Spoke运行在自己的沙箱中。沙箱的seccomp规则和文件系统限制使得Spoke A根本无法访问属于Spoke B进程空间或沙箱外的文件路径。当它尝试执行删除操作时要么系统调用被阻断要么返回“权限不足”。攻击被遏制在Spoke A的沙箱内。通过对比两个脚本的输出日志你可以清晰地看到在无隔离系统中恶意操作畅通无阻而在SecGPT中同样的操作会被沙箱拦截并报错。测试心得运行案例前确保你已经正确安装了Redis并启动了服务因为记忆功能会用到。另外案例脚本可能会调用一些未默认安装的功能如Gmail如果没配置相关凭证对应的测试可能会跳过或失败这没关系核心的隔离机制测试不受影响。6. 局限性与未来扩展思考SecGPT是一个强有力的架构示范但它并非银弹在实际部署中仍需考虑以下几点性能开销为每个工具调用创建独立的沙箱进程必然带来额外的开销进程创建、销毁、IPC通信。对于高频调用的简单工具这可能成为瓶颈。优化方向可以是沙箱进程池化预热并复用进程。权限管理的粒度与用户体验目前的授权是“每操作一授权”对于复杂工作流可能打断用户体验。需要在安全与流畅之间取得平衡例如引入会话级授权或基于敏感级别的分级授权。Hub本身的安全性Hub作为系统的“大脑”如果其本身的提示词被注入攻击或者规划逻辑有缺陷它可能会发出错误的指令序列。SecGPT的隔离无法防止Hub层面的逻辑错误。这需要结合提示词加固、规划验证等其他安全措施。侧信道攻击虽然内存隔离但Spoke仍可能通过共享的CPU缓存、内存总线时序等侧信道泄露信息。这属于更高级别的威胁在绝大多数应用场景下可暂不考虑。扩展更多隔离后端目前主要依赖Linux的seccomp和rlimit。要支持Windows或macOS需要适配其他沙箱技术如Docker容器、gVisor等。对于开发者而言SecGPT最大的启发在于其设计模式将复杂的LLM应用拆解为“可信规划中心”“不可信但隔离的执行单元”。即使你不完全照搬其代码也可以在自己的项目中借鉴这种思想。例如在云原生环境中你可以将每个Spoke实现为一个独立的微服务或容器利用Kubernetes的Security Context和网络策略来实现隔离而Hub则作为协调服务的编排器。这个项目为LLM应用的安全实践提供了一个扎实的起点。它告诉我们在追逐AI能力的同时必须将安全设计融入架构的骨髓。随着AI智能体承担越来越重要的任务像SecGPT这样的“安全笼”或许会成为未来AI基础设施中的标准配置。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑