【问题标题】:What are the security issues involved in compiled source codes (C++, Java, etc) when running on the machine? [closed]在机器上运行时编译的源代码(C++、Java 等)涉及哪些安全问题? [关闭]
【发布时间】:2013-09-17 09:08:54
【问题描述】:

我只是想知道源代码的编译形式是否真的存在安全问题?

我在想,既然源代码已经编译成机器代码,那么当机器已经在执行指令时(即编译的源代码)应该不会有任何安全问题。

我在网上没有找到任何好的和相关的解释。

【问题讨论】:

  • 有一些关于代码安全的文献。我的一位同事的桌子上有东西,但我不记得了。不过,谷歌搜索“软件代码安全”会产生一些有希望的结果。
  • 我认为这个问题不适合这个网站。但是有一些东西:你如何验证,编译的代码确实做了你认为它应该做的事情?您如何验证编译器没有向其中添加某些内容,例如键盘记录器代码?此外,通过执行指令,您还可以将数据保存在内存中。那里的所有东西都可能对您不期望的人可见(尽管这样做可能并不容易)。
  • 如果您有一个可验证的系统(例如 .NET),您可以排除许多攻击媒介,例如缓冲区溢出。不过,这不会阻止应用程序将密码以明文形式存储在内存中。应用程序不会神奇地变得 100% 安全。这些都与代码是否被编译无关。
  • 您的意思是像每隔一段时间从 Microsoft 获取安全更新的代码?可能完全安全,MS 只是假装存在安全问题,因为他们从中赚钱。
  • @molbdnilo 您有一个说法是正确的:安全是一个过程,而不是一个产品。如果您想了解可验证安全的真正含义,请阅读Type Safety and SecurityWriting Verifiably Type-Safe CodeImportance of Managed and Typesafe code 也可能很有启发性。

标签: java c++ security compilation


【解决方案1】:

他们当然有安全问题。

例子:

  1. 想象一个简单的 C/C++ 代码将标准输入中的字符读入 char 缓冲区,而程序员没有检查输入的长度。此类代码易受Buffer overflow 的攻击。

  2. Reverse engineering。有了机器码,我们可以使用decompiler 获得更高级别的可读性更高的代码。如果有足够的时间,您可以找到硬编码的密钥或一些秘密算法,例如在游戏中发送高分时使用的加密方法。

  3. 在运行时篡改内存中的变量。例如,您有一个得分为 100 的游戏,因此您正在分配给已执行进程的内存中寻找这 100,假设您找到了 4 个具有此值的地址。稍后你又得到 10 分,所以你有 110。所以,你正在检查这 4 个地址 - 其中一个现在包含 110。如果最终你找到了 1 个地址 - 宾果游戏。现在你可以用你喜欢的任何东西覆盖它,例如 999999。

【讨论】:

  • 很好的例子。那是我年轻时常做的事……
  • 我不明白你的第二个例子。编译后的代码通常比中间代码(Java 字节码、CIL)或源代码(在 Lua 等脚本环境中)更难进行逆向工程。
  • @IInspectable 你说得对,这更难。但问题是,编译代码的安全问题是什么。逆向工程当然一个安全问题。
【解决方案2】:

编译代码的主要安全问题之一是您不知道它的作用——您无法轻松检查它。这使得您必须只运行来自受信任来源的编译代码(软件)...

例如,我可能会给你写一个猜我的数字游戏,你可能会喜欢它,但谁能说当你忙着猜数字时,我还没有开始一个新的执行线程,它忙于复制所有数据在你的机器上?

还有缓冲区溢出、SQL 注入、Peek 'n' Poke 等问题仍然存在。

编译不是为了安全,而是为了效率。如果您遇到这种期望的安全性,您可能想要研究混淆,但那是完全不同的蠕虫罐......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    相关资源
    最近更新 更多