当前位置: 首页 > news >正文

【安全编码】代码质量|C语言安全编码---增加中

  1. 使用realloc函数注意

根据 realloc 的返回值说明,下面这种使用方法应该避免:

...
void* buf = malloc(len);
...
buf = realloc(buf, size);
...

因为如果 realloc 失败了,buf 会被赋值为 NULL,而原内存还没有被释放,就泄漏了。

https://www.cnblogs.com/sunnypoem/p/11368473.html

https://wenku.baidu.com/view/dc381a8eb5daa58da0116c175f0e7cd1842518ed.html

【安全开发】C/C++安全编码规范

C本质上是不安全的编程语言。例如如果不谨慎使用的话,其大多数标准的字符串库函数有可能被用来进行缓冲区攻击或者格式字符串攻击。但是,由于其灵活性、快速和相对容易掌握,它是一个广泛使用的编程语言。下面是针对开发安全的C语言程序的一些规范。

1.1.1      缓冲区溢出

避免使用不执行边界检查的字符串函数,因为它们可能被用来进行缓冲区溢出攻击。下面是应该避免使用的函数。同时,也列出了每个函数相应的比较安全的替换方式。

不使用strcpy(),使用strncpy();

不使用strcat(),使用strncat();

不使用sprintf(),使用snprintf();

不使用gets(),使用fgets()。

在上面的前三个中函数中,每个替代函数的“n”表示了使用的缓冲区的大小。最后一个函数的“f”,表示格式,它允许用户指定期望的输入的格式。这些替换方程强制程序员定义使用的缓冲区的尺寸以及确定输入的类型。

1.1.2      格式化字符串攻击

该类攻击往往与缓冲区溢出相关,因为它们主要利用了某些函数的假设,例如sprintf()和vsprintf()假设缓冲区的长度是无限的。然而即使使用snprintf()替换sprintf()也无法完全保护程序不受格式化字符串的攻击。这些攻击通过直接将格式说明符(formatspecifiers)(%d,%s,%n等)传递到输出函数接收缓冲区来进行。

例如,以下的代码就是不安全的snprintf(buffer,sizeof(buffer),string)这种情况下,可以在字符串中插入格式说明符来操纵内存的栈,来写入攻击者的数据(这些数据中包含小的程序代码,并可由处理器接着执行)。对以上的例子建议使用下面的代码。

snprintf(buffer,sizeof(buffer),“%s”,string)进行格式字符串攻击不太容易。首先攻击者必须能获得内存栈的内容情况(或者从应用导出或者使用调试器),然后必须知道如何精确访问特定的内存空间来操纵栈中的变量。

执行外部程序推荐使用exec()函数而不是system()函数来执行外部程序。这是因为system()接收整个命令行的随机的缓冲区来执行程序。

snprintf(buffer,sizeof(buffer),"emacs%s",filename);

system(buffer);

在以上的例子中,可以通过使用分号利用文件名变量在sehll中插入额外的命令(例如文件名可以是/etc/hosts;rm*,这将在显示/etc/hosts目录文件的同时,删除目录中的所有文件)。而exec()函数只保证第一个参数被执行:

execl("usr/bin/emacs","usr/bin/emacs",filename,NULL);

上面的例子保证文件名仅仅作为一个参数输入Emacs工具,同样它在Emacs命令中使用完全的路径而不是使用可以被攻击者利用的PATH环境变量。

1.1.3      竞争条件

进程需要访问资源时(无论是磁盘、内存或是文件)通常需要执行两个步骤:

1、首先测试资源是否空闲可用;

2、如果可用,就访问该资源,否则它等到资源不再使用为止再去访问它。当另一个进程在步骤1和2之间想要访问同一个资源时就出现问题了。

这会导致不可预测的结果。进程可能会被锁定,或者一个进程劫持获得了另一个进程的较大的权限而导致安全问题。攻击主要集中在有较大权限的程序上(称为setuid程序)。竞争条件攻击通常利用程序执行时可以访问到的资源。另外权限低的程序也存在安全风险,因为攻击者可能会等待有较高权限的用户执行那个程序(例如root),然后进行攻击。

下面的建议有助于缓解竞争条件(racecondition)攻击:

在进行文件操作时,利用那些使用文件描述符的函数而不能使用那些使用文件路径的函数(例如使用fdopen()而不能使用fopen())。文件描述符使得恶意的用户在文件打开时或是在原始的进程对文件进行操作前,无法使用文件连接(符号式的或是物理的)来改变文件。

在写文件甚至在读文件时使用fcntl()和flock()函数来对文件加锁,这样它们就不能被其他进程访问。它几乎可以建立原子级的操作。

谨慎操纵临时文件,因为它往往会导致竞争条件。

1.1.4      检验有效的返回值

检验有效的返回值非常重要。一个例子是旧的/bin/login的实现中不检验错误的返回值,导致当它找不到/etc/passwd文件时返回root的访问权限。如果该文件损坏了,那么这种情况是合理的,但如果该文件存在只是无法访问,那么这就是一个大问题。

https://www.cnblogs.com/fogcell/p/11661817.html

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python的静态变量和静态方法
  • 【C++】libevent 、libev、 libuv 、asio、 muduo、 ace 等C++ 网络库
  • 【工具】Fiddler HTTP 抓包工具使用教程
  • 【测试】Cunit单元测试
  • 【VS linux】使用Visual Studio 2017开发Linux程序
  • 【MQTT】python MQTT客户端
  • 【STL】STL 操作
  • 【FTP】Linux中ftp的常用命令
  • 【HTTP】Linux命令行访问网页
  • 【libevent】libevent 库的使用(windows) ---编辑中
  • 【高并发】多线程之无锁队列
  • 【RAII】RAII 技术(内存安全解决技术/自动化解锁技术)
  • 【HTTP】为何HTTP使用文本描述结构和协议的趋势|HTTP协议问什么要基于文本而不是基于二进制节约带宽...
  • 【算法】递归思想
  • 【加密】OpenSSL 介绍和使用
  • 《深入 React 技术栈》
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Bytom交易说明(账户管理模式)
  • canvas绘制圆角头像
  • C语言笔记(第一章:C语言编程)
  • dva中组件的懒加载
  • es6(二):字符串的扩展
  • GitUp, 你不可错过的秀外慧中的git工具
  • js对象的深浅拷贝
  • JS专题之继承
  • JS字符串转数字方法总结
  • ReactNativeweexDeviceOne对比
  • SAP云平台里Global Account和Sub Account的关系
  • Spring声明式事务管理之一:五大属性分析
  • SwizzleMethod 黑魔法
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Yii源码解读-服务定位器(Service Locator)
  • 测试开发系类之接口自动化测试
  • 从tcpdump抓包看TCP/IP协议
  • 关于使用markdown的方法(引自CSDN教程)
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 实习面试笔记
  • 一道面试题引发的“血案”
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 用element的upload组件实现多图片上传和压缩
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 积累各种好的链接
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • #git 撤消对文件的更改
  • $.ajax()参数及用法
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (Qt) 默认QtWidget应用包含什么?
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档