7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy20101软件安全开发生命周期杭州安恒信息技术有限公司7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy20102软件安全开发生命周期(SDL)基于WEB应用程序的SDL目录7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy20103简介安全需求分析安全设计安全编程安全测试安全部署及安全响应软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy20104简介安全开发周期,即SecurityDevelopmentLifecycle(SDL),是微软提出的从安全角度指导软件开发过程的管理模式。SDL不是一个空想的理论模型。它是微软为了面对现实世界中安全挑战,在实践中的一步步发展起来的软件开发模式。典型的软件开发流程中,如瀑布模型,中心围绕着产品功能,完全没有安全方面的考虑。这样的开发流程可以造就功能上相对完善的软件,但是无法满足在安全上的需要。由于软件开发过程中未进行任何有效的安全控制措施,导致软件开发后由于其固有的安全隐患所引起的安全事件频频发生,给黑客及恶意人员可趁之机,由此导致的经济损失不可估量。软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy20105虽然目前企业和组织已经逐步意识到软件安全的重要性,但是他们把目光更多的聚焦到了软件开发后的漏洞扫描或渗透测试,尽管这个过程能够发现和解决大多数的安全隐患,但是后期的安全评估和安全整改,将带来更大的成本投入和人力投入;甚至由于开发人员的流动导致许多安全漏洞无法得到解决。据美国国家标准局(NIST)早年发表的一份调查报告估计,更好的安全控制措施将为后期安全整改的总体成本节省三分之一以上的费用,且有效规避70%以上由于软件安全隐患所引发的安全事件。软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy20106软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy20107简介安全需求分析安全设计安全编程安全测试安全部署及安全响应软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy20108安全需求分析——设定安全目标–在需求分析阶段,加入以下的安全考虑产品提供的安全功能产品如何安全的与用户(或其它软件模块)交互特别的,安全方面的考虑对产品开发计划的影响产品的风险评估和威胁模型(threatmodeling)产品的缺省功能配置软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy20109简介安全需求分析安全设计安全编程安全测试安全部署及安全响应软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy201010安全设计–在安全设计阶段,特别加入以下两方面的考虑减少攻击界面。例如,对一个网络软件的设计,它需要监听那些网络端口,是否可以减少监听端口的数目?那些用户可以与这些端口建立连接,是否要加强身份验证?深层防御。底层模块的设计中,假设上层模块有可能出现安全漏洞。对传递的数据考虑进一步校验软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy201011简介安全需求分析安全设计安全编程安全测试安全部署及安全响应软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy201012安全编程–独立、完整且集中的输入验证创建并使用了独立的用户输入验证模块以完成对所有用户的输入校验,以此可带来:统一的输入检测策略统一的验证逻辑统一的错误验证处理降低升级和维护成本软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy201013–校验全部的程序输入保证所有变量在使用之前都经过严格的校验,防止被污染的数据进入程序。–校验全部的输入长度通过限制输入长度,可以有效的控制一些攻击使其不给系统带来过大的威胁:SQLInjectXSSFileInclude………软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy201014–校验全部的输入类型不同的程序所接收到的参数类型应严格区分并校验,对于非法的类型应有相关异常进行处理以防止其进入程序。–不使用任何方式验证失败的数据当程序对某个数据校验失败时(如:校验数据类型),相关的异常处理程序应抛弃该数据并中断操作,而不应对数据进行任何的修复尝试。–对HTTP所有内容进行校验除需对传统的HTTPGET、POST等数据进行严格校验外,还应对HTTP内所有可能使用到的字段进行校验,防止字段中包含恶意字符而污染程序,如:RefererHostCookie……软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy201015–校验向用户输出的数据当程序通过查询后台数据库或其他方式从后台获取数据后,在将数据输出给用户前应对该数据进行校验,校验其中是否包含有非法字符、可执行客户端脚本等恶意信息。–使用安全的SQL查询方式在进行SQL查询时,必须使用安全的查询方式,如:PreparedStatement,以避免查询语句中由用户恶意插入SQL语句所带来的风险。–禁止使用JavaScript进行任何校验由于JavaScript为客户端脚本,因此任何试图使用JavaScript对用户数据进行校验的行为都可能被用户构造的本地脚本所绕过,因此,所有校验工作应由服务端程序完成而不是客户端。软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy201016–使用安全、统一的编码或转义方式创建并使用独立、统一的编码或转移方式,而且编码或转移中,至少应包含对以下类别数据的编码或转移:可能造成SQL注入的数据,如:分号、单引号等可能造成XSS的数据,如:script、javascript等–设定有安全的权限边界所有的程序都应清楚的了解到自己能做什么,而在其所能做的范围之外,均属于其权限边界之外,应严格禁止对其权限之外的任何操作。–校验被调用的后台命令若程序需要调用后台可执行程序,则在调用时,应通过使用完整路径或对程序进行HASH校验等方式保证程序的调用正确。软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy201017–校验被调用的文本或配置文件若程序需要调用后台文本或配置文件,则在调用前,应相对文件或配置文件的完整性和有效性进行检查,以确保读入的文本或配置文件是正确可用的。–确保程序所记录的日志可控若程序需要记录额外的操作日志等信息,应保证这些日志中的某些或全部内容不来自用户输入,否则用户可能通过外部恶意提交信息的方式填充日志。软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy201018简介安全需求分析安全设计安全编程安全测试安全部署及安全响应软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy201019安全测试–安全测试是什么?在产品的生命周期中,特别是产品开发基本完成到发布阶段,对产品进行检验以验证产品符合安全需求定义和产品质量标准的过程。–安全测试目标•提升产品安全质量•尽量在发布前兆到安全问题予以修补降低成本•度量安全–当前安全测试方法有•模式匹配方法,将程序看作字符串•状态机模型,将程序看作状态机•黑盒模型,将程序看作黑盒子•白盒模型,将程序看作路径的组合软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy201020安全测试–当前安全测试的问题•覆盖性•完备性•可度量性–当前安全测试困难•测试理论很难适用于安全领域•安全测试基础理论薄弱,当前测试方法缺少理论指导,也缺乏技术产品工具–测试VS安全测试•BUGVS安全漏洞(并非是BUG的一个子集)•信息泄露,WMF,LNK,SYNFLOOD漏洞是BUG吗?软件安全开发生命周期7SafeCompanyOverview2009DanHaagman,InfoSecurity2009SecureCodingCourse,©7Safe2010/11/10DBAppsecurtiy201021安全测试–假设条件•测试:导致问题的数据是用户不小心构成的(只考虑提供给用户的界面)•安全测试:导致问题的数据是攻击者处心积虑构成的(考虑所有攻击界面,包括可污染/渗透传递的界面)–思考域•测试:功能本身•安全测试:功能,系统机制,外部环境,应用与数据自身安全风险与安全属性–问题发现模