如何防止恶意代码

如今,网络安全风险无处不在,网络攻击的威胁很高。有许多形式的网络攻击。其中许多可能是由恶意代码引起的。

什么是恶意代码?

恶意代码(malcode)是导致风险的任何代码。

这段代码可以:

  • 访问私人数据。

  • 更改系统的行为。

  • 防止系统运行。

恶意代码是如何产生的?

        故意将恶意代码写入系统。例如,心怀不轨的开发人员可能会故意编写恶意代码。或者可以在开发后注入恶意代码。例如,恶意软件,间谍软件或勒索软件在部署后进入系统并造成伤害。这是一个非常现实的问题,特别是对于开发安全关键系统的团队而言。最好在恶意代码损坏程序之前阻止它们。应在开发过程的早期采用安全最佳实践。这是保护您的软件免受恶意代码漏洞攻击的最佳方法。

如何防止恶意代码漏洞(示例)

您可以保护您的软件通过确保它没有安全漏洞免受恶意代码的侵害 。

1.使用安全编码标准

安全编码标准 – 例如CERT C / C ++ – 旨在防止安全漏洞。

例如,CERT以具有未定义行为的可能导致安全风险的代码为目标。

示例1:缓冲区溢出

        缓冲区溢出是一个众所周知的安全漏洞。当程序将数据写入其分配的内存边界之外时,就会发生这种情况。

        这会危及软件的安全性,因为可能会将恶意代码注入运行时内存。

        即使是常用的库函数(如gets()或fscanf()) – 如果不小心使用也会导致缓冲区溢出。

  1. 缓冲区溢出为何导致代码易受攻击

  2. 缓冲区溢出使您的代码易受攻击

这是一个例子。

        如果程序正在接收数据- 而且没有检查以确保输入缓冲区不会溢出- 那么此时就可以设计包含恶意代码的输入或“有效负载”。此输入可能会溢出输入缓冲区。

        因此,它会使用恶意代码的地址覆盖函数的返回地址。当函数返回时,程序从恶意代码处开始执行。

如何防止缓冲区溢出

        CERT ARR30-C是有助于防止缓冲区溢出的C编码规则的示例。此规则也适用于CERT C ++。

         “不要形成或使用越界指针或数组下标。”

        通过应用此规则,您将避免写入超出范围的指针或数组下标。这可以防止执行任意代码。

        MISRA C也有这样的规则- 而且CWE也注意到类似的情况。

示例2:不受控制的字符串格式

        不受控制的字符串格式是另一个安全漏洞。

        当使用格式化字符串调用格式化的I / O函数时,该格式字符串包含来自不受信任的外部源的未过滤数据。这通常被称为“污染”数据。

        为什么不受控制的格式字符串使代码易受攻击

        不受控制的格式字符串使您的代码容易受到攻击。

        它可以允许攻击者通过以下方式启用执行恶意代码:

  1. 崩溃的程序。

  2. 查看内存内容。

  3. 写入任意内存位置。

        如何防止不受控制的字符串格式

        使用以格式字符串作为参数的函数时要小心。示例函数包括fprintf(),sprintf()和snprintf()。

        CERT FIO30-C是防止格式字符串攻击的C编码规则的示例。此规则也适用于CERT C ++。

        “从字符串格式中排除用户输入。”

         确保不受信任的输入不用作格式字符串的一部分。

示例3:签名的整数溢出

        有符号整数溢出是另一种常见的安全漏洞。当算术运算的结果太大而不能存储在整数中时,会发生溢出。

        在C和C ++编程中,如果未检测到整数溢出,则可能导致缓冲区溢出。 

        为什么签名整数溢出会使您的代码易受攻击

        整数溢出会导致未定义的行为,因此确保对整数的操作不会导致溢出非常重要。

        在最坏的情况下,整数溢出可能导致缓冲区溢出- 以及攻击者执行恶意代码。

如何防止有符号整数溢出

        CERT INT32-C是防止整数溢出的编码规则的示例。此规则也适用于CERT C ++。

“确保对有符号整数的操作不会导致溢出。”

        可以防止整数溢出。您可以通过对传入的函数参数执行适当的范围检查来完成此操作

2.使用静态代码分析器实施安全编码规则

        实施安全编码规则的最佳方法是使用静态分析器。

        静态代码分析器会根据一组编码规则(例如CERT C / C ++中的编码规则)自动检查代码。最好的静态分析仪- 如Helix QAC -包含额外的规则以确保最佳实践编码。

        例如,Helix QAC可以根据上面提到的CERT编码规则轻松检查代码。它还可以在测试开始之前提供数千种诊断来改进您的代码- 并且在安全漏洞可能危及您的软件之前。

        通过确保遵循这些规则,您将避免严重的编码错误- 以及潜在的恶意代码漏洞。