零日威胁是一个尚未发现的开发漏洞的术语。 网络犯罪分子可以利用这些漏洞,最终将影响公司的声誉。 开发人员面临的任务是最大程度地减少可能导致这种漏洞的代码中的缺陷数量。 用于识别安全漏洞的工具之一是针对C,C ++,C#,Java的PVS-Studio静态代码分析器。
零日威胁
零日威胁是一个术语,用于标识开发人员允许但尚未发现的漏洞和漏洞。 在修复该漏洞之前,它可以用于访问网络,远程控制计算机,操纵数据等。 由于开发人员没有一天修复缺陷的事实,因为尚无人知道这一事实,因此该术语的名称已广为人知。 在适当的时候,诸如
Adobe ,
Windows ,
Tor浏览器之类的大公司和软件就遭受了这些漏洞的困扰。
一些组织很幸运,他们的脆弱性是由不打算使用它的人发现的,他们只是提供有关该问题的信息。 例如,这是使用
MacOS的 。 或者有一个更新,除了新功能外,还意外修复了零日威胁。
但是,还有其他情况。 例如,谷歌浏览器一次迫切需要修复一个
漏洞 ,该
漏洞使攻击者可以在受害者的设备上远程执行任意代码。
这种威胁的问题在于不可能100%防御它,因为很难防御您尚不了解的事情。 但是,有一些方法可以减少您的项目中出现此类威胁的可能性,我们将在稍后进行讨论,但只需要一点理论即可。
静态分析
静态代码分析是由分析仪检查程序代码而不启动程序本身的过程。 静态分析可以被视为自动化的代码审查过程。 在某些情况下,静态分析的有效性优于代码审查,但不能被多个程序员视为代码审查的完整替代方案。 下面,我尝试简要概述一下代码审查和静态代码分析之间的优缺点。
CVE和CWE
常见漏洞和披露(CVE)是网络犯罪分子可以使用的软件错误数据库。 创建CVE是为了简化已知的软件缺陷。 大多数信息安全工具使用自己的数据库和名称,为了消除这种混乱并增加与各种工具的兼容性,MITRE在1999年创建了CVE。 但是,CVE不足以评估代码安全性。 这就需要更精确的方法,并详细说明问题,并且要比实际情况少得多。 因此,创建了满足这些要求的通用弱点枚举(CWE)库。 如果错误在CWE列表中,则很可能会导致攻击者可以利用该漏洞并进入CVE列表。 为了清楚起见,您可以查看下面的欧拉图。
一些静态分析器可以告诉开发人员,例如,该项目使用的漏洞所在的库。 这样,您可以选择已修复了漏洞的库的较新版本,并减少由于其他人的代码而引起威胁的问题的可能性。
随着CVE和CWE列表的发展,许多信息安全工具已经开始提供支持,包括静态分析器。 此类分析仪可以视为SAST解决方案。 SAST(静态应用程序安全性测试)允许开发人员在软件开发生命周期的早期阶段就发现应用程序源代码中的漏洞。
在开发中使用SAST是将零日威胁的可能性降到最低的另一种选择。 分析器根据CWE对错误进行分类,可以判断隐藏在哪里的潜在漏洞。 通过更正这些错误,开发人员可以使应用程序更可靠,并减少0天威胁的可能性。
有各种用于静态安全测试的工具。 为了演示处理漏洞的功能,让我们关注一下
PVS-Studio工具。 该分析仪发出的警告可归为CWE。 让我们看几个例子。
警告PVS-Studio:
CWE-561 :
无效代码(
V3021 )。
public string EncodeImage(....) { if (string.IsNullOrWhiteSpace(inputPath)) { throw new ArgumentNullException("inputPath"); } if (string.IsNullOrWhiteSpace(inputPath)) { throw new ArgumentNullException("outputPath"); } .... }
这段代码无意中打了错字。 在两个
if条件中,将检查同一变量。 根据生成的异常判断,在第二种情况下,应检查变量
outputPath 。 结果,部分代码无法访问。
乍看之下,此类错误看起来是无害的。 但是,这种印象可能会令人误解。 考虑一个非常简单且乍看之下与
goto运算符重复有关的无害错误。
一次,此错误导致iOS操作系统中的漏洞。
CVE-2014-1266漏洞说明:6.1.6之前的Apple iOS 6.x和7.0.6之前的7.x,Apple TV中的数据安全性组件中安全传输功能中的libsecurity_ssl / lib / sslKeyExchange.c中的SSLsecurityifySignedServerKeyExchange函数6.0.2之前的6.x和10.9.2之前的Apple OS X 10.9.x不会检查TLS服务器密钥交换消息中的签名,该消息允许中间人攻击者使用任意内容来欺骗SSL服务器签名步骤或省略签名步骤的私钥。
static OSStatus SSLVerifySignedServerKeyExchange(SSLContext *ctx, bool isRsa, SSLBuffer signedParams, uint8_t *signature, UInt16 signatureLen) { OSStatus err; .... if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0) goto fail; if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) goto fail; goto fail; if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0) goto fail; .... fail: SSLFreeBuffer(&signedHashes); SSLFreeBuffer(&hashCtx); return err; }
由于两次
goto ,还会出现代码无法到达的情况。 无论条件如何,第二条goto
语句都将在
if语句中执行。 这导致不进行签名验证的事实。 该函数返回0,这意味着签名无误,即使签名存在问题,程序也将从服务器接收密钥。 在传输期间加密数据需要此密钥。
这种简单错误的后果非常严重。 因此,没有理由争辩将此错误分类为CWE有多危险。 只需对其进行修复,从而使代码更安全。
顺便说一下,PVS-Studio分析仪可以很容易地检测出所描述的错误。 他会立即在此处发出两个CWE警告:
让我们看另一个例子。 早在2012年,人们就知道MySQL中的安全性问题,攻击者可以在其中进入MySQL数据库。 我将提供一段代码作为此原因。
CVE-2012-2122说明 :在Oracle MySQL 5.1.x(5.1.63之前),5.5.x(5.5.24之前)和5.6.x(5.6.6之前)以及MariaDB 5.1.x(5.1.62之前)中的sql / password.c,在具有memcmp功能某些实现的某些环境中运行时,在5.2.12之前的5.2.x,5.3.6之前的5.3.x和5.5.23之前的5.5.x允许远程攻击者通过重复验证以绕过身份验证来绕过身份验证错误的密码,由于返回值检查不正确,最终导致令牌比较成功。
typedef char my_bool; my_bool check_scramble(const char *scramble_arg, const char *message, const uint8 *hash_stage2) { .... return memcmp(hash_stage2, hash_stage2_reassured, SHA1_HASH_SIZE); }
memcmp函数的返回类型
为int ,而
check_scramble函数的返回类型
为my_bool ,实际上是
char 。 结果,将
int强制转换为
char ,其中丢弃高位。 这导致这样的事实,即在256种情况中,大约1种情况下,只要知道用户名,就可以使用任何密码进行连接。
同样,即使在编写代码阶段,此CWE错误也可以消除,并防止变成CVE。 例如,PVS-Studio静态分析器生成以下警告:
CWE-197 (
V642 ):数值截断错误。
在继续该主题时,我建议看一下文章“
PVS-Studio如何帮助寻找漏洞? ”。
结论
0天漏洞-无法保证不受保护的事物。 但是它们发生的可能性可以大大降低。 为此,可以使用专用的SAST解决方案,例如PVS-Studio。 如果您的项目检测到可以归为CWE的错误,则应注意并修复它们。 尽管事实上只有少数CWE会通过消除CWE错误来填充CVE列表,但您仍可以保护应用程序免受许多潜在威胁的侵害。
网站连结
- 下载并尝试PVS-Studio
- PVS-Studio代码分析器中用于搜索错误和潜在漏洞的技术
- 根据常见弱点枚举(CWE)的PVS-Studio警告分类
- 根据SEI CERT编码标准的PVS-Studio警告分类

如果您想与说英语的读者分享这篇文章,请使用以下链接:Ekaterina Nikiforova。
PVS-Studio静态分析器作为防止零日漏洞的工具 。