Fortify扫描结果

上传人:jiups****uk12 文档编号:54813795 上传时间:2018-09-19 格式:PPT 页数:21 大小:177.50KB
返回 下载 相关 举报
Fortify扫描结果_第1页
第1页 / 共21页
Fortify扫描结果_第2页
第2页 / 共21页
Fortify扫描结果_第3页
第3页 / 共21页
Fortify扫描结果_第4页
第4页 / 共21页
Fortify扫描结果_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《Fortify扫描结果》由会员分享,可在线阅读,更多相关《Fortify扫描结果(21页珍藏版)》请在金锄头文库上搜索。

1、Fortify Source Code Analysis Suite 安全扫描介绍,Fortify Source Code Analysis Suite是美国Fortify Software为软件开发企业提供的软件源代码安全漏洞扫描、分析和管理的工具。使用该工具能弥补软件开发人员、安全人员和管理人员在源代码方面的安全知识不足,加速代码安全审计和方便软件安全风险的管理。,Fortify SCA的组成及组件介绍,Fortify Source Code Analysis Engine(源代码安全分析引擎) Fortify Secure Code rules(软件安全代码规则集) Fortify Au

2、dit Workbench (安全审计工作台) Fortify Rules Builder(安全代码规则构建器) Fortify Source Code Analysis Suite plug in(Fortify SCA IDE集成开发插件) Fortify Manager(软件安全管理器),对部分软件版本扫描结果统计 (具体解释在后面),1-SQL注入,根据用户输入来构造一个动态的SQL 语句,这有可能使得攻击者能够修改语句的意思,或者执行任意的SQL 指令。SQL注入错误发生在: 1) 输入程序的数据来自于不可信源。 2) 这些数据被用于动态构建SQL查询。,1-SQL注入-例,下面的代

3、码动态构建和执行一个SQL查询,查找与给定名称匹配的item。查询限定只有当当前用户名与item的所有者名称匹配时,才向当前用户显示item。.String userName = ctx.getAuthenticatedUserName();String itemName = request.getParameter(“itemName“);String query = “SELECT * FROM items WHERE owner = “+ userName + “ AND itemname = “+ itemName + “; ResultSet rs = stmt.execute(qu

4、ery);.,1-SQL注入-例,代码中的查询原本希望执行如下语句:SELECT * FROM items WHERE owner = AND itemname = ; 然而,因为查询语句是通过连接常量字符串和用户输入的字符串来动态构造,所以只有当itemName中不包含单引号字符时,查询才能正确执行。如果一个用户名为wiley的攻击者输入字符串“name OR a=a”作为itemName的值,那么查询会变成如下形式:SELECT * FROM itemsWHERE owner = wileyAND itemname = name OR a=a; 额外的条件OR a=a导致了子句的值总是为t

5、rue,于是该查询语句从逻辑上来说等价于:SELECT * FROM items;,1-SQL注入-解决方案,使用参数化的SQL 参数化的SQL请求是防止SQL注入的最好方法通过row级别的访问控制来使用数据库不要依赖应用程序访问控制能够保护数据库的数据,限制每个请求使用户只能访问他们自己的数据,2-跨站脚本(Cross-Site Scripting),向浏览器发送未经验证的数据会使浏览器执行恶意代码,2-跨站脚本,跨站脚本发生在以下两种情况: 1)数据通过不可靠的源进入Web application,大多数情况下是web request 2)包含在动态内容中的数据在没有经过安全检测就发送给网

6、络用户。 发给web浏览器的恶意内容通常以JavaScript段的形式出现,但也包括HTML, Flash或者其他浏览器能够执行的代码类型。基于XSS的攻击种类几乎是无限的,但是它们通常会包括:传送私有数据(如cookies或者其他session信息)给攻击者,将受害者的浏览器重定向到攻击者所控制的web内容中,或者假借有漏洞的站点在用户机器上进行其他恶意操作。,2-跨站脚本-例,Example 1: 下面的JSP 代码段从一个HTTP request中读雇员的eid ,并将它 显示出来,如果eid包含源代码,该源代码就会被浏览器执行。.Employee ID: Example 2: 下面的J

7、SP 代码段根据一个雇员的ID在数据库中查询对应的名字,并将其打印出来 。如果数据库中的数据来源于用户的输入并没有进行相应的安全性检查,将会造成用户的浏览器执行恶意代码。Employee Name: ,2-跨站脚本-例,当name符合规范的时候,这段代码能够正确运行。但当name有问题时,代码段中并没有任何措施来阻止其运行。造成XSS攻击的原因是HTTP响应中包含了未经验证的数据。 XSS攻击可以通过三种媒介侵入受害者: 1)数据直接从HTTP请求中读取,在HTTP响应中反射回去。反射型XSS通常是由攻击者诱使用户向有漏洞的web应用程序提供危险内容,然后这些危险内容会反射给用户并由浏览器执行

8、。传递恶意内容最常见的方法是将恶意内容作为一个参数包含在URL中,然后将URL公开发布或者通过email发给受害者。以这种形式构造的URL是很多钓鱼(phishing)圈套的核心,通过钓鱼圈套,攻击者获取受害者的信任,诱使受害者访问指向有漏洞站点的URL。当站点将攻击者的内容反射给用户后,恶意内容将被执行,从用户机器上窃取用户的私有信息(如包含session信息的cookies)发送给攻击者或者进行其他恶意活动。 2) 应用程序在数据库或者其它可信数据源中存储了危险数据。这些危险数据随后被应用程序读取并包含在动态内容中。存储型XSS通常是由攻击者将危险内容注入数据存储中,然后该内容被读出并包含

9、在动态内容中。在攻击者看来,注入恶意内容最理想的地方要么是用户访问量大的地方,要么是能引起用户兴趣的地方。这些被攻击者感兴趣的用户通常能够提高该应用程序的权限或者交互一些对攻击者而言有价值的敏感数据。如果这种用户执行了恶意内容,攻击者就有可能假冒用户执行一些特殊操作或者访问属于用户的敏感数据。 3) 应用程序外部的数据源中存储了危险数据,这些危险数据随后被应用程序作为可信数据读取并包含在动态内容中,2-跨站脚本-解决方案,跨站脚本攻击都是由于对用户的输入没有进行严格的过滤造成的,所以我们必须在所有数据进入应用程序之前把可能的危险拦截。针对非法的HTML代码包括单双引号等,可以编写函数对其进行过

10、滤。 在数据发送给客户前进行编码或者加密 ,防止发生跨站脚本。,3-系统信息泄露(System Information Leak),问题简介 暴露系统数据或者调试信息会帮助攻击者了解系统并制定攻击计划。详细描述 根据系统设置,该信息可能出现在控制台、写入日志文件或者暴露给一个远程用户。在某些情况下,错误信息会准确的告诉攻击者系统容易遭受哪类攻击。举个例子,数据库错误信息可能会暴露应用程序容易遭受SQL注入攻击。其他错误信息可能会暴露更多关于系统的间接线索。在上述例子中,搜索路径可能会暗含操作系统的类型信息、系统安装的应用程序信息以及管理员放入程序配置的信息。,3-系统信息泄露-解决方案,创建一

11、个默认的错误页面 对所有的异常构造统一的错误页面,包括HTTP错误和未经处理的异常 使用通用的错误消息要确定你的应用的错误信息不会泄露系统信息以及出错原因等敏感信息,4-竞态条件:单独的成员域,问题简介 Servlet成员域可能允许一个用户看到另一个用户的数据。 详细描述 很多Servlet开发者并没有认识到:只有当一个Servlet实现了SingleThreadModel接口时,这个Servlet才是单独的。否则只会有一个Servlet实例,这个Servlet实例被反复使用,用来处理不同线程同时进行的多个请求。 这种误解所造成的一个常见的后果就是开发者在使用Servlet成员域的时候,一个用

12、户可能会在不经意间看到另一个用户的数据。换句话说,将用户数据存储在Servlet成员域中会导致数据访问的竞态条件。,4-竞态条件:单独的成员域,下面的Servlet将一个请求的参数值存储在成员域中,然后在响应输出流中将该参数值输出。public class GuestBook extends HttpServlet String name;protected void doPost (HttpServletRequest req,HttpServletResponse res) name = req.getParameter(“name“);.out.println(name + “, tha

13、nks for visiting!“);,4-竞态条件:单独的成员域,在单用户环境下该代码可以完美的运行,但是如果在差不多同一时间有2个用户访问这个Servlet,那么处理这2个请求的线程很可能以如下方式工作: Thread 1: 分配 “Dick“ 给 name Thread 2: 分配 “Jane“ 给 name Thread 1: 打印 “Jane, thanks for visiting!“ Thread 2: 打印 “Jane, thanks for visiting!“ 这样就把第2个用户的名字显示给了第1个用户。 将用户数据存储在Servlet成员域中会导致数据访问的竞态条件,5

14、-密码管理:源代码中的密码(Password Management: Hardcoded Password),将密码放在源代码中决不是一个好主意。源代码中的密码不仅使得所有的工程开发者可以看到密码,还使得修改问题变得非常麻烦。一旦这种代码出现在产品中,那么不对软件进行修改就无法改变密码。如果密码保护的帐户受到了安全威胁,那么系统的所有者将不得不在安全性和实用性之间做出选择。,5-源代码中的密码-例,Example:下面的代码使用源代码中的密码来连接数据库。.DriverManager.getConnection(url, “scott“, “tiger“);. 代码能够成功运行,但是任何人只要

15、能够访问该代码,就能读取密码。一旦程序开始运行,就没有办法对数据库用户scott和密码tiger进行改动,除非修改程序。如果攻击者能够访问该信息,就能用它来侵入系统。更糟的是,如果攻击者能够访问应用程序的class文件,他们就能用javap c命令分解代码,找出包含的密码值。这种操作可能以如下形式:javap -c ConnMngr.class22: ldc #36; /String jdbc:mysql:/ ldc #38; /String scott26: ldc #17; /String tiger,6-其他-输入处理,命令注入攻击主要是因为对用户输入或者环境变量值没有进行验证所造成的。为了防范命令注入攻击,我们应该对用户输入进行校验,过滤非法字符(如“&”等)。同时,在程序中应该尽量不要从环境变量中读入数据,即使不得不依赖环境变量,也应该严格限制这些变量的路径和所起的作用,减少程序受到的影响。 此外,还可以去除应用程序不必要的特殊权限。因为很多攻击只有在获得高级特权时才有意义,所以减少程序拥有的特权可以降低被攻击的风险。,6-其他-输入处理,保证所有的输入信息是被验证过的 程序默认就要对输入的信息进行验证,不能通过验证的将会被拒绝,同时使所有变量在使用之前的验证过程尽量简单 。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号