Time: 2019-11-24  百度文库

代码审计解决方案

  1前言

  代码审计技术是目前最流行的白盒安全测试技术。代码审计是指安全代码评估者通过阅读应用系统的源代码来发现潜在安全漏洞及隐患的技术手段,它可以弥补黑盒测试未能完全覆盖的漏洞环节与安全隐患,是一种可靠性、安全性最高的漏洞修补方法。

  2代码审计简介

  2.1基本概念

  代码安全审计是从安全的角度对代码进行的安全测试评估,通过分析当前应用系统的源代码,在熟悉业务系统的情况下,从应用系统结构方面检査其各模块和功能之间的关联、权限验证等内容;从安全性方面检查其脆弱性和缺陷。结合丰富的安全知识、编程经验、测试技术,利用静态分析和人工审核的方法寻找代码在架构和编码上的安全缺陷,在代码形成软件产品前将业务软件的安全风险降到最低

  代码审计服务的目的在于,让开发人员了解其开发的应用系统可能会面临的威胁,并指导开发人员正确修复程序缺陷。对下一步的编码安全规范性建设具有重大意义。通过实施代码安全审计,以较小成本快速发现系统中的代码安全漏洞快速评估系统代码安全风险,有助于增强系统安全性,抵御黑客恶意攻击,保护信息系统资产。

  2.2服务的必要性

  实践证明,程序的安全性是否有保障很大程度上取决于程序代码的质量,而保证代码质量最快捷有效的手段就是代码审计。

  在风险评估过程中,代码审计是一般脆弱性评估的一种很好的补充,代码审计服务的代码覆盖率为100%,能够找到一些安全测试所无法发现的安全漏洞。同时,由于主持代码审计的安全服务人员一般都具备丰富的安全编码经验和技能,所以其针对性比常见的脆弱性评估手段会更强、粒度也会更为细致

  2.3服务的收益

  2.3.1用户收益

  (1)明确安全隐患点

  代码审计能够对整个信息系统的所有源代码进行检査,从整套源代码切入最终明至某个威胁点并加以验证,以此明确整体系统中的安全隐患点。

  (2)提高安全意识

  如上所述,任何的隐患在代码审计服务中都可能造成“千里之堤溃于蚁穴”的效果,因此代码审计服务可有效督促管理人员杜绝任何一处小的缺陷,从而降低整体风险

  (3)提高开发人员安全技能

  在代码审计服务人员与用户开发人员的交互过程中,可提升开发人员的技能。另外,通过专业的代码审计报告,能为用户开发人员提供安全问题的解决方案,完善代码安全开发规范。

  2.3.2审计人员收益

  安全审计人员根据代码安全策略和项目的安全需求和风险控制人员共同制定安全规范。通过将规范贯彻到软件开发中来规避软件安全风险

  2.3.3其他价值

  (1)满足安全策略和安全需求

  OA人员可以从扫描报告中看出当前产品的安全特性是否通过了安全策略和产品的安全需求,确保不安全的应用不会发布到最终的生产环境中去提供大量数据域报告作为安全决策依据:提供的大量有关软件安全的分析和测试的数据报告,为OA人员和测试组在分析安全漏洞的原因,跟踪和定位安全问题根源提供依据,并为安全审计决策提供重要的参考价值。

  (2)对于渗透测试的价值

  为渗透测试提供代码级的细节,加速对渗透性测试中所发现的安全问题进行修复

  (3)提高安全知识水平

  软件安全测试报告及其相关文档资料弥补用户应用软件安全知识不足,尽快了解各种软件安全漏泂的成因和修复方法。

  (4)提高安全活动效率

  安全测试能够让这些繁琐的过程自动化,并且给出全面而精确的分析结果。源代码审计变得更高效。

  (5)提高修复安全问题的效率

  快速识别软件的安全隐患开发人员快速修复问题,可以为特定的风险和环境定制分析,获取一致的软件安全问题的报告和数据,帮助团队开发出安全的代码。

  2.4审计范围和周期

  代码审计的对象主要是基于PHP、JAVA、ASP、NET等WEB编程语言的WEB系统

  (1)新上线系统一—要求进行代码审计

  (2)已运行系统一一建议进行代码审计,每年至少1次

  2.5审核重点

  (1)与数据库交互的接口模块

  (2)与用户进行交互和身份验证的模块

  (3)代码中的关键模块

  2.6服务分类

  2.6.1整体代码审计

  整体代码审计是指代码审计服务人员对被审计系统的所有源代码进行整体的安全审计,代码覆盖率为100%,整体代码审计采用源代码扫描和人工分析确认相结合的方式进行分析,发现源代码存在的安全漏洞。但整体代码审计属于白盒静态分析,仅能发现代码编写存在的安全漏洞,无法发现业务功能存在的缺陷。

  2.6.2功能点人工代码审计

  功能点人工代码审计是对某个或某几个重要的功能点的源代码进行人工代码审计,发现功能点存在的代码安全问题。功能点人工代码审计需要收集系统的设计文档、系统开发说明书等技术资料,以便代码审计服务人员能够更好的了解系统业务功能。由于人工代码审计工作量极大,所以需要分析并选择重要的功能点,有针对性的进行人工代码审计。

  2.7代码审计、安全漏洞扫描、渗透测试的差异对比

  代码审计属于白盒测试,白盒测试因为可以直接从代码层次看漏洞,所以能够发现一些黑盒测试发现不了的漏洞,比如二次注入,反序列化,XML实体注入等。

  安全漏洞扫描是一款轻量级的安全服务,针对业务简单,但有周期性检查需求的客户,服务周期短,检测范围广。

  渗透测试是一种黑盒测试。测试人员在仅获得目标的I地址或域名信息的情况下,完全模拟黑客使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。

  2.8报告撰写

  代码审计的结果应以一份详细报告表现出来,概述代码问题区域,以便将来防止常见的逻辑错误及其它错误。

  3代码审计服务内容

  3.1审计流程

  代码审计的服务流程如下:计划准备、测试执行、人工审计、成果提交。

  3.2审计内容

  代码检査是代码审计工作中最常使用的一种技术手段。代码检查可以由人工进行,也可以借助代码检查工具自动进行。在实际应用中,通常采用“自动分析+人工验证”的方式进行。人工验证主要是自己搭建数据库然后查找验证漏洞代码检査的目的在于发现代码本身存在的问题,如代码对标准的遵循、可读性代码的逻辑表达的正确性,代码结构的合理性等方面。通过分析,可以发现各种违背程序编写标准的问题,主要包括以下几类。

  3.2.1业务逻辑错误测试

  3.2.1.1业务逻辑错误概述

  由于逻辑错误并不涉及到程序自身的错误及异常,因此,在自动化检测过程中,逻辑错误是无法被识别的逻辑错误不但需要人工进行检测,而且还需要检测人员在检测之前对业务有所了解,因此,在检测前,测试人员往往会构造大量的数据进行测试,以学习业务的正常逻辑,从而进一步构造可能造成业务危害的错误逻辑数据,以达到逻辑测试的目的。

  3.2.1.2业务逻辑错误的类型

  3.2.1.2.1欺骗密码找回功能

  目前业务系统对于用户的口令找回,有多种实现逻辑,其中很可能存在验证漏洞从而导致密码泄露。

  3.2.1.2.2规避交易限制

  攻击者篡改数据包,使得购买的商品为负数,或者商品价格为负数。

  3.2.1.2.3越权缺陷

  攻击者更改数据包中指示用户的⑩,来访问他人敏感信息或者冒充他人发布信息。

  3.2.1.2.4 Cookies和 session的问题

  攻击者在知道用户D的前提下,然后构造一个 COOKIE或让 SESSION值为TRUE就可以绕过这样的认证。

  3.2.1.2.5顺序执行缺陷

  攻击者在网购的过程中绕过支付过程,直接从放入购物车步骤进入填写收货地址的步骤,这样的话就可以0元购物了。

  3.2.1.2.6授权绕过漏洞

  业务系统中针对未加权认证、平行认证、敏感接口等缺乏认证,从而导致的越权操作及后台可猜解漏洞。通常对于是否存在授权绕过采用的测试方面有:

  (1)当用户没有通过验证时,是否有可能访问该资源?

  (2)是否有可能在注销后访问该资源

  (3)是否有可能获得只应由拥有不同角色特权的用户才能访问的功能和资

  (4)尝试作为管理员用户访问应用程序并追踪所有的管理职能。如果测试者

  (5)用普通用户身份登录是否有可能访问这些管理职能?

  (6)因拥有不同权限,而导致操作被拒绝的用户是否有可能使用这些功能?

  3.2.1.2.7请求重放漏洞

  未采用动态加密方法的认证过程,可能导致业务系统的认证功能失效例如对重要的操作,如转账操作,先正常进行一个正常的流程,在流程的重要环节,对提交的数据进行同时拦截,对取得的数据再次进行提交,如提交返回结果成功,则此流程存在重放攻击漏洞,反之则满足设计安全要求。

  3.2.2查看该系统所用开源框架

  (1)Struts2的相关安全

  1)低版本的 Struts2,,低版本的 Struts2存在很多已知的版本漏洞。一经使用,很容易造成比较大的危害

  2)开启 Struts2的动态调用方法,现在发现的如S2-033,S2-032等漏洞都是由于系统开启了动态调用方法,导致远程代码执行

  3)在JSP页面中使用Stπuts2的OGNL表达式传输数据。

  4)开启 Struts2的DEⅥMODE,易造成远程代码执行

  5)存在 Struts.2本身自带的OGNL页面

  (2)Spring的相关安全

  Spring在JSP尽量使用EL表达式, Spring的Boot框架远程命令执行就是由于EL表达导致的。

  (3)Mybatis XML相关安全

  在SQL语句中,使用$进行传参

  (4)其他安全

  在使用JAA自带的环境时,如 WEBLOGIO或者 JBOSS,请注意查看版本号,因为此类环境低版本,大部分包含JAMA反序列化漏洞,导致远程代码执行。

  3.2.3源代码设计

  源代码设计问题通常来源于程序设计之初,例如代码编写工具的使用等。在

  这方面的审计主要是分析代码的系统性和约束范围,主要从下面的几个方面:

  (1)不安全的域

  (2)不安全的方法

  (3)不安全的类修饰符

  (4)未使用的外部引用

  (5)未使用的代码

  3.2.4错误处理不当

  这类问题的检查主要是通过分析源代码了解程序在管理错误、异常、日志记录以及敏感信息等方面是否存在缺陷。如果程序处理这类问题不当,最可能的问题是将敏感信息泄露给攻击者,从而可能导致危害性后果。这类问题主要体现在以下几个方面:

  (1)程序异常处理

  (2)返回值用法

  (3)空指针

  (4)日志记录

  3.2.5直接对象引用

  直接对象引用意指在引用对象时没有进行必要的校验,从而可能导致被攻击者利用。通过代码检查,审计人员可以分析出程序是否存在直接对象引用以及相应的对象引用是否安全。直接独享引用问题主要有以下几类

  (1)直接引用数据库中的数据

  (2)直接引用文件系统

  (3)直接引用内存空间

  3.2.6资源滥用

  资源滥用是指程序对文件系统对象、CPU、内存、网络带宽等资源的不恰当使用。资源使用不当可能导致程序效率降低,遭受拒绝服务攻击的影响。代码检査中,审计人员将会根据编码规范分析代码中对各种资源的引用方法进行分析,发现其中可能导致资源过度占用方面的问题。资源占用方面的问题主要有以下几个方面:

  (1)不安全的文件创建、修改和删除

  (2)竟争冲突

  (3)内存泄露

  3.2.7 API滥用

  API滥用是指由系统或程序开发框架提供的API被恶意使用,导致出现无法预知的安全问题。检查过程中,审计人员将会针对此类问题来对源代码进行分析以发现此类问题。API滥用主要有下面几种类型:

  (1)不安全的数据库调用

  (2)不安全的随机数创建

  (3)不恰当的内存管理调用

  (4)不全的字符串操作

  (5)危险的系统方法调用

  对于WEB应用来说不安全的HTTP会话句柄也是API滥用的一种

  3.2.8应用代码关注要素

  3.2.8.1跨站脚本漏洞

  漏洞:对用户的输入没有采用有效的安全控制手段就将用户输入插入到返回页面中

  影响:攻击者可以利用存在XSS漏洞的WEB网站攻击浏览相关网页的用户,窃取用户会话中诸如用户名和口令(可能包含在 COOKIE里)等敏感信息、通过插入恶意代码对用户执行挂马攻击、ⅹSS漏洞还可能被攻击者用于网页篡改。

  3.2.8.2跨站请求伪装漏洞

  漏洞:提交表单中没有用户特有的标识

  影响:攻击者可利用跨站请求伪装(CSRF)漏洞假冒另一用户发出未经授权的请求,即恶意用户盜用其他用户的身份使用特定资源。

  3.2.8.3 SQL注入漏洞

  漏洞:对访问数据库的SQL语句没有进行任何过滤,可能导致SQL注入。

  影响:如果SQL注入成功,攻击者可以获取网站数据库的信息,可以修改删除薮据库,还可能获取执行命令的权限,进而完全控制服务器。

  3.2.8.4命令执行漏洞

  漏洞:系统中使用了一些调用操作系统函数的命令,在调用过程中,如果命令的来源不可信,系统可能执行恶意命令

  影响:攻击者有可能把要执行的命令替换成恶意命令,如删除系统文件

  (1)目录遍历

  (2)任意文件修改

  (3)任意文件删除

  (4)绝对路径泄露

  3.2.8.5日志伪造漏洞

  漏洞:将未经验证的用户输入写入日志。

  影响:攻击者可以利用该漏洞伪造日志条目或将恶意内容注入日志

  3.2.8.6参数篡改

  漏洞:一些重要参数可能会被篡改。

  影响:攻击者能够通过篡改重要参数或方法对系统进行攻击。

  3.2.8.7密码明文存储

  漏洞:配置文件中存储明文密码

  影响:在配置文件中存储明文密码可能会危及系统安全,攻击者可以轻易取到系统密码。

  3.2.8.8配置文件缺陷

  漏洞:配置文件内容存在缺陷,例如未设置统一的错误响应页面

  影响:攻击者能够利用配置文件的缺陷对系统进行攻击。

  3.2.8.9路径操作错误

  漏洞:用户输入没有有效的安全控制手段就直接对文件进行操作。

  影响:攻击者可以控制路径参数,访问或修改其他受保护的文件。

  3.2.8.10资源管理

  漏洞:使用完资源后没有关闭,或者可能关闭不成功

  影响:攻击者有可能通过耗尽资源池的方式发起拒绝服务攻击,导致服务器性能降低,甚至宕机。

  3.2.8.11不安全的Ajax调用

  漏洞:系统存在不安全的Aax调用

  影响:攻击者能够利用该漏洞绕过验证程序或直接编写脚本调用Ajax方法实现越权操作。

  3.2.8.12系统信息泄露

  漏洞:异常捕获泄露系统信息

  影响:攻击者可以从泄露的信息中找到有用信息,发起有针对性的攻击。

  3.2.8.13调试程序残留

  代码包含调试程序,如:不必要的打印信息

  3.2.8.14第三方控件漏洞

  如: Fckeditor, Wordpress等等。

  3.2.8.15文件上传漏洞

  文件上传的 Action有一个比较显著的特征: Spring Mvc默认支持两种文件上传操作方式。一种是使用MultiparthttpservletrequesT或者MultipartFile作为方法参数,第二种是使用javax.servlet.httppart作为方法参数。

  3.2.8.16远程命令执行

  在调用本机的 Shell,去运行特殊的命令时,没有对传入的参数进行检查,导致命令执行

  3.2.8.17远程代码执行

  通过反射来执行代码: Class c= Class. forName(" com. wgx test4Test")

  ∥创建这个类的实例,前提是存在这个类,并且存在此种方法

  Object obj=cnewInstance ();

  //通过 class来取得这个方法对象并且声明这个类的参数类型

  java. lang reflect Method method=c. getMethod ("sayhello", Class forName(“java.lang.String”));

  //invoke来执行方法对象记得参数类型要跟这里的参数匹配

  method. invoke (obj, wax");

  3.2.8.18越权下载

  String fileName ="../../../../1.xml

  File file new File ("/Users/dly/Desktop/test2/src/main/webapp/upload/"+

  fileName)

  FileInputStream fileInputStream=new FileInputStream (file

  BufferedReader buff- new BufferedReader new InputStreamReader

  (fileInputStream )): System. out. printIn (buff. readLine ())

  此时,如果1.xm1存在,可以直接读取出来

  3.2.8.19授权绕过漏洞

  业务系统中针对未加权认证、平行认证、敏感接口等缺乏认证,从而导致的越权操作及后台可猜解漏洞。通常对于是否存在授权绕过采用的测试方面有:

  (1)当用户没有通过验证时,是否有可能访问该资源?

  (2)是否有可能在注销后访问该资源?

  (3)是否有可能获得只应由拥有不同角色特权的用户才能访问的功能和资源

  (4)尝试作为管理员用户访问应用程序并追踪所有的管理职能。如果测试者用普通用户身份登录是否有可能访问这些管理职能?

  (5)因拥有不同权限,而导致操作被拒绝的用户是否有可能使用这些功能

  3.2.8.20二次注入

  二次注入漏洞是一种在WEB应用程序中广泛存在的安全漏洞形式。相对于一次注入漏洞而言,二次注入漏洞更难以被发现,但是它却具有与一次注入攻击漏洞相同的攻击威力。

  3.2.8.21反序列化

  Java序列化就是把对象转换成字节流,便于保存在内存、文件、数据库中Java中的 ObjectOutputStream类的 writeObject方法可以实现序列化Java反序列化即逆过程,由字节流还原成对象。 ObjectInputStream类的readobject方法用于反序列化

  因此要利用Java反序列化漏洞,需要在进行反序列化的地方传入攻击者的序列化代码。能符合以上条件的地方即存在漏洞

  3.2.8.22XML实体注入

  XML实体可以指定为外部HTTP文件,也可以指定为内部文件系统,当指定为本地文件的时候,则出现了XML实体注入漏洞。

  3.2.8.23其他因素

  代码安全很多的其他因素有关系,比较重要的还有操作系统类型(主要是两大阵营 Win/*nix),WEB服务端软件(主要是 IIS/APACHE两大类型)等因素这是由于不同的系统不同的 WEB SERVER有着不同的安全特点或特性。

  3.3工具说明

  3.3.1信息收集工具

  TextCrawler

  3.3.2静态分析工具

  RSM、Fortify SCA、SSWCodeAuditor、FindBugs、CAT.NET、FxCop、MSScasi、PMD、RIPS、VCG

  3.3.3源码提取工具

  Reflector、Java Decompiler

  3.3.4常用的三款工具介绍

  3.3.4.1 RIPS

  RIPS是一款开源的,具有较强漏洞挖掘能力的自动化代码审计工具。它是PHP语言编写的,用于静态审计PHP代码的安全性。

  RIPS的主要功能特点如下

  (1)能够检测XSS、SQL注入、文件泄露、本地远程文件包含、远程命令

  执行以及更多种类型的漏洞

  (2)有5种级别选项用于显示以及辅助调试扫描结果

  (3)标记存在漏洞的代码行

  (4)对变量高亮显示

  (5)在用户定义函数上悬停光标可以显示函数调用。

  (6)在函数定义和调用之间灵活跳转

  (7)详细列出所有用户定义函数(包括定义和调用)、所有程序入口点(用户输入)和所有扫描过文件(包括 include的文件).

  (8)以可视化的图表展示源代码文件、包含文件、函数及其调用。

  (9)仅用几个鼠标点击就可以使用CURL创建针对检测到漏洞的EXP实例

  (10)列出每个漏洞的描述、举例、POC、补丁和安全函数。

  (11)7种不同的语法高亮显示模式

  (12)使用自顶向下或者自底向上的方式追溯显示扫描结果

  (13)一个支持PHP的本地服务器和浏览器即可满足使用需求

  (14)正则搜索功能

  3.3.4.2 VcG

  VCG( Visual Code Grepper),是一款支持C、C++、C#、VB、PHP、Java和PL/SQL的免费代码安全审计工具。它是一款基于字典的检测工具,功能简洁,易于使用

  VCG是一个基于字典的自动化源代码扫描工具,可以由用户自定义需要扫描的数据。它可以对源代码中所有可能存在风险的函数和文本做一个快速的定位。

  3.3.4.3 Fortify SCA

  Fortify SCA( Static Code Analyzer)是由 Fortify软件公司(已被惠普收购)开发的一款商业版源代码审计工具。它使用独特的数据流分析技术,跨层跨语言地分析代码的漏洞产生,目前支持所有的主流开发语言。

  它是一款商业软件,价格较为昂贵。因为是商业软件,它有详细的使用文档查阅非常方便。它支持一些DDE的插件功能,在安装的时候会有选项

  同时也是一个静态的、白盒的软件源代码安全测试工具。它通过内置的五大主要分析引擎:数据流、语义、结构、控制流、配置流等对应用软件的源代码进行静态的分析,分析的过程中与它特有的软件安全漏洞规则集进行全面地匹配、査找,从而将源代码中存在的安全漏洞扫描出来,并给予整理报告。扫描的结果中不但包括详细的安全漏洞的信息,还会有相关的安全知识的说明,以及修复意见的提供。

  目前 Fortify SCA可以扫描出约350种漏洞, Fortify将所有安全漏洞整理分类,根据开发语言分项目,再细分为8个大类,约350个子类。


18933931888

工作时间:法定工作日,9:00~18:00

广州万方计算机科技有限公司 ©版权所有 2019-2020 粤ICP备08124637号

本站文章内容部分来源于网络转载,版权归作者所有。文章内容仅代表作者独立观点,不代表本站立场,转载目的在于传递更多信息。如有侵权,请联系删除。