资讯动态

DuckDB 沙箱如何隔离 AI 生成的 SQL?Helix Foundry Executor 安全执行源码解读

发布时间:2026/10/14 17:07:01 来源:尧图企业网站定制
【免费下载链接】helix-foundryYour companys data, connected into one ontology, on your own computer. A local-first data workspace built on HelixDB and DuckDB.项目地址https://gitcode.com/gh_mirrors/he/helix-foundry点击查看免费下载Helix Foundry是一个本地优先local-first的数据工作区它把公司的数据连接进同一个 ontology运行在你自己的电脑上底层由 HelixDB 和 DuckDB 支撑。当你向它的 Analyst 用自然语言提问时模型会生成一段 SQL 去查数据——这段别人写的代码如果直接执行风险不小。Helix Foundry 专门用了一个名为Executor的独立服务来承接所有 DuckDB 作业通过进程级沙箱 数据库级配置锁死 SQL 白名单校验三层隔离让 AI 生成的 SQL 只能看见你允许它看见的那几张表。这篇文章带你完整读懂这套安全执行机制。先认识主角Executor 在整个系统里的位置在 compose.yaml 中Executor 是一个独立容器与appAPI、worker、helix等服务平级。API 收到任何需要跑 SQL的请求——自然语言问答、仪表盘查询、导入、管道构建——都会通过 HTTP 把作业投递给 Executor 的/execute接口客户端封装见 apps/api/src/executor.ts。Executor 收到作业后并不会在自身进程里执行而是为每个作业 fork 一个一次性的子进程来跑 DuckDB跑完无论成功、失败还是被杀就销毁整个环境。这个一次一弃的设计是后面所有隔离措施的地基。第一层隔离一次性子进程与受限环境 ️打开 services/executor/src/jobs.ts可以看到作业执行的核心函数run子进程隔离Executor 用spawn启动一个全新的 Node 进程来运行 services/executor/src/runner.ts该脚本从 stdin 读入作业 JSON调用引擎执行后把结果 JSON 写回 stdout。即使一段恶意 SQL 把 DuckDB 连接搞崩受害的也只是一个用完即弃的子进程Executor 主进程毫发无损。环境变量白名单子进程只拿到PATH、DATA_DIR、DUCKDB_MEMORY、EXECUTOR_SCRATCH等寥寥几个变量见 jobs.ts父进程里的密钥、凭证一律带不进去。输出熔断子进程 stdout 累计超过 10 MB 直接被SIGKILL防止SELECT 出一个宇宙式的大输出拖垮系统。超时即杀每个作业从进入队列的那一刻就开始计时超时后SIGKILL直接了断没有协商余地。此外Executor 自带一个小型任务调度器同一时刻最多 2 个 DuckDB 作业并行另有 50 个等待排队队列满了返回 429等待超时的作业返回 503jobs.ts。这种小批量 排队的策略让资源占用始终可预期。第二层隔离SQL 白名单——只许一条 SELECT 进程只是外壳真正锁住AI 生成 SQL 的是 services/executor/src/engine.ts 里的执行引擎。在拿到sql之后引擎做了三道检查engine.ts正则预检SQL 必须以SELECT或WITH开头任何DROP、DELETE、COPY、ATTACH开头的语句直接抛出Only a single SELECT query is allowed语句拆分校验用 DuckDB 的extractStatements真正解析 SQL确认它恰好只有 1 条语句——SELECT ...; DELETE ...这种夹带写法在这里无所遁形包一层子查询最终执行的是CREATE TABLE result AS SELECT * FROM (你的SQL) AS foundry_result结果被收进一个受控表。同时数据输入本身也是白名单制的只有job.inputs里声明的、且通过了safePart字符校验^[a-zA-Z0-9_-]{1,100}$engine.ts的数据集才会被从本地 Parquet 快照加载成内存表。也就是说沙箱里只装得进你主动声明的那几张表AI 的 SQL 就算想SELECT * FROM secrets也只会得到一个表不存在的错误。第三层隔离DuckDB 配置上锁 沙箱不只是少给数据还主动关掉了 DuckDB 的一票危险能力。引擎在每次建库时就写死了运行参数engine.ts配置值作用数据库:memory:内存库不落盘进程一死全清空memory_limit512 MBDUCKDB_MEMORY可调防止内存吃满threads2限制并行防止 CPU 占满allow_unsigned_extensionsfalse禁用未签名扩展SQL 无法加载外部插件autoinstall/autoload_known_extensionsfalse禁止任何自动安装/加载扩展在执行 SQL 之前引擎还会连续三条SET把沙箱彻底封死engine.tsSET allowed_paths [...]DuckDB 只能访问那一个指定的结果输出路径read_csv之类函数读不了机器上的任何其他文件SET enable_external_access false关闭一切外部访问httpfs、read_parquet(http://...)这类借道读远端文件的手法全部失效SET lock_configuration true锁定配置这是关键一手——AI 的 SQL 即使在语句里再写SET enable_external_access true试图自我解锁也会被 DuckDB 直接拒绝。沙箱规则只有引擎自己有权设置被执行的 SQL 没有这个权利。配合 compose 层面的容器加固compose.yaml——mem_limit: 2g内存上限、pids_limit: 128进程数上限、cap_drop: [ALL]丢弃全部 Linux 权限、no-new-privileges禁止提权加上 Executor 只挂在与外网断开的内部网络——整个执行链路形成闭环AI 生成的 SQL 没有文件系统越权、没有网络外联、没有提权路径、没有持久化能力超时会死超内存也会死。时间即资源两套超时如何兜底 ⏱️再严密的沙箱也需要时间预算。services/executor/src/limits.ts 定义了两档EXECUTOR_QUERY_TIMEOUT默认 120 秒面向有人在等答案的查询——仪表盘、自然语言提问EXECUTOR_JOB_TIMEOUT默认 900 秒面向整表读写的导入、管道、发布作业。注意计时起点是Executor 收到作业的时刻排队时间也一并计入一个在队列里耗光时间的作业会直接失败而不会迟到的爆发。API 侧读同一套配置并多等 15 秒REPLY_MARGIN保证永远能先收到 Executor 的答复而不是自己先超时。详细的运维说明见 docs/OPERATIONS.md 的Deployment limits一节。善后临时文件的自动清理 DuckDB 内存不够时会把数据溢出spill到磁盘Executor 为每个作业在DATA_DIR/scratch下开一个独立的临时目录作业结束——包括被超时杀死、被 OOM 杀死、容器停止等各种非正常结局——该目录都会被删除jobs.ts。Executor 启动时还会清扫上次异常退出遗留的作业目录jobs.ts所以scratch目录不会成为垃圾堆积地备份脚本也干脆把它整体排除在外。如何调整这些安全参数所有参数都在.env中配置留空即用默认值修改后重启容器即可生效参数默认含义DUCKDB_MEMORY512 MB单个作业的 DuckDB 内存上限DUCKDB_SPILL_LIMIT不限磁盘 90%单个作业溢出文件占用的磁盘上限如20GBEXECUTOR_RESULT_LIMIT2 GB发布查询结果行数写入的大小上限EXECUTOR_QUERY_TIMEOUT120查询类作业超时秒EXECUTOR_JOB_TIMEOUT900导入/管道/发布作业超时秒配置非法值比如2m时API、worker 和 Executor 会在启动阶段就拒绝启动并给出带参数名的错误信息而不是让每个作业都失败——这是一种fail fast的安全姿态limits.ts。总结三层沙箱各守一道门回看 Helix Foundry Executor 的设计它回答的其实是同一个问题AI 生成的 SQL 不可信怎么办进程层一次性子进程 环境变量白名单 超时 SIGKILL 并发限流崩溃和失控都被限制在最小爆炸半径内SQL 层只放行单条SELECT/WITH输入表白名单加载恶意意图根本没有执行面数据库层内存库 禁用扩展 allowed_paths 关闭外部访问 lock_configuration锁死配置让 SQL 在引擎内部也无法自救越狱。这种层层设防的本地优先架构让 Helix Foundry 敢把用自然语言查任意数据做成日常功能而你的数据始终只留在这台你自己的电脑上。如果你想继续深入可以从 services/executor/src/engine.ts 读起配合 docs/OPERATIONS.md 里关于部署限制与内存预算的章节完整理解每个默认值背后的取舍。赞分享【免费下载链接】helix-foundryYour companys data, connected into one ontology, on your own computer. A local-first data workspace built on HelixDB and DuckDB.项目地址https://gitcode.com/gh_mirrors/he/helix-foundry点击查看免费下载相关推荐5分钟快速上手PyMatting从零开始的图像抠图实战教程5分钟快速上手PyMatting从零开始的图像抠图实战教程 想要快速掌握专业的图像抠图技术吗PyMatting是一个强大的Python库专门用于alphaBotpress LLMz 安全沙箱全解析用 VM 隔离技术安全执行 LLM 生成代码Botpress LLMz 安全沙箱全解析用 VM 隔离技术安全执行 LLM 生成代码 LLMz 是 Botpress 开源仓库 packages/llmzAI 应用后端BetterDiscord安全沙箱设计VM模块如何隔离危险代码执行BetterDiscord安全沙箱设计VM模块如何隔离危险代码执行 安全沙箱架构概述 BetterDiscord通过多层隔离机制保障Discord客户端安全桌面应用UI组件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价 →
↑