在 PHP 中使用 tmpfile() 处理敏感数据的安全风险

信息安全 php
2021-09-03 13:32:19

通过 tmpfile() 在 PHP 的临时目录中存储敏感数据时,主要关注什么?例如:

  1. 恶意管理员可以从硬盘恢复这些数据吗?
  2. 管理员可以轻松地将 tmp 目录更改为永久存储位置吗?
  3. 在初始写入过程中,数据是否可以轻松复制到另一个位置?

我的 Web 应用程序存储加密的用户数据,但我必须对其进行加密,以便它可以通过 webdav 流式传输。暂时存储解密的副本似乎是最简单的方法。否则我可能不得不发明一些基于块的加密和即时解密数据。

3个回答
  1. 必须假定数据在写入文件时被刷新。从理论上讲,它可能会留在缓冲区中并且永远不会被刷新,但是您不能依赖它,并且您无法判断它是否确实如此。临时文件位置可能是安装在RAM 上的磁盘(如 Linux 中的 tmpfs),但您可能无权访问该信息,同样,您不能依赖这种情况。最坏的(也是最有可能的)情况是它被写入硬盘,在这种情况下,任何拥有原始磁盘读取权限的人,比如管理员,都可以搜索硬盘的原始扇区并检查数据。这并不像听起来那么难,在使用简单的 NIX 工具链接ddgrep.

  2. 我不认为这是一个问题。创建的文件tmpfile()应该在您关闭文件时自动删除,无论它是在哪里创建的。(至少,手册和经验是这样说的。)

  3. 当然。管理员可以监视临时目录并复制他看到的任何文件。这在用户模式级别应该是可行的,并且如果他们非常致力于刷每个临时文件,那么在驱动程序级别肯定是可行的(如果他们编写了文件窃取驱动程序并将其放入文件系统堆栈中)。

根据经验,任何需要加密的数据都不应写入未加密的文件。文件内容不受您的直接控制,未加密的数据必须如此。

应该可以使用标准加密方案即时进行加密。它可能比进行一次大型加密调用要复杂一些,但绝对可以使用任何称职的加密库。

管理员可以做任何事情如果管理员是你的敌人,那么你就输了。无论你把它们放在哪里,他都可以复制你的珍贵文件;他甚至可以直接读取您的 PHP 进程的 RAM 内容。

如果管理员是您的朋友,那么您的下一个敌人就是对同一台机器具有某种访问权限的其他人,例如该机器的普通(非管理员)用户,和/或在同一台服务器上运行的其他 PHP 脚本。PHPtmpfile依赖于(至少在类 Unix 系统上)tmpfile()操作系统提供的函数(实际上是一个 libc 函数)。如果您使用 Linux,那么您很幸运:特定实现会在其中创建具有随机名称的文件/tmp立即将其删除根据 Unix 语义,该文件仍然存在(它在文件系统中占用了一些空间)但名称被破坏,禁止其他用户进行任何访问。

您可能仍然需要担心其他 PHP 脚本,如果它们是敌对的并且 PHP 引擎没有受到适当的约束,因为这些脚本在与您的帐户相同的帐户下运行(操作系统级别的帐户,即运行 Web 服务器的 Unix 用户),因此可以从/proc. 但这相当极端。如果不同的人,可能彼此敌对,可以将他们自己的 PHP 脚本添加到同一台服务器,而他们之间没有隔离,那么服务器结构中有一些非常错误的地方,并且管理员没有做他的工作。

  1. 由于临时文件与普通文件相同(在写入磁盘的相同方面,尽管只是很短的时间),它仍然可以使用数据恢复工具恢复,直到它被覆盖。据我所知,当临时文件被删除时,它只是“取消链接”,并没有被安全删除
  2. 临时文件夹设置在操作系统级别,因此理论上他们可以更改位置,但无论文件夹如何,在脚本执行结束时仍应将其删除
  3. 由于该文件在脚本的整个持续时间内都存在(或直到它被显式关闭),他们可能会监视目录并复制其中出现的任何内容。该文件应该将所有者设置为创建它的人,但由于管理员将拥有 root 权限,因此他无论如何都可以访问

为了解决第 1 点,您可以在文件上调用srm并自己显式删除它,这应该可以防止它被恢复。至于第 2 点和第 3 点,除非您自己能够保护服务器,否则它不在您的掌控之中。

希望这可以帮助