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

news2025/1/16 8:10:02

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.coloradmin.cn/o/1628526.html

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

相关文章

立即刷新导致请求的response没有来得及加载造成的this request has no response data available

1、前端递归调用后端接口 const startProgress () > {timer.value setInterval(() > {if (progress.value < 100) {time.value--;progress.value Math.ceil(100 / wait_time.value);} else {clearInterval(timer.value);progress.value 0;timer.value null;time.…

pytest-asyncio:协程异步测试案例

简介&#xff1a;pytest-asyncio是一个pytest插件。它便于测试使用异步库的代码。具体来说&#xff0c;pytest-asyncio提供了对作为测试函数的协同程序的支持。这允许用户在测试中等待代码。 历史攻略&#xff1a; asyncio并发访问websocket Python&#xff1a;协程 - 快速创…

vscode安装中文插件不生效

在 escode 中&#xff0c;安装了上面的插件&#xff0c;但是界面依然显示的是英文。 解决方案 使用组合键 ctrshiftp&#xff0c;输入 Configure Display Language&#xff0c; 选中 zh-cn&#xff0c;重启

机器视觉3D视觉检测系统的优势

随着科技的飞速发展&#xff0c;机器视觉技术已经成为现代工业生产中不可或缺的一部分。特别是3D视觉检测系统&#xff0c;其优势日益凸显&#xff0c;为各行业的质量控制和生产自动化提供了强大的支持。本文将探讨机器视觉3D视觉检测系统的优势&#xff0c;并分析其在实际应用…

C语言入门课程学习笔记-6

C语言入门课程学习笔记-6 第27课 - 字符数组与字符串&#xff08;上&#xff09;第28课 - 字符数组与字符串&#xff08;下&#xff09;第29课 - 数组专题练习&#xff08;上&#xff09;第30课 - 数组专题练习&#xff08;下&#xff09; 本文学习自狄泰软件学院 唐佐林老师的…

【图像压缩算法】霍夫曼编码

1. 研究背景 霍夫曼在1952年提出一种构造最佳码的方法&#xff0c;称之为霍夫曼编码&#xff08;Huffman)。霍夫曼编码是一种无损的统计编码方法&#xff0c;利用信息符号概率分布特性的改变字长进行编码。霍夫曼编码适用于多元独立信源&#xff0c;对于多元独立信源来说它是最…

淘宝API接口大全:淘宝app商品详情数据接口

淘宝APP商品详情数据接口是用于获取商品详情信息的专用API&#xff0c;适用于移动应用开发者使用。 要使用这个接口&#xff0c;你需要遵循以下步骤&#xff1a; 了解和申请API权限&#xff1a;在使用淘宝API接口之前&#xff0c;需要先前往淘宝开放平台了解相关的API文档&am…

Git泄露和hg泄露原理理解和题目实操

一.Git泄露 1.简介 Git是一个开源的分布式版本控制系统&#xff0c;它可以实现有效控制应用版本&#xff0c;但是在一旦在代码发布的时候&#xff0c;存在不规范的操作及配置&#xff0c;就很可能将源代码泄露出去。那么&#xff0c;一旦攻击者发现这个问题之后&#xff0c;就…

速卖通自养号测评:如何规避安全风险?

对于初涉电商领域的新卖家而言&#xff0c;进行销量测评显得尤为关键。由于速卖通新店铺往往难以获得平台活动的支持&#xff0c;流量也相对匮乏&#xff0c;因此&#xff0c;开店的首要任务便是进行测评&#xff0c;通过积累一定的评论和销售数据。 测评的益处颇多&#xff0…

Java web应用性能分析之【sysbench基准测试】

Java web应用性能分析之【CPU飙高分析之MySQL】-CSDN博客 Java web应用性能分析之【Linux服务器性能监控分析概叙】-CSDN博客 Java web应用性能分析概叙-CSDN博客 Java web应用性能分析之【基准测试】-CSDN博客 上面基本科普了一下基准测试&#xff0c;这里我们将从sysbench…

leetCode60. 排列序列

leetCode60. 排列序列 方法一:语法版&#xff0c;面试官不认可的方法&#xff1a;next_permutation函数 // 方法一&#xff1a;使用next_permutation函数&#xff0c;将某容器设置为当前按照字典序 // 的下一个全排列的内容 class Solution { public:string getPermutation(in…

将游戏界面与注册/登录界面连接到一起

一、 导包 在注册页面中导入一个import subprocess包 二、 使用代码将其连接到一起 在循环中加入下面这一行代码&#xff0c;用来实现效果 subprocess.run(["python", "game代码.py"]

RocketMQ 部署

RocketMQ 部署 1、安装依赖&#xff08;Java&#xff09; [rootMicroservices ~]# mkdir -p /data/businessServer/ [rootMicroservices ~]# cd /data/businessServer/# 获取安装包&#xff08;下载较慢&#xff09; [rootMicroservices businessServer]# wget https://githu…

【深度学习实战(25)】搭建训练框架之ModelEMA

一、什么是ModelEMA&#xff1a; 在深度学习中&#xff0c;经常会使用EMA&#xff08;指数移动平均&#xff09;这个方法对模型的参数做平均&#xff0c;以求提高测试指标并增加模型鲁棒。 指数移动平均&#xff08;Exponential Moving Average&#xff09;也叫权重移动平均&a…

Redis面试题二(数据存储)

目录 1.redis 的数据过期策略 1. 惰性删除&#xff08;Lazy Expiration&#xff09; 2. 定期删除&#xff08;Periodic Expiration&#xff09; 3. 定时删除&#xff08;Timing-Based Expiration&#xff09; 实际应用中的组合策略 2.redis 有哪些内存淘汰机制 volatile&…

uniapp 根据不同角色实现动态底部TabBar导航栏

文章目录 前言最终效果一、实现步骤1.配置page.json中的tabBar属性2.创建自定义tabBar文件3.配置Vuex4.在main.js中引入并挂载store&#xff1a;5.登录页内引入自定义tabbar&#xff0c;根据角色进行登录验证6.在每个导航页中使用自定义的tabbar 前言 在UniApp的开发过程中&am…

Swift - 函数

文章目录 Swift - 函数1. 函数的定义2. 隐式返回(Implicit Return)3. 返回元组&#xff1a;实现多返回值4. 函数的文档注释5. 参数标签&#xff08;Argument Label&#xff09;6. 默认参数值&#xff08;Default Parameter Value&#xff09;7. 可变参数&#xff08;Variadic P…

【Java】全套云HIS源码包含EMR、LIS(多医院、卫生机构使用)

云HIS系统简介 SaaS模式Java版云HIS系统源码&#xff0c;在公立二甲医院应用三年&#xff0c;经过多年持续优化和打磨&#xff0c;系统运行稳定、功能齐全&#xff0c;界面布局合理、操作简便。 1、融合B/S版电子病历系统&#xff0c;支持电子病历四级&#xff0c;HIS与电子病…

Redis(七) zset有序集合类型

文章目录 前言命令ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZPOPMAXZPOPMIN两个阻塞版本的POP命令BZPOPMAX BZPOPMINZRANKZREVRANKZSCOREZREMZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBY集合间操作ZINTERSTOREZUNIONSTORE 命令小结 内部编码使用场景 前言 对于有序集合这个名…

航片水体空洞修补

水体空洞情况如下图所示&#xff1a; 水体空洞修补结果如下图所示&#xff1a; 操作视频教程&#xff1a; MCM智拼图软件V8.5-漏洞空洞修补-水体修补_哔哩哔哩_bilibili