安全研究 | 差别编程语言中 IP 地点分类的不一致性

[复制链接]
发表于 2024-10-31 23:41:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
作为一名安全研究职员,我分析了差别编程语言中 IP 地点分类 的行为。近来,我留意到一些有趣的不一致性,特别是在循环地点和私有 IP 地点的处置惩罚上。在这篇文章中,我将分享我对此题目标观察和见解。
设置

我检查了多种编程语言(如 Go、Java、Node.js、PHP、Python 和 Ruby)中多个 IP 地点(包罗本地和私有范围)的输出。以下是我的分析中的关键发现:
循环 IP 地点 (127.0.0.1)


•Go:报告 Is Private: false, Is Loopback: true
•Java:标记为 Is Private: false
•Node.js:报告 Is Private: true, Is Loopback: true
•PHP:报告 Is Private: true
•Python:报告 Is Private: True, Is Loopback: True
•Ruby:标记为 Is Private: false

不一致性:对于 127.0.0.1 的分类在语言间有明显差别。一些语言(Go、Node.js、PHP)将其识别为 私有,而其他语言(Java、Ruby)则 不这样以为。一般而言,127.0.0.1 应被视为循环地点,并预计被分类为 私有。
IPv6 循环地点 (::1)


•Go:报告 Is Private: false, Is Loopback: true
•Java:标记为 Is Private: false
•Node.js:报告 Is Private: true
•PHP:报告 Is Private: true
•Python:报告 Is Private: True, Is Loopback: True
•Ruby:标记为 Is Private: false

不一致性:与 127.0.0.1 类似,IPv6 循环地点 ::1 在各语言中的分类也有所差别。尽管一些语言(Node.js、PHP)将其标记为 私有,其他语言(Java、Ruby)则 不这样以为。预期 ::1 应被视为循环地点,并标记为 私有。
私有 IP 地点


•Go:正确识别 192.168.1.1 为 私有。
•Java:正确识别 192.168.1.1、10.0.0.1 和 172.16.0.1 为 私有。
•Node.js:在 127.0.0.1 和 169.254.169.254 上显示不一致。
•PHP:正确识别多个地点为 私有,包罗 169.254.169.254。
•Python:正确处置惩罚 私有 IP,但将 169.254.169.254 标记为私有,大概会引起混淆。
•Ruby:错误地将 169.254.169.254 识别为非 私有。

169.254.169.254 的案例

IP 地点 169.254.169.254 属于链路本地范围(169.254.0.0/16),专门用于自动私有 IP 地点分配(APIPA),通常出如今云环境中,如 AWS 和 Google Cloud。该地点提供关键的元数据,使运行在假造机上的服务可以或许访问实例信息,包罗安全凭据、实例 ID 以及其他环境数据。



差别编程语言输出的不一致性

让我们看看这个 IP 在差别编程语言中的处置惩罚方式:

•Go:标记 169.254.169.254 为 IsLinkLocalUnicast: true,但不为 私有 (IsPrivate: false)。
•Java:将该 IP 分类为 Is Private: false,这与链路本地地点的性质一致,链路本地地点不严格属于私有地点,但在本地子网内利用受到限制。
•Node.js:同时标记为 IsPrivate: true 和 IsLoopback: false。这是一个不一致的分类,因为链路本地地点不应被视为私有。
•PHP:将其标记为 私有,这与链路本地地点的预期行为相矛盾。
•Python:正确识别为 IsLinkLocal: True,同时标记为 私有。
•Ruby:错误地识别为 非 私有。

这为何紧张

链路本地地点如 169.254.169.254 在云环境中扮演着紧张角色,特别是用于实例元数据的检索。错误地分类这个 IP 地点大概导致严重的安全题目,尤其是在容易受到 服务器端请求伪造(SSRF) 毛病攻击的环境中。
例如,假如应用步调错误地将 169.254.169.254 标记为私有,并允许对其的无限制访问,那么攻击者利用 SSRF 毛病大概会提取敏感的实例元数据,包罗云服务的临时凭据。这大概使他们提拔权限、访问云资源并发起进一步攻击。
在 AWS 中,访问 http://169.254.169.254/latest/meta-data/ 会提供关于 EC2 实例的紧张元数据,包罗 IAM 角色。在 Google Cloud 中,类似的元数据也可以通过该 IP 获取。错误的分类大概会导致对该地点的请求暴露敏感信息给未授权用户。
结论

观察到的编程语言间的不一致性突显了 IP 地点分类缺乏标准化定义和行为。这种差别在安全上下文中尤为关键,因为差别的处置惩罚方式大概导致意想不到的行为,尤其是在涉及服务器端请求的场景中。
建议

- 标准化:建立明白的指南,以便在差别编程环境中同一 IP 地点分类,从而最小化这些不一致性。
- 测试和验证:对 IP 分类函数实行全面的测试,以确保在各种环境中表现出一致且安全的行为。
- 意识提拔:开发者必须意识到这些差别,并相应设计应用步调,特别是在处置惩罚大概涉及本地或私有网络地点的请求时。
Semgrep Rule for Go

为了确保 Go 语言中对 IP 地点分类的正确处置惩罚,可以利用以下 Semgrep 规则:
  1. rules: - id: go-check-isprivate languages: [go] patterns: - pattern: $IP.IsPrivate() - pattern-not: $IP.IsLinkLocalUnicast() message: "Ensure IP address handling methods include MustParseAddr or ParseIP, and validate the IP using IsPrivate, IsLoopback, or IsLinkLocalUnicast after parsing." severity: WARNING
复制代码
该规则检查 IsPrivate() 的利用,同时确保 IsLinkLocalUnicast() 不存在,提示开发者在解析后验证其 IP 地点处置惩罚方法。



理解这些细微差别对于增强安全性和确保应用步调在差别编程语言和环境中的稳定性至关紧张。通过解决这些不一致性,我们可以帮助减少大概危及基于云的基础设施的潜伏毛病。
您可以在我的GitHub仓库中找到完整的代码和分析:https://github.com/aydinnyunus/isItPrivate。该仓库旨在帮助理解差别编程语言中的IP地点分类,并夸大这些分类的潜伏安全影响,特别是与云环境中的SSRF毛病相关的影响。
向Google及其他公司报告题目

在我的研究过程中,我遇到了差别编程语言对169.254.169.254分类不一致的题目。为了澄清这一点,我向Google报告了该题目。3月3日,他们复兴道:

“IP.IsPrivate检查一个IP是否属于IANA定义的私有地点块,依据RFC 1918和RFC 4193。169.254.169.254不属于这两个范围。169.254/16是一个链接本地前缀,正如IP.IsLinkLocalMulticast和IP.IsLinkLocalUnicast所正确报告的那样。这似乎是按照预期工作的。”

这种不一致性源于差别语言和库对链接本地和私有IP的差别表明。
 
无 偿 获 取 网 安 资 料:


 说明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗出都需获取授权,违者后果自行承担,与本号及作者无关
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表