翻译《The Old New Thing》 - Why .shared sections are a security hole

Why .shared sections are a security hole - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20040804-00/?p=38253

Raymond Chen 2004年08月04日


        许多人会推荐使用共享数据节作为在应用程序的多个实例之间共享数据的一种方式。这听起来是个好主意,但实际上它是一个安全漏洞。

        由CreateFileMapping函数正确创建的共享内存对象是可以被保护的。它们有安全描述符,允许你指定哪些用户被允许拥有什么级别的访问权限。相比之下,任何加载了你的EXE或DLL的人都可以访问你的共享内存节。

        让我用一个故意不安全的程序来演示。

        拿一个scratch程序并进行以下更改:

#pragma comment(linker, “/SECTION:.shared,RWS”)
#pragma data_seg(“.shared”)
int g_iShared = 0;
#pragma data_seg()
void CALLBACK TimerProc(HWND hwnd, UINT, UINT_PTR, DWORD)
{
  int iNew = g_iShared + 1;
  if (iNew == 10) iNew = 0;
  g_iShared = iNew;
  InvalidateRect(hwnd, NULL, TRUE);
}
BOOL
OnCreate(HWND hwnd, LPCREATESTRUCT lpcs)
{
    SetTimer(hwnd, 1, 1000, TimerProc);
    return TRUE;
}
void
PaintContent(HWND hwnd, PAINTSTRUCT *pps)
{
  TCHAR sz[2];
  wsprintf(sz, TEXT(“%d”), g_iShared);
  TextOut(pps->hdc, 0, 0, sz, 1);
}

        继续运行这个程序。它不断地从0数到9。由于TimerProc函数从不让g_iShared超过9,wsprintf对缓冲区溢出是安全的。

        或者不是?

        运行这个程序。然后使用runas实用工具以不同用户身份运行这个程序的第二个副本。为了更有趣,让一个用户是管理员,另一个不是管理员。

        注意计数器以双倍速度计数。这是可以预期的,因为计数器是共享的。

        好的,现在关闭一个副本,然后在调试器下重新启动它。(如果你让管理员的副本自由运行,并且在调试器下运行非管理员的副本,那会更有趣。)

        让两个程序都运行,然后在调试器中中断并更改变量g_iShared的值为一个非常大的数字,比如说1000000。

        现在,根据你的调试器的侵入性,你可能会或可能不会看到崩溃。一些调试器是“有帮助的”,并且“取消共享”共享内存节,当你从调试器中更改它们的值时。对于调试(也许),对于我的演示(绝对是)是不好的。

        这是我如何使用内置的ntsd调试器做到的。

        我打开了一个命令提示符,它以我自己的身份运行(我不是管理员)。

        然后我使用runas实用程序以管理员身份运行scratch程序。

        我将使管理员的scratch程序副本崩溃,尽管我只是一个无聊的普通非管理员用户。

        从正常的命令提示符,我输入了“ntsd scratch”在调试器下运行scratch程序。

        从调试器提示符,我输入了“u TimerProc”来反汇编TimerProc函数,寻找

01001143 a300300001 mov [scratch!g_iShared (01003000)],eax

(注意:你的数字可能不同)。

        然后我输入了“g 1001143”以指示调试器正常执行直到达到该指令。

        当调试器中断时,我输入了“r eax=12341234;t”将eax寄存器的值更改为0x12341324,然后跟踪一个指令。

        那个单步跟踪将超出范围的值写入共享内存,一秒钟后,管理员版本的程序因缓冲区溢出而崩溃。

        发生了什么?

        由于内存是共享的,所有正在运行的scratch程序副本都可以访问它。我只是使用调试器运行了scratch程序的副本并更改了共享内存变量的值。由于变量是共享的,管理员程序副本中的值也会改变,这导致wsprintf缓冲区溢出,从而崩溃了管理员的程序副本。

        拒绝服务已经够糟糕了,但如果程序在共享内存中保留了任何有价值的东西,你真的可以做一些有趣的事情。如果有一个指针,你可以破坏指针。如果有一个字符串,你可以移除空终止符并使其变得“不可能”长,如果有人复制它而没有检查长度,可能会导致潜在的缓冲区溢出。

        如果有一个带有vtable的C++对象,那么你就中了大奖!你要做的是将vtable重定向到一个虚假的vtable(你构造在共享内存节中),并在该vtable中放置一个指向你生成的代码(也进入共享内存节)的函数指针条目,该代码接管了机器。(如果启用了NX,那么攻击就更难了,但原则上仍然可能。)

        即使你不能通过搞乱共享内存中的变量来触发缓冲区溢出,你仍然可以导致程序行为异常。在共享内存节上随意写入随机数字肯定会在被攻击的程序中引起“有趣”的行为。

        故事的寓意:避免共享内存节。由于你不能在节上附加ACL,任何可以加载你的EXE或DLL的人都可以修改你的变量并在另一个以更高安全级别运行的程序实例中造成混乱。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

走向大规模应用之前,DePIN 如何突破技术、数据与市场之网

近期,随着分布式物理基础设施网络(DePIN)的快速演变,一个旨在利用区块链技术彻底改造传统基础设施模型的新兴生态系统正在逐渐浮现。2024 年 4 月,以 peaq 为代表的 DePIN 项目成功筹集了 1500 万美元用于生态系统的扩…

通过 API从 0 到 1 构建 本地 GPTs——1.构建Builder‘s Prompt

目的:帮助小白用户生成结构化 prompt 功能清单 搭建本地 gpts 能力,构建本地企业知识库助手Builder’s Prompt -对话引导构建 prompt 示例,生成助手信息function_call的用法prompt 示例 GPTs 的 Create 能力 用于引导用户构建结构化的 pr…

深度学习的瓶颈是什么!

深度学习主要的瓶颈: 数据依赖与标注问题:深度学习模型通常需要大量的标注数据来进行训练。然而,获取大量的标注数据不仅成本高昂,而且在某些领域(如医疗、金融等)中可能难以获取足够的标注数据。此外&…

python-excel自动化-openpyxl

openpyxl学习笔记 创建或打开表格存储和遍历数据设置单元格风格过滤器和排序更改工作表的背景颜色合并单元格冻结窗口数字格式公式图像图表条形图折线图散点图 创建或打开表格 # 创建 import datetime from openpyxl import Workbook # 实例化 wb Workbook() # 激活 work…

四:物联网ARM开发

一:ARM体系结构概述 1:控制外设led灯还有一些按键这些就要用到gpio,采集传感器的数据需要adc进行转化数据格式,特殊的外设和传感器是通过特殊的协议接口去进行连接的比如一些轴传感器和主控器的连接是通过spi,IIC 控制…

Check the `candidate.safety_ratings` to see if the respoe was blocked.

ValueError:“response.text”快速访问器仅适用于简单(单“部分”)文本响应。此响应不是简单的文本。请改用“result.parts”访问器或完整的“result.candidates[index].content.parts”查找。期号 #170 谷歌-双子座/生成-人工智能-python Gi…

JavaScript 日期对象

在 JavaScript 中,你可以使用 Date 对象来处理日期和时间。以下是一些常见的 Date 对象的使用方法: 1、创建日期对象: // 创建一个表示当前日期和时间的 Date 对象 let currentDate new Date();// 创建一个特定日期和时间的 Date 对象 let…

GPB | RegVar:基于深度神经网络的非编码区突变功能预测新方法

Genomics, Proteomics & Bioinformatics (GPB)发表了由军事医学研究院辐射医学研究所张成岗研究员、周钢桥研究员和卢一鸣副研究员团队完成的题为“RegVar: Tissue-specific Prioritization of Noncoding Regulatory Variants”的方法文章。我们的“…

数据结构 - 栈

目录 一. 栈的概念 二. 栈的结构 三. 栈的实现 1. 实现栈的两种方式 链表实现栈 顺序表实现栈 选择依据 栈的创建 栈的初始化 栈的销毁 入栈 出栈 获取栈顶元素 判断栈是否为空 获取栈中有效数据的个数 一. 栈的概念 栈(Stack)是一种重要…

VScode Failed to parse remote port from server output

在使用VScode 在连接AutoDL 过程中一直连接不上,显示 Failed to parse remote port from server output 在网上查了很多资料,貌似的没啥用。和我有相同 error 的可以尝试修改setting.json 文件。 添加这条命令(我的json文件里面没有&#…

共享购:融合社交分享与消费返利的创新电商模式

共享购电商模式是一种独特的商业模式,巧妙地将社交分享与消费返利结合,让消费者在购物的同时,也能通过平台资产奖励实现价值的双重增长。该平台资产体系主要由共享值和共享积分两大要素构成,共同构建了一个充满活力的电商生态系统…

区块链技术与应用学习笔记(8-9节)——北大肖臻课程

目录 8.挖矿 对于全节点和轻节点思考问题? ①全节点在比特币的主要作用? ②挖矿时当监听到别人已经挖出区块并且延申了最长合法链此时应该立刻放弃当前区块在 本地重新组装一个指向最后这个新合法区块的候选区块,重新开始挖矿。节点这么做…

vivado 使用“链路 (Links)”窗口查看和更改链路设置

使用“链路 (Links) ”窗口查看和更改链路设置 创建链路后 , 就会将其添加到“ Links ”视图 ( 请参阅下图 ) 中 , 该视图是更改链路设置和查看状态的主要方法 , 也是最佳方法。 “ Links ”窗口中的每一行都对应 1 …

pymilvus创建多向量

pymilvus创建多向量 从 Milvus 2.4 开始,引入了多向量支持和混合搜索框架,单个collection可以支持10个向量字段。不同的向量字段可以表示不同的方面、不同的embedding模型甚至表征同一实体的不同数据模态。该功能在综合搜索场景中特别有用,例…

python学习笔记----python基础语法(二)

一、字面量 在 Python 中,字面量 是一种直接在代码中表示其自身值的数据。字面量用于创建值,并且可以直接被 Python 的解释器识别和处理。不同类型的数据有不同的字面量形式。下面是一些常见的字面量类型: 二、注释 注释:在程序…

[Android14] SystemUI的启动

1. 什么是System UI SystemUI是Android系统级应用,负责反馈系统及应用状态并与用户保持大量的交互。业务主要涉及的组成部分包括状态栏(Status Bar),通知栏(Notification Panel),锁屏(Keyguard),控制中心(Quick Setting)&#xff…

Babylon.js和Three.js的区别

Babylon.js和Three.js都是基于WebGL的3D图形库,它们使得开发者能够在网页上创建和展示3D内容。尽管它们的目标相似,但在设计理念、功能集、性能和社区支持等方面存在一些差异。北京木奇移动技术有限公司,专业的软件外包开发公司,欢…

SpringCloud引入SpringBoot Admin

Spring Boot Admin可以监控和管理Spring Boot&#xff0c;能够将 Actuator 中的信息进行界面化的展示&#xff0c;也可以监控所有 Spring Boot 应用的健康状况&#xff0c;提供警报功能。 1. 创建SpringBoot工程 2. 引入相关依赖 <dependency><groupId>com.alib…

MinIO分布式文件系统介绍

1、不同存储方式的对比&#xff1a; 2、 分布式文件系统对比 3、MinIO的特点 MinIO特点 数据保护&#xff1a;Minio使用Minio Erasure Code&#xff08;纠删码&#xff09;来防止硬件故障。即便损坏一半以上的driver&#xff0c;但是仍然可以从中恢复。 高性能&#xff1a;作…

PID算法学习

PID算法介绍 在过程控制中&#xff0c;按偏差的比例&#xff08;P&#xff09;、积分&#xff08;I&#xff09;和微分&#xff08;D&#xff09;进行控制的PID控制器&#xff08;亦称PID调节器&#xff09;是应用最为广泛的一种自动控制器。它具有原理简单&#xff0c;易于实…