应用程序要分析和"执行"一文件,要主张的文件是可执行的,出于安全原因。

一时刻的思想和你意识到这一初始代码的竞争条件,使安全方案无效的:

import os

class ExecutionError (Exception):
    pass

def execute_file(filepath):
    """Execute serialized command inside @filepath

    The file must be executable (comparable to a shell script)
    >>> execute_file(__file__)  # doctest: +ELLIPSIS
    Traceback (most recent call last):
        ...
    ExecutionError: ... (not executable)
    """
    if not os.path.exists(filepath):
        raise IOError('"%s" does not exist' % (filepath, ))
    if not os.access(filepath, os.X_OK):
        raise ExecutionError('No permission to run "%s" (not executable)' %
                filepath)

    data = open(filepath).read()

    print '"Dummy execute"'
    print data

竞争条件之间存在

os.access(filepath, os.X_OK)

data = open(filepath).read()

因为有一种可能性的文件是被复盖的与一个非可执行的文件的不同内容之间的这两个系统的呼吁。

第一个解决方案我有的是要改变关键的电话(和跳过现在冗余的存在检查):

fobj = open(filepath, "rb")
if not os.access(filepath, os.X_OK):
    raise ExecutionError('No permission to run "%s" (not executable)' %
            filepath)

data = fobj.read()

这不会解决的竞争条件?我如何能解决这正常吗?

安全方案的理由,简要地(我想)

该文件将能够进行任何命令它的内部 环境中的,所以它是相当于一个壳脚本。

有一个安全洞免费的桌面。桌面上的文件的定义 应用程序:该文件可能指定任何可执行的争论, 它可以选择其自己的图标和名称。因此,一个随机可以隐藏下载的文件 后面的任何名称或图标和做任何事情。这是不好的。

这是解决的需要。桌面文件具有的可执行位 设定,否则他们将不能使用的姓名/图标,以及免费的桌面 将要求用户如果愿意启动该程序之前开始。

与此相比,Mac OS X是非常好的设计:"这种程序已被下载的网页, 你确定你要打开吗?"。

因此,在这个寓言,而事实上,你必须 chmod +x 外壳 脚本,你下载,我想到了设计中的问题上。

闭幕词

也许最后,也许我们应该保持它的简单:如果文件必须是可执行的,使其可执行并且让核心执行它的时候援引的用户。代表团的任务为它所属的地方。

有帮助吗?

解决方案

在可执行连接到你打开文件,没有什么从指向的inode包含要读取的数据停止几个文件。换言之,相同的数据可以是来自非可执行文件中的同一文件系统的其他地方可读。此外,即使打开该文件后,你不能阻止同一个文件的可执行性更改,甚至有可能被取消链接。

在“尽力而为”提供给您,因为我看到它是做使用在打开的文件os.fstat检查,前后检查保护模式和修改时间,但充其量,这只会降低改变未被发现的可能性当你阅读该文件。

在第二个想法,如果你在这个文件中的数据的原创者,你可以考虑写一个从来没有链接到文件系统首先一个inode,在通过文件内存共享一个常见的技术。另外,如果包含在数据最终必须公开给其他用户,你可以使用文件锁定,然后保护位逐步扩展到那些需要它的用户。

最后,你必须确保恶意用户根本不必写访问该文件。

其他提示

您不能完全解决这种竞争情况 - 例如,在版本,你先打开,然后检查权限,它的可能的你已经打开的文件,只是刚过权限得到改变之前你已经更改的权限。

如果您可以将文件原子移动到一个目录,潜在的坏人无法达到,那么你可以放心,任何关于该文件将被从你的鼻子底下,而你正在处理它改变。如果潜在的坏人可以达到的处处的,或者您不能将文件移动到哪里,他们无法到达,没有防守。

顺便说一句,这不是很清楚,我怎么这个方案,即使可以做它的工作,实际上会增加任何安全 - 当然,如果坏人可以在文件中就把中毒内容是无法超越他们给它chmod +x作为好?

最好你可以做的是:

  • 拯救的权限。
  • 改变它对自己独特的用户(一些与节目的名称)并禁止其运行。
  • 让你检查(在保存的许可,如果需要的话)。
  • 运行过程。
  • 设置返回的权限的保存人。

当然,也有缺点,但是如果您使用情况为简单的因为你似乎说,它可以做的伎俩。

您应该更改文件的所有权,使得攻击者不能访问它“CHOWN根:根FILE_NAME”。做一个“搭配chmod 700 FILE_NAME”,这样没有其他帐户可以读/写/执行的文件。这一切都在一起,避免了TOCTOU的问题,这是人们如何防止文件被攻击者谁拥有你的系统上的用户帐户被修改。

另一种方法是将文件名更改为意想不到的事情,甚至是复制整个文件 - 如果它不是太大 - 到一个临时目录(加密如果必要的话),让你检查,然后重命名/复制文件恢复。

当然这是一个非常重的过程。

但你最终,由于系统尚未建立从一开始安全。一个安全的方案将签名或加密,他要保持安全数据。在你的情况下,这是不可能的。

除非你真的对重加密,没有办法保证你无法控制的机器上100的安全性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top