最近,openssl 库被发现存在严重缺陷,使攻击者能够读取高达 64KB 的内存。
http://blog.existentialize.com/diagnosis-of-the-openssl-heartbleed-bug.html
原因似乎是由于使用了 memcpy 而没有交叉检查攻击者提供的输入的大小。
如果我们假设标准库(不调用 C),Java 对这些类型的安全漏洞免疫吗?
为了更具体地说明安全漏洞的类型,我指的不是信任用户输入,而是特别是有限的内存访问。
最近,openssl 库被发现存在严重缺陷,使攻击者能够读取高达 64KB 的内存。
http://blog.existentialize.com/diagnosis-of-the-openssl-heartbleed-bug.html
原因似乎是由于使用了 memcpy 而没有交叉检查攻击者提供的输入的大小。
如果我们假设标准库(不调用 C),Java 对这些类型的安全漏洞免疫吗?
为了更具体地说明安全漏洞的类型,我指的不是信任用户输入,而是特别是有限的内存访问。
Java 更安全,因为它不使用指针算法,不进行边界检查,并且(通常)不允许访问任意内存块(参见sun.misc.Unsafe!)。
但是,原则上,如果根据不受信任的客户端提供的偏移量从数组、ByteBuffer 等读取和写入字节,则可能会出现类似的问题。问题大大减少了,因为只能攻击该数组(或类似容器)范围内的数据,而不是任意相邻对象中的数据。
即使使用Unsafe
,通常也会是,呃,安全,因为人们倾向于使用它来分配和访问一组非常特定的性能关键对象,而不是整个应用程序(包括加密密钥、密码等)。
基本问题是信任用户输入,这可能发生在任何语言和各种上下文中,例如 SQL 注入。