SV.USAGERULES.SPOOFING
电子欺骗安全漏洞
某些系统调用(通常是 DNS 查找)很容易遭到电子欺骗攻击。SV.USAGERULES.SPOOFING 检查器标记出以下系统调用的实例:gethostbyaddr、gethostbyname 和 sethostname,它们都是电子欺骗的潜在目标,因为它们依赖于来自主机服务器的数据。
漏洞与风险
电子欺骗将通过使 DNS 缓存中毒来允许恶意用户获得受信任的状态。在 Microsoft Internet Explorer 中即存在该漏洞的一个示例,它可能被攻击者利用以在地址和状态栏中显示虚假的 URL。在本案例中,因为输入验证错误导致产生漏洞。
成功的漏洞利用将允许攻击者在地址和状态栏中显示任意的完全限定的域名 (FQDN),这与实际的页面位置不同。该做法可能欺骗用户,使其泄露敏感信息,或在系统上下载并执行恶意软件,因为他们信任了虚假的域。
缓解与预防
要避免该漏洞:
- 确保针对所有系统输入都进行正确地验证。
- 使用 IP 地址而非 DNS 名称。IP 地址也可能遭受电子欺骗,但一般来说,它们比 DNS 名称更可靠。
漏洞代码示例
复制
#include <winsock2.h>
#include <ws2tcpip.h>
void foo()
{
struct hostent *he;
struct in_addr ipv4addr = { 0 };
inet_pton(AF_INET, "127.0.0.1", &ipv4addr);
he = gethostbyaddr((char *)&ipv4addr, sizeof ipv4addr, AF_INET);
}
修正代码示例
复制
#include <winsock2.h>
#include <ws2tcpip.h>
void foo()
{
struct sockaddr_in sa;
char host[NI_MAXHOST] = "127.0.0.1";
char service[NI_MAXSERV];
getnameinfo((struct sockaddr *)&sa, sizeof sa, host, sizeof host, service, sizeof service, NI_NUMERICSERV);
}