ian-flores/securer

GitHub: ian-flores/securer

为 LLM 代理提供操作系统级沙箱化的 R 代码执行环境,支持工具调用 IPC、资源限制和会话池化,让 AI 生成的代码安全可控地运行。

Stars: 0 | Forks: 0

# securer [![R-CMD-check](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/dbf54f12bc143331.svg)](https://github.com/ian-flores/securer/actions/workflows/R-CMD-check.yaml) [![Codecov test coverage](https://codecov.io/gh/ian-flores/securer/graph/badge.svg)](https://codecov.io/gh/ian-flores/securer) [![Lifecycle: experimental](https://img.shields.io/badge/lifecycle-experimental-orange.svg)](https://lifecycle.r-lib.org/articles/stages.html#experimental) [![pkgdown](https://github.com/ian-flores/securer/actions/workflows/pkgdown.yml/badge.svg)](https://ian-flores.github.io/securer/) **让 LLM 编写调用您函数的 R 代码 —— 且确保安全。** 当 LLM 生成 R 代码时,您需要两样东西:一种让代码回调到您的应用程序的途径(工具调用),以及确信代码不会执行任何危险操作的信心(沙箱化)。securer 提供了这两者。 ``` # 最简单的用法 —— 在 sandbox 中运行 R 代码 execute_r("1 + 1") #> [1] 2 ``` 对于工具调用,定义沙箱化代码可以使用的函数: ``` library(securer) # 您的函数将变为 LLM 代码可以调用的工具 tools <- list( securer_tool("query_db", "Query a database table", fn = function(table, limit) head(get(table, "package:datasets"), limit), args = list(table = "character", limit = "numeric")) ) # LLM 生成的代码在 sandbox 中运行 —— tool calls 会暂停,在您这一侧执行,然后恢复 result <- execute_r(' data <- query_db("mtcars", 5) mean(data$mpg) ', tools = tools, sandbox = TRUE) ``` 子 R 进程在操作系统层面被沙箱化。工具函数在沙箱外的宿主端执行,拥有对您资源的完全访问权限。LLM 的代码永远不会直接接触您的文件系统、网络或数据。 ## secure-r-dev 生态系统的一部分 securer 是用于在 R 中构建受控 AI 代理的 7 包生态系统的一部分: ``` ┌────────────────┐ │ >>> securer <<< │ └───────┬────────┘ ┌─────────────────┼─────────────────┐ │ │ │ ┌──────▼──────┐ ┌──────▼──────┐ ┌───────▼────────┐ │ securetools │ │ secureguard │ │ securecontext │ └──────┬───────┘ └──────┬──────┘ └───────┬────────┘ └─────────────────┼─────────────────┘ ┌───────▼──────┐ │ orchestr │ └───────┬──────┘ ┌─────────────────┼─────────────────┐ │ │ ┌──────▼──────┐ ┌──────▼──────┐ │ securetrace │ │ securebench │ └─────────────┘ └─────────────┘ ``` securer 位于堆栈的顶层,提供了其他包赖以构建的沙箱化 R 执行引擎。securetools 添加了预构建的工具定义,secureguard 添加了防护机制,而 orchestr 将代理连接到工作流中。 | 包 | 角色 | |---------|------| | [securer](https://github.com/ian-flores/securer) | 具有工具调用 IPC 的沙箱化 R 执行 | | [securetools](https://github.com/ian-flores/securetools) | 预构建的经过安全强化的工具定义 | | [secureguard](https://github.com/ian-flores/secureguard) | 输入/代码/输出防护(注入、PII、机密) | | [orchestr](https://github.com/ian-flores/orchestr) | 基于图的代理编排 | | [securecontext](https://github.com/ian-flores/securecontext) | 文档分块、embeddings、RAG 检索 | | [securetrace](https://github.com/ian-flores/securetrace) | 结构化追踪、token/成本核算、JSONL 导出 | | [securebench](https://github.com/ian-flores/securebench) | 具备 precision/recall/F1 指标的防护基准测试 | ## 安装说明 ``` # install.packages("pak") pak::pak("ian-flores/securer") # 验证其是否正常工作 library(securer) execute_r("1 + 1") #> [1] 2 ``` ## 为什么选择 securer? | 问题 | securer 如何解决它 | |---------|----------------------| | LLM 代码可能访问文件系统 | 操作系统沙箱阻止写入;读取仅限于 R 库 | | LLM 代码可能发起网络请求 | 通过命名空间隔离 或 Seatbelt (macOS) 阻止网络访问 | | LLM 代码需要调用您的 API/数据库 | 注册在沙箱外的宿主端执行的工具函数 | | LLM 代码可能永远运行下去 | 执行超时并自动恢复会话 | | LLM 代码可能耗尽所有内存 | 通过 ulimit (Linux/macOS) 和 Job Objects (Windows) 进行资源限制 | | LLM 代码存在语法错误 | 预验证在执行前捕获解析错误 | ## 工作原理 ``` ┌──────────────────────┐ ┌──────────────────────┐ │ Parent (host) │ │ Child (sandboxed R) │ │ │ │ │ │ 1. Send code ────────┼───────>│ 2. eval(code) │ │ │ UDS │ │ │ 3. Execute tool <───┼────────│ Code calls tool() │ │ (your function) │ │ → pauses on socket │ │ │ │ │ │ 4. Send result ──────┼───────>│ 5. Resumes with │ │ │ │ tool result │ │ │ │ │ │ 6. Receive final <───┼────────│ Returns final value │ │ result │ │ │ └──────────────────────┘ └──────────────────────┘ ``` 通信通过 Unix 域套接字 进行。工具调用是同步的:子进程在父进程满足请求期间会一直阻塞。 ## 功能特性 ### 持久会话 跨多次执行重用会话,以避免启动开销: ``` session <- SecureSession$new(tools = tools, sandbox = TRUE) session$execute('query_db("iris", 3)') session$execute('query_db("mtcars", 5)') session$close() ``` ### 会话池 预热多个会话,实现低延迟并发执行: ``` pool <- SecureSessionPool$new(size = 4, tools = tools, sandbox = TRUE) result <- pool$execute('query_db("iris", 3)') pool$close() ``` ### 资源限制 约束 CPU、内存、文件大小等。在所有平台上均可工作,无论是否开启沙箱模式: ``` result <- execute_r("1 + 1", limits = list(cpu = 10, memory = 256 * 1024 * 1024) ) ``` ### 执行超时 自动终止长时间运行的代码。会话会自动恢复并且可重用: ``` session <- SecureSession$new() session$execute("Sys.sleep(100)", timeout = 5) # Error: Execution timed out after 5 seconds session$execute("1 + 1") # still works ``` ### 代码预验证 在将代码发送到子进程之前捕获语法错误: ``` session$execute("if (TRUE {") # immediate error, no child round-trip ``` ### ellmer 集成 在 [ellmer](https://ellmer.tidyverse.org/) LLM 聊天中将 securer 用作代码执行工具: ``` library(ellmer) chat <- chat_openai() chat$register_tool(securer_as_ellmer_tool()) chat$chat("Calculate the mean of 1 through 100 using R") ``` ### 审计日志 将所有会话事件写入结构化的 JSONL 日志,用于合规性和调试: ``` session <- SecureSession$new(audit_log = "session.jsonl") ``` ### 详细日志 通过人类可读的 `message()` 输出调试会话行为: ``` session <- SecureSession$new(verbose = TRUE) # [securer] Session started (sandbox=FALSE, pid=1234) # [securer] Tool call: query_db(table="iris", limit=3) # [securer] Execution complete (0.5s) ``` ## 平台支持 | 平台 | 沙箱 | 网络受阻止 | 文件系统受限制 | 资源限制 | |----------|---------|-----------------|----------------------|-----------------| | **Linux** | bubblewrap (`bwrap`) | 是 | 是 | 是 | | **macOS** | Seatbelt (`sandbox-exec`) | 是 | 是 | 是 | | **Windows** | Job Objects + 环境隔离 | 否 | 否 | 是 (内存、CPU、进程数) | | **docker-spawn** (任何宿主机) | 每个会话生成新容器 | 是 (`--network=none`) | 是 (容器文件系统) | 是 (`--memory`、`--cpus`、ulimit) | 所有平台均支持工具调用 IPC、执行超时和代码预验证。`docker-spawn` 后端是选择启用的(`SECURER_SANDBOX_MODE=docker-spawn`),并且需要 `docker` CLI 以及一个可访问的守护进程。请参阅 `inst/docker/Dockerfile` 获取参考镜像。 ## 安全性 securer 通过多层机制实现深度防御:操作系统级沙箱、经过身份验证的 IPC、资源限制、环境清理和输入验证。有关详细的威胁模型和安全架构,请参阅 `vignette("security-model", package = "securer")`。 如需报告安全漏洞,请直接给维护者发送电子邮件,而不是提交公开 issue。 ## 文档 - `vignette("quickstart", package = "securer")` -- 安装与初步示例 - `vignette("sessions-and-tools", package = "securer")` -- 持久会话、流式传输、池化 - `vignette("deployment", package = "securer")` -- 沙箱化、资源限制、架构 - `vignette("security-model", package = "securer")` -- 威胁模型与防御层 - `vignette("ellmer-integration", package = "securer")` -- 将 securer 与 ellmer LLM 聊天结合使用 - `vignette("integration-examples", package = "securer")` -- Shiny、Plumber 和批处理示例 - `vignette("troubleshooting", package = "securer")` -- 常见问题与解决方案 - [pkgdown 站点](https://ian-flores.github.io/securer/) -- API 参考 ## 许可证 MIT
标签:AI安全, AST解析, Chat Copilot, DLL 劫持, DNS 反向解析, Golang, IPC, LLM代理, R包, R语言, R语言开发, XML 请求, 代码沙箱化, 大语言模型, 安全开发, 安全执行, 安全编程, 安全隔离, 工具调用, 操作系统级安全, 数字取证, 沙箱, 生成式AI, 索引, 自动化脚本, 请求拦截, 进程间通信