从攻击者角度来看Go1.24的路径遍历攻击防御

news2025/5/16 21:57:02

        

目录

一、具体攻击示例

程序

攻击步骤:

二、为什么攻击者能成功?

分析

类比理解

总结

三、TOCTOU 竞态条件漏洞

1、背景:符号链接遍历攻击

2. TOCTOU 竞态条件漏洞

3. 另一种变体:目录移动攻击

4. 问题的核心

四、防御方法

        在golang 1.24中,提供了Traversal-resistant file API os.Root。它通过限制对根目录的访问,提供了一种简单而强大的防御机制。Golang官方称,使用os.RootAPI可以有效地防止未授权的路径遍历攻击‌。那Go为什么要绞尽脑汁去堵住这一漏洞,它又是如何起作用的?我们避开一堆晦涩的概念,试着从攻击者角度,就很容易理解了。

一、具体攻击示例

程序

假设你的程序逻辑如下:

// 1. 检查阶段:解析符号链接,确保路径是合法的
cleaned, err := filepath.EvalSymlinks("/tmp/user_upload/a/b/file.txt")
if err != nil {
    return err
}
if !filepath.IsLocal(cleaned) {
    return errors.New("路径不安全")
}

// 2. 使用阶段:打开文件
f, err := os.Open(cleaned)  // 攻击者在这里动手脚!

攻击步骤

  1. 初始状态

    • 路径 /tmp/user_upload/a/b/file.txt 是一个普通文件(无符号链接)。

    • 你的程序检查时确认它是合法的。

  2. 攻击者发动攻击

    • 在你的程序刚完成检查还未执行 os.Open 的瞬间,攻击者快速执行以下命令

      • # 删除原文件(或目录),替换成符号链接
        rm -rf /tmp/user_upload/a/b/file.txt
        ln -s /etc/passwd /tmp/user_upload/a/b/file.txt

        (或者直接移动目录:mv /tmp/user_upload/a/b /tmp/user_upload/a/b_backup

  3. 程序实际打开文件时
    • 由于路径已被篡改,os.Open(cleaned) 会跟随符号链接,意外打开 /etc/passwd

二、为什么攻击者能成功?

分析

  1. 文件系统操作不是原子的

    • 检查和打开是两个独立的系统调用,操作系统会在这之间调度其他进程(包括攻击者的恶意操作)。

  2. 攻击者可以不断尝试

    • 攻击者可以用脚本反复运行符号链接替换操作,只要有一次成功抢占时间窗口,就能达成攻击。

  3. 多核CPU加剧问题

    • 现代多核系统并行执行任务,进一步扩大了竞态条件的可能性。


类比理解

想象以下场景:

  1. 你是一名保安,检查访客的身份证(检查阶段),确认无误后允许进入大楼。

  2. 但在你低头登记时(检查和放行之间的时间差),攻击者快速调包了身份证。

  3. 你根据登记表放行时,实际进入的是冒名顶替者(恶意符号链接)。

总结

        现在我们知道,攻击者不修改你的代码,而是利用操作系统的调度特性,在极短的时间窗口内篡改文件系统状态。这里就有个概念:即“检查时间/使用时间竞态条件”(TOCTOU, Time Of Check To Time Of Use)。

        因此,

防御的核心是消除竞态条件,确保“检查”和“使用”是原子操作。

三、TOCTOU 竞态条件漏洞

1、背景:符号链接遍历攻击

        符号链接(symlink)是一种特殊的文件,它指向另一个文件或目录。攻击者可能通过构造恶意符号链接,诱骗程序访问非预期的文件(如 /etc/passwd)。为了防止这种攻击,程序通常会先检查路径是否包含符号链接,例如:

cleaned, err := filepath.EvalSymlinks(unsafePath)  // 解析路径中的符号链接
if err != nil {
  return err
}
if !filepath.IsLocal(cleaned) {  // 检查路径是否在安全范围内
  return errors.New("unsafe path")
}

这段代码的逻辑是:

  1. 解析路径中的所有符号链接,得到最终路径(cleaned)。

  2. 检查路径是否是“本地的”(例如,不包含 .. 或绝对路径等危险操作)。

2. TOCTOU 竞态条件漏洞

        即使程序在打开文件前检查了路径的安全性,攻击者仍可能在检查(Check)和实际使用(Use)之间篡改路径。例如:

  1. 攻击步骤

    • 程序检查路径 a/b/c,确认它是合法的。

    • 在检查之后、打开文件之前,攻击者将 a/b/c 替换为指向 /etc/passwd 的符号链接。

    • 程序实际调用 os.Open(cleaned) 时,会跟随符号链接,意外访问敏感文件。

  2. 代码示例的漏洞

    f, err := os.Open(cleaned)  // 攻击者可能在检查后修改路径!

3. 另一种变体:目录移动攻击

另一种 TOCTOU 攻击涉及移动路径中的目录。例如:

  • 攻击者提供路径 a/b/c/../../etc/passwd

    • 正常解析后,路径应为 a/etc/passwd(因为 c/../../ 会回退两级)。

  • 攻击时机

    • 在程序解析路径时,攻击者将 a/b/c 重命名为 a/b

    • 此时路径实际指向 a/b/../../etc/passwd,即 /etc/passwd,导致越权访问。


4. 问题的核心

  • 根本原因:文件系统的状态在检查和使用之间可能被篡改(竞态条件)。

  • 防御难点:传统的“先检查后使用”模式无法保证原子性(检查和操作不是连续的)。

四、防御方法

  1. 原子性操作

    • 使用 openat + O_NOFOLLOW(Linux)或类似机制,确保检查和打开是连续的

    • 示例(Go 中可用 os.OpenFile 设置标志位):

      • f, err := os.OpenFile(cleaned, os.O_RDONLY|syscall.O_NOFOLLOW, 0)

  2. 降低时间窗口

    • 尽量减少检查和打开之间的代码(减少被攻击的窗口)。

  3. 文件描述符传递

    • 通过已打开的父目录文件描述符操作子路径(避免路径解析竞态)。

  4. 沙盒/权限控制

    • 在容器或低权限环境中运行程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2377163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt中的RCC

Qt资源系统(Qt resource system)是一种独立于平台的机制,用于在应用程序中传输资源文件。如果你的应用程序始终需要一组特定的文件(例如图标、翻译文件和图片),并且你不想使用特定于系统的方式来打包和定位这些资源,则可以使用Qt资源系统。 最…

Delphi 12.3调用Chrome/edge内核实现DEMO源码

DELPHI使用调用Chrome/Edge内核浏览器,虽然旧的WebBrowser也还可以用,但大势所趋,新版的已经不需要使用第三方的组件了,算是全内置的开发了,不废话 Unit1 源码 Form 源码 unit Unit1;interfaceusesWinapi.Windows, W…

GitDiagram - GitHub 仓库可视化工具

GitDiagram - GitHub 仓库可视化工具 项目链接:https://github.com/ahmedkhaleel2004/gitdiagram 将任何 GitHub 仓库转换为交互式架构图,只需替换 URL 中的 hub 为 diagram。 ✨ 核心功能 即时可视化:将代码库结构转换为系统设计/架构图…

【Linux】基于虚拟机实现网络的管理

通过学习我们需要掌握:IP 的配置、子网掩码、网关、DNS 服务器】 一、配置虚拟机的IP地址 1. 查看虚拟机 IP 地址(可以看到三个地址) ip a(即ip address show) 其中可以看到: Linux系统识别的以太网接口…

QT 使用QPdfWriter和QPainter绘制PDF文件

QT如何生产pdf文件,网上有许多文章介绍,我也是看了网上的文章,看他们的代码,自己琢磨琢磨,才有了本编博客; 其他什么就不详细说了,本篇博客介绍的QPdfWriter和QPainter绘制PDF文件;…

linux - 权限的概念

目录 用户权限 超级用户与普通用户的区别 超级用户(root): 普通用户: 切换用户身份 使用sudo执行高权限命令 用户管理 用户组管理 文件权限 文件访问者类别 基本权限 权限表示方法 权限修改 chmod chown chgrp u…

【Vue】CSS3实现关键帧动画

关键帧动画 两个重点keyframesanimation子属性 实现案例效果展示: 两个重点 keyframes 和 animation 作用:通过定义关键帧(keyframes)和动画(animation)规则,实现复杂的关键帧动画。 keyframes 定义动画的关键帧序列…

AD 多层线路及装配图PDF的输出

装配图的输出: 1.点开‘智能PDF’ 2. 设置显示顶层: 设置显示底层: 多层线路的输出 同样使用‘智能PDF’

MultiTTS 1.7.6 | 最强离线语音引擎,提供多音色无障碍朗读功能,附带语音包

MultiTTS是一款免费且支持离线使用的文本转语音(TTS)工具,旨在为用户提供丰富的语音包选项,实现多音色无障碍朗读功能。这款应用程序特别适合用于阅读软件中的离线听书体验,提供了多样化的语音选择,使得听书…

基于自校准分数的扩散模型在并行磁共振成像中联合进行线圈灵敏度校正和运动校正|文献速递-深度学习医疗AI最新文献

Title 题目 Joint coil sensitivity and motion correction in parallel MRI with aself-calibrating score-based diffusion model 基于自校准分数的扩散模型在并行磁共振成像中联合进行线圈灵敏度校正和运动校正 01 文献速递介绍 磁共振成像(MRI)…

OCR发票识别API实现

OCR发票识别API实现 1. 阿里云OCR发票识别2. Tesseract OCR3. 利用java调用大模型进行识别4. 飞桨PaddleOCR 1. 阿里云OCR发票识别 阿里云OCR发票识别 示例: 接口:https://dgfp.market.alicloudapi.com/ocrservice/invoice 参数:{"img&…

实战案例:采集 51job 企业招聘信息

本文将带你从零开始,借助 Feapder 快速搭建一个企业级招聘信息数据管道。在“基础概念”部分,我们先了解什么是数据管道和 Feapder;“生动比喻”用日常场景帮助你快速理解爬虫组件;“技术场景”介绍本项目中如何使用代理等采集策略…

从AlphaGo到ChatGPT:AI技术如何一步步改变世界?

从AlphaGo到ChatGPT:AI技术如何一步步改变世界? 这里给大家分享一个人工智能学习网站。点击跳转到网站。 https://www.captainbed.cn/ccc 前言 在科技发展的历史长河中,人工智能(AI)技术无疑是最为璀璨的明珠之一。从…

AI 编程革命:腾讯云 CodeBuddy 如何重塑开发效率?

引言 在传统开发流程中,开发者常需依赖 SDK 文档或反复调试来获取云资源信息。而随着 AI 技术爆发式发展,腾讯云推出的 CodeBuddy 正以对话式编程颠覆这一模式 —— 只需自然语言描述需求,即可直接生成可执行代码。作为腾讯混元大模型与 Dee…

星海智算云平台部署GPT-SoVITS模型教程

背景 随着 GPT-SoVITS 在 AI 语音合成领域的广泛应用,越来越多的个人和团队开始关注这项前沿技术。你是否也在思考,如何快速、高效地部署并体验这款强大的声音克隆模型?遗憾的是,许多本地部署方案不仅配置复杂,而且对…

15:00开始面试,15:06就出来了,问的问题有点变态。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到4月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…

20250515通过以太网让VLC拉取视熙科技的机芯的rtsp视频流的步骤

20250515通过以太网让VLC拉取视熙科技的机芯的rtsp视频流的步骤 2025/5/15 20:26 缘起:荣品的PRO-RK3566适配视熙科技 的4800W的机芯。 1080p出图预览的时候没图了。 通过105的机芯出图确认 荣品的PRO-RK3566 的硬件正常。 然后要确认 视熙科技 的4800W的机芯是否出…

UE5.3 C++ 房屋管理系统(二)

三.当房屋生成成功,我们就需要把TMap里的数据存到数据库里。不然一点停止运行,就会所以数据都不见了。这里使用DataTable来存储。 1.DataTable是UE常用的表,虽然不是专门用来存档的,但也可以这么用。 DataTable表,实…

VSCode1.101.0便携版|中英文|编辑器|安装教程

软件介绍 Visual Studio Code是微软推出的一个强大的代码编辑器,功能强大,操作简单便捷,还有着良好的用户界面,设计得很人性化,旨在为所有开发者提供一款专注于代码本身的免费的编辑器。 软件安装 1、 下载安装包…

Linux系统发布.net core程序

前端 前端用的Vue3,发布的话需要Nginx下载安装Nginx 麒麟:这里我麒麟用的是桌面版,我直接把操作流程写在下面,写的比较简单,具体的可以具体搜这一块内容学习一下。打包vue程序,通过MobaXterm将打包后的程序…