CodeQL 文档

条件的不可信输入

ID: cpp/tainted-permissions-check
Kind: path-problem
Security severity: 7.5
Severity: warning
Precision: medium
Tags:
   - security
   - external/cwe/cwe-807
Query suites:
   - cpp-security-extended.qls
   - cpp-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

此规则查找在 if 语句中使用不可信输入的代码,并且该语句的主体做出了安全决策。这是 CWE-807 的一个示例,它使程序容易受到攻击。攻击者可能能够通过操纵系统的外部输入来获得对系统的未授权访问。

建议

在大多数情况下,您需要添加或加强对用户提供数据的检查,以确保其完整性。然后,用户提供的数据可以用作安全决策的可信输入。例如,不要根据可预测的固定字符串检查 HTTP cookie,而是根据随机生成的会话密钥检查 cookie。

此规则可能会突出显示一些条件,在这些条件下,用户提供的数据已经过检查并且可以信任。并非始终可以确定对数据应用的检查是否足以确保安全性。

示例

以下示例包含在 CWE 807 中。

struct hostent *hp;struct in_addr myaddr;
char* tHost = "trustme.example.com";
myaddr.s_addr=inet_addr(ip_addr_string);

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 查询的结果与固定字符串进行比较。攻击者可以为请求的 IP 返回不正确的反向 DNS 条目,从而获得与来自 trustme.example.com 的合法用户相同的访问权限。

要解决此示例中的问题,您需要添加一种额外的机制来测试用户提供的数据。例如,可以使用数字 IP 地址。

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私