5

有人可以帮助我了解以下攻击是什么以及java如何使这些攻击成为不可能:

  1. 超出常规堆栈 - 蠕虫和病毒的常见攻击
  2. 破坏自己进程空间之外的内存
  3. 未经许可读取或写入文件。

我精通 c/c++ 并从 java 开始,所以请帮助我理解这些。

4

3 回答 3

5

由于几个原因,Java 是一种相当安全的语言,主要集中在您的 3 点上,Java 比其他语言更安全,主要是因为它在自己的虚拟机中执行字节码指令,而不是本机代码。它不允许越界数组访问,并且没有指针访问。这几乎回答了你的前 2 点。至于未经许可的阅读和写作,我不确定你的意思。本质上,文件读取和写入是在操作系统级别控制的。如果没有利用某种漏洞来获得比应有的更多权限,无论它是用什么语言编写的,程序都无法写入或读取操作系统禁止它使用的文件。如果您的意思是从应用程序的角度来看未经许可,例如插件系统,

于 2012-12-12T09:31:04.983 回答
5

首先,安全问题更多的是实现问题,而不是语言问题。Java 确实强加了一些在 C++ 中是可选的(并且在运行时非常昂贵)的安全检查(边界检查等)。关于您的具体问题:

  1. 我认为这是指经典的缓冲区溢出问题,这通常是 C 中的一个问题。在 C++ 中,我们使用std::vector,它可以(并且通常会,至少在给出正确的编译器选项时)执行与 Java 相同的检查。另一方面,如果它确实是指堆栈溢出(例如由于递归太深),那么由于JVM的堆栈不是机器堆栈,Java可以进行额外的检查,并且还可以保证内存不足堆栈溢出时的异常。(这在 C++ 中也是可能的,但我不知道有哪个编译器可以做到这一点。而且操作系统并不总是那么容易。)

  2. 这是操作系统问题,不是语言问题。现代操作系统不允许程序访问它们自己的进程空间之外的内存,因此 Java 和 C++ 都不允许。

  3. 如上所述,这是一个操作系统问题,而不是语言问题,现代操作系统执行得相对较好,无论程序是用 Java 还是 C++ 编写的。

总而言之,无论是哪种语言,2 和 3 都是不可能的,并且 1 在编写良好的 C++ 中不会出现(尽管在过去使用 C 时这是一个问题)。

于 2012-12-12T10:08:36.047 回答
4

安全是相对的东西。由于 Java 在虚拟机中运行,它可以自我保护 C 中出现的一些经典问题。

超出常规堆栈 - 蠕虫和病毒的常见攻击

Java 有一个明确的抛出 StackOverflowError 的行为,你不能绕过它。

破坏自己进程空间之外的内存

恕我直言,这确实是操作系统的考虑因素。即使在 C 中,您的操作系统也可以保护您的进程免于修改其他进程的内存。无论操作系统是否提供此功能,Java 都会保护您不让您访问任意内存位置。大多数现代操作系统都提供这种保护。

未经许可读取或写入文件。

同样,您的操作系统可以保护您免于在 C 中执行此操作,并且应该是您的第一道防线。Java 所做的是允许您运行不受信任的代码并保护您的文件,即使您可以访问它们,但阻止您的程序之一访问它们。Java 有两种机制,SecurityManager 和 AccessControl。

于 2012-12-12T09:30:53.127 回答