为啥 PHP 中的 phar 写支持特别被锁定?

Posted

技术标签:

【中文标题】为啥 PHP 中的 phar 写支持特别被锁定?【英文标题】:Why is phar write support in PHP especially locked down?为什么 PHP 中的 phar 写支持特别被锁定? 【发布时间】:2013-09-19 15:17:39 【问题描述】:

phpphar.readonly设置,默认开启,只能通过配置文件关闭。

此选项禁用使用 phar 流或 Phar 对象的写入支持创建或修改 Phar 档案。此设置应始终在生产机器上启用,因为 phar 扩展方便的写入支持可以在与其他常见安全漏洞结合使用时直接创建基于 php 的病毒。

http://php.net/manual/en/phar.configuration.php

在这种情况下默认阻止写入支持的原因是什么?

有更通用和现成的 PHP 编写方式,Phar 的编写支持的“便利性”究竟是什么,这从安全角度来看是危险的?

【问题讨论】:

您也可以通过 CLI arg 禁用它:php -dphar.readonly=0 build-phar.php 请注意,如果您只想使用 Phar 创建(不可执行的)档案,您仍然可以使用 PharData,无论 phar.readonly 设置的值如何。 【参考方案1】:

如果您需要在没有设置只读的情况下编写,则可以使用 ZIP 或 GZ 容器。请参阅Head-to-head comparison of Phar, Tar and Zip 了解更多信息。

从黑客的角度来看,拥有只读的 PHAR 可以有效地将其锁定。如果您的 Web 版本的 PHP(mod_php、php-cgi 或其他)具有默认值,那么这使得破坏基于 Phar 的应用程序非常困难,因为在执行期间可以覆盖 phar.readonly=1

还有一个性能优势在于文件仅以 R/O 方式打开,并且 Web 请求(本质上可以是并发的)可以在没有文件锁定的情况下访问和使用 Phar。

您通常会使用 @scribu 描述的 CLI 包装器在您的测试配置上构建 Phar,然后只需将 Phar 复制到相关的应用程序目录即可将其安装到您可公开访问的 Web 服务上。

【讨论】:

这并不能完全回答我的问题,即 - 为什么 phar 写入被认为更容易被利用以及它是如何促成病毒创建的? 我做了但含蓄的。如果 PHP 脚本包含使黑客能够破坏执行的漏洞,那么她或他可以控制并覆盖应用程序的某些部分以创建后门。如果您面向 Web 的 PHP 有phar.readonly=1,那么黑客就无法覆盖应用程序代码。此类写入会引发异常。 ini_set() 也不起作用,因为执行不能将值降低到 PER_SYS 值以下。

以上是关于为啥 PHP 中的 phar 写支持特别被锁定?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL锁机制和PHP锁机制

为啥 ASP.NET-Core 应用程序会收到错误消息“此平台不支持锁定/解锁文件区域”。在 MacOS 上部署时?

PHP中phar包的使用

oracle数据库 账号为啥被锁了

确保当前线程持有 C++11 互斥锁

redis用的是悲观锁还是乐观锁?