安全编码导引(2)——常见的编码漏洞之一

        计算机安全中的“漏洞”指的是在软件的设计,开发或者配置过程中通过的一个错误或者脆弱点,并且这些弱点被发现后可用于破坏产品的组织安全策略进而使得攻击者可以在未授权的情况下访问敏感信息。了解软件漏洞的使用机理可以帮助程序员更快的发现代码中存在的漏洞。常见的安全漏洞有以下几种:

1. 缓冲区溢出

        当程序允许输入对分配的内存写入数据时,可能会出现缓冲区溢出。攻击者通过缓冲区溢出攻击来获取对整个应用的控制权或者引起程序冲突。最容易受到缓冲区溢出影响的语言是C和C++。其他的诸如Java,C#以及VB等,它们自带数组边界检查机制以及专有字符串类型,基本杜绝了直接访问内存的可能。所以这些语言对缓冲区溢出有一定抵抗能力。

/** Example of Buffer overflow **/

int main(int argc, char const *argv[])
{
    char buffer1[5] = "VXYZ";
    char buffer2[5] = "PQRS";
    strcpy(buffer2, argv[1]);
    printf("buffer1:%s, buffer2:%s\n", buffer1, buffer2);
    return 0;
}

  

        上面的程序中,数组被拷贝到buffer2,但是拷贝过程没有检查拷贝数据的长度,这种缺陷会导致缓冲区溢出漏洞。

2. 整数溢出

        在数据运算时,如果某个整数变量尝试存储大于其能存储的最大数值的数时就会出现整数溢出。C和C++是这类溢出的重灾区,其他语言则会自动进行数值范围检查,极大降低了此类风险。

/** Example of Integer Overflow **/

short int number = 0;
char buffer[large_value];

while(number < MAX_NUM)
{
    number += getInput(buffer+number);
}

        在这个例子中,整数变量‘number’可以不停的构造比MAX_NUM小的数值,最后会造成证书溢出。在这种情况下,也会不停向buffer中写入MAX_NUM-1个字节。

3. 格式化字符串攻击

        输入字符串中用户提供的数据被当成应用的某个指令进行解析时,攻击者可以从堆栈中打印数据,执行任意代码,或者窃取信息。恶意输入一般会包含格式字符串参数例如 %x或者%n。最容易出现此类问题语言时C和C++。

/** Example of Format String Attacks **/

int main(int argc, char *argv[])
{
    print(argv[1]);
    return 0;
}

        在上面的实例中,如果输入的字符串含有类似于%x或者%n,程序将输出非预期的结果。使用print(argv[1])代替printf("%s, argv[1]")引入了格式化字符串漏洞。

4. 命令行注入

        当恶意数据被注入进了输入中并传递给语言解释程序,就会出现该输入被解释成某种指令的情况,这就是命令行注入。无论是任何语言,如果没有执行正确的输入验证就可能存在这种漏洞。

/** Example of Command Injection **/

int main(char* argc, char** argv)
{
    char command[MAX] = "head";
    strcat(command, argv[1]);
    system(command);
}

        这里程序执行的是UNIX命令‘head file’并且显示输入文件的前10行。‘strcat’将命令和文件名拼接起来,然后‘system’指令负责执行。因为缺乏输入检查,攻击者可以注入恶意指令到输入中,例如注入‘hello.c; rm welcome.c’。程序将会显示hello.c的前一部分并且删除welcome.c文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值