跳转至

Node.js 单可执行应用程序

REA 通过 inspect-artifact / inspect_artifact 对注入的 Node.js SEA blob 进行清点,并通过 extract-artifact / extract_artifact 物化其内容。它绝不运行应用程序,也不会反序列化 V8 快照或代码缓存。

rea inspect-artifact ./application --json
rea inspect-artifact ./application --detail summary --evidence_output evidence.json --json
rea extract-artifact ./application --json

对于 MCP,使用 open_binary 打开载体,然后调用 inspect_artifact。摘要交付会保留完整的 Evidence:可将 parent_evidence_id 与 inspect_analysis_view 结合使用,以请求特定的清点路径和字段。提取会返回一个新的 output_root;使用 analyze_javascript_application 分析该提取出的目录。仅包含快照的应用程序没有恢复的主脚本,也不会收到 JavaScript 后续探测。逻辑路径缺少 JavaScript 源文件后缀的主脚本(例如 main)同样不会收到探测,因为分析器会按后缀选择提取出的文件。

识别与证据

容器格式为 node-sea。REA 在 NODE_SEA 或 __NODE_SEA 中定位名为 __NODE_SEA_BLOB 的 Mach-O 节,定位由 NODE_SEA_BLOB 拥有的 ELF note,以及名为 NODE_SEA_BLOB 的 PE RCDATA 资源。PE 资源位置来自共享的 PE 资源解析器。ELF 程序头 PT_NOTE 段是权威的,与运行时一致;仅当程序头表不可读时,才会读取 SHT_NOTE 节,因为注入器可能会留下过期的节条目。没有 NODE_SEA_BLOB 资源名的 PE 将交由原生分类处理。具有不同 slice blob 的通用 Mach-O 载体因不明确而被拒绝;相同的 blob 只清点一次。原生载体字节保留其内容哈希和原生分类,而根出现项代表 SEA 容器。

根 format_metadata 保留原始标志、解码标志、代码路径、blob 位置、exec 参数和 fuse 观察结果。主脚本和资源子项在 source_path 中保留其角色和确切声明的名称。经过共享的 NFC 路径规范化后,安全且不冲突的名称会成为逻辑路径。作为相对路径不安全、与另一条目存在完全或文件前缀冲突、或占用保留的 __node_sea__ 命名空间的名称,会获得确定性的逻辑路径:主 CommonJS 源代码使用 __node_sea__/main.cjs,资源使用 __node_sea__/assets/<ordinal>,其中 <ordinal> 是它们在 blob 中从零开始的顺序。原始声明的名称保留在 source_path 中,包括空的资源键。快照和代码缓存使用 __node_sea__/snapshot 和 __node_sea__/code-cache。提取通过共享的路径包含和冲突规则物化逻辑路径,并且绝不会覆盖现有文件。

fuse 扫描会独立记录 set、unset、absent 或 conflicting。当 blob 存在但 fuse 为 unset 时,会报告为一项限制。这些是静态哨兵观察结果,而非运行时激活的证据:脚本或资源字节中类似哨兵的文本也会参与扫描。

支持的布局与限制

解码器遵循 Node v24.10.0 node_sea.cc 和 node_sea.h 中的 64 位小端布局,包括 exec 参数扩展字节。不支持没有该字节的旧布局、32 位长度字段、大端 blob 以及未来的标志。载体字节序与 blob 字节序相互独立。

格式错误的魔数、截断、未知标志/扩展、无效的 UTF-8、重复的原始资源键以及冲突的 blob 声明都会以明确的命名原因失败关闭(fail closed)。完整 blob 之后的零填充是允许的。blob 读取上限为 256 MiB;PE 载体还使用共享的 512 MiB 输入、65,536 个目录项和 8 MiB 资源元数据上限。解码器最多接受 100,000 个资源,其名称总计不超过 8 MiB;最多接受 4,096 个 exec 参数,其文本总计不超过 1 MiB。这些是固定的资源界限,而非 Node 格式限制;它们会在解码名称或创建记录之前进行检查。一旦命中,将作为限制失败,且没有运行时覆盖。资源与参数解码、填充扫描和清点构建会以有界批次让出(yield),并尊重调用方的取消请求。资源数量和名称预算会独立于存储的成员体大小来限制保留的元数据。PE 名称探测会从载体的前 64 KiB 读取头部;如果 PE 的头部延伸超出该范围,则交由原生分类处理。快照和代码缓存字节保持不透明。

验证

合成测试夹具覆盖了 Mach-O、ELF 和 PE 的清点/提取、畸形 blob、冲突以及 fuse 矛盾。CLI 和 MCP 测试会演练相同的工件提供程序(artifact provider)和对外宣称的 schema。一条 CLI 回归测试还会使用固定的本地 Node 版本、绝对主路径和空资源键生成一个 blob,然后在合成 ELF 载体中对其进行清点。这验证的是真实的 blob 生成器,而非真实注入的可执行文件。

可选的真实 ELF 通道使用 Docker 官方 Node v24.10.0 镜像和固定的 postject 来构建测试夹具,然后验证清点结果以及提取出的脚本/资源字节,而无需运行注入的应用程序:

npm run verify:node-sea

这需要 Docker 和网络访问权限,以获取生成器镜像和 postject。它会创建并删除自己的临时测试夹具目录。真实的 macOS Mach-O 或 Windows PE 运行属于单独的覆盖范围;合成载体并不能确立真实平台验证。本文不声称任何性能改进;整个任务的 token 数、CPU、内存以及冷/热计时均未进行测量。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea