PHP 沙盒的安全问题

信息安全 应用安全 Web应用程序 php 源代码 沙盒
2021-08-30 23:32:56

我正在为 Web 应用程序蜜罐开发 PHP 沙箱。PHP 沙箱将分析可能已作为 RFI 攻击的一部分注入的 PHP 文件。它应该在安全的环境中运行文件并返回结果,嵌入 PHP 脚本的输出。我们希望欺骗攻击者相信这是一个真实的响应,从而继续他的下一步攻击。

为了构建沙箱,我们使用了 Advance PHP Debugger (ADP)。使用rename_functionand override_function,易受攻击的 PHP 函数已被重写。某些功能(例如exec, )disk_free_space已被重写以发送虚假回复。所有其他函数什么都不返回。这是已考虑的功能的完整列表。

此外,输入脚本在沙箱中最多只能运行 10 秒。之后,整个沙盒进程被杀死。

  1. 这份清单是否足够好?这是否使沙盒足够安全,可以成为 Web 应用程序蜜罐的一部分?

  2. 除了像这样阻塞函数调用之外,还有没有应该采取的安全措施?

  3. 最后,这是一个蜜罐。因此,我们希望我们的回复尽可能接近真实回复。因此,通过阻止 DNS 函数调用dns_check_recordgethostbyname我们是否不必要地限制了脚本的执行范围。(我不知道他们为什么首先出现)

    简而言之,我想知道我应该从列表中添加/删除哪些元素。

  4. 任何其他有关如何解决此问题的建议/建议将不胜感激。

2个回答

我远不是 PHP 专家,所以我的评论更笼统而不是具体。

  1. 可能不完全,但这取决于。我不认为任何白名单/黑名单方法都可以 100% 准确。总会有误报漏报的情况。因此,您总是在命中(脚本仍然能够穿透您的防御)和未命中(即成功阻止脚本,但以不允许您进一步分析的方式)之间取得平衡。PHP 必须有数千种不同的调用和排列,因此构建防水列表非常困难。也就是说,快速浏览的列表看起来可以作为起点。同样,我的 php 经验是有限的。

  2. 当您说“成为 Web 应用程序的一部分”时,我不确定您的意思是什么,但我强烈建议不要将其嵌入到任何远程连接或接近真实数据或任何实际生产应用程序的东西中。如果这是一个蜜罐,它应该尽可能地保持隔离您应该考虑以下事项:

    • 在定期“刷新”的专用硬件机器上运行此程序(重新映像,从头开始构建)
    • 不要让它连接到外界以外的任何东西
    • 不要在上面存储任何敏感(甚至不那么敏感)的数据
    • 记录所有访问并使用具有详细日志记录的外部防火墙
    • 使用内部操作系统系统日志记录
    • 在您的任何日志上监控任何甚至远程奇怪的东西
    • 考虑限制外部连接的速度

    如果系统隔离得足够好,那么除了自身之外,剩下的主要风险就是其他系统。假设攻击者成功通过了您的 php 保护层,您的蜜罐可用于对其他系统发起外部攻击- 垃圾邮件、拒绝服务、充当僵尸网络的一部分等。这就是为什么要保持隔离,密切关注在它上面,以及丢弃和从头开始是一个好主意。

  3. 不幸的是,我无法回答比我在 1 中已经涵盖的更多的问题。

  4. 见 2。

你的方法对我来说没有多大意义。

你说你想通过禁用常见的攻击向量来创建一个蜜罐(即一个看起来不安全的系统)。

我们希望欺骗攻击者相信这是一个真实的响应

这意味着您将只能用响应来替代您已经描述过的攻击。而且您将运行与您尝试对其行为建模的系统非常不同的软件堆栈。

充其量,这将是一个巨大的努力。更有可能的是,您将拥有远非代表性的东西,它不会暴露您正在建模的系统的漏洞,并且会将其暴露给任何攻击者。您的列表远不是一个完整的禁用/包装安全 PHP 安装的列表 - 但这不是重点。

我建议您恢复到标准的 PHP 构建,并考虑如何将蜜罐作为一个整体进行封装和监控。您当然希望在虚拟机中实现蜜罐(您可以将其复制到其他地方以研究/快速脱机/修改构建)并代理和记录所有服务器流量进出,远程日志记录和(近)连续完整性检查. 无论如何都要用日志记录关键的 PHP 函数/构造——但不要禁用它们。