安全研究 | 不同编程语言中 IP 地址分类的不一致性
作为一名安全研究人员,我分析了不同编程语言中 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 规则:
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的不同解释。
无 偿 获 取 网 安 资 料:
申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关
相关文章:

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

小小的表盘还能玩出这么多花样?华为手表这次细节真的拉满
没想到小小的表盘还能玩出这么多花样?华为这次细节真的拉满!还有没有你不知道的神奇玩法? 情绪萌宠,心情状态抬腕可见 好心情就像生活馈赠的糖果,好的心情让我们遇到困难也不惧打击!HUAWEI WATCH GT 5情绪…...

trueNas 24.10 docker配置文件daemon.json无法修改(重启被覆盖)解决方案
前言 最近听说truenas的24.10版本开放docker容器解决方案放弃了原来难用的k3s,感觉非常巴适,就研究了一下,首先遇到无法迁移老系统应用问题比较好解决,使用sudo登录ssh临时修改daemon.json重启docker后进行docker start 容器即可…...

数字孪生,概念、应用与未来展望
随着科技的飞速发展,数字化已经成为各行各业的发展趋势,在这个过程中,数字孪生作为一种新兴的技术,逐渐引起了人们的关注,本文将对数字孪生的概念、应用以及未来展望进行详细介绍。 数字孪生的概念: 数字孪…...

Chromium HTML Input 类型Text 对应c++
一、文本域(Text Fields) 文本域通过 <input type"text"> 标签来设定,当用户要在表单中键入字母、数字等内容时,就会用到文本域。 <!DOCTYPE html> <html> <head> <meta charset"ut…...

SpringMvc参数传递
首先对于post请求汉字乱码需要进行过滤器配置 普通参数传递 直接传递 客户端传递的属性名与我的bean中的函数参数名相同 映射传递RequestParam("XXX") 在我们方法参数中定义一个与客户端属性名一致 并绑定参数 POJO实体类传递 嵌套POJO传递 数组likes参数传递…...

西安国际数字影像产业园:数字化建设赋能产业升级与拓展
西安国际数字影像产业园的数字化建设,在当前经济与科技迅猛发展的大背景下,已然成为提升园区管理效率、服务水平以及运营效果的关键趋势。随着信息技术日新月异的进步,数字化更是成为这座产业园转型升级的核心关键词。如今,西安国…...

linux线程池
线程池: * 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着 监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利 用࿰…...

PyTorch图像分类实战——基于ResNet18的RAF-DB情感识别(附完整代码和结果图)
PyTorch图像分类实战——基于ResNet18的RAF-DB情感识别(附完整代码和结果图) 关于作者 作者:小白熊 作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测…...

【OccNeRF: Advancing 3D Occupancy Prediction in LiDAR-Free Environments】阅读笔记
【OccNeRF: Advancing 3D Occupancy Prediction in LiDAR-Free Environments】阅读笔记 1. 论文概述Abstract1. Introduction2. Related work2.1 3D Occupancy Prediction2.2 Neural Radiance Fields2.3 Self-supervised Depth Estimation 3. Method3.1 Parameterized Occupanc…...

DDRPHY数字IC后端设计实现系列专题之后端设计导入,IO Ring设计
本章详细分析和论述了 LPDDR3 物理层接口模块的布图和布局规划的设计和实 现过程,包括设计环境的建立,布图规划包括模块尺寸的确定,IO 单元、宏单元以及 特殊单元的摆放。由于布图规划中的电源规划环节较为重要, 影响芯片的布线资…...
EDA --软件开发之路
之前一直在一家做数据处理的公司,从事c开发,公司业务稳定,项目有忙有闲,时而看下c,数据库,linux相关书籍,后面跳槽到了家eda公司,开始了一段eda开发之路。 eda 是 electric design …...

51c~目标检测~合集2
我自己的原文哦~ https://blog.51cto.com/whaosoft/12377509 一、总结 这里概述了基于深度学习的目标检测器的最新发展。同时,还提供了目标检测任务的基准数据集和评估指标的简要概述,以及在识别任务中使用的一些高性能基础架构,其还涵盖了…...
计算机低能儿从0刷leetcode | 33.搜索旋转排列数组
题目:33. 搜索旋转排序数组 思路:看到时间复杂度要求是O(log N)很容易想到二分查找,普通的二分查找我们已经掌握,本题中的数组可以看作由两个分别升序的数组拼成,在完全升序的部分中进行二分查找是容易的,…...

SpringBoot+VUE2完成WebSocket聊天(数据入库)
下载依赖 <!-- websocket --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency><!-- MybatisPlus --><dependency><groupId>com.ba…...

理解 CSS 中的绝对定位与 Flex 布局混用
理解 CSS 中的绝对定位与 Flex 布局混用 在现代网页设计中,CSS 布局技术如 flex 和绝对定位被广泛使用。然而,这两者结合使用时,可能会导致一些意想不到的布局问题。本文将探讨如何正确使用绝对定位元素,避免它们受到 flex 布局的…...
Redis 事务 问题
前言 相关系列 《Redis & 目录》《Redis & 事务 & 源码》《Redis & 事务 & 总结》《Redis & 事务 & 问题》 参考文献 《Redis事务详解》 Redis事务是什么? 标准的事务是指执行时具备原子性/一致性/隔离性/持久性的一系列操作。…...
Cpp学习手册-进阶学习
C标准库和C20新特性 C标准库概览: 核心库组件介绍: 容器: C 标准库提供了多种容器,它们各有特点,适用于不同的应用场景。 std::vector: vector:动态数组,支持快速随机访问。 #in…...

代码随想录-字符串-反转字符串中的单词
题目 题解 法一:纯粹为了做出本题,暴力解 没有技巧全是感情 class Solution {public String reverseWords(String s) {//首先去除首尾空格s s.trim();String[] strs s.split("\\s");StringBuilder sb new StringBuilder();//定义一个公共的字符反转…...

勒索软件通过易受攻击的 CyberPanel 实例攻击网络托管服务器
一个威胁行为者(或可能多个)使用 PSAUX 和其他勒索软件攻击了大约 22,000 个易受攻击的 CyberPanel 实例以及运行该实例的服务器上的加密文件。 PSAUX 赎金记录(来源:LeakIX) CyberPanel 漏洞 CyberPane…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...