软件应用程序安全开发指南(SDLC)(20)
2023-06-18 来源:飞速影视
区溢出攻击。下面是应该避免使用的函数。同时,也列出了每个函数相应的比较安全的替换方式。
不使用strcpy(),使用strncpy();
不使用strcat(),使用strncat();
不使用sprintf(),使用snprintf();
不使用gets(),使用fgets()。
在上面的前三个中函数中,每个替代函数的"n"表示了使用的缓冲区的
大小。最后一个函数的"f",表示格式,它允许用户指定期望的输入的格式。
这些替换方程强制程序员定义使用的缓冲区的尺寸以及确定输入的类型。
3.6.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目录文件
本站仅为学习交流之用,所有视频和图片均来自互联网收集而来,版权归原创者所有,本网站只提供web页面服务,并不提供资源存储,也不参与录制、上传
若本站收录的节目无意侵犯了贵司版权,请发邮件(我们会在3个工作日内删除侵权内容,谢谢。)
www.fs94.org-飞速影视 粤ICP备74369512号