【问题标题】:using getenv with respect to security在安全方面使用 getenv
【发布时间】:2012-07-06 23:45:36
【问题描述】:

如果我使用getenv() 禁用我的程序的某些验证(例如许可证检查),黑客是否能够轻松发现相关的环境变量(使用 strace 或其他?)

代码示例:

if (! getenv("my_secret_env_variable")) checkLicense();

(另一方面,如果我检查了特定文件的存在,黑客会立即使用 strace 看到它)

【问题讨论】:

  • 只有一个问题 - 如果您正在开发代码(或您的程序员) - 为什么不给自己一个许可证?
  • 许可证示例只是一个示例。真正的事情是:我想禁用看门狗。
  • @user803422: ...那么你有很多东西要学,年轻的学徒:)
  • 能够通过环境变量打开调试等(即,如果小心不会有安全风险)或任何人都可以更容易地削减你的薪水之间存在很大差异。

标签: c


【解决方案1】:

让我补充现有的答案,让您对软件保护有更广泛的了解。

黑客不会只使用strace,他们会使用他们工具箱中的任何工具,但为了增加复杂性,也许只是开始strings这样简单的东西在大多数情况下。我认识的大多数黑客天生就是懒惰的,因此会选择阻力最小的道路。 (注意:hacker 我指的是技术上非常熟练的人,不是破解者 - 后者通常具有相同的技能组合,但道德规范不同)。

一般来说,从逆向工程师的角度来看,几乎任何东西都可以“破解”或解决。问题是攻击者有多少时间和/或决心。考虑到一些学生可能只是为了搞笑而这样做,而一些“发布组”这样做是为了在他们的“场景”中成名。

我们以硬件加密狗为例。大多数软件作者/公司认为他们在授权某些加密狗时会以某种方式神奇地“购买”安全性。但是,如果他们对系统的实施不小心,那么解决方法就像您的尝试一样简单。即使他们足够小心,通常仍然可以模拟加密狗,尽管提取加密狗上的信息需要一些技巧。一些加密狗(我不会对你隐瞒这个事实)因此是“智能的”,这意味着它们包含一个 CPU 甚至是一个成熟的嵌入式系统。如果软件产品的重要部分在加密狗上执行,并且所有进入加密狗的都是输入,而所有离开加密狗的都是输出,那么这就提供了很好的保护。但是,在大多数情况下,它同样会惹恼诚实的客户和攻击者。

或者让我们将加密作为另一个例子。许多开发人员似乎没有掌握公共密钥和密钥的概念,并认为将密钥“隐藏”在代码中会使其更安全。好吧,它没有。代码现在包含算法和密钥,这对攻击者来说有多方便?

大多数情况下的普遍问题是,一方面您信任用户(因为您向他们销售产品),但另一方面您不信任他们(因为您试图以某种方式保护您的软件)。当您以这种方式看待它时,您会发现它实际上是多么徒劳。大多数情况下,您会激怒诚实的客户,而只是稍微延迟攻击者(软件保护是二元的:要么提供保护,要么不提供保护,即它已经被破解)。

请考虑 IDA Pro 的制造商所走的道路。他们在用户获取所有二进制文件之前为其添加水印。然后,如果这些二进制文件被泄露,可以采取法律措施。即使不考虑采取法律措施,他们也可以羞辱(并且已经羞辱)那些公开泄露其产品的人。此外,如果您对泄漏负责,您将不会被出售任何软件升级,IDA 的制造商也不会与您的雇主开展业务。这是保护您的 IDA 副本安全的一个很大的动力。现在,我明白了,IDA 在某种程度上是一种利基产品,但它的方法仍然有根本的不同,并且没有与传统的软件保护尝试相同的问题。

当然,另一种选择是提供服务而不是软件。所以你可以给用户一个令牌,软件发送到你的服务器。然后,服务器基于解码令牌(我们假设它是加密消息)和检查有效性提供更新(或任何服务)。在这种情况下,用户只会收到令牌,而不会收到解密它的密钥,另一方面,您的服务器必须验证令牌。称其为产品密钥或其他任何名称,人们可以想象出几十种方式。关键是您不会同时陷入信任和不信任用户的矛盾中。您只会不信任用户,例如,如果她的令牌被滥用,您可以将其列入黑名单。

【讨论】:

  • 这是一个很好的回答和批评。我一直这么认为。您能做的最好的事情就是让破解代码变得困难且不值得。为了克服这个问题,要么提供服务(提供对数据库的访问等),要么解决一些错误,然后在下一个版本中更正它们。只是一个愤世嫉俗的老混蛋。
  • @airza:我写了“几乎任何东西”。我相当谨慎,因为我描述的“服务”无法在不损害服务器的情况下被破解。我描述的“智能”加密狗也是如此,除非你拥有远远超出你通常所面对的资源和技能。在这种情况下,我们谈论的是普通银行木马与 Stuxnet、Duqu 或 Flame 的区别 :)
【解决方案2】:

是的。在已编译的二进制文件中很容易发现任何硬编码的字符串。库调用也很容易看到。也可以将二进制文件中的字符串更改为其他内容。

【讨论】:

    【解决方案3】:

    我们也可以LD_PRELOADgetenv函数来显示参数接收

    【讨论】:

      【解决方案4】:

      黑客会立即通过 strace 看到它 - 也许你也应该看看 ltrace

      虽然您可能无法隐藏变量名,但为什么不需要值?特别是,您可以使用整数作为有效值 (atoi),因为它们在代码中更难发现,甚至是整数和单个字符的组合。但是请记住,环境块是内存中很容易找到的部分,尤其是在核心转储中。

      【讨论】:

      • OP 只使用getenv 来表示它的存在。假设这不是真的,那么它要么是字符串比较,要么是(如您所说)转换为 int。前者 - 简单,后者接下来的几行代码将包含一个 switch 或 if 语句。
      • @Ed Heal:也许我应该说整数在编译代码中更难发现。
      【解决方案5】:

      是的 - 简单。他们只是使用strings 找出要尝试的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多