一个安全检查的悖论
一方面代码审核要求有审计日志,需要记录操作者的IP,那我加上获取当前用户ip的逻辑,然后呢Fortify扫描又说获取IP的容易被欺骗,使用ip是个高风险漏洞,Fortify扫描的高风险漏洞必须整改,不整改不给验收。体制太僵硬了,Fortify扫描的规则这么死,有些问题根本不符合实际,你还得按它的结果改。没得法,全注掉好了,你要ip,我给你随便写吧
Abstract
攻击者可以欺骗 DNS 条目。勿将 DNS 名称作为安全性的依据。
Explanation
许多 DNS 服务器都很容易被攻击者欺骗,所以应考虑到某天软件有可能会在有问题的 DNS 服务器环境下运
行。 如果允许攻击者进行 DNS 更新(有时称为 DNS 缓存中毒),则他们会通过自己的机器路由您的网络流
量, 或者让他们的 IP 地址看上去就在您的域中。勿将系统安全寄托在 DNS 名称上。 示例: 以下代码使用
DNS 查找,以确定输入请求是否来自可信赖的主机。如果攻击者可以攻击 DNS 缓存,那么他们就会获得信
任。
String ip = request.getRemoteAddr();
InetAddress addr = InetAddress.getByName(ip);
if (addr.getCanonicalHostName().endsWith("trustme.com")) {
trusted = true;
}
IP 地址相比 DNS 名称而言更为可靠,但也还是可以被欺骗的。攻击者可以轻易修改要发送的数据包的源 IP
地址,但是响应数据包会返回到修改后的 IP 地址。为了看到响应的数据包,攻击者需要在受害者机器与修改
的 IP 地址之间截取网络数据流。为实现这个目的,攻击者通常会尝试把自己的机器和受害者的机器部署在同
一子网内。攻击者可能会巧妙地采取源地址路由的方法来回避这一要求,但是在今天的互联网上通常会禁止
源地址路由。总而言之,核实 IP 地址是一种有用的 authentication 方式,但不应仅使用这一种方法进行
authentication。
Recommendation
如果通过域名检查的方式可以确保主机接受和发送的 DNS 记录的一致性,您可以更加信任这一方式。攻击者
如若不能控制目标域的域名服务器,就无法同时欺骗接受和发送的 DNS 记录。虽然这种方法并不简单,但
是: 攻击者也许可以说服域注册者把域移交给一个恶意的域名服务器。依赖于 DNS 记录的 authentication 是
有风险的。 虽然没有十分简单的 authentication 机制,但是还有比基于主机的 authentication 更好的方法。密
码系统提供了比较不错的安全性,但是这种安全性却易受密码选择不当、不安全的密码传送和 password
management 失误的影响。类似于 SSL 的方法值得考虑,但是通常这样的方法过于复杂,以至于使用时会有
运行出错的风险,而关键资源也随时面临着被窃取的危险。在大多数情况下,包括一个物理标记的多重
authentication 可以在合理的代价范围内提供最大程度的安全保障。
?
|