在安全性方面使用getenv

时间:2012-07-06 14:39:46

标签: c

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

代码的例子:

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

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

5 个答案:

答案 0 :(得分:4)

让我添加现有答案,为您提供更广泛的软件保护视图。

黑客不仅会使用strace,他们会使用他们工具箱中的任何工具,但为了增加复杂性,或许只是开始,只需要{{} {1}}在大多数情况下。我所知道的大多数黑客都天生懒惰,因此会采取阻力最小的道路。 (注意: hacker 我的意思是技术上非常熟练的人,不是黑客 - 后者通常具有相同的技能组合,但是具有不同的道德规范)。

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

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

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

大多数情况下的一般问题是,一方面你信任用户(因为你卖给他们),但另一方面你不信任他们(因为你试图以某种方式保护你的软件)。当你以这种方式看待它时,你可以看到它实际上是徒劳的。大多数情况下,你会对诚实的客户不满,而只是稍微推迟攻击者(软件保护是二进制的:要么保护它,要么不提供保护,即它已经破解)。

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

另一种选择当然是提供服务而不是软件。因此,您可以为用户提供软件发送到服务器的令牌。然后,服务器基于解码令牌(我们假设为加密消息)并检查有效性来提供更新(或任何服务)。在这种情况下,用户只会收到令牌,但永远不会收到解密它的密钥,另一方面,您的服务器必须验证令牌。称之为产品密钥或其他什么,有几种方法可以想象。关键是你不会在同时信任和不信任用户的矛盾中结束。您只是不信任该用户,并且可以将该令牌列入黑名单(如果已被滥用)。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

我们还可以LD_PRELOAD getenv函数显示参数receive

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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