第8章软件安全编码南京师范大学计算机科学与技术学院陈波本讲要点1.软件安全编码概述2.开发语言的安全性3.安全编码实践4.应用案例1.软件安全编码概述(1)主要工作包括:选择安全的编程语言版本(配置)管理代码检测安全编译1.软件安全编码概述(1)主要工作包括:1)选择安全的编程语言所谓安全的编程语言是指那些具有对缓冲区、指针和内存进行管理能力而避免发生软件安全问题的语言。类型安全语言就属于安全的编程语言。传统的C语言不是类型安全语言。C#语言拥有内建到语言中的许多安全机制,包括类型安全元素、代码访问安全和基于角色的安全,这些安全机制都包括在.NET框架中,因而属于类型安全语言范畴。Java也属于类型安全的语言,它可以确保操作仅能应用于适当的类型,使程序员能够制定新的抽象类型和签名,防止没有经过授权的代码对特定的值实施操作。1.软件安全编码概述(1)主要工作包括:2)版本(配置)管理不仅能够保证开发团队正在使用的程序版本是正确的,同时在必要的情况下也能提供回退到上一个版本的功能;还提供了跟踪所有权和程序代码变化的能力。安全管理专家可以通过对每一个版本的攻击面分析所隐含的安全问题,把握软件安全的演化趋势。可以降低漏洞再生的可能性。例如,已经修复的漏洞补丁在无意中会被覆盖,从而出现漏洞再生的问题。配置管理贯穿于软件开发、部署和运维过程。在软件编码开发阶段,配置管理较多地关注源代码的版本管理和控制;当软件完成部署处于运行状态的时候,配置管理应包括软件配置参数、操作、维护和废弃等系列详细内容。1.软件安全编码概述(1)主要工作包括:3)代码检测对代码质量进行检查,发现是否存在可利用漏洞的过程。根据代码检测时代码所处的状态,可以将代码分析分为两种类型:代码静态检测和代码动态检测。代码静态检测是指,不在计算机上实际执行所检测的程序,而是采用人工审查或类似动态分析的方法,通常借助相关的静态分析工具。代码动态检测是指,实际运行代码时进行检测的方法。通常依靠系统编译程序和动态检查工具实现检测,但完成后可能仍会存在与安全相关的、在编译阶段发现不了、运行阶段又很难定位的错误。工业界目前普遍采用的代码动态分析是进行模糊测试和渗透测试。1.软件安全编码概述(1)主要工作包括:4)安全编译采用最新的集成编译环境,并选择使用这些编译环境提供的安全编译选项和安全编译机制。如在VS中编译时,开启/GS选项对缓冲区的安全进行检查。在一个安全的环境中进行。例如:对代码编译系统实施安全访问控制;使用访问控制列表防止未授权用户的访问;使用软件版本控制方法;尽量使用自动化编译工具和脚本。对应用环境的真实模拟多样化编译技术应用1.软件安全编码概述(2)基本原则包括:CERT安全编码建议•验证输入(Validateinput)•留意编译器警告(Heedcompilerwarnings)•安全策略的架构和设计(•保持简单性(Keepitsimple)•默认拒绝(Defaultdeny)•坚持最小权限原则(Adheretotheprincipleofleastprivilege)•清洁发送给其他系统的数据(Sanitizedatasenttoothersystems)1.软件安全编码概述基本原则包括:CERT安全编码建议•纵深防御(Practicedefenseindepth)•使用有效的质量保证技术(Useeffectivequalityassurancetechniques)•采用安全编码标准(Adoptasecurecodingstandard)其他安全编码原则•最少反馈•检查返回2.开发语言的安全性(1)C语言安全编码C语言安全编码的注意点•对内存访问错误的检测和修改。•指针引用是C中最灵活、最核心、最复杂,也是最易出错的部分。•随机数的选取和使用问题。•C语言没有提供异常处理机制,其异常检测处理要由程序员预设完成。2.开发语言的安全性(1)C语言安全编码C语言中针对缓冲区溢出的主要解决措施•使用安全字符串函数•如果在开发过程中无法避免使用这些不安全函数,应该遵循以下3个原则:–1)应要求代码传递缓冲区的长度;–2)探测内存;–3)正确使用函数参数。•开启编译器的安全编译选项2.开发语言的安全性(2)Java语言安全编码Java已有的安全机制2.开发语言的安全性(2)Java语言安全编码语言层安全语言层安全是通过编译器的编译来实现,即编译成功则说明达到了语言层安全性。Java在语言层提供如下安全机制:•通过某些关键字(如private、protected)定义代码的可见性范围(即权限)。•通过类型规则确保程序运行时变量的值始终与声明的类型一致,在函数或方法调用时形参与实参的类型匹配。•Java还采用自动内存管理、垃圾收集站、字符串和数组的范围检查等方法,来确保Java语言的安全性。2.开发语言的安全性(2)Java语言安全编码字节码层安全在字节码层次,Java提供两种保障安全的机制:•类加载器类加载器主要分为四类:启动类加载器、标准扩展类加载器、路径类加载器和网络类加载器。•字节码验证器验证分成静态和动态两个阶段。2.开发语言的安全性(2)Java语言安全编码应用层安全一旦类加载器加载了一个类并由字节码验证器验证了它,Java平台的第3种安全机制,即安全管理器就开始运行:•安全管理器是一个由JavaAPI提供的类,即:java.lang.SecurityManager类,它的作用是说明一个安全策略以及实施这个安全策略。•安全策略描述了哪些代码允许做哪些操作。由安全管理器对象定义的安全检查方法构成了当前系统的安全策略。当这些检查方法被调用时,安全策略就得以实施。3.安全编码实践(1)输入验证输入验证是一个证明输入数据的准确性并符合规范要求的过程。对于任何不可信任数据源的输入进行验证,这是CERT给程序开发人员安全编码实践的第一条建议。1)验证内容2)验证方法3)验证端点4)其他注意点3.安全编码实践(1)输入验证1)验证内容程序默认情况下应对所有的输入信息进行验证,不能通过验证的数据应被拒绝尤其是对以下输入信息进行验证:HTTP请求消息的全部字段,包括GET数据、POST数据、Cookie和Header数据等;不可信来源的文件;第三方接口数据;从数据库中检索出的数据;对来自命令行以及配置文件的输入;网络服务;注册表值;系统性能参数;临时文件。当输入数据包含文件名、路径名、URL等数据时,应先对输入内容进行规范化处理后再进行验证。3.安全编码实践(1)输入验证2)验证方法应根据情况综合采用多种输入验证的方法,包括以下几种。检查数据是否符合期望的类型。检查数据是否符合期望的长度。检查数值数据是否符合期望的数值范围。比如检测整数输入的最大值与最小值。检查数据是否包含特殊字符,如:、、、'、%、(、)、&、+、\、\'、\等。应使用正则表达式进行白名单检查,尽量避免使用黑名单法。3.安全编码实践(1)输入验证3)验证端点在客户端验证的同时,在服务器端也应进行验证。3.安全编码实践(1)输入验证4)其他注意点应建立统一的输入验证接口,为整个应用系统提供一致的验证方法。如日志数据中包含输入数据,应对输入数据进行验证,禁止攻击者能够写任意的数据到日志中。在软件中设置适当的字符集(如Unicode码)和输出语言环境,采用XML格式将数据转换为标准格式,以避免任何标准化方面的问题。在执行验证之前使用一次性解码,将输入数据首先进行标准化转换为内部表达的方式,以保证验证过程不会被绕过。3.安全编码实践(2)数据净化数据净化是将一些被认为是危险的数据转化为无害形式的过程。输入和输出的数据都可以被净化。输入验证后再次净化数据是纵深防御的体现。1)输入数据净化•剥离(Stripping)•替代(Substitution)•文本化(Literalization)2)输出数据净化•HTML实体编码•URL编码3.安全编码实践(3)错误信息输出保护编码时应限制返回给客户与业务处理无关的信息,禁止把重点保护数据返回给不信任的用户,避免信息外泄。使用简洁的、只包含必要信息的错误消息。对错误信息进行规整和清理后再返回到客户端。使用将错误和例外事件重定向到一个预先定制的默认错误处理页面,并根据用户登录地点(本地或是远程)的上下文情境来确定显示合适的错误消息详细内容,例如“访问的网页不存在”,或返回“404错误”。3.安全编码实践(4)数据保护在软件实现中,数据安全保护要注意密码算法和密码函数库的正确应用、密钥管理,以及充分的访问控制和审计等问题。1)密码算法选择选择密码算法及加密强度时,除了根据安全需求,还应参照国家法律和相关行业规定的要求。我国制定了商用密码管理条例,并陆续推出了我国自主设计的密码算法,并在商用密码产品中得到广泛采用。3.安全编码实践(4)数据保护2)常用密码函数库MIRACLOpenSSL.NET基础类库中的加密服务提供类Java安全开发包3.安全编码实践(4)数据保护3)安全的密钥管理保证密钥本质上是随机的或伪随机的。密钥的交换需要安全地进行,如PKI。密钥的存储需要被保护密钥的循环要遵从适当的过程密钥的归档和托管需要受适当的访问控制机制的保护密钥的销毁3.安全编码实践(4)数据保护4)充分的访问控制和审计用户(包括外部用户和内部用户)要访问加密密钥和加密算法应当经过以下控制。明确地被批准。使用审计和周期性检查的方法实现对加密机制的监督和控制。不会因为一些无意识或者粗心大意的软件脆弱点而使加密机制失效,例如不安全的软件访问许可配置。与具体环境相适应的保护方法,而不仅仅考虑是单向还是双向加密。3.安全编码实践(5)其他安全编码实践1)内存管理2)例外管理3)会话管理4)配置参数管理5)并发控制6)标签化7)沙箱8)安全的API9)防篡改技术4.应用案例【案例8】基于OpenSSL的C/S安全通信程序下载、安装OpenSSL配置VS2017开发环境生成服务器证书程序主要流程程序效果检测本讲要点1.软件安全编码概述2.开发语言的安全性3.安全编码实践4.应用案例