如何防止恶意代码
如今,网络安全风险无处不在,网络攻击的威胁很高。有许多形式的网络攻击。其中许多可能是由恶意代码引起的。
什么是恶意代码?
恶意代码(malcode)是导致风险的任何代码。
这段代码可以:
访问私人数据。
更改系统的行为。
防止系统运行。
恶意代码是如何产生的?
故意将恶意代码写入系统。例如,心怀不轨的开发人员可能会故意编写恶意代码。或者可以在开发后注入恶意代码。例如,恶意软件,间谍软件或勒索软件在部署后进入系统并造成伤害。这是一个非常现实的问题,特别是对于开发安全关键系统的团队而言。最好在恶意代码损坏程序之前阻止它们。应在开发过程的早期采用安全最佳实践。这是保护您的软件免受恶意代码漏洞攻击的最佳方法。
如何防止恶意代码漏洞(示例)
您可以保护您的软件通过确保它没有安全漏洞免受恶意代码的侵害 。
1.使用安全编码标准
安全编码标准 – 例如CERT C / C ++ – 旨在防止安全漏洞。
例如,CERT以具有未定义行为的可能导致安全风险的代码为目标。
示例1:缓冲区溢出
缓冲区溢出是一个众所周知的安全漏洞。当程序将数据写入其分配的内存边界之外时,就会发生这种情况。
这会危及软件的安全性,因为可能会将恶意代码注入运行时内存。
即使是常用的库函数(如gets()或fscanf()) – 如果不小心使用也会导致缓冲区溢出。
缓冲区溢出为何导致代码易受攻击
缓冲区溢出使您的代码易受攻击
这是一个例子。
如果程序正在接收数据- 而且没有检查以确保输入缓冲区不会溢出- 那么此时就可以设计包含恶意代码的输入或“有效负载”。此输入可能会溢出输入缓冲区。
因此,它会使用恶意代码的地址覆盖函数的返回地址。当函数返回时,程序从恶意代码处开始执行。
如何防止缓冲区溢出
CERT ARR30-C是有助于防止缓冲区溢出的C编码规则的示例。此规则也适用于CERT C ++。
“不要形成或使用越界指针或数组下标。”
通过应用此规则,您将避免写入超出范围的指针或数组下标。这可以防止执行任意代码。
MISRA C也有这样的规则- 而且CWE也注意到类似的情况。
示例2:不受控制的字符串格式
不受控制的字符串格式是另一个安全漏洞。
当使用格式化字符串调用格式化的I / O函数时,该格式字符串包含来自不受信任的外部源的未过滤数据。这通常被称为“污染”数据。
为什么不受控制的格式字符串使代码易受攻击
不受控制的格式字符串使您的代码容易受到攻击。
它可以允许攻击者通过以下方式启用执行恶意代码:
崩溃的程序。
查看内存内容。
写入任意内存位置。
如何防止不受控制的字符串格式
使用以格式字符串作为参数的函数时要小心。示例函数包括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编码规则轻松检查代码。它还可以在测试开始之前提供数千种诊断来改进您的代码- 并且在安全漏洞可能危及您的软件之前。
通过确保遵循这些规则,您将避免严重的编码错误- 以及潜在的恶意代码漏洞。