版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章安全编码与代码审核编码实现的软件,不仅要具有一定的质量,还要具有一定的抗攻击能力,杜绝“为了实现而实现”!张仁斌2025.02本章主要内容6.1软件编码概述6.2安全编码规范6.4作业与实践任务6.3安全编码过程管理与代码安全审核6.1.1软件编码软件编码的主要活动包括程序设计程序设计包括理解软件的需求说明和设计模型,补充遗漏的或剩余的详细设计,设计程序代码的结构,并进行设计审核编写代码编译代码单元测试代码检查详细设计规格说明书等前期文档软件编码单元测试代码复核理解设计模型单元开发计划编写源代码软件集成源码文档化复用代码和组件代码优化构建软件程序源代码软件编码包含的活动软件编码必须遵循的原则使用指定的程序设计语言,使用指定的开发工具和开发环境,执行制定的软件编码规范,确保程序代码具有良好的编写风格和接口规范,提高程序代码的可读性、可维护性。严格按照详细设计说明书完成软件的编码工作对于开发过程中发生的需求变更及设计变更等问题,需要通过项目启动阶段确定的变更控制流程进行处理注重软件阶段性成果及文档资料的管理工作,加强版本控制,加强软件供应链的管控注重团队协作精神的培养和运用,善于总结、加强沟通,提高团队凝聚力注重提炼公用代码、通用代码,加强公共模块的开发,形成公用编程知识库,以利于提高代码复用、提高开发效率6.1.2编码规范编码规范涵盖的内容源文件相关的约定源文件命名约定、源文件内容约定采用UTF-8编码或其它编码,以及源文件结构约定,例如文件内容可能包含许可证或版权信息、文件内容概述、导入语句、源码等。标识符命名规范。排版风格注释风格类和方法/函数设计原则:“高内聚,低耦合”、SOLID原则对语句的要求避免语句过于复杂、不便理解和维护。例如,if-else语句的嵌套层数尽量少,try-catch语句的try块尽量只包含可能抛出异常的代码;在确保程序正确性、稳定性、可读性及可测试性的前提下,尽量提高代码效率编码规范的作用有利于交流沟通及软件编码工作的衔接有利于降低软件维护成本有利于提高程序员个人能力良好的编码规范,有利于程序员养成良好的编码习惯,有利于程序员培养严谨的编程思维6.1.3代码检查代码检查包括桌面检查、代码审查和走查等方式桌面检查:由程序员检查自己编写的程序代码代码审查:代码审查是由若干程序员和测试人员组成审查小组走查:让与会者集体扮演计算机角色,将测试用例沿程序的逻辑“模拟运行”一遍,随时记录程序的踪迹规划总体会议准备审查会议返工跟踪待审代码审查后代码本章主要内容6.1软件编码概述6.2安全编码规范6.4作业与实践任务6.3安全编码过程管理与代码安全审核6.2.1安全编码建议(通用于各种语言)实施保障软件质量的编码规范验证来自所有不可信数据源的输入使用安全的函数避免使用弃用的函数;摒弃不安全的库函数,或使用具有安全隐患的函数时须谨慎处理;尽量避免使用功能复杂、易用错的函数安全地调用函数检查关键函数的返回值,避免函数未完全正确执行的情况下继续执行程序在使用指针或对象之前,判断指针或对象是否为空(null),避免引用空指针或空对象而出现异常应对函数实参进行有效性、安全性校验,否则可能导致安全漏洞例如Windows操作系统PrintSpooler远程执行代码漏洞CVE-2021-1675。PrintSpooler是Windows操作系统中管理打印相关事务的服务,对应的进程以系统权限运行,其调用YAddPrinterDriverEx函数时,没有对参数dwFileCopyFlags进行校验,因而攻击者能够设置APD_INSTALL_WARNED_DRIVER标志,导致添加打印机驱动时对驱动合法性校验失效,从而可以加载并以系统权限运行任意DLL(提权攻击)建立完善的异常和错误处理机制执行数值运算时,避免除法的分母为零,避免模运算的模数为零,避免关键整数发生整数溢出而影响依赖于该整数的后续操作多线程编程时确保共享变量的可见性,确保共享变量的操作是原子操作,确保执行阻塞操作的线程可以终止多线程访问资源时,避免死锁和竞争条件漏洞避免在大小有限的线程池中执行有相互依赖的任务,以防止死锁针对可访问资源并行访问存在竞争等问题,设定不同操作对资源(尤其是安全功能控制下的资源)访问的优先级,确保关键操作为高优先级的活动,而不受低优先级活动造成的不当干扰或延迟影响明确无误地授权执行,而非未出现特定错误时授权执行DWORDdwRet=IsAccessAllowed(...);if(dwRet==ERROR_ACCESS_DENIED){//安全检查失败,通知用户访问被拒绝}else{//安全检查无误,执行任务}DWORDdwRet=IsAccessAllowed(...);if(dwRet==NO_ERROR){//安全检查无误,执行任务}else{//安全检查失败,通知用户访问被拒绝}尽量减少代码的攻击面利用面向对象编程封装技术或类似方法尽量避免将程序内部的数据处理过程暴露给外部环境,代码实现应尽量简单,避免与外部环境做多余的数据交互,过多的攻击面将增加被攻击的概率可以利用动态菜单、动态按钮尽可能少的暴露访问入口,而不是禁用已显示的功能对于Web系统,可以结合基于角色的访问控制,根据用户的不同权限显示不同的菜单和可操控的按钮,减小攻击面。界面加载前,先读取并分析登录用户的权限,然后仅动态生成、加载用户有权访问的菜单和可操作的功能,避免采用隐藏方式隐藏菜单项和按钮,避免用户能看到菜单项或按钮,但操作时提示无权操作。熟悉并避免已有的安全缺陷进行代码安全检查建立标准的、安全的、可重用的代码,重用已知安全的代码6.2.1应用软件安全编程国家标准信息安全技术应用软件安全编程指南》(GB/T38674-2020)从程序安全和环境安全两个方面给出了提升基于客户端/服务器架构的应用软件的安全性的编程实践指南(包括Java、C/C++示例代码)程序安全数据清洗输入验证输出净化面向对象程序安全内存安全数据加密数据保护访问控制身份鉴别口令安全权限管理日志安全并发程序安全函数调用安全异常处理安全指针安全代码生成安全数据库管理文件管理网络传输代码实现安全安全功能实现资源使用安全环境安全第三方软件安全开发环境安全运行环境安全安全功能实现:以预防SQL注入为例不规范用法(Java语言)示例,直接拼接未经验证或净化的参数字符串为SQL语句,可能导致SQL注入攻击publicvoiddoPrivilegedAction(Stringusername,char[]password)throwsSQLException{Connectionconnection=getConnection();//...try{Stringpwd=hashPassword(password);StringsqlString="SELECT*FROMdb_userWHEREusername='"+username+"'ANDpassword='"+pwd+"'";Statementstmt=connection.createStatement();ResultSetrs=stmt.executeQuery(sqlString);//…}finally{try{connection.close();}catch(SQLExceptionx){//...}}}规范用法(Java语言)示例,利用参数化查询避免SQL注入攻击publicvoiddoPrivilegedAction(Stringusername,char[]password)throwsSQLException{Connectionconnection=getConnection();//...try{Stringpwd=hashPassword(password);if((username.length()>8){//...}StringsqlString="SELECT*FROMdb_userWHEREusername=?ANDpassword=?";PreparedStatementstmt=connection.prepareStatement(sqlString);stmt.setString(1,username);stmt.setString(2,pwd);//...}finally{try{connection.close();}catch(SQLExceptionx){//...}}}代码实现安全:以面向对象程序安全中的“比较类而不是类名”为例,不规范用法(Java语言)示例在JVM中,如果两个类可以被同一个类装载器装载,并且拥有相同的全名,那么这两个类被认为是相同的类如果需要授权访问一个受保护的资源,而该授权是基于类名的比较,如果攻击者提供一个完全与目标类全名相同的恶意类,那么攻击者就能访问到受保护的资源if(auth.getClass().getName().equals("com.application.auth.DefaultAuthenticationHandler")){//访问受保护的资源}//Determinewhetherobjectauthhasrequired/expectedclassnameif(auth.getClass()==this.getClass().getClassLoader().loadClass("com.application.auth.DefaultAuthenticationHandler")){//访问受保护的资源}6.2.3SEICERT安全编码系列标准卡内基梅隆大学软件工程研究所(SEI)计算机应急响应小组(CERT)采纳软件开发和软件安全社区的贡献开发的SEICERT安全编码系列标准包括常用编程语言(例如C、C++、Java和Perl)及安卓(Android)平台应用程序的安全编码标准,针对不安全编码实践和可能导致可利用漏洞的未定义行为,给出了安全编码规则和建议,用于开发功能安全和性能安全的可靠系统规则已成为静态分析工具对源代码进行安全分析的依据之一可以查阅官网/confluence/display/seccode,或在CWE官网查阅编号为CWE-1133、CWE-1154、CWE-1178的视图6.2.4ISO/IECC安全编码规则《信息技术—程序设计语言及其环境和系统软件接口—C安全编码规则》(ISO/IECTS17961:2013)为代码静态分析器建立一组基线要求,以便不同分析器实现代码静态分析时对代码安全缺陷具有统一的覆盖程度5.9比较填充数据[padcomp]规则需要诊断对填充数据的比较论据填充位的值未指定,可能包含初始时由攻击者提供的数据示例在本不合规的示例中,需要对代码进行诊断,因为C标准库函数memcmp()用于比较包括填充数据的结构s1和s2structmy_buf{charbuff_type;size_tsize;charbuffer[50];};
unsignedintbuf_compare(conststructmy_buf*s1,conststructmy_buf*s2){if(!memcmp(s1,s2,sizeof(structmy_buf))){//diagnosticrequired/*...*/}
return0;}6.2.5面向特定行业领域的安全编码规则MISRAC编码指南由汽车工业软件可靠性协会(MotorIndustrySoftwareReliabilityAssociation,MISRA)提出的C语言开发指南,解决可能不安全的C语言特性,并提供编程规则以避免这些隐患,用于增强嵌入式系统软件的安全性及可移植性针对C++语言有对应的标准MISRAC++MISRAC最初主要针对汽车行业,涉及嵌入式系统软件的其它行业,例如铁路、航空航天、国防、医疗设备等行业,都已有厂商使用MISRACAUTOSARC++编码指南在2003年,由全球汽车制造商、零部件供应商及其它电子、半导体和软件系统公司联合建立汽车开放系统架构(AUTomotiveOpenSystemARchitecture,AUTOSAR)联盟,并联合推出开放的、标准化的汽车嵌入式系统软件分层架构——AUTOSAR规范,降低汽车嵌入式系统软硬件耦合度,有利于提高软件复用度,尤其是跨平台的复用度,便于软件的交换与更新JSFAVC++编码标准2005年美国洛克希德·马丁公司发布《JointStrikeFighterAirVehicleC++CodingStandardsfortheSystemDevelopmentandDemonstrationProgram(联合攻击战斗机飞行器系统研制与验证项目C++编码标准)》,简称JSFAVC++编码标准本章主要内容6.1软件编码概述6.2安全编码规范6.4作业与实践任务6.3安全编码过程管理与代码安全审核6.3.1安全编码过程管理安全编码前的规划和准备①软件开发组织针对拟开发软件的用于内部和外包代码开发的期望和批准的安全编码规范②熟悉导致安全漏洞的不良编码实践和常见缺陷,制定常见缺陷检查列表③统一配置集成开发环境(包括编译器安全相关编译参数选项设置)、代码静态分析工具等开发工具,以帮助程序员强制创建安全代码④遵循开发工具和执行环境提供商发布的适用指南⑤维护和使用更新的开发工具(如编译器)⑥培训开发人员并确认编写安全代码的开发人员的资格⑦安全设计和架构,包括威胁建模⑧制定并使用安全编码标准⑨使用受控环境进行软件开发编码期间的安全管理①特定于正在使用的编程语言和技术的安全编码实践②使用安全编程技术,如结对编程、重构、同行评审、安全迭代和测试驱动开发③使用结构化编程技术④记录代码并消除可能导致安全漏洞被利用的编程缺陷⑤禁止使用不安全的程序设计技术(例如,使用硬编码密码、未经批准的代码样本和未经认证的Web服务)⑥使用源码管理工具,确定可以签入新代码的人员,跟踪文件变更⑦制定适当的代码精简计划,逐步去除不使用和不安全的特性进而简化旧代码⑧应在开发期间和之后进行测试、安全评估生成发行版时的代码处理①检查并清除调试代码、调试接口。调试代码可以用于提权或绕过身份验证例如“CWE-489:ActiveDebugCode”描述的绕过身份验证:假设应用程序有一个接收用户名和密码的登录脚本,且假设第三个可选参数“debug”被脚本解释为请求切换到调试模式,当给出这个参数时,不检查用户名和密码。在这种情况下,很容易绕过身份验证过程②以JavaScript等源码方式发行的程序,须利用Grunt等工具软件去除源码中的注释,并进行代码混淆处理,增加攻击者分析源码的难度③无论编译结果是否为字节码,编译时进行代码混淆处理,增加逆向分析的难度6.3.2源代码静态安全分析静态分析方法包括:词法分析语法分析抽象语法树分析语义分析控制流分析数据流分析污点分析程序切片源代码抽象与建模解析词法分析语法分析token源码中间表示信息收集数据流分析污点分析信息分析检测结果无缺陷缺陷列表安全分析规则源代码安全静态分析基本流程源代码中间表示方法的生成流程源代码中间表示源代码解析器词法分析语法分析token抽象语法树控制流图数据流图调用图代码属性图控制依赖数据依赖程序依赖图系统依赖图常见的源代码安全分析工具软件名称支持的编程语言授权奇安信代码卫士C++、C#、Java、Python、Go等主流编程语言商业FortifySCAC/C++、C#、Java等30种以上语言和框架商业PREfastC/C++商业PVS‑StudioC/C++、C#、Java商业CheckmarxCxSuiteC++、C#、Java、Python、Go等20种语言商业AxivionSuiteC/C++商业VisualCodeGrepperC/C++、Java、C#、VB、PL/SQL、PHP、COBOL开源SpotBugsJava开源security-code-scanC#、VB.NET开源CppCheckC/C++开源FlawFinderC/C++开源NodeJsScanJavaScript开源gosecGo开源BrakemanRuby开源基于静态分析工具的代码安全分析基本流程运行代码静态分析工具确定代码检测分析目标报告检测分析结果修复发现的漏洞源代码规则库控制流分析示例1while((node=*ref)!=NULL){2*ref=node->next;3free(node);4if(!unchain(ref)){5break;6}7}8if(node!=NULL){9free(node);10returnUNCHAIN_FAIL;11}12,345879,1011源代码相似性比对软件开发者常复用第三方开源代码,但复用的代码可能存在漏洞,从而导致漏洞广泛传播。如果发现某源代码存在漏洞,则可以利用源代码相似性检测其它源代码是否存在相同的漏洞源代码A抽象语法树token源代码处理程序依赖图源代码B待比对源码源代码中间表示基于token的方法基于图的方法…基于树的方法向量A向量B数值向量相似性计算分析结果相似度及相似性分析报告源代码相似性比较流程6.3.3代码安全审核代码安全审核方法代码安全审核常用的方法是将代码安全缺陷形成检查列表,对照代码逐一检查。检查列表应根据被审核的对象和应用场景进行调整也常采用源码静态扫描结合故障树分析的方法进行代码安全审核,即:基于源码扫描,生成故障树,进而进行安全分析模型释义代码扫描词法分析生成有向图生成故障树分析结果关键词表源代码扫描与故障树的结合代码安全审核流程国家标准《信息安全技术代码安全审计规范》(GB/T39412-2020)将代码安全审核(Review)称作代码安全审计(Audit)审计准备签署保密协议明确审计目的背景调研熟悉代码制定检查列表审计实施信息收集审计入场代码安全缺陷检测特殊情形审查审计报告改进跟踪GB/T39412给出的代码安全审计流程本章主要内容6.1软件编码概述6.2安全编码规范6.4作业与实践任务6.3安全编码过程管理与代码安全审核任务1:安全登录模块的实现任务内容(并入期末课程报告)根据第4章实践任务1和实践任务2针对“基于Web的大学生选课系统”撰写的需求分析及安全需求分析,编程实现选课系统的安全登录功能及至少一个业务功能,登录功能应能对抗暴力破解登录,并实现会话管理(避免绕过登录,直接访问业务功能)任务目的熟悉Web安全编程;掌握防范SQL注入攻击、跨站脚本攻击、暴力破解等常见攻击的基本方法;掌握会话管理参考方法前端基于VUE,后端基于SpringBoot+MyBatis+Shiro;利用Shiro实现会话管理,利用MyBatis的预编译对抗SQL注入攻击,利用验证码或多因素认证对抗暴力破解任务思考会话有效时间设置多长比较合适?服务器端能否强制结束会话,若可以,如何实现?如何防范登录账号密码被网络窃听、键盘记录?如何防范Web系统被假冒(用户被钓鱼攻击)?任务2:代码安全分析(不要求)任务内容利用源代码静态分析工具进行代码安全分析任务目的了解不同编程语言常用的静态分析工具;结合工具软件的分析结果,熟悉常见的代码安全缺陷参考方法利用静态分析工具,分析自己编写的代码,或分析开源代码,查看分析结果,并对照源代码分析、结果,思考消除相应缺陷的方法实验2:内存安全之ASLR、DEP与栈
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化妆品生产车间设备布局规划制度
- 预见性护理与护理实践指南
- 颅脑损伤术后营养与代谢护理
- 分级护理护理管理创新
- 药物应用护理核心知识
- 食管癌康复期的护理要点
- 教资历史高中试题及答案
- 教案-单元一任务3 会议设备-硬件连接
- 风湿免疫科出科考含答案解析
- 电动工具定转子制造工岗前知识理论考核试卷含答案
- 2026年江西省医师定期考核题库-人文(卷7卷8-100题)
- 2026年新版卫生法律法规考试题及答案
- 2026年四川省绵阳市中考化学模拟预测试卷
- 江西生物科技职业学院《公共经济学》2025-2026学年期末试卷
- 河南开放大学2026年《版式设计》形考作业1-3答案终考作业答案
- 2026年山西省教师职称考试(教育管理)真题
- 2026年高级结核病考试题及答案
- 2026年青少年安全知识竞赛考试及答案
- TSG08-2026《特种设备使用管理规则》解析
- 2026年开通科创板知识目真题(典型题)附答案详解
- 手术室PDCA-提高急诊手术器械物品准备的完善率
评论
0/150
提交评论