我对学习安全编码最佳实践(特别是Java应用程序)感兴趣,我正在阅读OWASP的安全编码实践清单。在他们的内存管理部分,他们陈述以下内容:
避免使用已知的易受攻击的功能(例如,
printf
、strcat
、strcpy
等)。
我不是 C/C++ 开发人员,但这肯定意味着上述函数中存在安全漏洞。我搜索了几次易受攻击的Java方法,我想出的只是这个CVE。
哪些 Java SE/EE 方法(如果有)适用于 OWASP 的此公告?
对于 C API,是的,如果不仔细检查参数,则可能会通过执行意外的内存损坏而导致这些函数出现问题。
在 Java 中,由于所有操作都是自动检查的,因此此类内存损坏漏洞不应发生(除非实现中的错误)。
这些是特别容易出现缓冲区溢出和格式字符串攻击的 C 函数。
Java通常没有这些问题,但同样的经验法则适用 - 不要相信你的输入。
反射和序列化
Java的反射API可能是漏洞的来源。
如果攻击者可以导致他们为您提供的字符串的一部分被视为类、方法或属性名称,那么他们通常会导致您的程序执行您不希望执行的操作。
例如
ObjectInputStream in = ...;
MyType x = (MyType) in.readObject();
将允许控制in
上内容的攻击者导致加载和初始化 CLASSPATH 上的任何类,并允许调用 CLASSPATH 上任何可序列化类的任何构造函数。 例如,如果你碰巧在CLASSPATH上有一个JS或Python解释器,他们可能能够访问String -> JavaScript/Python函数类,从那里他们可以通过Java反射访问更强大的方法。
javax.script
javax.script
在Java 6中可用,并允许将字符串转换为嵌入式脚本语言的源代码。 如果不受信任的输入到达这些接收器,它们可能能够使用脚本引擎对 Java 反射的访问来访问文件系统或 shell,以当前进程所有者的权限执行任意用户环指令。
.XML
Java 与其他语言一样容易受到外部实体攻击,XML 输入中的外部实体可用于包含来自本地网络的 URL 的内容。
如果您不挂接到java.net.SocketFactory
或使用SecurityManager
来过滤传出连接,那么任何不允许您将出现在 DTD 中的 URL 列入白名单的 XML 解析方法都容易受到攻击。
运行时/进程生成器
也不是特定于 Java,但Runtime
和ProcessBuilder
允许访问本地文件系统上的可执行文件。 任何攻击者控制的字符串都可能用于提升权限。