安全研究 | 不同编程语言中 IP 地址分类的不一致性

admin 2024年10月21日19:03:09评论17 views字数 3409阅读11分21秒阅读模式

扫码领资料

获网安教程

安全研究 | 不同编程语言中 IP 地址分类的不一致性

安全研究 | 不同编程语言中 IP 地址分类的不一致性

Track安全社区投稿~  

千元稿费!还有保底奖励~(https://bbs.zkaq.cn)

作为一名安全研究人员,我分析了不同编程语言中 IP 地址分类 的行为。最近,我注意到一些有趣的不一致性,特别是在循环地址和私有 IP 地址的处理上。在这篇文章中,我将分享我对此问题的观察和见解。

设置

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

循环 IP 地址 (127.0.0.1)

Go:报告 Is Privatefalse, Is Loopbacktrue
Java:标记为 Is Privatefalse
Node.js:报告 Is PrivatetrueIs Loopbacktrue
PHP:报告 Is Privatetrue
Python:报告 Is PrivateTrueIs LoopbackTrue
Ruby:标记为 Is Privatefalse
不一致性:对于 127.0.0.1 的分类在语言间有显著差异。一些语言(Go、Node.js、PHP)将其识别为 私有,而其他语言(Java、Ruby)则 不这样认为。一般而言,127.0.0.1 应被视为循环地址,并预计被分类为 私有

IPv6 循环地址 (::1)

Go:报告 Is Privatefalse, Is Loopbacktrue
Java:标记为 Is Privatefalse
Node.js:报告 Is Privatetrue
PHP:报告 Is Privatetrue
Python:报告 Is PrivateTrueIs LoopbackTrue
Ruby:标记为 Is Privatefalse
不一致性:与 127.0.0.1 类似,IPv6 循环地址 ::1 在各语言中的分类也有所不同。尽管一些语言(Node.js、PHP)将其标记为 私有,其他语言(Java、Ruby)则 不这样认为。预期 ::1 应被视为循环地址,并标记为 私有

私有 IP 地址

Go:正确识别 192.168.1.1 为 私有
Java:准确识别 192.168.1.110.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 地址分类的不一致性

img

不同编程语言输出的不一致性

让我们看看这个 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 规则:
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 地址处理方法。
安全研究 | 不同编程语言中 IP 地址分类的不一致性

img
理解这些细微差别对于增强安全性和确保应用程序在不同编程语言和环境中的稳定性至关重要。通过解决这些不一致性,我们可以帮助减少可能危及基于云的基础设施的潜在漏洞。
您可以在我的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的不同解释。
以上内容由白帽子左一翻译并整理。原文:https://infosecwriteups.com/understanding-inconsistencies-in-ip-address-classification-across-programming-languages-19b2645b10a9

声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。

原文始发于微信公众号(白帽子左一):安全研究 | 不同编程语言中 IP 地址分类的不一致性

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月21日19:03:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   安全研究 | 不同编程语言中 IP 地址分类的不一致性https://cn-sec.com/archives/3292110.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息