<b>C、C++和Java安全编码实践提醒与本领</b>[VC/C++编程]
本文“<b>C、C++和Java安全编码实践提醒与本领</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
关于全部范例环境中的开辟人员来说,安全性正成为一个越来越重要的主题,即便过去一向认为安全性不成问题的嵌入式系统也是如此.本文将介绍几种范例的编码漏洞,指出漏洞是什么、若何降低代码被攻击的风险、若何更好地找出代码中的此类缺陷.
注入攻击
通过将信息注入正在运行的流程,攻击者可以危害进程的运行状况,以反射到开辟人员无法保护的某种终究目标.比方,攻击者大概会通过仓库溢出(stack corruption)将代码注入进程,从而履行攻击者选定的代码.此外,攻击者也大概尝试将数据注入数据库,供将来利用;或将未受保护的字符串注入数据库查询,获得比开辟人员更多的信息.无论出于怎样的目的,注入老是一件坏事,老是需求谨严对待的.
最卑劣的注入攻击情势大概是代码注入——将新代码置入正在运行的进程的内存空间,随后指导正在运行的进程履行这些代码.此类攻击假如成功,则几近可以举行任何操作,因为正在运行的进程完好被劫持,可履行攻击者但愿履行的任何代码.
此类攻击最闻名的示例之一就是 Windows 动画光标攻击,这恰是本文要谈论的情势.攻击者操纵一个简单的 Web 页面将情势不当的动画光标文件下载到查看者的 PC 中,招致浏览器调用此动画光标,动画光标调用时大概发生肆意代码的注入.实际上,这是一个完善的攻击载体:因为它不要求对被攻击机械的任何实际拜候、终究用户根本意识不到任何大概发生的麻烦;此外,假如攻击效果的恶意也是适度的,则对终究用户的外部影响几近是零.
考虑示例 1(a),当然,这改写自 Windows 攻击,它构成了此类攻击载体的底子.这里的开辟人员关于传入流的坚固性做出了基本的假定.信任流和并相信一切都没问题.利用基于仓库的将被非串形化(deserialized)的范例调用函数,未知数据流和代码注入必定会在某个时间点呈现.
(a)
void LoadTypeFromStream(unsigned char* stream, SOMETYPE* typtr)
{
int len;
// Get the size of our type's serialized form
memcpy(&len, stream, sizeof(int));
// De-serialize the type
memcpy(typtr, stream + sizeof(int), len);
}
(b)
void foo(unsigned char* stream)
{
SOMETYPE ty;
LoadTypeFromStream(stream, &ty);
}
(c)
void LoadTypeFromStream
(unsigned char* stream, SOMETYPE* typtr)
{
int len;
// Get the size of our type's serialized form
memcpy(&len, stream, sizeof(int));
// GUARD
if( len < 0 || len > sizeof(SOMETYPE) )
throw TaintedDataException();
// De-serialize the type
memcpy(typtr, stream + sizeof(int), len);
}
示例1 注入攻击.
这是怎样发生的?假定您调用示例 1(b)中的函数.我们就得到了一个易于操纵的攻击载体.这里的问题在于 SOMETYPE 在编译时的大小是固定的.假定此范例在内存中利用 128 个字节表示.再假定您构建传入流时,使前 4 个字节(要非串形化的内容的长度)的读数为 256.目前,您没有查抄正在处理的内容的有效性,而是将 256 个字节复制到了仅为 128 个字节的保存仓库空间内.
考虑到公布情势仓库的典型筹划,您明显碰到了麻烦.查看仓库,理解缘由所在.每个被调用的函数城市将其本地数据布设到仓库的一个帧内,普通是通过在输入时从仓库指针减去本地数据的已知大小(加上处理调用链本身所需的任何管理数据)实现的.编译器发出的抱负函数 prolog(伪代码)以下所示:
.foo
sub sp, 128 ; sizeof SOMETYPE
随后,对可操纵函数的调用应以下所示:
push sp ; push the SOMETYPE
local variable
push ap ; push the stream
pointer (comes from 1st argument)
call LoadTypeFromStream
ret
以上是“<b>C、C++和Java安全编码实践提醒与本领</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |