教你几招消灭代码漏洞的方法 代码漏洞英文
yuyutoo 2024-10-21 11:59 2 浏览 0 评论
指针释放完后必须置为空指针
指针释放没处理好,容易引发高风险漏洞:内存破坏漏洞。
在编程中对指针进行释放后,需要将该指针设置为NULL,以防止后续free指针的误用,从而导致UAF (Use After Free)等其他内存破坏问题。尤其在结构体、类里面存储的原始指针。
错误释放指针范例
正确释放指针范例
针对指针释放建议的解决方案:建议使用string、vector、智能指针等代替原始内存管理机制,这样可以大量减少这类型的错误。
指针应用时必须检查空指针
这类问题没处理好,容易引发低风险的拒绝服务漏洞风险。
下面是检查空指针范例
注意检查指针大小的方式
检查指针大小没处理好,它会引发中风险逻辑漏洞的风险
下面是检查指针大小范例
智能指针使用安全
智能指针如果没应用好,会引发高风险漏洞:内存破坏漏洞
在编程中使用智能指针时候,必须防止智能指针和原始指针混用,否则可能会导致对象生命周期问题,例如UAF安全风险。
错误的使用智能指针
正确的使用智能指针
防止错误类型转换
类型转换处理不好会引发高风险的漏洞:内存破坏漏洞
在编程中对指针、对象或变量进行操作时,需要能够正确判断所操作对象的原始类型。如果使用了与原始类型不兼容的类型进行访问操作,那么代码就会存在安全的隐患。
错误类型转换范例
正确使用类型转换范例
不可直接使用无长度限制的函数
使用无长度限制的的函数,它会引发中风险漏洞和高风险漏洞:信息泄露漏洞和缓冲区溢出漏洞。
不能直接使用无长度限制的字符串拷贝、输入函数、例如:strcpy、sprintf、wcscpy、mbscpy等函数,这些函数的特征是:通过输入一长串字符串,而不限制长度。如果环境允许,应当使用_s安全版本替代,或者使用n版本函数(如:snprintf,vsnprintf)。
若使用形如sscanf之类的函数时,在处理字符串输入时应该通过%10s这样的方式来严格限制字符串长度,同时确保字符串末尾有\0。如果环境允许应该使用_s安全版本。
在使用n系列拷贝函数时,要确保正确计算缓冲区长度,同时,如果你不确定是否地面在各个编译器下都能确保末尾有0时候,建议增加1字节输入缓冲区,并将其置为\0,以确保输出的字符串结尾一定有\0。
建议使用方案:在C++中,建议用string、vector等更高封装层的基础组件代替原始指针和动态数组,可以有效提高代码的可读性和安全性。
调用启动进程类的系统函数的安全做法
没调用好启动进程类的系统函数,它会引发两大高风险漏洞:代码执行漏洞和权限提升漏洞。
在调用如 system、WinExec、CreateProcess、SheellExecute等启动进程类的函数,需要严格检查函数的参数。
当启动时从用户输入、环境变量读取组合命令行时,还需要注意是否可能存在命令注入风险。最好进行检查用户输入是否含有非法数据。
下面可以借鉴的范例
尽量不要使用_alloca和可变长度数组
使用_alloca和可变长度数组,它可能会引发低风险和高风险漏洞:拒绝服务漏洞和内存破坏漏洞。
_alloca和可变长度数组使用的内存量在编译期间是未知的,尤其是在循环中使用时,根据编译器的实现不同,可能会导致:1.栈溢出;2.缺少栈内存测试的编译器实现可能导致申请到非栈内存,并导致内存损坏。
对于C++,可变长度数组也是非标准扩展,在代码规范中禁止使用。
调用printf系列函数,参数必须对应
调用printf系列函数没处理好会引发中风险漏洞:信息泄露漏洞
调用printf系列函数,如sprintf,snprintf,vprintf等必须对应控制符号和参数。
不要把用户可修改字符串作为printf系列函数的“format”参数
这个没处理好,它会引发低风险、中风险和两大高风险漏洞:拒绝服务、信息泄露、内存破坏和代码执行漏洞。
如果用户可以控制字符串,则通过%n、%p等内容,最坏情况洗可以直接执行任意恶意代码。
对数组delete时需要使用delete[]
这个没处理好,它会引发低风险、中风险和高风险漏洞:内存泄漏、逻辑漏洞、内存破坏漏洞
delete []操作符用于删除数组。delete操作符用于删除非数组对象。它们分别调用operator delete[]和operator delete。
建议的解决方案在C++代码中,使用string、vector、智能指针(比如std::unique_ptr)等可以消除绝大多数 delete[] 的使用场景,并且代码更清晰。
使用switch中必须使用default
编程中switch没应用好,它会引发两大中风险漏洞:逻辑漏洞、内存泄漏漏洞。
switch中应该有default,以处理各种预期外的情况。这可以确保switch接受用户输入,或者后期在其他开发者修改函数后确保switch仍可以覆盖到所有情况,并确保逻辑正常运行。
在debug版本或错误信息中不提供过多信息。
提供过多的信息,这会引发中风险的信息泄露漏洞。
包含过多信息的Debug消息不应当被用户获取到。Debug信息可能会泄露一些值,例如内存数据、内存地址等内容,这些内容可以帮助攻击者在初步控制程序后,更容易地攻击程序。
不能返回栈上变量的地址和使用未初始化栈变量
这个情况,会引发高风险的内存破坏漏洞。
函数不可以返回栈上的变量的地址,它的内容再函数返回后就会失效,可以用堆类传递简单类型变量。
在栈上声明的变量使用之前确认是否已经初始化了。最好是在声明变量的时候,就直接初始化变量值。
建议方案:强烈建议返回 string、vector 等类型,会让代码更加简单和安全。
错误的范例
正确的用法范例
函数的每个分支都应该有返回值
函数中的分支没处理好,它会引发两大中风险漏洞:信息泄露,逻辑漏洞。
函数的每个分支都应该有返回值,否则如果函数走到无返回值的分支,其结果是未知的。
错误用法的范例
正确用法的范例
在多线程中变量应确保线程安全性
线程中的变量没处理好,它会引发两大中风险漏洞:信息泄露,逻辑漏洞。
当一个变量可能被多个线程使用时,应当使用原子操作或加锁操作。
建议解决方案:
对于C代码,C11 后推荐使用 atomic 标准库。
对于C++代码,C++11后,推荐使用 std::atomic。
错误用法范例
正确用法范例
在程序中不得明文存储敏感信息。
存储明文信息,它会引发高风险漏洞风险:敏感信息泄露漏洞。
用户的敏感信息应该使用加密算法进行做处理,并做到传输过程中加密,存储过程中加密,存储状态下加密。在程序运行内存中的用户敏感信息应该完全抹除。
使用rand()类函数应正确初始化
编程中rand函数没有正确初始化,它会引发逻辑漏洞的高风险漏洞。
在编程中,rand类函数的随机性并不高。而且在使用前需要使用srand()来初始化。未初始化的随机数可能导致某些内容可预测。
操作文件时候避免路径穿越问题
编程中,如果文件路径没处理好,它会引发高风险的逻辑漏洞。
在进行文件操作时,需要判断外部传入的文件名是否合法,如果文件名中包含 ../ 等特殊字符,则会造成路径穿越,导致任意文件的读写。
避免相对路径导致被劫持的问题
编程中相对路径没处理好会引发逻辑漏洞风险。
在编程中,使用相对路径可能导致一些安全风险,例如DLL、EXE劫持等问题。
针对DLL劫持编码安全的建议:
- 调用LoadLibrary,LoadLibraryEx,CreateProcess,ShellExecute等进行模块加载的函数时,指明模块的完整(全)路径,禁止使用相对路径,这样就可避免从其它目录加载DLL。
- 在应用程序的开头调用SetDllDirectory(TEXT("")); 从而将当前目录从DLL的搜索列表中删除。结合SetDefaultDllDirectories,AddDllDirectory,RemoveDllDirectory这几个API配合使用,可以有效的规避DLL劫持问题。
文件权限控制
编程中,文件权限没处理好,它会引发中风险的逻辑漏洞风险。
在创建文件时,需要根据文件的敏感级别设置不同的访问权限,以防止敏感数据被其他恶意程序读取或写入。
防止整数溢出
在编程中,数据操作时候没处理好,它会引发高风险的漏洞:内存破坏。
在计算时需要考虑整数溢出的可能,尤其在进行内存操作时,需要对分配、拷贝等大小进行合法校验,防止整数溢出导致的漏洞。
错误用法范例
正确用法范例
防止Off-By-One漏洞
计算和操作数据的时候没处理好,它会引发高风险漏洞:内存破坏
在进行计算或者操作时,如果使用的最大值或最小值不正确,使得该值比正确值多1或少1,可能导致安全风险。
解决方案:建议使用 string、vector 等组件代替原始指针和数组操作。
运算时检查除以零异常
编程中,数据运算没检查除以零的情况,它会引发低风险的漏洞:拒绝服务漏洞。
在进行除法运算时,需要判断被除数是否为零,以防导致程序不符合预期或者崩溃。
防止数字类型的错误强转
在编程中数值类型没处理好,它会引发中风险逻辑漏洞和高风险内存破坏漏洞。
在有符号和无符号数字参与的运算中,需要注意类型强转,它可能导致的逻辑错误,建议指定参与计算时数字的类型或者统一类型参与计算。
下图是参考范例
比较数据大小时加上最小或最大值的校验
编程中数据比较没处理好,它会引发高风险的内存破坏漏洞
在编程中进行数据大小比较时,要合理地校验数据的区间范围,建议根据数值类型,对其进行最大和最小值的判断,以防止非预期错误。
本文转自:小道安全
原文链接:https://mp.weixin.qq.com/s/4tyHCuevwVVKsWIBTnWPLQ
侵删~
相关推荐
- Mysql和Oracle实现序列自增(oracle创建序列的sql)
-
Mysql和Oracle实现序列自增/*ORACLE设置自增序列oracle本身不支持如mysql的AUTO_INCREMENT自增方式,我们可以用序列加触发器的形式实现,假如有一个表T_WORKM...
- 关于Oracle数据库12c 新特性总结(oracle数据库19c与12c)
-
概述今天主要简单介绍一下Oracle12c的一些新特性,仅供参考。参考:http://docs.oracle.com/database/121/NEWFT/chapter12102.htm#NEWFT...
- MySQL CREATE TABLE 简单设计模板交流
-
推荐用MySQL8.0(2018/4/19发布,开发者说同比5.7快2倍)或同类型以上版本....
- mysql学习9:创建数据库(mysql5.5创建数据库)
-
前言:我也是在学习过程中,不对的地方请谅解showdatabases;#查看数据库表createdatabasename...
- MySQL面试题-CREATE TABLE AS 与CREATE TABLE LIKE的区别
-
执行"CREATETABLE新表ASSELECT*FROM原表;"后,新表与原表的字段一致,但主键、索引不会复制到新表,会把原表的表记录复制到新表。...
- Nike Dunk High Volt 和 Bright Spruce 预计将于 12 月推出
-
在街上看到的PandaDunk的超载可能让一些球鞋迷们望而却步,但Dunk的浪潮仍然强劲,看不到尽头。我们看到的很多版本都是为女性和儿童制作的,这种新配色为后者引入了一种令人耳目一新的新选择,而...
- 美国多功能舰载雷达及美国海军舰载多功能雷达系统技术介绍
-
多功能雷达AN/SPY-1的特性和技术能力,该雷达已经在美国海军服役了30多年,其修改-AN/SPY-1A、AN/SPY-1B(V)、AN/SPY-1D、AN/SPY-1D(V),以及雷神...
- 汽车音响怎么玩,安装技术知识(汽车音响怎么玩,安装技术知识视频)
-
全面分析汽车音响使用或安装技术常识一:主机是大多数人最熟习的音响器材,有关主机的各种性能及规格,也是耳熟能详的事,以下是一些在使用或安装时,比较需要注意的事项:LOUDNESS:几年前的主机,此按...
- 【推荐】ProAc Response系列扬声器逐个看
-
有考牌(公认好声音)扬声器之称ProAcTablette小音箱,相信不少音响发烧友都曾经,或者现在依然持有,正当大家逐渐掌握Tablette的摆位设定与器材配搭之后,下一步就会考虑升级至表现更全...
- #本站首晒# 漂洋过海来看你 — BLACK&DECKER 百得 BDH2000L无绳吸尘器 开箱
-
作者:初吻给了烟sco混迹张大妈时日不短了,手没少剁。家里有了汪星人,吸尘器使用频率相当高,偶尔零星打扫用卧式的实在麻烦(汪星人:你这分明是找借口,我掉毛是满屋子都有,铲屎君都是用卧式满屋子吸的,你...
- 专题|一个品牌一件产品(英国篇)之Quested(罗杰之声)
-
Quested(罗杰之声)代表产品:Q212FS品牌介绍Quested(罗杰之声)是录音监听领域的传奇品牌,由英国录音师RogerQuested于1985年创立。在成立Quested之前,Roger...
- 常用半导体中英对照表(建议收藏)(半导体英文术语)
-
作为一个源自国外的技术,半导体产业涉及许多英文术语。加之从业者很多都有海外经历或习惯于用英文表达相关技术和工艺节点,这就导致许多英文术语翻译成中文后,仍有不少人照应不上或不知如何翻译。为此,我们整理了...
- Fyne Audio F502SP 2.5音路低音反射式落地音箱评测
-
FyneAudio的F500系列,有新成员了!不过,新成员不是新的款式,却是根据原有款式提出特别版。特别版产品在原有型号后标注了SP字样,意思是SpecialProduction。Fyne一共推出...
- 有哪些免费的内存数据库(In-Memory Database)
-
以下是一些常见的免费的内存数据库:1.Redis:Redis是一个开源的内存数据库,它支持多种数据结构,如字符串、哈希表、列表、集合和有序集合。Redis提供了快速的读写操作,并且支持持久化数据到磁...
- RazorSQL Mac版(SQL数据库查询工具)
-
RazorSQLMac特别版是一款看似简单实则功能非常出色的SQL数据库查询、编辑、浏览和管理工具。RazorSQLformac特别版可以帮你管理多个数据库,支持主流的30多种数据库,包括Ca...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
推荐7个模板代码和其他游戏源码下载的网址
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
-
- Mysql和Oracle实现序列自增(oracle创建序列的sql)
- 关于Oracle数据库12c 新特性总结(oracle数据库19c与12c)
- MySQL CREATE TABLE 简单设计模板交流
- mysql学习9:创建数据库(mysql5.5创建数据库)
- MySQL面试题-CREATE TABLE AS 与CREATE TABLE LIKE的区别
- Nike Dunk High Volt 和 Bright Spruce 预计将于 12 月推出
- 美国多功能舰载雷达及美国海军舰载多功能雷达系统技术介绍
- 汽车音响怎么玩,安装技术知识(汽车音响怎么玩,安装技术知识视频)
- 【推荐】ProAc Response系列扬声器逐个看
- #本站首晒# 漂洋过海来看你 — BLACK&DECKER 百得 BDH2000L无绳吸尘器 开箱
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)