Runno沙盒安全深度剖析为什么你的代码在浏览器中是安全的【免费下载链接】runnoSandboxed runtime for programming languages and WASI binaries. Works in the browser, on your server, or via MCP.项目地址: https://gitcode.com/gh_mirrors/ru/runno在当今的Web开发世界中直接在浏览器中运行代码已成为一种强大而便捷的功能。Runno作为一款创新的编程语言沙盒运行时让用户能够在浏览器中安全地执行Python、JavaScript、Ruby、C/C等多种语言的代码。但你是否曾担心过这些代码真的安全吗会不会损坏我的设备或窃取我的数据本文将深入剖析Runno的安全架构揭示它如何确保你的代码在浏览器中安全运行。️ 多层次安全架构Runno的防护盾Runno采用了一个精心设计的多层安全架构这个架构就像洋葱一样层层包裹每一层都提供了一道安全屏障。这种设计理念确保了即使某一层被突破还有其他层提供保护。第一层WebAssembly虚拟化隔离Runno的核心安全基础建立在WebAssemblyWASM技术之上。WebAssembly是一种可移植、体积小、加载快且安全的二进制格式专门设计用于在Web环境中执行代码。它提供了以下关键安全特性内存隔离WebAssembly运行在沙盒化的线性内存空间中与宿主JavaScript环境完全隔离指令验证所有WASM模块在加载时都会经过严格的验证确保不会执行恶意操作控制流完整性WebAssembly强制执行结构化控制流防止代码注入和跳转到任意位置在Runno的实现中所有编程语言运行时都被编译为WebAssembly模块这意味着它们无法直接访问宿主系统的资源。例如在packages/wasi/lib/wasi/wasi.ts中WASI类负责管理WebAssembly实例的初始化和执行确保所有系统调用都通过安全的接口进行。第二层WASI系统接口限制WASIWebAssembly System Interface是Runno安全架构的第二道防线。WASI定义了一套标准化的系统接口允许WebAssembly程序以受控的方式与外部环境交互。Runno实现了WASI preview1规范这意味着受限的文件系统访问程序只能访问预先定义的虚拟文件系统受控的进程间通信所有I/O操作都通过标准输入/输出流进行资源限制内存、CPU时间和文件描述符都有明确的限制在packages/wasi/lib/wasi/wasi-drive.ts中WASIDrive类实现了虚拟文件系统确保程序无法访问宿主系统的真实文件export class WASIDrive { fs: WASIFS; openMap: MapFileDescriptor, OpenFile | OpenDirectory new Map(); constructor(fs: WASIFS) { this.fs { ...fs }; // 预打开根目录但仅限于虚拟文件系统 this.openMap.set(3, new OpenDirectory(this.fs, /)); } }Runno沙盒架构的多层保护机制示意图 虚拟化环境代码的监狱完全虚拟化的文件系统Runno为每个执行环境提供了一个完全虚拟化的文件系统。这意味着隔离的文件存储每个沙盒实例都有自己的文件系统与其他实例和宿主系统隔离只读基础镜像运行时环境基于只读的基础文件系统镜像构建临时文件空间程序可以创建临时文件但这些文件在会话结束后会被自动清理在packages/sandbox/lib/runtime.ts中runFS函数展示了如何为每个执行创建独立的文件系统上下文export async function runFS( runtime: Runtime, entryPath: string, fs: WASIFS, options: { stdin?: string; timeout?: number; } {} ): PromiseRunResult { // 创建独立的文件系统环境 const fs: WASIFS { /program: { path: program, content: code, mode: string, timestamps: { access: new Date(), modification: new Date(), change: new Date(), }, }, }; }网络访问完全禁用Runno的沙盒环境完全禁止网络访问。这是通过WASI实现的因为Runno的WASI实现不提供任何网络相关的系统调用。这意味着无法发起HTTP请求无法建立Socket连接无法访问外部API完全的网络隔离这种设计确保了恶意代码无法从沙盒内部泄露数据或与外部服务器通信。Runno沙盒执行环境的可视化界面⏱️ 资源限制与超时控制执行时间限制Runno为所有代码执行设置了严格的超时限制。在packages/sandbox/lib/runtime.ts中可以看到超时控制的实现async function _startWASIWithLimits( binaryPath: string, context: PartialContext, limits: PartialLimits ): PromiseWASIExecutionResultWithLimits { if (limits.timeout) { const timeoutPromise: Promisetimeout new Promise((resolve) setTimeout(() resolve(timeout), limits.timeout! * 1000) ); result await Promise.race([workerHost.start(), timeoutPromise]); } if (result timeout) { workerHost.kill(); throw new TimeoutError(); } }内存使用限制WebAssembly本身提供了内存限制机制。Runno利用这一特性确保每个WebAssembly实例有固定的最大内存限制内存分配失败时会优雅地处理错误无法通过内存溢出攻击影响宿主系统 系统调用过滤与监控受限的系统调用接口Runno的WASI实现只暴露了一组有限的、安全的系统调用。在packages/wasi/lib/wasi/snapshot-preview1.ts中可以看到所有可用的系统调用都经过精心筛选文件操作仅限于虚拟文件系统内的操作进程控制仅限于获取环境变量和参数时间获取只读访问无法修改系统时间随机数生成使用安全的伪随机数生成器系统调用审计所有系统调用都经过审计和记录。这意味着如果出现异常行为Runno可以检测到非预期的系统调用模式记录所有安全相关事件在检测到可疑行为时终止执行Runno的MCP检查器可以监控系统调用和安全事件 代码验证与预处理输入验证在代码执行之前Runno会进行多层次的输入验证语法检查确保代码符合目标语言的语法规范大小限制限制代码和输入数据的大小字符集验证确保输入不包含恶意字符预处理步骤某些运行时需要预处理步骤。在packages/sandbox/lib/runtime.ts中headlessPrepareFS函数负责安全地准备执行环境export async function headlessPrepareFS( prepareCommands: Command[], fs: WASIFS, limits: PartialLimits {} ) { // 安全地执行预处理命令 for (const command of prepareCommands) { // 每个预处理步骤都在相同的安全环境中执行 const resultWithLimits await _startWASIWithLimits( binaryPath, { args: [command.binaryName, ...(command.args ?? [])], env: command.env, fs: prepare.fs, // ... }, limits ); // 检查退出代码确保预处理成功 if (resultWithLimits.result.exitCode ! 0) { throw new PrepareError(Prepare step returned a non-zero exit code, prepare); } } }️ 实际安全测试与验证自动化安全测试Runno包含一套完整的自动化测试套件用于验证安全特性。在packages/sandbox/__tests__/runtime/runtime.test.ts中可以看到各种安全测试it(should handle timeouts correctly, async () { const result await runCode(python, while True: pass, { timeout: 0.1, // 100毫秒超时 }); expect(result.resultType).toBe(timeout); });边界情况处理Runno专门处理了各种边界情况和潜在的攻击向量无限循环检测通过超时机制防止无限循环内存耗尽保护WebAssembly内存限制防止内存耗尽攻击递归深度限制防止栈溢出攻击文件系统边界确保程序无法跳出虚拟文件系统即使在浏览器中运行复杂的FFmpeg工具Runno也能确保安全隔离 跨域隔离与Worker隔离跨域隔离要求为了使用SharedArrayBuffer实现高效的进程间通信Runno要求页面启用跨域隔离。这通过以下HTTP头实现Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp这些头文件提供了额外的安全层防止跨站攻击。Web Worker隔离Runno在可能的情况下使用Web Worker来执行代码。这意味着主线程保护计算密集型任务不会阻塞主线程进程隔离每个执行环境都在独立的Worker中运行崩溃隔离如果一个Worker崩溃不会影响其他Worker或主页面在packages/sandbox/lib/host.ts中WASIWorkerHost类管理Worker的生命周期export class WASIWorkerHost { // 在独立的Worker中执行代码 private worker: Worker; constructor(binaryURL: string, context: PartialWASIContextOptions) { this.worker new Worker( new URL(./worker.js, import.meta.url), { type: module } ); } } 安全优势总结与传统沙盒的对比安全特性传统沙盒Runno沙盒内存隔离进程级隔离WebAssembly内存隔离文件系统访问受限的真实文件系统完全虚拟化文件系统网络访问可能受限完全禁止系统调用通过seccomp过滤通过WASI接口限制执行环境容器或虚拟机浏览器内WebAssemblyRunno的安全优势深度防御多层安全机制确保单一漏洞不会导致全面突破标准化接口基于WASI标准经过广泛的安全审查浏览器原生利用现代浏览器的安全特性透明可审计所有代码开源安全机制透明持续更新随着WebAssembly和WASI标准的发展而更新 最佳实践与使用建议安全配置建议启用跨域隔离确保你的应用正确设置COOP和COEP头设置合理的超时根据代码复杂度设置适当的执行时间限制限制资源使用控制内存和CPU使用量监控执行结果记录所有执行结果和安全事件开发人员注意事项始终验证用户输入的代码不要信任沙盒输出的敏感数据定期更新Runno依赖以获取安全修复在生产环境前进行充分的安全测试 未来安全增强Runno团队正在积极研究以下安全增强更细粒度的权限控制允许更精细地控制文件系统访问权限网络沙盒在受控环境中允许有限的网络访问硬件加速隔离利用WebAssembly的线程提案实现更好的性能隔离形式化验证对关键安全组件进行形式化验证结语Runno通过其多层安全架构、基于WebAssembly的虚拟化、WASI接口限制和严格的资源控制为在浏览器中运行代码提供了一个高度安全的环境。虽然没有任何系统是100%安全的但Runno的设计遵循了安全最佳实践并采用了深度防御策略。对于教育平台、代码演示、在线评测系统等需要安全执行用户代码的场景Runno提供了一个可靠且易于集成的解决方案。通过理解其安全机制并遵循最佳实践开发者可以放心地在自己的应用中集成Runno为用户提供安全可靠的代码执行环境。记住安全是一个持续的过程。Runno作为开源项目欢迎安全研究人员和开发者审查其代码、报告漏洞并贡献改进。只有这样我们才能共同构建更安全的Web编程环境。✨【免费下载链接】runnoSandboxed runtime for programming languages and WASI binaries. Works in the browser, on your server, or via MCP.项目地址: https://gitcode.com/gh_mirrors/ru/runno创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
Runno沙盒安全深度剖析:为什么你的代码在浏览器中是安全的
发布时间:2026/7/5 18:46:12
Runno沙盒安全深度剖析为什么你的代码在浏览器中是安全的【免费下载链接】runnoSandboxed runtime for programming languages and WASI binaries. Works in the browser, on your server, or via MCP.项目地址: https://gitcode.com/gh_mirrors/ru/runno在当今的Web开发世界中直接在浏览器中运行代码已成为一种强大而便捷的功能。Runno作为一款创新的编程语言沙盒运行时让用户能够在浏览器中安全地执行Python、JavaScript、Ruby、C/C等多种语言的代码。但你是否曾担心过这些代码真的安全吗会不会损坏我的设备或窃取我的数据本文将深入剖析Runno的安全架构揭示它如何确保你的代码在浏览器中安全运行。️ 多层次安全架构Runno的防护盾Runno采用了一个精心设计的多层安全架构这个架构就像洋葱一样层层包裹每一层都提供了一道安全屏障。这种设计理念确保了即使某一层被突破还有其他层提供保护。第一层WebAssembly虚拟化隔离Runno的核心安全基础建立在WebAssemblyWASM技术之上。WebAssembly是一种可移植、体积小、加载快且安全的二进制格式专门设计用于在Web环境中执行代码。它提供了以下关键安全特性内存隔离WebAssembly运行在沙盒化的线性内存空间中与宿主JavaScript环境完全隔离指令验证所有WASM模块在加载时都会经过严格的验证确保不会执行恶意操作控制流完整性WebAssembly强制执行结构化控制流防止代码注入和跳转到任意位置在Runno的实现中所有编程语言运行时都被编译为WebAssembly模块这意味着它们无法直接访问宿主系统的资源。例如在packages/wasi/lib/wasi/wasi.ts中WASI类负责管理WebAssembly实例的初始化和执行确保所有系统调用都通过安全的接口进行。第二层WASI系统接口限制WASIWebAssembly System Interface是Runno安全架构的第二道防线。WASI定义了一套标准化的系统接口允许WebAssembly程序以受控的方式与外部环境交互。Runno实现了WASI preview1规范这意味着受限的文件系统访问程序只能访问预先定义的虚拟文件系统受控的进程间通信所有I/O操作都通过标准输入/输出流进行资源限制内存、CPU时间和文件描述符都有明确的限制在packages/wasi/lib/wasi/wasi-drive.ts中WASIDrive类实现了虚拟文件系统确保程序无法访问宿主系统的真实文件export class WASIDrive { fs: WASIFS; openMap: MapFileDescriptor, OpenFile | OpenDirectory new Map(); constructor(fs: WASIFS) { this.fs { ...fs }; // 预打开根目录但仅限于虚拟文件系统 this.openMap.set(3, new OpenDirectory(this.fs, /)); } }Runno沙盒架构的多层保护机制示意图 虚拟化环境代码的监狱完全虚拟化的文件系统Runno为每个执行环境提供了一个完全虚拟化的文件系统。这意味着隔离的文件存储每个沙盒实例都有自己的文件系统与其他实例和宿主系统隔离只读基础镜像运行时环境基于只读的基础文件系统镜像构建临时文件空间程序可以创建临时文件但这些文件在会话结束后会被自动清理在packages/sandbox/lib/runtime.ts中runFS函数展示了如何为每个执行创建独立的文件系统上下文export async function runFS( runtime: Runtime, entryPath: string, fs: WASIFS, options: { stdin?: string; timeout?: number; } {} ): PromiseRunResult { // 创建独立的文件系统环境 const fs: WASIFS { /program: { path: program, content: code, mode: string, timestamps: { access: new Date(), modification: new Date(), change: new Date(), }, }, }; }网络访问完全禁用Runno的沙盒环境完全禁止网络访问。这是通过WASI实现的因为Runno的WASI实现不提供任何网络相关的系统调用。这意味着无法发起HTTP请求无法建立Socket连接无法访问外部API完全的网络隔离这种设计确保了恶意代码无法从沙盒内部泄露数据或与外部服务器通信。Runno沙盒执行环境的可视化界面⏱️ 资源限制与超时控制执行时间限制Runno为所有代码执行设置了严格的超时限制。在packages/sandbox/lib/runtime.ts中可以看到超时控制的实现async function _startWASIWithLimits( binaryPath: string, context: PartialContext, limits: PartialLimits ): PromiseWASIExecutionResultWithLimits { if (limits.timeout) { const timeoutPromise: Promisetimeout new Promise((resolve) setTimeout(() resolve(timeout), limits.timeout! * 1000) ); result await Promise.race([workerHost.start(), timeoutPromise]); } if (result timeout) { workerHost.kill(); throw new TimeoutError(); } }内存使用限制WebAssembly本身提供了内存限制机制。Runno利用这一特性确保每个WebAssembly实例有固定的最大内存限制内存分配失败时会优雅地处理错误无法通过内存溢出攻击影响宿主系统 系统调用过滤与监控受限的系统调用接口Runno的WASI实现只暴露了一组有限的、安全的系统调用。在packages/wasi/lib/wasi/snapshot-preview1.ts中可以看到所有可用的系统调用都经过精心筛选文件操作仅限于虚拟文件系统内的操作进程控制仅限于获取环境变量和参数时间获取只读访问无法修改系统时间随机数生成使用安全的伪随机数生成器系统调用审计所有系统调用都经过审计和记录。这意味着如果出现异常行为Runno可以检测到非预期的系统调用模式记录所有安全相关事件在检测到可疑行为时终止执行Runno的MCP检查器可以监控系统调用和安全事件 代码验证与预处理输入验证在代码执行之前Runno会进行多层次的输入验证语法检查确保代码符合目标语言的语法规范大小限制限制代码和输入数据的大小字符集验证确保输入不包含恶意字符预处理步骤某些运行时需要预处理步骤。在packages/sandbox/lib/runtime.ts中headlessPrepareFS函数负责安全地准备执行环境export async function headlessPrepareFS( prepareCommands: Command[], fs: WASIFS, limits: PartialLimits {} ) { // 安全地执行预处理命令 for (const command of prepareCommands) { // 每个预处理步骤都在相同的安全环境中执行 const resultWithLimits await _startWASIWithLimits( binaryPath, { args: [command.binaryName, ...(command.args ?? [])], env: command.env, fs: prepare.fs, // ... }, limits ); // 检查退出代码确保预处理成功 if (resultWithLimits.result.exitCode ! 0) { throw new PrepareError(Prepare step returned a non-zero exit code, prepare); } } }️ 实际安全测试与验证自动化安全测试Runno包含一套完整的自动化测试套件用于验证安全特性。在packages/sandbox/__tests__/runtime/runtime.test.ts中可以看到各种安全测试it(should handle timeouts correctly, async () { const result await runCode(python, while True: pass, { timeout: 0.1, // 100毫秒超时 }); expect(result.resultType).toBe(timeout); });边界情况处理Runno专门处理了各种边界情况和潜在的攻击向量无限循环检测通过超时机制防止无限循环内存耗尽保护WebAssembly内存限制防止内存耗尽攻击递归深度限制防止栈溢出攻击文件系统边界确保程序无法跳出虚拟文件系统即使在浏览器中运行复杂的FFmpeg工具Runno也能确保安全隔离 跨域隔离与Worker隔离跨域隔离要求为了使用SharedArrayBuffer实现高效的进程间通信Runno要求页面启用跨域隔离。这通过以下HTTP头实现Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp这些头文件提供了额外的安全层防止跨站攻击。Web Worker隔离Runno在可能的情况下使用Web Worker来执行代码。这意味着主线程保护计算密集型任务不会阻塞主线程进程隔离每个执行环境都在独立的Worker中运行崩溃隔离如果一个Worker崩溃不会影响其他Worker或主页面在packages/sandbox/lib/host.ts中WASIWorkerHost类管理Worker的生命周期export class WASIWorkerHost { // 在独立的Worker中执行代码 private worker: Worker; constructor(binaryURL: string, context: PartialWASIContextOptions) { this.worker new Worker( new URL(./worker.js, import.meta.url), { type: module } ); } } 安全优势总结与传统沙盒的对比安全特性传统沙盒Runno沙盒内存隔离进程级隔离WebAssembly内存隔离文件系统访问受限的真实文件系统完全虚拟化文件系统网络访问可能受限完全禁止系统调用通过seccomp过滤通过WASI接口限制执行环境容器或虚拟机浏览器内WebAssemblyRunno的安全优势深度防御多层安全机制确保单一漏洞不会导致全面突破标准化接口基于WASI标准经过广泛的安全审查浏览器原生利用现代浏览器的安全特性透明可审计所有代码开源安全机制透明持续更新随着WebAssembly和WASI标准的发展而更新 最佳实践与使用建议安全配置建议启用跨域隔离确保你的应用正确设置COOP和COEP头设置合理的超时根据代码复杂度设置适当的执行时间限制限制资源使用控制内存和CPU使用量监控执行结果记录所有执行结果和安全事件开发人员注意事项始终验证用户输入的代码不要信任沙盒输出的敏感数据定期更新Runno依赖以获取安全修复在生产环境前进行充分的安全测试 未来安全增强Runno团队正在积极研究以下安全增强更细粒度的权限控制允许更精细地控制文件系统访问权限网络沙盒在受控环境中允许有限的网络访问硬件加速隔离利用WebAssembly的线程提案实现更好的性能隔离形式化验证对关键安全组件进行形式化验证结语Runno通过其多层安全架构、基于WebAssembly的虚拟化、WASI接口限制和严格的资源控制为在浏览器中运行代码提供了一个高度安全的环境。虽然没有任何系统是100%安全的但Runno的设计遵循了安全最佳实践并采用了深度防御策略。对于教育平台、代码演示、在线评测系统等需要安全执行用户代码的场景Runno提供了一个可靠且易于集成的解决方案。通过理解其安全机制并遵循最佳实践开发者可以放心地在自己的应用中集成Runno为用户提供安全可靠的代码执行环境。记住安全是一个持续的过程。Runno作为开源项目欢迎安全研究人员和开发者审查其代码、报告漏洞并贡献改进。只有这样我们才能共同构建更安全的Web编程环境。✨【免费下载链接】runnoSandboxed runtime for programming languages and WASI binaries. Works in the browser, on your server, or via MCP.项目地址: https://gitcode.com/gh_mirrors/ru/runno创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考