揭秘Ladybird浏览器沙箱安全:pledge()与unveil()如何防御恶意网页

发布时间:2026/9/3 12:30:09
揭秘Ladybird浏览器沙箱安全:pledge()与unveil()如何防御恶意网页 揭秘Ladybird浏览器沙箱安全pledge()与unveil()如何防御恶意网页【免费下载链接】ladybirdTruly independent web browser项目地址: https://gitcode.com/GitHub_Trending/la/ladybirdLadybird浏览器是一款真正独立的开源浏览器其 WebContent 渲染进程通过类 pledge()/unveil() 的沙箱机制层层收权Linux 下用 Landlock 文件白名单 seccomp 系统调用过滤macOS 下用 Seatbelt 档案让恶意网页即使攻破渲染进程也无法读取你的文件、发起网络请求。⚠️ 先说结论pledge()和unveil()是 OpenBSD 的专有系统调用Ladybird 代码库中并没有直接调用它们。但 Ladybird 完整移植了这套先承诺、后收权的设计哲学并在 Linux / macOS 上用原生机制落地。下面带你逐层拆解。为什么浏览器需要沙箱浏览器是最危险的软件之一它每天都在执行来自互联网的不可信代码HTML、CSS、JavaScript、图片解码器。一旦渲染引擎存在漏洞恶意网页就可能劫持渲染进程。Ladybird浏览器采用多进程架构作为第一道防线渲染网页的 WebContent 进程与 UI 进程、网络进程RequestServer、图片解码进程ImageDecoder、合成进程Compositor相互隔离。架构文档可参考Documentation/ProcessArchitecture.md进程隔离解决的是爆炸半径问题而沙箱解决的是进程内部还能做什么的问题。pledge()与unveil()的设计哲学渐进承诺 最小权限OpenBSD 的这两个系统调用是浏览器沙箱领域的祖师爷unveil()—— 进程启动时逐步揭幕允许访问的路径白名单未揭幕的路径一律不可见。理念是最小权限的文件系统视图。pledge()—— 进程按运行阶段立军令状如我现在只需要读文件和网络一旦承诺之后越权的系统调用直接失败不可逆。理念是攻击面随时间单调递减。Ladybird 在渲染进程启动时就一次性完成承诺 揭幕效果等同于pledge(none)之后的终极状态。Linux 上的等价实现Landlock seccompLinux 渲染进程沙箱的完整逻辑在 Services/RendererSandboxLinux.cpp共四步1️⃣ 禁止提权install_no_new_privileges()通过PR_SET_NO_NEW_PRIVS确保进程以及其派生的任何子进程永远无法获得新权限恶意代码无法利用 setuid 程序提权。2️⃣ unveil等价物Landlock 文件系统白名单代码只向渲染进程揭幕以下路径其余文件系统完全不可见 资源根目录、配置文件、可执行文件自身、lib/目录 ——只读/proc/self—— 只读 PulseAudio 运行时目录 —— 读写播放网页音频需要3️⃣ pledge等价物seccomp 系统调用过滤Libraries/LibSandbox/Seccomp.h 定义的白名单式策略只放行渲染必需的少量系统调用类别只读打开文件、文件系统元数据查询、受控写入、文件描述符操作、IPC、常用运行时调用和可执行内存映射供 JIT 使用。核心片段Sandbox::SeccompPolicy policy; policy.allow_readonly_file_opens(); policy.allow_filesystem_metadata_queries(); policy.allow_filesystem_writes(); policy.allow_ipc(); policy.allow_common_runtime(); TRY(policy.install());任何不在白名单内的系统调用会立即失败——这正是 pledge() 不可逆承诺的 Linux 版本。macOS 上的等价实现Seatbelt 档案Services/RendererSandboxMacOS.cpp 使用 macOS 的 Seatbelt 沙箱框架同样只揭幕资源目录、可执行文件和缓存目录并且对渲染进程执行NetworkAccess::Denied——渲染进程根本没有网络权限。所有网络请求必须通过 IPC 交给独立的 RequestServer 进程处理见 Services/RequestServer/这是比 pledge/unveil 更彻底的一步。面对恶意网页时的完整防御链条当一个携带漏洞利用代码的网页被加载时防线机制恶意代码被卡住的方式① 进程隔离多进程架构渲染进程被攻破也不影响 UI 和网络进程② 禁止提权no_new_privileges无法借助 setuid 程序越狱③ 文件不可见Landlock / Seatbelt 白名单open(/home/user/secret.txt)直接失败④ 系统调用黑名单seccomp 策略越权 syscall 被内核拦截⑤ 网络隔离RequestServer 收口渲染进程无法直接建连外传数据 官方测试套件中包含大量沙箱场景用例例如验证无脚本权限的 sandboxed-iframe 仍能正常加载图片如何上手探索这套沙箱阅读沙箱公共接口Libraries/LibSandbox/Sandbox.hLandlockPath与SeatbeltPath两种白名单结构一目了然对比两份平台实现Services/RendererSandboxLinux.cpp vs Services/RendererSandboxMacOS.cpp用 DevTools 连接到沙箱化的 WebContent 进程观察被隔离的渲染环境深入理解请求如何跨越沙箱边界Documentation/RequestServerWireLogging.md总结Ladybird浏览器没有照搬 OpenBSD 的 pledge()/unveil() 系统调用而是抓住了它们的灵魂——能力最小化 攻击面单调递减——并用 Landlock、seccomp、Seatbelt 三大平台原生工具实现了等效甚至更强的防护。对于关注浏览器安全的新手这套源码是学习现代沙箱设计的绝佳范本。【免费下载链接】ladybirdTruly independent web browser项目地址: https://gitcode.com/GitHub_Trending/la/ladybird创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考