您的位置:首页 > Web前端

CWE-121: 基于栈的溢出(Stack-based Buffer Overflow)

2014-04-09 00:43 302 查看
Translated by: Apxar
Translation From:/article/8883115.html

Essay From:http://cwe.mitre.org/data/definitions/121.html

一 .栈溢出概念

由于缓冲区buffer(局部变量,少数情况是 参数 ) 在堆栈上的溢出
二.影响

范围 影响
有效通常造成崩溃,其他的攻击导致影响包括 使得程序进入无尽的循环
访问控制缓冲区溢出能执行任意代码,它影响范围超出了程序的安全策略
访问控制其他程序破坏其他的安全服务
三.范例

例1: 缓冲区溢出的例子相当复杂,也有可能非常简单

#define BUFSIZE 256

int main(int argc, char **argv)

{

char buf[BUFSIZE];
strcpy(buf, argv[1]);

}

缓冲区buf的大小是 固定的,但是没有保障argv[1]的 大小限制,将造成溢出

例2.这个程序,从参数出获得一个用户提供的ip地址,验证查找用户名,然后拷贝到缓冲区

void host_lookup(char *user_supplied_addr)
{

struct hostent *hp;
in_addr_t *addr;
char hostname[64];
in_addr_t inet_addr(const char *cp);

/*routine that ensures user_supplied_addr is in the right format for conversion */
validate_addr_form(user_supplied_addr);
addr = inet_addr(user_supplied_addr);
hp = gethostbyaddr( addr, sizeof(struct in_addr), AF_INET);
strcpy(hostname, hp->h_name);

}
这个函数分配了64字节大小的缓冲区来存储用户名 ,但不能保证用户名不会超过64字节,如果攻击者制定一个地址,而这个地址解析为一个很长的用户名,会造成覆盖敏感数据和遭到攻击者的控制。
请注意,这些例子包含着未检查的返回值(CWE-252) ,而这些返回值将导致一个空指针引用(CWE-476).
四.防范措施
1.编译组建
1)运行或者编译软件时,采用保护机制,来减轻或消除缓冲区溢出,例如某些编译器和扩展的功能提供自动的缓冲区溢出的检测机制(将出现在编译的代码,中),包括visual studio的GS 标志(http://msdn.microsoft.com/zh-cn/library/9598wk25(v=vs.100).aspx),fedora,红帽子 FORTIFY_SOURCE GCC标志,StackGuard,和ProPolice(http://www.xfocus.net/articles/200103/78.html)
2)深入防御
这不一定是个完正的解决方法,因为这机制只能检测到某些类型的溢出,另外,攻击可能会导致拒绝服务,因为典型的反应是退出程序
2.
1)使用库来远离有风险的API,但是这个方法不是一个完全的解决方法
3.
1)边界检查输入
2)不要使用危险的函数,例如gets,使用更安全,等价的,检查边界错误的 函数
4.
1)使用操作系统级别的防御技术,ASLR,但这不是完整的方法

五.背景细节
通常几个关键数据导致任意代码执行,最突出是返回地址,攻击者能用内存地址来覆盖这个值,使得代码能运行具有特权,或者攻击者提供关键call的地址,例如 POSIX
system() call,把参数给栈上的call.这个通常叫做return into libc exploit,其他的,包括栈指针,frame指针,修改这写值可达到目的
六.其他注意事项
基于栈的溢出 具体 体现在 返回地址的覆盖写,栈指针的重覆盖,fram指针的覆盖,这些都可以被认为是函数指针的覆盖,数组索引器的覆盖 或者write-what-where 条件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: