很久没在思否社区公布博客了,最近一段时间平安代码审计做的比拟多,因而在社区谈谈认识。
在软件开发过程中,C 语言作为一门根底语言应用宽泛,但也因为其自由度高、指针操作不便等特点,成为编写容易受到攻打的代码所抉择的首选语言。因而,C 代码平安审计工作的重要性也就愈发凸显。本文次要从参数和指令查看、输入输出查看、字符串函数安全检查、指针越界查看、函数返回值查看、用户数据长度查看以及数据格式查看七个方面讲述 C 代码平安审计的基础知识。
参数和指令查看
在 C 语言代码中,有很多函数须要应用命令行参数和环境变量参数,如 command: argc argv 和环境变量获取函数 getenv()。参数的平安校验包含数据类型、指令格局长度等的查看。常见的最容易出破绽的 argv[1] 参数指针援用也可能会导致缓冲区溢出、整数溢出、越界等破绽。在代码中进行判断能够无效防止此类破绽,如下代码:
if (argc != 2)
{
/* 参数个数谬误,请从新输出 */
return 0;
}
else if (strlen(argv[1]) >= MAX_LEN)
{
/* 参数长度谬误,请从新输出 */
return 0;
}
输入输出查看
C 代码中有一些函数会读写文件数据或者网络数据,如 read()、fscanf()、getc()、fgetc()、fgets()、vfscanf()、scanf()、getchar() 等。其中,gets() 函数在遇到 EOF 字符或换行字符之前,不会进行读取文本,也就是说 gets() 函数会产生缓冲区溢出,因而绝不要应用 gets() 函数。对于其余读写函数,也要进行输入输出查看,以确保数据安全。如下代码:
if (scanf("%d", &num) != 1)
{
/* 输出格局谬误,请从新输出 */
return 0;
}
else if (fwrite(buffer, sizeof(char), BUFFER_LEN, file) != BUFFER_LEN)
{
/* 写入文件谬误 */
return 0;
}
字符串函数安全检查
C 语言中字符串函数应用范畴宽泛,而其中较为容易出问题的就是 strcpy() 和 strcat() 函数。这两个函数都须要指定具体复制字符的数量,否则可能会造成缓冲区溢出。若源字符串来自于用户输出且未限度其大小,则更须要进行安全检查。如下代码:
if (strcpy(dest, src) == dest)
{/* 复制胜利 */}
else
{/* 复制失败 */}
指针越界查看
指针和数组都是常见的野指针或越界拜访数据的问题,因而须要进行指针和数组的边界查看,以保障程序的平安。如下代码:
if (i > 0 && i < arr_size)
{/* 失常拜访 */}
else
{/* 越界拜访 */}
函数返回值查看
在应用内存调配函数时,如 malloc()、calloc()、realloc() 和 new(),必须要保障正当应用或开释,否则会产生堆缓冲区溢出和 UAF 开释重用破绽等。对于其余函数的返回值也须要进行查看,以保障代码运行的正常性。如下代码:
if ((malloc_ptr = (char*)malloc(1024)) == NULL)
{
/* 内存调配失败 */
return 0;
}
用户数据长度查看
用户数据长度的校验也是重要的,比方数据截断、非逻辑分支等问题都会导致潜在的破绽和危害。因而,数据长度校验也十分要害,如下代码:
if (data_len > MAX_DATA_LEN)
{
/* 数据长度谬误 */
return 0;
}
数据格式查看
在解决构造体等数据类型时,还须要留神数据类型和格局的变动,否则可能会呈现数据当做代码或者指令执行的状况。如下代码:
/* 构造体定义 */
typedef struct _test
{char name[8];
int age;
} Test;
/* 数据赋值 */
Test t;
memset(&t, 0, sizeof(Test));
memcpy(&t, buffer, sizeof(Test));
代码平安审计是软件开发过程中不可或缺的一环。通过对 C 代码进行参数和指令查看、输入输出查看、字符串函数安全检查、指针越界查看、函数返回值查看、用户数据长度查看以及数据格式查看等方面的审查,咱们能够无效防止缓冲区溢出、越界、代码注入等破绽造成的平安威逼。
为了进一步爱护代码的平安,咱们还须要留神理论运行环境和常见的内部攻打因素,例如缓冲区溢出、SQL 注入、代码注入等攻击方式。应该思考到代码开发人员的技能程度和开发习惯,并确保所有审计测试都是全面和粗疏的。为了优化代码平安审计工作,我倡议应用一些自动化工具和脚本来帮忙加重审计累赘。
最终,实现无效的代码平安审计流程可能极大地晋升代码的可靠性,并有助于爱护应用程序免受安全漏洞和攻打的威逼。