攻击者如何使用伪造的临时文件来破坏程序?

信息安全 软件 编程
2021-08-24 22:07:18

我正在上安全课。课堂笔记说,攻击者可以观察临时文件名中的模式,然后制作自己的临时文件来破坏程序。他们说,如果临时文件是使用进程 ID 创建的,攻击者可以创建一个指向带有tripwire 进程ID 的密码文件的符号链接,从而使tripwire 使用临时文件的密码文件。

攻击者如何使用临时文件来破坏密码文件?或者以其他方式利用系统?

3个回答

首先要考虑的是临时文件的用途是什么。

如果 temp 正在输出有用的信息,攻击者可以使用它来收集有关程序功能、设置、错误消息等的信息(取决于输出)。攻击者可能会让恶意程序偶尔扫描此类文件以寻找特定模式,然后在攻击逻辑中使用。

同时,如果要读入临时文件,可以更改没有锁紧的合法程序的输入逻辑。例如,如果要读入临时文件以用于执行eval()或运行system()执行,则您可以让程序执行其权限允许在系统上执行的操作,这不是预期的。

除了修改将被读入的临时文件之外,还可以创建指向另一个文件的符号链接,您作为用户无法访问但应用程序可能具有读取权限。如果程序打印出临时文件,您可以以这种方式公开它。这听起来像是在权限提升中描述的攻击,而不是对密码文件的直接更改。

代码项目:应用程序中临时文件使用的安全提示

如果攻击者知道应用程序在哪里创建了它的临时文件,并且可以猜测下一个临时文件的名称,则可以实现以下攻击:

  • 攻击者会在临时文件位置放置一个符号链接。
  • 攻击者会将符号链接链接到特权文件。
  • 现在,应用程序将在不知不觉中写入特权文件,而不是写入临时目录中的文件。

还有一个 CWE ( CWE-377: Insecure Temporary File ),值得一读以及一些相关实例:

如果攻击者预先创建了具有宽松访问权限的文件,则应用程序存储在临时文件中的数据可能会被攻击者访问、修改或损坏。在基于 Unix 的系统上,如果攻击者预先创建文件作为指向另一个重要文件的链接,则可能会进行更隐蔽的攻击。然后,如果应用程序截断或将数据写入文件,它可能会在不知不觉中为攻击者执行破坏性操作。如果程序以提升的权限运行,这是一个特别严重的威胁。

在使用临时文件时,这种攻击的可能性并不是不可避免的。它源于临时文件的不安全实现。

例如,在 Unix 系统上,如果临时文件目录的权限不正确,则可能会打开一个漏洞。/tmp目录由用户共享,因此每个人都对目录本身具有写权限(以便能够创建文件)。但是应用了一个特殊的“粘性位”权限,它可以防止用户删除他们不拥有的文件。如果缺少该权限位,则恶意进程可能会创建竞争条件攻击:它注意到刚刚创建了一个临时文件,并且在拥有它的进程可以使用它之前,它会删除该文件并替换它用它自己的。(应用程序可以检查他们刚刚打开的临时文件的所有权和权限,但可能很少,如果有的话,因为程序被编写为信任临时目录配置正确。)

如果使用不正确的权限创建临时文件,则可以访问和篡改它。使用临时文件的程序必须以适当的权限创建它们。这意味着不能使用某些高度独立于平台的文件操作功能。例如,如果我们使用 C 函数fopen创建一个临时文件,我们就有一个安全漏洞,因为fopen没有任何参数来控制文件将拥有的权限。在类 Unix 系统上,它将创建一个具有自由权限的文件(仅减去那些被 删除的权限umask)。应使用特定于平台的库函数来创建和打开临时文件。

程序在创建临时文件时,总是检查该文件是否不存在。但是,此检查必须是原子的,否则在检查文件不存在和打开/创建文件之间存在竞争条件。对临时目录的正确权限无法解决该竞争条件。它是通过使用原子操作来创建文件来修复的。在 Unix 上,该O_EXCL标志除了用于O_CREAT要求操作系统open在文件已经存在时调用失败,否则创建它。这里的一个潜在问题是将临时文件目录托管在某些不符合O_EXCL.

当然,临时文件不受来自同一安全上下文的攻击的保护。(至少,如果没有在操作系统中实施细粒度的安全策略,则并非如此。)如果恶意程序以用户joe身份运行,则该程序可以攻击由以用户身份运行的程序创建的临时文件joe为了防止这种事情发生,您需要一个比简单的基于帐户的安全域更细粒度的安全方案。例如,具有以下规则的安全系统:“只/bin/foo允许可执行文件访问路径与模式匹配的任何文件系统对象/tmp/foo*”。

许多程序隐含地相信他们写入临时文件的内容在几毫秒或几秒钟或几分钟后仍然存在。如果您可以预测临时文件的名称,那么您就有更好的机会在文件创建和内容被读出之间捕获该文件,并且您可以将恶意数据写入文件中。