Fortify扫描结果
• 问题简介 • 暴露系统数据或者调试信息会帮助攻击者了解系统并制定 攻击计划。 • 详细描述 • 根据系统设置,该信息可能出现在控制台、写入日志文件 或者暴露给一个远程用户。在某些情况下,错误信息会准 确的告诉攻击者系统容易遭受哪类攻击。举个例子,数据 库错误信息可能会暴露应用程序容易遭受SQL注入攻击。 其他错误信息可能会暴露更多关于系统的间接线索。在上 述例子中,搜索路径可能会暗含操作系统的类型信息、系 统安装的应用程序信
1-SQL注入-解决方案
• 使用参数化的SQL 参数化的SQL请求是防止SQL注入的最好方法 • 通过row级别的访问控制来使用数据库 不要依赖应用程序访问控制能够保护数据库的数 据,限制每个请求使用户只能访问他们自己的数 据
2-跨站脚本(Cross-Site Scripting)
2-跨站脚本-解决方案
• 跨站脚本攻击都是由于对用户的输入没有 进行严格的过滤造成的,所以我们必须在 所有数据进入应用程序之前把可能的危险 拦截。针对非法的HTML代码包括单双引号 等,可以编写函数对其进行过滤。 • 在数据发送给客户前进行编码或者加密 , 防止发生跨站脚本。
3-系统信息泄露(System Information Leak)
Fortify SCA的组成及组件介绍 的组成及组件介绍
• • • • • • Fortify Source Code Analysis Engine(源代码安全分析引擎 源代码安全分析引擎) 源代码安全分析引擎 Fortify Secure Code rules(软件安全代码规则集) (软件安全代码规则集) Fortify Audit Workbench (安全审计工作台) 安全审计工作台) Fortify Rules Builder(安全代码规则构建器) 安全代码规则构建器) 安全代码规则构建器 Fortify Source Code Analysis Suite plug in(Fortify SCA IDE集成开发插件 集成开发插件) ( 集成开发插件 Fortify Manager(软件安全管理器) (软件安全管理器)
5-密码管理:源代码中的密码(Password Management: Hardcoded Password)
• 将密码放在源代码中决不是一个好主意。 源代码中的密码不仅使得所有的工程开发 者可以看到密码,还使得修改问题变得非 常麻烦。一旦这种代码出现在产品中,那 么不对软件进行修改就无法改变密码。如 果密码保护的帐户受到了安全威胁,那么 系统的所有者将不得不在安全性和实用性 之间做出选择。
对部分软件版本扫描结果统计
(具体解释在后面)
ocrm SQL注入 注入 跨站脚本 用户信息泄露 系统信息泄露 源代码中出现密码 39 133 10 16 11 ipss 14 6 8 fesp 6 3
Hot总数 总数
209
28
9
1-SQL注入
• 根据用户输入来构造一个动态的SQL 语句, 这有可能使得攻击者能够修改语句的意思, 或者执行任意的SQL 指令。 • SQL注入错误发生在: 1) 输入程序的数据来自于不可信源。 2) 这些数据被用于动态构建SQL查询。
1-SQL注入-例
• • • • • 代码中的查询原本希望执行如下语句: SELECT * FROM items WHERE owner = <userName> AND itemname = <itemName>; 然而,因为查询语句是通过连接常量字符串和用户输入的字符串来动态构造, 所以只有当itemName中不包含单引号字符时,查询才能正确执行。如果一个 用户名为wiley的攻击者输入字符串“name' OR 'a'='a”作为itemName的值, 那么查询会变成如下形式: SELECT * FROM items WHERE owner = 'wiley' AND itemname = 'name' OR 'a'='a'; 额外的条件OR 'a'='a'导致了子句的值总是为true,于是该查询语句从逻辑上 来说等价于: SELECT * FROM items;
2-跨站脚本-例
• 当name符合规范的时候,这段代码能够正确运行。但当name有问题时,代码段中并 没有任何措施来阻止其运行。造成XSS攻击的原因是HTTP响应中包含了未经验证的数 据。 • XSS攻击可以通过三种媒介侵入受害者: 1)数据直接从HTTP请求中读取,在HTTP响应中反射回去。反射型XSS通常是由攻击者 诱使用户向有漏洞的web应用程序提供危险内容,然后这些危险内容会反射给用户并由 浏览器执行。传递恶意内容最常见的方法是将恶意内容作为一个参数包含在URL中, 然后将URL公开发布或者通过email发给受害者。以这种形式构造的URL是很多钓鱼 (phishing)圈套的核心,通过钓鱼圈套,攻击者获取受害者的信任,诱使受害者访问 指向有漏洞站点的URL。当站点将攻击者的内容反射给用户后,恶意内容将被执行, 从用户机器上窃取用户的私有信息(如包含session信息的cookies)发送给攻击者或者 进行其他恶意活动。 2) 应用程序在数据库或者其它可信数据源中存储了危险数据。这些危险数据随后被应用 程序读取并包含在动态内容中。存储型XSS通常是由攻击者将危险内容注入数据存储 中,然后该内容被读出并包含在动态内容中。在攻击者看来,注入恶意内容最理想的 地方要么是用户访问量大的地方,要么是能引起用户兴趣的地方。这些被攻击者感兴 趣的用户通常能够提高该应用程序的权限或者交互一些对攻击者而言有价值的敏感数 据。如果这种用户执行了恶意内容,攻击者就有可能假冒用户执行一些特殊操作或者 访问属于用户的敏感数据。 3) 应用程序外部的数据源中存储了危险数据,这些危险数据随后被应用程序作为可信数 据读取并包含在动态内容中
Fortify Source Code Analysis Suite 安全扫描介绍
• Fortify Source Code Analysis Suite是美国 是美国Fortify 是美国 Software为软件开发企业提供的软件源代码安全漏 为软件开发企业提供的软件源代码安全漏 为软件开发企业提供的软件源代码 洞扫描、分析和管理的工具 的工具。 洞扫描、分析和管理的工具。使用该工具能弥补软 件开发人员、安全人员和管理人员在源代码方面的 件开发人员、 安全知识不足,加速代码安全审计和方便软件安全 审计和方便软件 安全知识不足,加速代码安全审计和方便软件安全 风险的管理。
5-源代码中的密码-例
• Example:下面的代码使用源代码中的密码来连接数据库。 • ... • DriverManager.getConnection(url, "scott", "tiger"); • ... • 代码能够成功运行,但是任何人只要能够访问该代码,就能读取密码。 一旦程序开始运行,就没有办法对数据库用户scott和密码tiger进行改 动,除非修改程序。如果攻击者能够访问该信息,就能用它来侵入系 统。更糟的是,如果攻击者能够访问应用程序的class文件,他们就能 用javap –c命令分解代码,找出包含的密码值。这种操作可能以如下 形式: • javap -c ConnMngr.class • 22: ldc #36; //String jdbc:mysql:///rxsql • 24: ldc #38; //String scott • 26: ldc #17; //String tiger
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成员域中会导致数据访问的竞态 条件
2-跨站脚本-例
• • • • • • • • • • • • • • Example 1: 下面的JSP 代码段从一个HTTP request中读雇员的eid ,并将它 显示出来,如果eid包含源代码,该源代码就会被浏览器执行。 <% String eid = request.getParameter("eid"); %> ... Employee ID: <%= eid %> Example 2: 下面的JSP 代码段根据一个雇员的ID在数据库中查询对应的名字,并将其 打印出来 。如果数据库中的数据来源于用户的输入并没有进行相应的安全性检查,将 会造成用户的浏览器执行恶意代码。 <%... Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from emp where id="+eid); if (rs != null) rs.next(); String name = rs.getString("name"); %> Employee Name: <%= name %>
3-系统信息泄露-解决方案 • 创建一个默认的错误页面 对所有的异常构造统一的错误页面,包括 HTTP错误和未经处理的异常 • 使用通用的错误消息 要确定你的应用的错误信息不会泄露系统 信息以及出错原因等敏感信息
4-竞态条件:单独的成员域
• • • • 问题简介 Servlet成员域可能允许一个用户看到另一个用户的数据。 详细描述 很多Servlet开发者并没有认识到:只有当一个Servlet实现 了SingleThreadModel接口时,这个Servlet才是单独的。 否则只会有一个Servlet实例,这个Servlet实例被反复使用, 用来处理不同线程同时进行的多个请求。 • 这种误解所造成的一个常见的后果就是开发者在使用 Servlet成员域的时候,一个用户可能会在不经意间看到另 一个用户的数据。换句话说,将用户数据存储在Servlet成 员域中会导致数据访问的竞态条件。