尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

radare2 沙箱机制全解析:原生 -S 沙箱与 OSX/OpenBSD/FreeBSD 系统级沙箱实践指南

radare2 沙箱机制全解析:原生 -S 沙箱与 OSX/OpenBSD/FreeBSD 系统级沙箱实践指南 radare2 沙箱机制全解析原生 -S 沙箱与 OSX/OpenBSD/FreeBSD 系统级沙箱实践指南【免费下载链接】radare2UNIX-like reverse engineering framework and command-line toolset项目地址: https://gitcode.com/gh_mirrors/ra/radare2导读本文基于 radare2 仓库的 doc/sandbox/README.md 编写系统讲解 radare2r2的内置沙箱能力既包括完全自实现的用户态沙箱-S/cfg.sandbox统一拦截文件系统、网络与进程调用也包括借助操作系统内核能力的沙箱方案macOS Seatbelt、OpenBSD pledge/systrace、FreeBSD Capsicum。读完本文你将掌握如何用r2 -S /bin/ls在不受信任的分析环境中安全打开二进制文件理解每条 Seatbelt 规则与 pledge 权限的含义并能根据平台差异选择合适的隔离策略。为什么 radare2 需要沙箱逆向分析工具天生要处理不受信任的输入恶意样本、畸形文件、可疑的磁盘镜像。radare2 的定位是UNIX-like reverse engineering framework其设计理念之一是沙箱原生支持sandboxing natively——通过在库层统一包装所有对文件系统、网络和进程执行的访问尝试让 r2 在不依赖外部工具的情况下就能约束自身行为。这一包装层位于 libr/util/sandbox.c对外暴露在 r_sandbox.h 中。原文档明确指出对某些平台内核提供了更原生的沙箱体验但当前ATM只有 OSX 和 OpenBSD 被 r2 支持Linux 与 Windows 的支持有待社区扩展。这句话有两层含义r2 的用户态沙箱在所有平台都可编译生效代码中有 Windows 与 WASI 分支内核级沙箱Seatbelt / pledge / systrace / Capsicum目前只在特定系统上由 r2 主动调用见下文r_sandbox_enable的平台分支。快速上手r2 原生沙箱-S参数与cfg.sandbox配置最简单的启用方式$ r2 -S /bin/ls原文档特别说明r2 -S是-e cfg.sandboxtrue的别名。从源码看该别名的接线在 libr/main/radare2.c命令行解析处case S: mr.sandbox true;约 L1144-L1146帮助文本为-S start r2 in sandbox mode约 L281初始化后期if (mr.sandbox) { r_config_set_b (r-config, cfg.sandbox, true); }约 L1971-L1973。而cfg.sandbox配置项在 libr/core/cconfig.c约 L4504中注册SETCB (cfg.sandbox, false, cb_cfgsanbox, sandbox mode disables systems and open on upper directories);即默认关闭值为布尔型可通过-e cfg.sandboxtrue或e cfg.sandboxtrue动态切换。原生沙箱做了什么根据原文档r2 原生沙箱启用后禁用文件系统访问disables file system access禁用网络连接disables network connectivity禁用 forkdisables forks即禁止 shell 逃逸与调试器在显示提示符之前激活activated before showing the prompt。这意味着在沙箱会话里!shell 逃逸、oop/ood调试、http服务器、向磁盘写文件等操作都会被拦截。原文档用一个命令给出完整语义$ r2 -S /bin/ls细粒度控制cfg.sandbox.grain仅用cfg.sandbox还不够灵活r2 提供了**权限粒度grain**机制。在 r_sandbox.h 中定义了位掩码Grain 常量值对应e cfg.sandbox.grain取值含义R_SANDBOX_GRAIN_NONE0none屏蔽所有可选权限R_SANDBOX_GRAIN_SOCKET1socket允许 socket 创建、监听与状态检查R_SANDBOX_GRAIN_DISK2disk允许底层文件描述符操作与文件打开open/read/write/lseek/truncateR_SANDBOX_GRAIN_FILES4files允许 stdio 风格的文件与目录访问fopen、opendir、chdirR_SANDBOX_GRAIN_EXEC8exec允许进程执行与 kill/system 辅助函数R_SANDBOX_GRAIN_ENVIRON16environ允许访问环境变量R_SANDBOX_GRAIN_NETWORK32network允许非 localhost 网络连接与 HTTP 请求R_SANDBOX_GRAIN_HIDDEN64hidden允许访问隐藏路径以.开头R_SANDBOX_GRAIN_ALLUT32_MAXall允许所有 grain默认值配置项在 libr/core/cconfig.c约 L4505SETCB (cfg.sandbox.grain, all, cb_cfgsanbox_grain, select sandbox permissions to keep enabled (all, none, disk, files, exec, socket, network, environ, hidden));其帮助信息help_msg_grain约 L1646 起进一步描述了每个取值的语义disk放行底层 fd 与文件打开files放行fopen/opendir/chdirexec放行进程执行与kill/systemsocket放行 socket 创建与监听network放行非本机连接与 HTTP 请求。内核实现在 sandbox.c 中核心是宏R_SANDBOX_GUARD(x, y)L29#define R_SANDBOX_GUARD(x,y) if (G_enabled !(G_graintype (x))) { return (y); }所有被包装的系统调用r_sandbox_open、r_sandbox_read、r_sandbox_write、r_sandbox_system、r_sandbox_kill、r_sandbox_fopen、r_sandbox_chdir、r_sandbox_opendir等在执行前都会过这道闸门。例如r_sandbox_openL432在沙箱启用时若请求O_CREAT/O_RDWR权限或路径未通过r_sandbox_check_path直接返回-1r_sandbox_fopenL512在沙箱下拒绝任何含w/a/的模式即只读打开并做同样的路径校验r_sandbox_systemL294与r_sandbox_killL558受R_SANDBOX_GRAIN_EXEC约束这对应原文档禁用 fork无 shell 逃逸或调试器r_sandbox_creatL374在沙箱下一律返回 false注释写明creating files is not allowed in sandbox even with DISK grain即使开了disk粒度也不允许创建文件。路径白名单r_sandbox_check_path除了 grain 位掩码路径校验是用户态沙箱的第二道防线。sandbox.c L65 的r_sandbox_check_path实现了一套白名单 黑名单规则允许R2_LIBDIR/radare2插件库目录、R2_DATDIR/radare2数据目录、XDGwww目录、R2_WWWROOTwebroot允许通过..或绝对路径到达之下的相对路径禁止以./开头的路径、含目录穿越..成分的路径、绝对路径/开头、UNIX 下符号链接路径隐藏路径以.开头或含/.Windows 还检查\.的路径默认禁止除非开启hiddengrainL44-L57、L70-L72。源码注释还坦诚地提示the sandbox can be bypassed if a directory is symlinkL69即符号链接目录存在绕过可能这是使用用户态沙箱时需要注意的边界。启用逻辑r_sandbox_enableL198是全局开关且被设计为一旦启用不可回退r_sandbox_disable在 pledge/Capsicum/priv 模式下会拒绝关闭。macOSSeatbelt 系统级沙箱sandbox-exec与.sb规则文件macOS 的 Seatbelt 在系统层实现沙箱规则用类 Lisp 的.sb文件描述。原文档给出的调用方式$ sandbox-exec -f radare2.sb r2 -S /bin/ls即用sandbox-exec -f加载规则文件进程内再叠加 r2 自身的-S实现系统 应用双重约束。仓库在 doc/sandbox/ 下提供两份现成规则radare2.sb 与 rabin2.sb可直接按上面命令使用。逐条解读 radare2.sbradare2.sb 的完整规则如下;为注释(version 1) (debug all) ; (allow default) (deny network*) (deny system*) (deny sysctl*) (deny file-write*) (deny file-ioctl) (deny mach*) ; disables debugger and ! shell escape (allow process*) (deny process-fork) ; record trace log ; (trace r2.log) (allow file-read* (regex #^/Users/[^.]/.config/radare2/$ #^/Users/[^.]/*/radare2/ #^/usr/share/radare2/* #^/usr/lib/system/* #^/usr/bin/radare2 #^/usr/lib/libr* #^/usr/bin/r2 #^/bin/ls ) ) (deny default)语义逐条拆解默认全拒(deny default)兜底未显式放行的操作一律拒绝网络与系统(deny network*)禁网络、(deny system*)禁系统调用、(deny sysctl*)禁内核参数读取、(deny mach*)禁 Mach 端口操作文件写入(deny file-write*)禁一切写文件(deny file-ioctl)禁 ioctl进程(allow process*)后跟(deny process-fork)——即允许进程相关操作但禁止 fork配合注释 disables debugger and ! shell escape与 r2 原生沙箱禁用 fork的策略一致文件只读白名单(allow file-read* (regex ...))仅允许正则匹配的路径被读取包括~/.config/radare2/、/usr/share/radare2/*、/usr/lib/system/*、/usr/bin/radare2、/usr/lib/libr*r2 动态库、/usr/bin/r2与被分析的/bin/ls调试辅助(trace r2.log)被注释掉取消注释可让 Seatbelt 记录 trace 日志用于调试规则。rabin2.sb 结构相同只是白名单针对rabin2保留~/.config/radare2/、/usr/share/radare2/*、/usr/lib/system/*、/usr/lib/libr*与/usr/bin/rabin2用于只读地提取二进制信息。配套测试doc/sandbox/Makefile 提供了可执行的自检目标all: # must success sandbox-exec -f radare2.sb /usr/bin/r2 /bin/ls # must fail sandbox-exec -f radare2.sb /usr/bin/r2 /bin/md5设计意图很清晰r2 /bin/ls读取路径被白名单放行/bin/ls在规则中应当成功而r2 /bin/md5中/bin/md5不在白名单应当失败。这组测试可以当作验证自定义.sb规则的模板。OpenBSD从 systrace 到 pledgeOpenBSD 5.9 及以后pledge(2)原文档指出 OpenBSD自 5.9 起通过pledge(2)系统调用提供沙箱只允许以下能力stdio 与 tty 操作文件系统读取rpathmmap(2)的PROT_EXEC操作。r2 对 pledge 的内核级集成在 sandbox.c 的r_sandbox_enableL206-L211#if LIBC_HAVE_PLEDGE if (G_enabled pledge (stdio rpath tty prot_exec inet, NULL) -1) { R_LOG_ERROR (sandbox: pledge call failed); return false; } #endif即启用 r2 沙箱时会调用pledge(stdio rpath tty prot_exec inet)限制为stdio、只读路径、tty、可执行映射和 inet。这正对应原文档列出的三类能力stdio/tty、文件系统读取、PROT_EXEC 的 mmap。同时sandbox.c L122 的r_sandbox_disable在已 pledge 的状态下拒绝关闭沙箱sandbox mode couldnt be G_disabled when pledged因为 pledge 承诺是不可逆的。LIBC_HAVE_PLEDGE等宏由构建系统在配置阶段探测见 libr/include/r_util/r_sandbox.h 中HAVE_CAPSICUM类似的条件编译模式。OpenBSD 5.9 之前systrace在 5.9 之前OpenBSD 用 systrace 工具实现沙箱。原文档给出完整操作流程查看手册$ man systrace生成默认策略文件$ systrace -A r2 /bin/ls使用生成的策略运行$ systrace -a r2 -S /bin/ls-A先自动生成策略把 r2 分析/bin/ls过程中触发的系统调用记录为允许项之后-a加载该策略运行。由于文档面向 5.9 之前的旧系统实践中 5.9 应优先选择 pledge 方案。FreeBSD10.0 起Capsicum 能力模式FreeBSD 从 10.0 起提供 Capsicum 框架核心是cap_enter(2)。原文档说明其限制取决于基础能力模式支持什么操作Operations limited on what basic capability mode support。r2 在 sandbox.c 中实现了完整的 Capsicum 集成L212-L248启用沙箱时用cap_rights_init构造写权限集CAP_READ|CAP_WRITE与读权限集CAP_READ|CAP_EVENT|CAP_FCNTL用cap_rights_limit分别收缩 stdin读集、stdout/stderr写集的文件描述符能力最后调用cap_enter()使进程进入能力模式失败则返回false并记录 sandbox: call_enter failed。与 pledge 一致r_sandbox_disable在能力模式下同样拒绝关闭L130-L135。宏HAVE_CAPSICUM在 r_sandbox.h L8-L18 中根据__FreeBSD__与__FreeBSD_version 1000000定义即 FreeBSD 10.0 起启用该代码路径——与原文档FreeBSD (from 10.0)完全吻合。其他平台仅原生沙箱对于 OSX/OpenBSD/FreeBSD 之外的平台Linux、Windows 等内核级方案尚不在 r2 的主动支持范围内只能依赖 r2 用户态沙箱。原文档总结了其四项行为禁用文件系统访问禁用网络连接禁用 fork无 shell 逃逸或调试器在显示提示符之前激活。统一入口仍然是$ r2 -S /bin/ls或等价地r2 -e cfg.sandboxtrue /bin/ls。结合前文 grain 机制在 Linux 上可以精细放行某些能力例如允许本地 HTTP 服务socketnetwork或允许执行命令exec但要注意保持默认的all之外组合时r_sandbox_open/r_sandbox_creat对写操作的内置限制依然生效。沙箱在工具链中的实际调用点-S不只存在于r2主程序。从 libr/main/ 下的代码看r2 工具链也复用沙箱能力r2agent.c-s参数启用沙箱代码中if (dosandbox !r_sandbox_enable (true)) { R_LOG_ERROR (Cannot enable the sandbox); ... }约 L190-L194并借用r_sandbox_kill实现/proc/kill/接口L220-L227rapatch2.c-s进入沙箱模式帮助文本写明 sandbox mode, disable scripts and r2 command executionL14并在加载核心后r_config_set_b (ro-core-config, cfg.sandbox, true)L57-L59rafind2.cL463-L467与 r2pm.c 则大量使用r_sandbox_system执行子命令使这些调用同样受execgrain 约束。这解释了为什么整个工具族而不只是交互式 r2都能在同一套策略下安全运行。实践建议与验证方法日常分析在 Linux/Windows 上使用r2 -S file把不受信任样本的读取限制在只读路径内若需写 dump 或临时文件评估cfg.sandbox.grain并留意沙箱内禁止创建文件的硬限制。macOS 双重防护sandbox-exec -f doc/sandbox/radare2.sb r2 -S /bin/ls并按需把要分析的路径加入.sb白名单正则可用(trace r2.log)调试规则。OpenBSD 5.9pledge由 r2 在r_sandbox_enable时自动调用直接r2 -S即可获得内核级保证旧系统按文档用systrace -A生成策略。FreeBSD 10r2 -S会自动触发cap_enter能力模式无需额外配置。回归测试参照 doc/sandbox/Makefile 的思路为每条白名单规则准备必须成功与必须失败两个用例验证沙箱边界。适用前提说明以上系统级能力Seatbelt、pledge、Capsicum均以对应操作系统与 r2 构建时的功能探测HAVE_CAPSICUM、LIBC_HAVE_PLEDGE等宏为前提在未启用内核方案的系统上cfg.sandbox提供的用户态防护仍是跨平台的基础保障。更详细的内核级沙箱原理可进一步阅读 libr/util/sandbox.c 与 libr/include/r_util/r_sandbox.h以及 libr/main/radare2.c 中-S参数的解析逻辑。【免费下载链接】radare2UNIX-like reverse engineering framework and command-line toolset项目地址: https://gitcode.com/gh_mirrors/ra/radare2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表