当前位置:网站首页>缓冲区溢出保护
缓冲区溢出保护
2022-07-07 12:43:00 【fpcc】
一、内存安全
c/c++饱为诟病的一个重点就是内存的安全问题,一个典型的例子就是内存的越界。在c/c++中,是不对内存越界进行检查的,比如一个数组,程序员操作其越界的指针仍然可以使用。但一旦用完释放,程序就会crash掉。缓冲区溢出(buffer overflow),是针对程序设计瑕疵或者语言本身的应用缺陷,向程序的数据缓冲区写入可使缓冲区溢出的数据(即上面提到的内存越界),导致程序运行异常从而获取程序乃至系统的控制权。
大家有没有注意到OpenSSL中提供的SM2算法中的缓冲区溢出漏洞,这个漏洞可以让非法用户得到更多的数据从而导致程序拒绝服务或者改变程序运行的行为。有兴趣的可以去网上搜索一下。不光这个软件的缓冲区漏洞,从历史上来看,基本上所有的有名气的软件或多或少都出现过这个安全问题,在一些白帽子论坛上,经常会有这些问题被提出。
内存问题,导致的整个程序的安全问题层出不穷,大到如微软、谷歌等大型公司,小到一些个人开发者,对内存管理的失效,往往会产生或者触发这种内存的安全问题。一般来说,内存就是放数据的缓冲区,所以内存安全问题也就称为缓冲区溢出问题。
二、缓冲区溢出保护
那么,既然缓冲区溢出如此重要,这也便成为了计算机安全的一个重要问题。一般来说,计算机的内存分为堆和栈两大类(寄存器之类的暂时不考虑)。程序的缓冲区安全保护可以从软件编写层次、编译层次、运行层次进行保护;而在运行层面上又可分为OS系统的保护和应用程序自身的保护。
1、语言层次的的安全控制
a、在编写程序时,注意检查和控制数组长度、指针大小等边界的控制,也即完整性的检查。
b、使用一些安全的库来替代原始的数组和指针。
c、加入安全控制代码。
d、使用内存静态检查工具
2、编译层次的安全控制
a、使用支持编译期内存检查的开发工具如visual studio,默认打了GS选项,GCC也提供了类似的机制。
b、编译期内的边界检查。
c、堆栈标记控制,用来管理内存中的位置。
d、使用运行期内存检测工具。
3、运行时的安全控制
a、操作系统中的预防性内存安全控制,如访问非法地址。
b、内存和数据的安全检查,包含越界管理。
c、沙箱托管运行。
这里说一下在内存中增加标记位来控制缓冲区溢出,一般有三种方式,一种是增加结尾字符,比如C/C++中的\0字符;一种是在内存中随机分布一些控制字符如canary ;最后是做异或动作。
三、应用
在实际的应用中,GNU Compiler Collection、LLVM、Microsoft Visual Studio还有Intel、IBM等的编译器都支持在编译期的安全检查。当然还有静态工具可以在编码阶段对内存问题进行检查如Lint等,在运行期一般操作系统都提供了内存安全控制,比如在栈空间上设置一些标志性检查,防止被覆盖来保护栈的安全。在Linux上,就有类似于这种行为称之为canary。
而StackGhost则是从硬件的层次上进行保护,这个就比较少见了。下面看一下Linux中如何进行内存安全检查:
1、CANNARY(栈保护)
gcc在4.2版本中添加了-fstack-protector和-fstack-protector-all编译参数以支持栈保护功能,4.9新增了-fstack-protector-strong编译参数让保护的范围更广。
2、FORTIFY
使用参数-U_FORTIFY_SOURCE编译来保护缓冲区溢出。
3、NX(DEP)
默认开启,在遇到溢出时,自动抛出异常,而不是去执行。
4、PIE(ASLR)
内存地址随机化机制(address space layout randomization),它分为映像、堆栈和PEB与TEB随机化三种。
5、RELRO
设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。GOT可以去看看动态库的加载相关内容。
四、总结
这里说明一下,本文不会教怎么做缓冲区溢出更不会教怎么进行攻击,那个是非法的。如果有想学习安全知识的,可以去看雪等安全网站去学习。本文重点还是说明如何保护好内存的安全。现在计算机安全问题已经上升到了国家层面上,包括俄乌战争背后都隐隐约约的有黑客的影子。程序大了,参与编程的人多了,人们的编程水平和能力的参差不齐以及对安全问题的认知程度和重视程度,都决定着程序的整体安全。缓冲区溢出做为一个从计算机出现就伴随着的安全问题,几乎可以说非常至关重要,说到这里,就需要提醒一下,一个优秀的程序员,一定深入了解语言的内存模型,操作系统内存管理机制和程序编译运行的机制等等。可以说有一处想不到,就意味着问题可能会发生,就看代价如何了。
千里之堤,溃于蚁穴!绝不是危言耸听。
边栏推荐
- Bashrc and profile
- AWS learning notes (III)
- Vscode configuration uses pylint syntax checker
- Demis hassabis talks about alphafold's future goals
- 潘多拉 IOT 开发板学习(HAL 库)—— 实验12 RTC实时时钟实验(学习笔记)
- Half an hour of hands-on practice of "live broadcast Lianmai construction", college students' resume of technical posts plus points get!
- Substance Painter笔记:多显示器且多分辨率显示器时的设置
- 设备故障预测机床故障提前预警机械设备振动监测机床故障预警CNC震动无线监控设备异常提前预警
- Hangdian oj2054 a = = B? ???
- Oracle non automatic submission solution
猜你喜欢
多商戶商城系統功能拆解01講-產品架構
KITTI数据集简介与使用
Ian Goodfellow, the inventor of Gan, officially joined deepmind as research scientist
「2022年7月」WuKong编辑器更版记录
【愚公系列】2022年7月 Go教学课程 005-变量
C 6.0 language specification approved
MicTR01 Tester 振弦采集模块开发套件使用说明
2022年13个UX/UI/UE最佳创意灵感网站
【历史上的今天】7 月 7 日:C# 发布;Chrome OS 问世;《仙剑奇侠传》发行
Selenium Library
随机推荐
Attribute keywords serveronly, sqlcolumnnumber, sqlcomputecode, sqlcomputed
回归测试的分类
Use case diagram
Attribute keywords ondelete, private, readonly, required
2022 cloud consulting technology series high availability special sharing meeting
ES日志报错赏析-maximum shards open
多商户商城系统功能拆解01讲-产品架构
Assign a dynamic value to the background color of DataGrid through ivalueconverter
在软件工程领域,搞科研的这十年!
Pinduoduo lost the lawsuit, and the case of bargain price difference of 0.9% was sentenced; Wechat internal test, the same mobile phone number can register two account functions; 2022 fields Awards an
Instructions d'utilisation de la trousse de développement du module d'acquisition d'accord du testeur mictr01
Es log error appreciation -- allow delete
Decrypt the three dimensional design of the game
The longest ascending subsequence model acwing 1014 Mountaineering
PLC: automatically correct the data set noise, wash the data set | ICLR 2021 spotlight
Because the employee set the password to "123456", amd stolen 450gb data?
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
寺岗电子称修改IP简易步骤
潘多拉 IOT 开发板学习(HAL 库)—— 实验12 RTC实时时钟实验(学习笔记)
Démontage de la fonction du système multi - Merchant Mall 01 - architecture du produit