在机器上运行时,编译源代码(C+;+;,Java等)涉及哪些安全问题?

在机器上运行时,编译源代码(C+;+;,Java等)涉及哪些安全问题?,java,c++,security,compilation,Java,C++,Security,Compilation,我只是想知道编译后的源代码是否真的存在安全问题 我在想,既然源代码已经编译成机器代码,那么当机器已经在执行指令(即编译的源代码)时,就不应该存在任何类型的安全问题 我没有在网上找到任何好的相关解释。当然他们有安全问题 示例: 想象一下,一个简单的C/C++代码正在将标准输入中的字符读入字符缓冲区,而程序员没有检查输入的长度。这种代码容易受到攻击 。有了机器代码,我们就可以获得更高级别的可读代码。如果有足够的时间,您可以找到硬编码密钥或一些秘密算法,例如,在发送高分时在游戏中使用的加密方法 在运行

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

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


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

当然他们有安全问题

示例:

  • 想象一下,一个简单的C/C++代码正在将标准输入中的字符读入字符缓冲区,而程序员没有检查输入的长度。这种代码容易受到攻击

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

  • 在运行时篡改内存中的变量。例如,您有一个分数为100的游戏,所以您正在分配给执行进程的内存中查找这100,假设您找到了4个具有该值的地址。后来你得到10分,所以你有110分。那么,您正在检查这4个地址-其中一个现在包含110。如果你最终找到了1个地址-宾果。现在,您可以使用任何您喜欢的内容覆盖它,例如999999


  • 编译代码的一个主要安全问题是,您不知道它做什么——您无法轻松地检查它。这使得您必须只运行来自可信源的编译代码(软件)

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

    还有一些问题,如缓冲区溢出、SQL注入、Peek'n'Poke等,这些问题可能仍然存在


    编译不是为了安全,而是为了效率。如果你对安全性抱有期望,你可能会想研究模糊处理,但这是另一种蠕虫……

    关于代码安全性的文献。我的一个同事桌上有东西,但我不记得了。谷歌搜索“软件代码安全性”会产生一些有希望的结果。我认为这个问题并不适合这个网站。但是有一点:您如何验证编译后的代码是否确实执行了您认为应该执行的操作?如何验证编译器没有向其中添加某些内容,例如键盘记录器代码?此外,通过执行这些指令,您还可以将数据存储在内存中。其中的所有内容都可能对您不期望的人可见(尽管这样做可能并不容易)。如果您有一个可验证的系统(如.NET),您可以排除许多攻击向量,如缓冲区溢出。不过,这并不妨碍应用程序在内存中以明文形式存储密码。应用程序不会神奇地变得100%安全。所有这些都与是否编译代码无关。你的意思是像那些经常从Microsoft获得安全更新的代码?可能是完全安全的,微软只是假装存在安全问题,因为他们从中赚钱。@molbdnilo有一句话你是对的:安全是一个过程,而不是一个产品。如果你想教育自己什么是可验证的安全真正意味着阅读和阅读。也可能是有启发性的。很好的例子。这是我年轻时经常做的事……我不明白你的第二个例子。编译后的代码通常比中间代码(Java字节码,CIL)或源代码(在Lua这样的脚本环境中)更难进行反向工程。@IInspectable你完全正确,这更难。但问题是,编译代码的安全性问题是什么。逆向工程当然是一个安全问题。