当前位置: 首页 > news >正文

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

作为一名安全研究人员,我分析了不同编程语言中 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 在不同编程语言中的处理方式:

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++

一、文本域&#xff08;Text Fields&#xff09; 文本域通过 <input type"text"> 标签来设定&#xff0c;当用户要在表单中键入字母、数字等内容时&#xff0c;就会用到文本域。 <!DOCTYPE html> <html> <head> <meta charset"ut…...

SpringMvc参数传递

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

西安国际数字影像产业园:数字化建设赋能产业升级与拓展

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

linux线程池

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

PyTorch图像分类实战——基于ResNet18的RAF-DB情感识别(附完整代码和结果图)

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

【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 物理层接口模块的布图和布局规划的设计和实 现过程&#xff0c;包括设计环境的建立&#xff0c;布图规划包括模块尺寸的确定&#xff0c;IO 单元、宏单元以及 特殊单元的摆放。由于布图规划中的电源规划环节较为重要&#xff0c; 影响芯片的布线资…...

EDA --软件开发之路

之前一直在一家做数据处理的公司&#xff0c;从事c开发&#xff0c;公司业务稳定&#xff0c;项目有忙有闲&#xff0c;时而看下c&#xff0c;数据库&#xff0c;linux相关书籍&#xff0c;后面跳槽到了家eda公司&#xff0c;开始了一段eda开发之路。 eda 是 electric design …...

51c~目标检测~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12377509 一、总结 这里概述了基于深度学习的目标检测器的最新发展。同时&#xff0c;还提供了目标检测任务的基准数据集和评估指标的简要概述&#xff0c;以及在识别任务中使用的一些高性能基础架构&#xff0c;其还涵盖了…...

计算机低能儿从0刷leetcode | 33.搜索旋转排列数组

题目&#xff1a;33. 搜索旋转排序数组 思路&#xff1a;看到时间复杂度要求是O(log N)很容易想到二分查找&#xff0c;普通的二分查找我们已经掌握&#xff0c;本题中的数组可以看作由两个分别升序的数组拼成&#xff0c;在完全升序的部分中进行二分查找是容易的&#xff0c;…...

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 布局混用 在现代网页设计中&#xff0c;CSS 布局技术如 flex 和绝对定位被广泛使用。然而&#xff0c;这两者结合使用时&#xff0c;可能会导致一些意想不到的布局问题。本文将探讨如何正确使用绝对定位元素&#xff0c;避免它们受到 flex 布局的…...

Redis 事务 问题

前言 相关系列 《Redis & 目录》《Redis & 事务 & 源码》《Redis & 事务 & 总结》《Redis & 事务 & 问题》 参考文献 《Redis事务详解》 Redis事务是什么&#xff1f; 标准的事务是指执行时具备原子性/一致性/隔离性/持久性的一系列操作。…...

Cpp学习手册-进阶学习

C标准库和C20新特性 C标准库概览&#xff1a; 核心库组件介绍&#xff1a; 容器&#xff1a; C 标准库提供了多种容器&#xff0c;它们各有特点&#xff0c;适用于不同的应用场景。 std::vector&#xff1a; vector&#xff1a;动态数组&#xff0c;支持快速随机访问。 #in…...

代码随想录-字符串-反转字符串中的单词

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

勒索软件通过易受攻击的 Cyber​​Panel 实例攻击网络托管服务器

一个威胁行为者&#xff08;或可能多个&#xff09;使用 PSAUX 和其他勒索软件攻击了大约 22,000 个易受攻击的 Cyber​​Panel 实例以及运行该实例的服务器上的加密文件。 PSAUX 赎金记录&#xff08;来源&#xff1a;LeakIX&#xff09; Cyber​​Panel 漏洞 Cyber​​Pane…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...