资讯动态

RustPython 沙箱边界重构:以 `rustpython-host_env` crate 隔离宿主机系统调用

发布时间:2026/9/13 6:25:54 来源:尧图企业网站定制
RustPython 沙箱边界重构以rustpython-host_envcrate 隔离宿主机系统调用【免费下载链接】RustPythonA Python Interpreter written in Rust项目地址: https://gitcode.com/GitHub_Trending/ru/RustPythonRustPython 通过host_env特性标志控制对宿主操作系统的访问权限但#[cfg(feature host_env)]散布在数百处代码中一旦遗漏某个cfg宿主代码就会悄悄泄漏进沙箱构建。本文以仓库中的 host_env_proposal.md 为骨架完整讲解「把宿主 OS API 封装独立成 crate让 crate 边界本身成为沙箱保证」的迁移方案包括零 Python 运行时依赖的约束、从common与vm/stdlib抽取宿主函数的五个阶段、五层 lint 强制体系与风险评估并结合当前仓库源码验证该提案的实际落地状态。读完你将掌握 RustPython 沙箱化构建的完整技术路线与可复用的 crate 边界隔离方法论。一、背景与问题cfg遗漏导致的宿主代码泄漏RustPython 对宿主操作系统访问的控制完全依赖host_env特性标志。项目通过#[cfg(feature host_env)]来隔离所有涉及真实文件系统、进程、网络、环境变量的代码路径但这一机制存在结构性弱点这些cfg属性被零散地分布在数百个位置。只要有一处cfg被遗忘宿主代码就会在没有任何报错的情况下静默泄漏进沙箱构建sandbox build。这种「靠人肉保证每个点都写对」的方式在大型代码库中极易失效——新增一行std::fs::read或std::env::var调用而忘记加cfg编译器不会给出任何提示沙箱的隔离边界就被悄悄突破了。host_env_proposal.md给出的核心解法非常直接通过把宿主 OS API 封装独立成一个专门的 cratecrate 边界本身就成为了沙箱保证。Rust 的模块系统天然保证一个 crate 若没有在[dependencies]中声明依赖rustpython-host_env它在物理上就无法调用任何宿主函数——这是编译期即可验证、无法绕过的约束。相比散落的cfg这是一个「结构性」而非「纪律性」的保证。二、核心约束宿主层零 Python 运行时依赖提案为新 crate 设定了一条硬性约束该 crate零 Python 运行时依赖zero Python runtime dependency。所有 Python 层级的绑定必须由调用方vm/stdlib自行添加。这意味着rustpython-host_env只包含纯粹的宿主系统调用封装它不知道PyObject、PyResult、虚拟机状态是什么只提供基于std::os、libc、nix、windows-sys的底层能力。Python 绑定层如#[pyfunction]、#[pyattr]继续留在vm和stdlib中由它们调用host_env完成真正的系统操作。2.1 已在crates/common中的零 Python 宿主抽象提案首先盘点了一批已经是纯宿主、不含 Python 绑定的模块它们位于crates/common/src/下是第一阶段迁移的现成对象文件内容os.rserrno 处理、exit_code、winerror_to_errno、OsStr ffi 转换crt_fd.rsCRT 文件描述符抽象Owned/Borrowed 类型open/read/write/closefileutils.rsfstat、fopen、Windows StatStructwindows.rsToWideString、FromWideString traitmacros.rssuppress_iph!宏MSVC 无效参数处理器抑制2.2 混在 vm/stdlib 中的纯宿主函数另一批宿主代码是纯宿主 API 调用与 Python 绑定混杂在同一文件中需要从中抽取纯宿主部分。提案给出了精确的行级盘点vm/src/stdlib/posix.rs2908 行set_inheritable(fd, inheritable)— 纯 nix fcntl 封装getgroups_impl()— 纯 libc/nix 封装get_right_permission()、get_permissions()— 纯权限逻辑400 个 libc 常量再导出#[pyattr] use libc::*vm/src/stdlib/nt.rs2301 行win32_hchmod()、win32_lchmod()、fchmod_impl()— 纯 Windows API 调用当前返回 PyResult应改为 io::ResultSpawn 模式常量、O_*标志vm/src/stdlib/_signal.rs729 行timeval_to_double()、double_to_timeval()、itimerval_to_tuple()— 纯数学转换30 个信号/定时器常量vm/src/stdlib/time.rs1616 行asctime_from_tm()— 纯字符串格式化get_tz_info()— 纯 Windows API时间单位常量SEC_TO_MS、MS_TO_US等duration_since_system_now()— 宿主时钟访问当前接收 vm 参数可改为返回 io::Resultvm/src/stdlib/msvcrt.rsgetch()、getwch()、getche()、getwche()、kbhit()、setmode_binary()— 全部为纯宿主调用锁常量LK_UNLCK、LK_LOCK等vm/src/stdlib/_winapi.rs2180 行GetACP()、GetCurrentProcess()、GetLastError()、GetVersion()— 纯宿主100 个 Windows API 常量vm/src/stdlib/os.rs2395 行fs_metadata()— 纯std::fs封装libc 标志常量O_APPEND、O_CREAT等这些文件的共同特征宿主调用部分与 Python 绑定部分交织但宿主部分彼此独立、不依赖任何 Python 类型具备整体抽取到host_env的可行性。三、目标依赖图common与host_env完全独立重构后的 crate 依赖关系如下rustpython-host_env (新建 — 零 Python 依赖与 common 相互独立) ├── Dependencies: libc, nix (unix), windows-sys (win), widestring (win), rustpython-wtf8 ├── From common: os, crt_fd, fileutils, windows, macros └── Extracted from vm/stdlib: posix, nt, signal, time, msvcrt, winapi, socket, mmap, ... rustpython-common (无 host_env 依赖 — 仅纯算法代码) └── cformat, float_ops, hash, int, str, encodings 等 rustpython-vm ├── rustpython-common ├── rustpython-host_env (可选feature host_env) ├── libc (保留用于 #[pyattr] 内联使用的类型定义与常量) └── Python 绑定通过调用 host_env 完成真实 OS 操作 rustpython-stdlib ├── rustpython-vm, rustpython-common ├── rustpython-host_env (可选feature host_env) └── libc, nix, socket2, memmap2 (暂时保留 — 未来的迁移目标)需要特别强调的是依赖图最下方的结论common和host_env完全独立——两个方向都不存在依赖关系。这意味着common可以保持纯算法性质字符串、哈希、整数、编码等与任何宿主概念解耦host_env则独占所有系统调用。两者互不引用各自可以独立演进也为后续#![no_std]化铺平了道路。四、Phase 1创建 crate 并迁移common模块第一阶段的目标是新建crates/host_env/把common中的宿主模块搬过去并在common中改为再导出。4.1 新 crate 的 Cargo.toml[package] name rustpython-host_env description Host OS API abstractions for RustPython (zero Python dependency) version.workspace true edition.workspace true [dependencies] rustpython-wtf8 { workspace true } libc { workspace true } num-traits { workspace true } cfg-if { workspace true } [target.cfg(unix).dependencies] nix { workspace true } [target.cfg(windows).dependencies] widestring { workspace true } windows-sys { workspace true, features [ Win32_Foundation, Win32_Globalization, Win32_Networking_WinSock, Win32_Storage_FileSystem, Win32_System_Console, Win32_System_Ioctl, Win32_System_LibraryLoader, Win32_System_SystemServices, Win32_System_Time, ] }几个值得注意的设计细节rustpython-wtf8是唯一保留的 rustpython 内部依赖用于 OsStr/WTF-8 相关转换平台相关依赖通过[target.cfg(...).dependencies]精确隔离——nix只进 unix 构建widestring/windows-sys只进 windows 构建windows-sys的 feature 列表按需裁剪只开启实际用到的 Win32 API 子集。4.2 新 crate 的 lib.rs#[macro_use] mod macros; pub use macros::*; pub mod os; #[cfg(any(unix, windows, target_os wasi))] pub mod crt_fd; #[cfg(any(not(target_arch wasm32), target_os wasi))] pub mod fileutils; #[cfg(windows)] pub mod windows; // 新模块 — 从 vm/stdlib 抽取Phase 2 #[cfg(unix)] pub mod posix; #[cfg(windows)] pub mod nt; pub mod signal; pub mod time; #[cfg(windows)] pub mod msvcrt; #[cfg(windows)] pub mod winapi;模块声明全部带cfg平台门控wasm32 等受限平台会自动排除对应模块。从common迁入的模块os.rs、crt_fd.rs、fileutils.rs、windows.rs、macros.rs。4.3 周边文件的同步修改工作区根Cargo.toml在[workspace.members]中加入crates/host_env在[workspace.dependencies]中加入rustpython-host_env { path crates/host_env }。crates/common/Cargo.toml从直接依赖中移除nix、windows-sys、widestring保留libcstr.rs中仍需要wchar_t类型定义不添加任何host_envfeature 或依赖——common保持纯算法性质。crates/common/src/lib.rs移除pub mod os、pub mod crt_fd、pub mod fileutils、pub mod windows声明移除#[macro_use] mod macros与suppress_iph!宏迁至 host_env删除源文件os.rs、crt_fd.rs、fileutils.rs、windows.rs、macros.rs。crates/vm/Cargo.toml[features] host_env [rustpython-host_env] [dependencies] rustpython-host_env { workspace true, optional true }crates/stdlib/Cargo.toml[features] host_env [rustpython-vm/host_env, rustpython-host_env] [dependencies] rustpython-host_env { workspace true, optional true }4.4 阶段验证命令cargo check -p rustpython-host_env cargo test cargo check -p rustpython-vm --no-default-features --features compiler,gc # sandbox build其中第三条命令专门用于验证不带host_envfeature 的沙箱构建是否依然成立——这正是整个方案要守护的目标。五、Phase 2从 vm/stdlib 抽取纯宿主函数第二阶段把 vm 的 stdlib 模块中的纯宿主函数与常量抽入host_env的新模块并给出每个模块的目标函数签名。posix.rs— 从vm/src/stdlib/posix.rs抽取use std::os::fd::BorrowedFd; pub fn set_inheritable(fd: BorrowedFd_, inheritable: bool) - nix::Result() { use nix::fcntl; let flags fcntl::FdFlag::from_bits_truncate(fcntl::fcntl(fd, fcntl::FcntlArg::F_GETFD)?); let mut new_flags flags; new_flags.set(fcntl::FdFlag::FD_CLOEXEC, !inheritable); if flags ! new_flags { fcntl::fcntl(fd, fcntl::FcntlArg::F_SETFD(new_flags))?; } Ok(()) } pub fn getgroups() - nix::ResultVecnix::unistd::Gid { ... } pub fn get_right_permission(mode: u32, file_owner: Uid, file_group: Gid) - nix::ResultPermissions { ... }nt.rs— 从vm/src/stdlib/nt.rs抽取pub fn win32_hchmod(handle: HANDLE, mode: u32) - io::Result() { ... } pub fn win32_lchmod(path: OsStr, mode: u32) - io::Result() { ... }signal.rs— 从vm/src/stdlib/_signal.rs抽取pub fn timeval_to_double(tv: libc::timeval) - f64 { ... } pub fn double_to_timeval(val: f64) - libc::timeval { ... } pub fn itimerval_to_tuple(it: libc::itimerval) - (f64, f64) { ... }time.rs— 从vm/src/stdlib/time.rs抽取pub const SEC_TO_MS: i64 1000; pub const MS_TO_US: i64 1000; // ... pub fn asctime_from_tm(tm: libc::tm) - String { ... } pub fn duration_since_system_now() - io::ResultDuration { ... } #[cfg(windows)] pub fn get_tz_info() - TIME_ZONE_INFORMATION { ... }msvcrt.rs— 从vm/src/stdlib/msvcrt.rs抽取pub fn getch() - Vecu8 { ... } pub fn getwch() - String { ... } pub fn kbhit() - i32 { ... } pub fn setmode_binary(fd: crt_fd::Borrowed_) { ... } pub const LK_UNLCK: i32 0; pub const LK_LOCK: i32 1; // ...winapi.rs— 从vm/src/stdlib/_winapi.rs抽取pub fn get_acp() - u32 { ... } pub fn get_current_process() - HANDLE { ... } pub fn get_last_error() - u32 { ... } pub fn get_version() - u32 { ... } // Windows API 常量5.1 vm/stdlib 侧的统一替换模式抽取之后vm/stdlib 侧的文件统一改为「从 host_env 再导出」消除宿主调用内联// BEFORE (vm/src/stdlib/posix.rs) pub fn set_inheritable(fd: BorrowedFd_, inheritable: bool) - nix::Result() { use nix::fcntl; // ... 10 lines of nix API calls } // AFTER (vm/src/stdlib/posix.rs) pub use rustpython_host_env::posix::set_inheritable;这种「再导出re-export」模式的好处是对外部调用方Python 绑定层的 API 形状完全不变迁移成本集中在一次 import 替换行为零改变。六、Phase 3vm/stdlib 导入迁移第三阶段是全局的 import 迁移所有common::os、common::crt_fd、common::fileutils、common::windows引用统一改为rustpython_host_env::。提案给出了逐文件的迁移清单。6.1 vm 侧迁移目标约 20 个文件文件当前引用新引用ospath.rsrustpython_common::crt_fdrustpython_host_env::crt_fdstdlib/os.rscommon::crt_fd、common::os::*rustpython_host_env::stdlib/nt.rscommon::windows::*、common::crt_fd::*rustpython_host_env::stdlib/_io.rscommon::crt_fd::Offset、common::fileutils::fstatrustpython_host_env::stdlib/_signal.rscommon::crt_fd::*、common::fileutils::fstatrustpython_host_env::stdlib/posix.rscommon::os::*、common::crt_fd::Offsetrustpython_host_env::stdlib/_ctypes/function.rsrustpython_common::os::get_errnorustpython_host_env::os::stdlib/_codecs.rscommon::windows::ToWideStringrustpython_host_env::windows::stdlib/sys.rs、winreg.rs、winsound.rscommon::windows::ToWideStringrustpython_host_env::windows::windows.rsrustpython_common::windows::ToWideStringrustpython_host_env::windows::exceptions.rscommon::os::ErrorExt、common::os::winerror_to_errnorustpython_host_env::os::6.2 stdlib 侧迁移目标约 7 个文件文件当前引用新引用socket.rscommon::os::ErrorExt、common::os::errno_io_errorrustpython_host_env::os::mmap.rsrustpython_common::crt_fdrustpython_host_env::crt_fdfaulthandler.rsrustpython_common::os::{get_errno, set_errno}rustpython_host_env::os::posixshmem.rscommon::os::errno_io_errorrustpython_host_env::os::termios.rscommon::os::ErrorExtrustpython_host_env::os::overlapped.rscrate::vm::common::os::winerror_to_errnorustpython_host_env::os::openssl.rsrustpython_common::fileutils::fopenrustpython_host_env::fileutils::6.3 外部消费者文件当前引用新引用src/lib.rsrustpython_vm::common::os::exit_coderustpython_host_env::os::exit_codeexamples/*.rsvm::common::os::exit_code通过再导出保持可用注意examples/*.rs走的是「Keep via re-export」路线保留再导出层避免破坏示例代码而 vm 内部则是「Clean break」——外部消费者必须显式从common::os更新到host_env::os不提供兼容 shim以此确保没有代码还停留在旧的宿主调用路径上。七、Phase 4未来从 stdlib 模块抽取宿主函数第四阶段沿用 Phase 2 的模式目标是crates/stdlib/src/中直接重度使用libc、nix、socket2、memmap2的模块。提案给出了完整的抽取映射表stdlib 模块host_env 模块抽取内容socket.rs3498 行host_env::socketSocket 创建、bind、connect、地址转换、cmsg 辅助、poll 封装再导出socket2类型mmap.rs1625 行host_env::mmapmmap/munmap 封装、madvise、msync再导出memmap2类型select.rs745 行host_env::select经 libc/nix 的 select/poll/epoll/kqueue 封装posixsubprocess.rs537 行host_env::subprocessfork_exec、pipe、dup2、close-on-exec 逻辑multiprocessing.rs1152 行host_env::multiprocessing信号量操作经 libc 的 sem_open/wait/post/unlinkfcntl.rs220 行host_env::fcntlfcntl、ioctl、flock 封装faulthandler.rs1333 行host_env::faulthandler信号处理器注册、经 libc write 的栈转储locale.rs332 行host_env::localestrcoll、strxfrm、setlocale 封装resource.rs194 行host_env::resourcegetrusage、getrlimit、setrlimit 封装grp.rs103 行host_env::grpgetgrent/setgrent/endgrent、经 nix 的 Group 查询syslog.rs148 行host_env::syslogopenlog、syslog、closelog、setlogmask 封装posixshmem.rs52 行host_env::shmshm_open、shm_unlink 封装termios.rs280 行host_env::termios经 termios crate 的终端属性 get/set完成后nix、socket2、memmap2、rustix将从 stdlib 的直接依赖中移除仅由host_env提供。届时 stdlib 的依赖面大幅收窄任何新增的系统调用都必须先进入host_env才能被使用。八、Phase 5五层 lint 强制体系第五阶段是整个方案的「执行保障」按强度从强到弱设计了五层防护8.1 第 1 层crate 边界编译期绝对最强的保证如果一个 crate 的[dependencies]中没有列出rustpython-host_env它在物理上无法调用任何 host_env 函数——由 Rust 模块系统天然强制执行。以下纯算法 crate 禁止依赖 host_envrustpython-commonrustpython-compiler、rustpython-compiler-core、rustpython-compiler-sourcerustpython-codegenrustpython-literalrustpython-sre_enginerustpython-wtf8rustpython-derive、rustpython-derive-impl配套 CI 检查脚本# Verify pure crates dont depend on host_env for crate in common compiler compiler-core compiler-source codegen literal sre_engine wtf8 derive derive-impl; do if rg rustpython-host_env crates/$crate/Cargo.toml; then echo ERROR: $crate should not depend on host_env exit 1 fi done8.2 第 2 层clippydisallowed_methods编译期可配置在 vm/stdlib 中封禁直接的宿主 API 使用强制所有宿主访问都经过host_env。工作区级clippy.toml项目根disallowed-methods [ # Filesystem { path std::fs::read, reason use rustpython_host_env for host filesystem access }, { path std::fs::write, reason use rustpython_host_env }, { path std::fs::read_to_string, reason use rustpython_host_env }, { path std::fs::read_dir, reason use rustpython_host_env }, { path std::fs::create_dir, reason use rustpython_host_env }, { path std::fs::create_dir_all, reason use rustpython_host_env }, { path std::fs::remove_file, reason use rustpython_host_env }, { path std::fs::remove_dir, reason use rustpython_host_env }, { path std::fs::metadata, reason use rustpython_host_env }, { path std::fs::symlink_metadata, reason use rustpython_host_env }, { path std::fs::canonicalize, reason use rustpython_host_env }, { path std::fs::File::open, reason use rustpython_host_env }, { path std::fs::File::create, reason use rustpython_host_env }, { path std::fs::OpenOptions::open, reason use rustpython_host_env }, # Environment { path std::env::var, reason use rustpython_host_env }, { path std::env::var_os, reason use rustpython_host_env }, { path std::env::set_var, reason use rustpython_host_env }, { path std::env::remove_var, reason use rustpython_host_env }, { path std::env::vars, reason use rustpython_host_env }, { path std::env::vars_os, reason use rustpython_host_env }, { path std::env::current_dir, reason use rustpython_host_env }, { path std::env::set_current_dir, reason use rustpython_host_env }, { path std::env::temp_dir, reason use rustpython_host_env }, # Process { path std::process::Command::new, reason use rustpython_host_env }, { path std::process::exit, reason use rustpython_host_env }, { path std::process::abort, reason use rustpython_host_env }, { path std::process::id, reason use rustpython_host_env }, # Network { path std::net::TcpStream::connect, reason use rustpython_host_env }, { path std::net::TcpListener::bind, reason use rustpython_host_env }, { path std::net::UdpSocket::bind, reason use rustpython_host_env }, ]crates/host_env/clippy.toml提供覆盖配置——host_env 自己允许使用一切disallowed-methods []Clippy 解析clippy.toml时从 crate 目录向上逐级查找因此host_env的本地配置优先于工作区根配置恰好形成「宿主代码只能在 host_env 里出现」的规则。再配合工作区Cargo.toml中的[workspace.lints.clippy] disallowed_methods deny将违规从警告升级为编译失败。8.3 第 3 层沙箱构建验证CI不带host_envfeature 构建捕获任何漏写 feature 门控的代码cargo check -p rustpython-vm --no-default-features --features compiler,gc cargo check -p rustpython-stdlib --no-default-features --features compiler如果某段宿主代码漏掉了#[cfg(feature host_env)]这条构建会直接编译失败把泄漏消灭在 CI 阶段。8.4 第 4 层白名单模块审计CI 脚本维护一份「已知不使用 host_env」的模块白名单任何向白名单模块添加rustpython_host_envimport 的改动都会触发 CI 失败# .ci/host_env_whitelist.txt — modules that must stay host-free # vm modules: crates/vm/src/stdlib/_abc.rs crates/vm/src/stdlib/_collections.rs crates/vm/src/stdlib/_functools.rs crates/vm/src/stdlib/_operator.rs crates/vm/src/stdlib/_sre.rs crates/vm/src/stdlib/_stat.rs crates/vm/src/stdlib/_string.rs crates/vm/src/stdlib/errno.rs crates/vm/src/stdlib/gc.rs crates/vm/src/stdlib/itertools.rs crates/vm/src/stdlib/marshal.rs # Check: while IFS read -r file; do if rg rustpython_host_env $file 2/dev/null; then echo ERROR: $file is whitelisted as host-free but imports host_env exit 1 fi done .ci/host_env_whitelist.txt反向审计同样有价值维护一份「允许使用 host_env」的文件清单任何未在清单上的新文件使用 host_env 都会被拒绝——这能拦截新模块中意外的宿主 API 使用。8.5 第 5 层纯 crate 的#![no_std]移除宿主模块后common有条件成为无条件的#![no_std]它已有#![cfg_attr(not(feature std), no_std)]。这是最强保证——std::fs、std::env、std::net、std::process在编译层面完全不可用。候选的无条件#![no_std]craterustpython-literalrustpython-wtf8rustpython-compiler-source8.6 五层强制体系小结层捕获什么强度成本crate 边界缺失 host_env 依赖绝对 — 编译错误零 — 自动clippy disallowed_methods直接的 std::fs/env/net 使用强 — clippy deny低 — clippy.toml 配置沙箱构建缺失#[cfg(feature host_env)]强 — 编译错误低 — CI job模块白名单纯模块中意外的 host_env 使用中 — CI 脚本低 — 维护白名单#![no_std]纯 crate 中任何 std 使用绝对 — 编译错误中 — 可能需要重构这套体系的关键设计在于把最强的保证放在成本最低、最自动化的层面crate 边界与#![no_std]是零维护的编译期保证clippy 与 CI 脚本是低维护的补充防线层层递进、各司其职。九、风险评估与迁移策略提案对迁移过程的风险进行了量化评估风险等级缓解措施目标模块存在 Python 类型依赖低已验证仅依赖libc、nix、windows-sys、rustpython-wtf8移动时内部交叉引用断裂低crt_fd、os、fileutils、windows整体一起迁移crate::路径保持有效suppress_iph!宏$crate解析中$crate自动解析到新 crate__macro_private随迁破坏外部消费者中干净断裂——消费者必须把common::os更新为host_env::os不提供再导出 shimPhase 2 抽取范围中从明确纯宿主的函数开始混合函数可以增量迁移几点解读「目标模块有 Python 类型依赖」被评为低风险因为提案已预先盘点验证——候选模块只依赖libc、nix、windows-sys、rustpython-wtf8没有任何 Python 类型依赖「不提供再导出 shim」是刻意的取舍外部消费者被迫一次性完成迁移避免新旧两套路径长期并存防止绕过沙箱边界的旁路再次出现Phase 2 采取「先易后难」策略从明确的纯宿主函数开始混合函数增量迁移降低单次改动面。十、落地现状验证提案已基本实现host_env_proposal.md是一份设计提案而从当前仓库源码看该提案已基本落地。以下是仓库中可验证的实现证据crate 已创建crates/host_env/Cargo.toml 存在且模块布局远超提案 Phase 1-2 的范围——crates/host_env/src/lib.rs 中不仅包含os、crt_fd、fileutils、windows、macros、posix、nt、signal、time、msvcrt、winapi还覆盖了 Phase 4 的目标模块socket、mmap、select、fcntl、faulthandler、locale、resource、grp、syslog、shm、termios、multiprocessing、overlapped、winsound等并按平台cfg精细门控含posix_wasi.rs、posix_windows.rs、crt_fd_unsupported.rs等平台适配文件。common 已纯化crates/common/src/lib.rs 已不再包含os、crt_fd、fileutils、windows、macros模块剩下的都是纯算法模块cformat、float_ops、hash、int、str、encodings、compression、lock等并且文件头带有#![cfg_attr(not(feature std), no_std)]与#![deny(clippy::disallowed_methods)]——与提案第 5 层的设计完全对应。feature 接线已就位根 Cargo.toml 的[workspace.dependencies]已声明rustpython-host_env { path crates/host_env, version 0.5.0 }且默认特性中包含host_envdefault [threading, stdlib, stdio, importlib, ssl-rustls-aws-lc, host_env]其中host_env [rustpython-vm/host_env, rustpython-stdlib?/host_env]crates/vm/Cargo.toml 的默认特性包含host_envcrates/stdlib/Cargo.toml 同样默认启用host_env并将 SSL 相关能力挂在 host_env 之上。clippy 覆盖配置已实现crates/host_env/clippy.toml 内容恰为disallowed-methods []与提案第 2 层的设计一致。宿主函数已归位搜索确认crates/vm/src/stdlib/posix.rs中已通过use rustpython_host_env引入宿主能力验证了「Python 绑定层调用 host_env」的目标结构。10.1 如何在本地验证沙箱构建读者可以在当前仓库中执行以下命令验证整套体系# 验证 host_env crate 本身可独立编译 cargo check -p rustpython-host_env # 验证不带 host_env 的沙箱构建依然成立vm 侧 cargo check -p rustpython-vm --no-default-features --features compiler,gc # 验证不带 host_env 的沙箱构建依然成立stdlib 侧 cargo check -p rustpython-stdlib --no-default-features --features compiler如果 vm 或 stdlib 中有人忘了给宿主代码加#[cfg(feature host_env)]第二条/第三条命令就会立刻编译失败——这正是「crate 边界 沙箱构建」双层防线在实战中的体现。结语从「纪律约束」到「结构保证」host_env_proposal.md的核心思想是把 RustPython 沙箱化从「依赖开发者记住在每个调用点写cfg」的纪律性约束升级为「依赖 Rust 模块系统与 crate 边界」的结构性保证。通过「零 Python 依赖的宿主 crate 纯算法 common 五层 lint 强制」的组合宿主代码泄漏从「可能悄悄发生」变成「编译期必然失败」而这一切几乎不增加运行时成本。该方案已在当前仓库落地其五阶段迁移路线与分层强制体系对任何需要在单一代码库内隔离「可执行环境」与「宿主环境」的 Rust 项目都是一份高价值的参考范本。【免费下载链接】RustPythonA Python Interpreter written in Rust项目地址: https://gitcode.com/GitHub_Trending/ru/RustPython创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价