十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DeepSeek Harness 沙箱基石:landlock-run 自限制启动器的设计与接入实战

DeepSeek Harness 沙箱基石:landlock-run 自限制启动器的设计与接入实战 人工智能AI AgentAgent 框架DeepSeek【免费下载链接】deepseek-harnessDeepSeek Harness: Everything is a Plugin.项目地址https://gitcode.com/gh_mirrors/de/deepseek-harness点击查看免费下载本指南系统讲解 DeepSeek Harness 仓库中 native/landlock-run 子项目——一个基于 Linux Landlock 的 self-restrict-then-exec 子进程隔离启动器。它面向需要在文件系统白名单下运行不可信命令、同时自身不受限制的 Agent harness 与沙箱宿主以约 300 行静态链接 C11 实现并以「入口包 按平台预编译包」的 npm 形式分发。读完本文你将掌握它的安装方式、JS 侧 API 用法、完整 CLI 契约argv 文法、退出码、报告行、底层 Landlock 原理以及它在当前仓库中的打包、测试与发布模型。项目定位机制归仓库策略归消费者landlock-run 是 DeepSeek Harness 沙箱能力的一条关键底座。按 architecture.md 的表述本仓库拥有的是隔离机制mechanism而非策略policy由消费者agent harness、sandbox 能力模块决定一次运行可读/可写哪些路径由本包族提供强制这些授权的启动器以及解析它、与它对话的 JavaScript API。它的设计动机在 main.c 头部注释中写得很直白在bwrap不可用的 Linux 主机上未安装、非特权用户命名空间被禁用、或 LSM 配置禁止 mountLandlock 是一族独立系统调用不需要上述任何前提。启动器先在自身上安装 Landlock 规则集再exec被包裹的命令由于规则集会随execve继承命令及其派生的每个进程都处于受限状态而调用方进程保持不受限。整个项目遵循fail-closed失败即关闭原则内核无法执行强制时启动器直接退出且不运行被包裹的命令绝不在无隔离状态下执行。安装与发布形态入口包 按平台预编译包通过 npm 安装入口包npm install deepseek-ai/node-addon-landlock-run发布包族采用「入口包 平台可选包」的 esbuild 式布局deepseek-ai/node-addon-landlock-run deepseek-ai/node-addon-landlock-run-linux-x64 deepseek-ai/node-addon-landlock-run-linux-arm64两层包的分工见 architecture.md 与 packaging.md入口包纯 ESM JavaScript拥有 CLI 契约——路径解析launcherPath、功能探测probe、授权 argv 构造grantArgs与契约常量随包附带 C 源码便于审计把每个平台包声明为optionalDependency。平台包bin/下只含一个预编译静态二进制与声明它的prebuilds.json没有任何 JavaScript 可导入。npm 的os/cpu字段让安装器只拉取匹配的平台包入口包把平台包解析为文件路径。值得强调的刻意设计无安装期编译回退入口包没有 install 脚本绝不在消费者主机上编译。因为编译回退会要求处处具备 musl 工具链把一个干净利落的 fail-closed 降级变成依赖环境的「也许」。scripts/verify-packed-install.mjs会检查并强制禁止安装生命周期脚本。无共享 loader 包平台包没有可加载的东西不需要共享 JS。无 libc 字段二进制静态链接 muslglibc 与 musl 发行版通用因此package.json刻意不声明libc。快速上手JS API 三件套入口包暴露的 API 刻意保持最小核心用法如下取自 README.md 的示例import { grantArgs, launcherPath, probe } from deepseek-ai/node-addon-landlock-run; const launcher launcherPath(); if (probe(launcher) ! unusable) { const argv [launcher, ...grantArgs({ readOnly: [/], readWrite: [/tmp/work] }), --, bash, -c, command]; // spawn argv with your process runner of choice }三个函数分别对应 index.ts 中的实现API行为与语义launcherPath()返回本机启动器的绝对路径按deepseek-ai/node-addon-landlock-run-platform-arch解析到package/bin/landlock-run。刻意不检查文件是否存在——可用性信号统一交给probe。平台包不可解析时平台不支持、或安装时跳过了可选依赖返回一个指向本包node_modules内的确定性 fallback 路径该路径永远不存在。probe(launcher?, { timeoutMs? })功能探测返回full \| partial \| unusable。通过spawnSync执行landlock-run --probe默认超时 2000ms非零退出映射为unusablestdout 含partially enforced映射为partial否则为full。同步设计消费者运行一次并缓存结论。grantArgs({ readOnly?, readWrite? })构造启动器授权 argv--ro path排在先、--rw path排在后按调用者顺序未授予的一切默认拒绝。代码注释揭示了两个刻意的不变量不读环境变量——哪个二进制来隔离进程绝不能由环境变量决定测试注入通过函数参数完成。缺失二进制与不强制内核刻意不可区分——两者都探测为unusable消费者只有一条降级路径而不是两条。CLI 契约argv 文法、退出码与报告行启动器的外部可观察行为被 cli-contract.md 完整钉死——这是二进制与每个消费者之间的跨仓库兼容面。CLI 解析是手写的main.c 中parse函数注释直言四个 flag 不值得引入解析库。调用文法landlock-run [--ro path]... [--rw path]... -- argv... landlock-run --probe--ro path授予路径之下读 执行权限。--rw path授予路径之下完整文件系统访问协商后内核 ABI 能管辖的一切访问。一切未授予的均被拒绝——Landlock 规则集是白名单。对非目录的授权只保留文件兼容的访问位——这正是--rw /dev/null授权能工作的方式见下文add_rule的位掩码裁剪。--是强制分隔符其后全部是命令 argv经execvp执行环境原样保留。--probe与授权、命令互斥无其他 flag、无环境变量输入。退出码125LAUNCHER_FAILURE_EXIT所有启动器级失败——用法错误、内核无法执行 Landlock、授权根目录打不开、exec 失败。此时被包裹命令未运行。成功exec后子进程的每个退出状态原样透传包括 125。因此消费者判断启动器失败必须同时满足「状态 125」和一条landlock-run:致命报告行。--probe内核能执行完全或部分时返回 0否则 125。报告行探测成功恰好输出一行 stdoutlandlock: fully enforced或landlock: partially enforced (older ABI)入口包probe()据此映射为full/partial非零探测退出映射为unusable。部分 ABI 内核下的受限运行输出一行 stderrlandlock-run: partial enforcement (older Landlock ABI)后继续——凡是内核支持的访问仍全部受限。每个致命错误在退出 125 前输出一行以landlock-run:为前缀的 stderr。底层原理C11 直写 Landlock UAPImain.c 是仅约 300 行的 C11静态链接 musl除 libc 外不依赖任何库——整个审计面就是这一个文件加上内核稳定的系统调用契约。几个值得细读的实现要点自包含 UAPI 定义。内核用户空间 ABI 按契约稳定文件直接局部定义landlock_ruleset_attr、landlock_path_beneath_attr该结构在头文件中是 packed 的因此这里也必须__attribute__((packed))使构建不受工具链头文件版本影响同时这组定义本身就是「此启动器接触了哪些内核 API」的审计记录。宏MAX_ABI 5L表示本构建已知的最新 ABI。访问位按 ABI 分组。文件系统访问位被注释标注引入版本ABI 1 引入 execute/write_file/read_file/read_dir/remove/make_* 共 13 位LL_ABI1_MASKABI 2 加REFERABI 3 加TRUNCATEABI 4 仅增加 TCP 位ABI 5 加IOCTL_DEV。fs_mask_for_abi()按协商后的 ABI 裁剪规则集规模。ABI 协商与 fail-closed。restrict_self()先调用landlock_create_rulesetversion 参数探测内核 ABI返回ENOSYS内核未编译 Landlock或EOPNOTSUPP编译但被禁用都输出landlock is not enforced by this kernel并失败关闭。协商结果低于MAX_ABI时置partial标志但规则集照常按内核支持的最大能力安装。白名单与位掩码裁剪。add_rule()用open(path, O_PATH | O_CLOEXEC)打开授权根若打不开——比如授权路径不存在——直接失败关闭注释解释静默收窄授权集是安全的但带着调用方没拿到的东西运行不值得这种歧义。随后fstat判断非目录时把访问位裁剪为文件兼容位EXECUTE | WRITE_FILE | READ_FILE | TRUNCATE | IOCTL_DEV否则内核会因目录专用访问位而返回EINVAL。no_new_privs 继承语义。安装规则集前先prctl(PR_SET_NO_NEW_PRIVS, 1)——这是非特权 restrict 的前提同时中和沙箱内的 setuid/setgid 提权。随后landlock_restrict_self把规则集装到当前线程进程execvp后规则集随execve继承给命令及其全部后代进程。功能探测而非版本探测。--probe分支在一个短命子进程里真实构建并强制一个最大规则集以/为只读根因为纯版本检查会漏掉有系统调用但拒绝强制的内核——只有真正 restrict 自己才是诚实的信号。平台支持矩阵与刻意不支持按 support-matrix.md平台包构建者builder of record说明...-linux-x64ubuntu-24.04静态 musl——glibc 与 musl 发行版通用...-linux-arm64ubuntu-24.04-arm静态 musl——glibc 与 musl 发行版通用强制的先决条件是启用 Landlock 的内核5.13协商到的 ABI 级别决定探测结论本构建已知的每个访问都被管辖 →full旧 ABI 只管辖子集 →partial仍为其支持的一切受限Landlock 缺失或被禁用 →unusable启动器完全拒绝运行命令。权威是探测而非内核版本一个未编译 Landlock、或 LSM 被禁用的内核无论版本号多少都探测为unusable。刻意不支持darwinmacOS 消费者通常用随系统自带的sandbox-exec/Seatbelt没有可分发二进制、win32Windows 隔离启动器属于另一个机制、另一个仓库而非本项目的移植、以及其他 Linux 架构riscv64、s390x……——尚无原生 CI 构建者「无交叉工具链」规则意味着平台包只能与能构建并验证它的原生 runner 一起新增。不支持平台上的消费者解析到不存在的启动器路径、探测为unusable并失败关闭——这正是文档记载的降级路径。开发、测试与发布流程本地开发corepack enable pnpm install pnpm build:ts # 入口包 → lib/ pnpm build:native # 本 Linux 架构的二进制需 apt-get install musl-tools pnpm test二进制被 git 忽略按架构原生构建——本地构建给自己机器用CI 的各架构 runner 是正式构建者。测试覆盖entry.test.js 是免密钥测试任何主机可跑、不需要内核或真实二进制断言契约常量、grantArgs的 flag 拼写与顺序、launcherPath的解析契约平台包 → fallback且 fallback 必须是绝对路径、以及通过假启动器shell 脚本验证probe三态解析——包括用 200ms 超时验证挂起启动器探测为unusable。此外还有面向真实二进制的 launcher 测试。发布模型版本号在 workspace 根与三个公开包间共享release.mdpnpm --dir native/landlock-run release:bump patch # 或 minor / major / x.y.z pnpm --dir native/landlock-run release:commit patch # 一次完成 bump stage commit git tag landlock-run-vX.Y.Z发布严格从最终打包的 tarball 进行按publish-order.txt的顺序平台包先于依赖它们的入口包。两个关键细节平台包 tarball 用npm pack入口包用pnpm pack——刻意拆分因为 pnpm pack 会归一化文件权限、剥掉可执行位那样会发布一个无人能 spawn 的启动器平台包无依赖、不需要 pnpm 的 workspace 协议转换入口包则需要且不携带可执行文件。packaging.md 强调绝不要用 pnpm 手工打包平台包。三道发布门禁平台包 prepack 检查声明的每个二进制存在、可执行、ELFe_machine匹配声明的cpu入口包 prepack 检查lib/已构建verify-packed-install.mjs从打包 tarball 彩排消费者路径——载荷检查、一次性安装、安装后二进制的字节级钉住、可执行性检查、以及经由已安装启动器的真实隔离 world-proof。与 DeepSeek Harness 的协作边界最后回到它在整个仓库中的位置landlock-run 提供的是「文件系统白名单下运行不可信命令」这个隔离楔子rung策略由上层沙箱能力决定。它刻意保持零环境变量输入、单一一等可用性信号probe、以及处处失败关闭的降级路径让上层消费者拿到三种明确的状态full/partial/unusable来定义自己的模式词汇表。对任何需要在 Linux 上以允许清单方式约束子进程文件访问、又不希望自身受束缚的 Agent harness 而言这套「机制与策略分离 探测即真相 白名单即默认拒绝」的组合即是它的核心工程价值。赞分享人工智能AI AgentAgent 框架DeepSeek【免费下载链接】deepseek-harnessDeepSeek Harness: Everything is a Plugin.项目地址https://gitcode.com/gh_mirrors/de/deepseek-harness点击查看免费下载相关推荐traffic-levels-image-classification核心功能揭秘低/中/高/无交通状态智能识别traffic levels image classification核心功能揭秘低/中/高/无交通状态智能识别 traffic levels image c人工智能AI AgentAgent 框架DeepSeekdocker-ddns API详解轻松配置路由器与DDNS客户端的完整指南docker ddns API详解轻松配置路由器与DDNS客户端的完整指南 docker ddns是一个基于Docker、Go和Bind9的动态DNS解决方案人工智能AI AgentAgent 框架DeepSeekVisual-Regression-Tracker高级技巧如何使用忽略区域功能排除无关UI差异Visual Regression Tracker高级技巧如何使用忽略区域功能排除无关UI差异 Visual Regression Tracker是一款通过图人工智能AI AgentAgent 框架DeepSeek上一篇Apache RocketMQ Controller 模式设计详解基于 DLedger 的自动主从切换架构下一篇CUSE设备开发终极指南字符设备用户空间实现详解创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表