【问题标题】:Shell scripts and securityShell 脚本和安全性
【发布时间】:2012-01-20 00:03:21
【问题描述】:

TLDP 的高级 Bash 脚本指南指出不应将 shell 脚本用于“situations where security is important, where you need to guarantee the integrity of your system and protect against intrusion, cracking, and vandalism”。

是什么让 shell 脚本不适合这种用例?

【问题讨论】:

    标签: bash shell scripting


    【解决方案1】:

    由于 shell 的延展性,很难验证 shell 脚本在面对敌对输入时是否执行其预期功能并且该功能。 shell 的行为方式取决于环境,以及它自己的众多配置变量的设置。每个命令行都受到多个级别的扩展、评估和插值。一些 shell 构造在子进程中运行,而构造包含的变量在父进程中展开。在设计可能受到攻击的系统时,所有这些都与 KISS 原则背道而驰。

    【讨论】:

      【解决方案2】:

      可能是因为它很容易搞砸。当PATH 设置不正确时,您的脚本将开始执行错误的命令。在字符串中的某处放置一个空格可能会导致它稍后变成两个字符串。这些可能导致可利用的安全漏洞。简而言之:shell 为您的脚本的行为方式提供了一些保证,但它们对于真正安全的编程来说太弱或太复杂了。

      (对此我想补充一点,安全编程本身就是一门艺术,任何语言都可能搞砸。)

      【讨论】:

        【解决方案3】:

        我不同意这种说法,因为脚本本身并不安全。如果遵循一些简单的准则,Bash 脚本是绝对安全的:

        • 脚本中是否包含其他人无法查看的信息? 如果是这样,请确保它只能由所有者读取。
        • 脚本是否依赖于来自某个地方的输入数据?如果是这样,请确保输入数据 不能以任何方式被污染,或者可以检测到被污染的数据 并丢弃。
        • 其他人是否尝试运行 脚本?如果是这样,与第一点一样,确保没有人可以执行它,最好不要从中读取。 chmod 0700 通常对于执行系统功能的脚本来说是个好主意。
        • 您希望脚本具有 setuid(通过其解释器)的情况是 极为罕见

        将脚本与已编译程序分开的两点是源代码是可见的,以及解释器执行它。只要解释器​​没有受到损害(例如上面有一个 setuid 位),就可以了。

        在编写脚本来执行系统任务时,拼写错误和错误以及编写时的一般人为错误在某种程度上代表潜在的安全故障,但编译程序也会出现这种情况(很多人倾向于忽略编译后的程序也可以反汇编)

        值得注意的是,在大多数(如果不是全部)Linux 风格中,大多数(如果不是全部,事实上,想不出任何不是的)服务是通过 shellscript 启动的。

        【讨论】:

        • 当一个脚本不可读时,它就不能执行。脚本上的 Setuid 甚至是不可能的。
        【解决方案4】:
        • 坏男孩更容易让 shell 脚本以不同的方式工作(它与其他进程、PATH、shell 函数、prifile 交互很多)
        • 好孩子更难处理敏感数据(传递密码等)

        【讨论】:

          猜你喜欢
          • 2011-10-31
          • 1970-01-01
          • 2011-11-19
          • 2017-12-13
          • 1970-01-01
          • 2013-04-20
          • 1970-01-01
          • 1970-01-01
          • 2017-12-05
          相关资源
          最近更新 更多