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 条件
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 条件
相关文章推荐
- Stack-based buffer overflow in acdb audio driver (CVE-2013-2597)
- Stack-based buffer overflow in acdb audio driver (CVE-2013-2597)
- Stack-based buffer overflow in acdb audio driver (CVE-2013-2597)
- Stack Based Windows Buffer Overflow Tutorial
- stack-based buffer overflow basic paper
- Defeating the Stack Based Buffer Overflow Prevention Mechanism of Microsoft Windows 2003 Server
- Stack-based buffer overflow in acdb audio driver (CVE-2013-2597)
- Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
- Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
- IBM AIX 'rpc.cmsd' Calendar Daemon Remote Stack Buffer Overflow Vulnerability
- 于堆栈的(Stack-based ) 和基于寄存器(Register-based) 的虚拟机区别
- 【嵌入式安全扫盲一】Stack buffer overflow
- Error处理:Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack tra
- Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
- 递归错误之栈溢出Exception in thread "main" java.lang.StackOverflowError
- Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
- Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
- Where do you want to jmp today ? In one of my previous posts (part 1 of writing stack based buffer
- 【嵌入式安全扫盲一】Stack buffer overflow