SV.TAINTED.SECURITY_DECISION

在安全性决策中信任不受信任的输入

每当从用户或外部环境接受输入的时候,都应该在使用前验证类型、长度、格式和范围。在得到妥善验证之前,数据将被视为已被污染。SV.TAINTED 系列检查器会查找代码中使用已污染数据的情况。

当根据被污染数据的值作出安全性决策(例如身份验证或授权)时,攻击者可绕过软件的安全防护。在没有足够的加密、完整性检查或其他机制时,任何来自外部的输入都无法受到信任。

SV.TAINTED.SECURITY_DECISION 检查器会标记基于不受信任的数据做出安全性决策的情况。在此检查器的上下文中,安全性决策被定义为与硬编码字符串相比较。

漏洞与风险

攻击者能绕过安全性决策以获取任何受保护的内容。产生的后果将取决于相关的功能,但后果可包括向不受信任的用户授予额外的权限,以及绕过重要的安全性检查。最终,此弱点可能导致暴露或修改敏感数据,系统崩溃或执行任意代码。

漏洞代码示例

复制
  #include <sys/socket.h>
  #include <netdb.h>
  #include <stdbool.h>
  #include <string.h>
  #include <arpa/inet.h>
 
  void f(const char *ip_addr_string){
     struct hostent *hp;struct in_addr myaddr;
     char* tHost = "trustme.example.com";
    myaddr.s_addr=inet_addr(ip_addr_string);
    bool trusted = false;
    hp = gethostbyaddr((char *) &myaddr, sizeof(struct in_addr), AF_INET);
     if (hp && !strncmp(hp->h_name, tHost, sizeof(tHost))) { 
         trusted = true;
     } else {
         trusted = false;
     }
 }

以下代码示例使用 DNS 查找以确定入站请求是否来自受信任的主机。如果攻击者能使 DNS 缓存中毒,他们将获得受信任的状态。

Klocwork 针对第 13 行生成问题报告,指出在第 12 行通过调用 gethostbyaddr 获得来自外部函数的未经验证的字符串 hp->h_name,并且该字符串可在第 13 行通过调用 strncmp 用于潜在的安全性决策。

扩展

此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。