惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
MyScale Blog
MyScale Blog
Y
Y Combinator Blog
罗磊的独立博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Proofpoint News Feed
Google DeepMind News
Google DeepMind News
V
Vulnerabilities – Threatpost
T
The Blog of Author Tim Ferriss
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
N
News and Events Feed by Topic
B
Blog RSS Feed
阮一峰的网络日志
阮一峰的网络日志
博客园_首页
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 【当耐特】
N
Netflix TechBlog - Medium
博客园 - 叶小钗
B
Blog
Vercel News
Vercel News
T
Tenable Blog
T
The Exploit Database - CXSecurity.com
Spread Privacy
Spread Privacy
T
Threat Research - Cisco Blogs
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Last Week in AI
Last Week in AI
F
Fortinet All Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Microsoft Security Blog
Microsoft Security Blog
S
Securelist
Microsoft Azure Blog
Microsoft Azure Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Palo Alto Networks Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
D
DataBreaches.Net
Cyberwarzone
Cyberwarzone
Engineering at Meta
Engineering at Meta
Martin Fowler
Martin Fowler
G
GRAHAM CLULEY
Project Zero
Project Zero
Cisco Talos Blog
Cisco Talos Blog
A
Arctic Wolf
C
CERT Recently Published Vulnerability Notes
L
LangChain Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
Check Point Blog
A
About on SuperTechFans
W
WeLiveSecurity
The GitHub Blog
The GitHub Blog

机核

游戏性能旗舰最强之选,一加 Ace 6 至尊版国补到手价2999元起 6元钱自己更换电动车刹车线 《生化危机9:安魂曲》编剧Haris Orkin专访 摸金游戏?音乐游戏!暗区新赛季这把能弹的琴有何来历? 好评国产武侠SRPG《息风谷战略》免费DLC现已推出 | 机核 GCORES 碎片 《生化危机:安魂曲》将于5月实装首个免费更新内容 | 机核 GCORES 新锐东方游戏,谱写世界新章! 沉浸式恋爱视觉小说游戏《心象演算》免费试玩版现已正式上线 | 机核 GCORES 互动影游《代号三国:龙起》上线!穿越三国与曹操并肩、与佳人同行、与权谋博弈! 《老头收集梦想生活》,游戏酒桌会6,录音笔VOL.689 | 机核 GCORES 破界·共生——《白日梦:无限世界》五大核心游戏特点解析 价格已到史低,锐龙5 9600X/锐龙7 9700X正适合抄底 时间循环之旅即刻启程!《归环》一周目测试今日开启 热门在线韩游变魂游,洛奇衍生作能否打破“花瓶”魔咒? LG UltraGear evo 全新高端显示器系列:当“5K”遇见“AI”,不止强大,更懂热爱 反套路三国互动影游《代号三国:龙起》今日上线! 愿望单登记人数突破10万!备受瞩目的“女儿养成游戏” 《梦幻魔法公主》今日于Steam平台上线!限时八折优惠中 《黑神话:悟空》全球音乐会2026巡演将于4月29日12时开票 | 机核 GCORES “Snowguelike”生存肉鸽挖矿新作《蛙穿雪境》公布发售日期,5月7日正式上线 | 机核 GCORES 重塑移动办公、AI创作新境!全新华硕灵耀Air系列、ProArt 骁龙版震撼首发,创芯未来 均分88:《Saros》媒体评分汇总 | 机核 GCORES 上海烛龙公布合作遗迹探险游戏《吉时已到》首支预告片 | 机核 GCORES 首个独立游戏《萝薇日记》已上线Steam! 烛龙新IP《吉时已到》首曝,打造国内首款中式合作遗迹探险游戏 喜加一:《暗黑破坏神Ⅳ》国服现已开启限时免费领取本体活动 | 机核 GCORES 新版《生化危机》电影定于9月18日上映,官方网站现已上线 | 机核 GCORES 《冲就完事模拟器2》“星球大战”联动DLC正式宣布 | 机核 GCORES SteamController将于5月4日发售,售价99美元 | 机核 GCORES 事已至此,内存这么用也算省钱了,“2+1”非对称双通道应用实测 505游戏母公司现已收购《明末:渊虚之羽》IP | 机核 GCORES 基石 手动杂谈12|格斗游戏也能讲好故事 | 机核 GCORES I Love You Mr Snowball 我的向日葵小姐 会比GTA6先发售吗?最硬核的生存游戏《DAYZ》要推新DLC了 周记02:在2026遇到新怪谈 什么硬件,能让游戏Loading界面快速消失? | 机核 GCORES GadioSpec《百年风云世界杯》免费试听集 | 机核 GCORES 百年风云世界杯Vol.1丨足球崛起 | 机核 GCORES 100年前,一群人提前替我们经历了AI恐惧 | 机核 GCORES 《呼啸山庄》2026 ——一辆当代艺术的大卡车冲撞了我的大脑 手游《天穗之咲稻姬:日之香巡灵传》宣布将于7月27日停服 | 机核 GCORES 集结梦之队,征战世界杯,《最佳球会ONLINE》上线Steam 山水绝景随心拼 休闲建造游戏《千里山河录》Steam商店页公开 巫师帽、法袍、魔杖,为什么它们是影视、游戏里的法师必备三件套? 《无鞘信使》-第一章 复古风自动战斗肉鸽《终结之终结》Steam商店页面现已上线 电脑里有一款不破不立的MMO,录音笔VOL.688 | 机核 GCORES 《生化危机》30周年纪念周边发售,这次是真的“保护伞” 可靠耐用+AI全能,惠普战66 2025锐龙版深度体验 《时之书:无尽终章》关卡“大航海时代”全球首次公开 经典名作《乌龙派出所》改编经营模拟游戏《乌龙派出所~阿两的商店街物语~》正式宣布支持简体中文 明日开冲,解锁反套路三国互动影游《代号三国:龙起》即将上线 独立游戏《这是我的宝藏!》已发售~ 降低难度不是唯一解,无压力死亡也是好体验 Netflix官宣新片《普通人》:讲述韩国现代史上的权力风暴 《生化危机:安魂曲》全球销量现已突破700万份 《绝地鸭卫》PC版5月15日正式发售 亡妻回忆录?女性向情感叙事游戏《S-mail》现已正式发售 全新酷黑风格,酷睿Ultra 200S PLUS的高性价比搭档!七彩虹BATTLE-AX B860M-PLUS S WIFI7 V20 超级黑刃主板测评 胖狗 索尼发布了港台地区PS5产品价格调整公告,将于5月1日起实施 二次元怪猎+性感美女!《碧蓝幻想:无尽黄昏》开启Beta公测 这款怪谈类型中式恐怖游戏居然更新了?! 《百日战纪 -最终防卫学园-》改编漫画将于今年冬季开启连载 《如被附身,请致电我们》:匈牙利黑色幽默恐怖小说 《竹屿山房杂部卷五》(译文) 大树 超越引擎 摄影分享丨四月 碎片杂记vol.72 当老式FPS与老式动画技术碰撞出新时代的火花—《神探杰克鼠》 想做独游,如何避免首个项目就褒姒? 在线多人动作游戏《OCTOPinbs》将于5月12日上线Steam! 《酒鬼女神的酒诡》确定将于2026年登陆Steam 《CRYMELIGHT》将于11月5日(周四)正式发售!4月25日开始预购! 钢铁国度MKI部落Evolution,蛮兵部分 【钢铁国度】部落-Primal MK I,蛮兵部分 这是一个高中生用ai跑出来的作品,我自称他为物理神话 钢铁国度MKI部落Metamorphosis,蛮兵部分上 钢铁国度MKI部落Metamorphosis,蛮兵部分下 INDIE Live Expo于4月25日举办:首发9款新作,超200款独立游戏亮相 暗黑卡牌策略新作《魔忌:穷鼠啮狸》发布全新中文试玩版和发售预告片,4月30日正式上线在即 战锤40K长篇小说:变节者・苦难主宰(三)(全书完) 战锤40K长篇小说:变节者・苦难主宰(二) 战锤40K长篇小说:变节者・苦难主宰(一) 英语语言学习丨短语专题1:短语的特点 唯一的EVE战争 【少前同人】【M200】战术人形会梦见音乐会吗 【昏迷3】即将发售,前作主角悉数到场!“恶灵”宋老师化身可操控角色 业内人士:游戏公司“十有八九”使用生成式AI,包括卡普空 欢庆一周年:《光与影:33号远征队》全新纪念艺术图、超值折扣与免费更新同步上线 才刚刚开始呢 【抽奖】《星际卡车司机》推出免费大型更新,四折平史低折扣进行中 四人合作FPS游戏《佣兵猎手》抢先体验重大更新 1 现已上线 Raw Fury新作《深馅地牢 Deep Dish Dungeon》将于今秋加入 XGP 塔防幸存者游戏《魔怪来袭》推出首个 DLC 《饿狼传说:群狼之城》1周年纪念!新DLC“沃尔夫冈·克劳萨”今日参战 猫狗相伴 欢乐闯关 双人合作平台跳跃游戏《猫狗同行》上线Steam商店页 《同行:月球逃脱》(Together: Moon Escape)上线将于明日上线Steam
计算机和网络安全简史:第四期
Beta-TNT · 2024-12-02 · via 机核

题图:缓冲区溢出攻击基本原理示意图

从漏洞开始,对于大多数非计算机专业的人来说可能就比较抽象了。维基百科给出的计算机漏洞的定义是“能削弱计算机系统整体安全的瑕疵”(Vulnerabilities are flaws in a computer system that weaken the overall security of the system.)。往大了说,漏洞(Vulnerability)其实可以认为是一种bug,但在我认知看来,BUG更多的指的是程序在业务层面的错误,就比如游戏BUG导致萝卜上房或者存档损坏。而漏洞主要指的是可以直接对软件或者操作系统本身的安全性造成危害的那一类bug。并且更重要的是,漏洞可以被有意利用

漏洞的分类

漏洞的属性是多维度的,目前业界按以下几个维度对漏洞进行分类:

  • 漏洞利用的位置:分为本地和远程,区别在于漏洞是否可以通过远程(主要是通过网络)方式利用。只能在目标主机本地环境利用的漏洞就是本地漏洞;

  • 漏洞成因:造成漏洞的成因,如边界条件错误、设计瑕疵、输入验证错误、竞争条件、配置错误等;

  • 漏洞引发的威胁:漏洞利用可造成的效果,如代码执行、权限获取、权限提升、信息泄露、拒绝服务等;

  • 漏洞的时效性:可分为0day(漏洞信息尚未公开,还没有厂商和安全机构注意到,漏洞利用的技术和防御手段细节尚不明确);1day(漏洞信息已经公开,可以通过临时手段进行防御,已被厂商和安全机构关注,但厂商尚未提供漏洞修复补丁);nday(漏洞细节已经公开,且厂商也已经提供修复补丁)。

在计算机安全领域,0day漏洞就是核弹,因为0day漏洞没有公开的特征和信息,也就没有办法在漏洞被利用之前实施检测和防御,一旦被恶意利用会造成极为严重的后果。因此像微软、谷歌和Adobe等大型软件公司会以高昂的价格公开征集自家产品和服务的0day漏洞,单个0day漏洞奖金最高可达数十万美元。由此也诞生了一类专门以出售0day漏洞为职业的研究人员:漏洞猎人。

1 / 4

缓冲区溢出漏洞

限于篇幅,本文挑漏洞中最典型的一类漏洞介绍:缓冲区溢出漏洞

在漏洞成因分类中,缓冲区溢出漏洞属于边界条件错误。在讲原理之前想请大家一起回忆一个事儿:还记得当年玩PSP的时候,在神奇电池发现之前早期的破解刷机过程吗?我记得大概应该是这样的:机器买到之后,先用一些办法将系统版本降到2.00;再在记忆棒的相册文件夹里拷贝一张TIFF格式的图片文件;开机之后立即进相册找到这张图片,机器屏幕就会一闪,然后就进入自制系统了。

不知道各位有没有想过这个过程中究竟发生了什么?那张图片是做什么用的?如果你在电脑上打开那张TIFF图片,大概率电脑会告诉你图片格式损坏,无法读取。这张图片的真正用途,是用来触发PSP固件的TIFF图片的缓冲区溢出漏洞。

要弄明白缓冲区溢出漏洞,首先要弄清楚什么是缓冲区。简单来说缓冲区(Buffer)是指程序为了容纳数据,在内存中开辟的一块内存空间,这块内存空间一旦申请,其大小就会被固定下来。申请缓冲区的目的当然是为了用于容纳数据,但如果写入缓冲区的数据比缓冲区更大,而且编译器和程序自身都没有检查写入数据的长度(术语叫边界检查,Boundary Checking),就会把数据数据写入缓冲区以外的内存空间,覆盖了其他数据,这就造成了缓冲区溢出

这里还可以阅读@韩大老师这篇介绍内存管理文章作为背景知识。韩大老师的文章大概提到了指针越界会引发的问题,这篇文章可以详细告诉你具体会引发什么样的问题、如何利用以及如何防御。

一般情况下,这种意外的内存覆盖会导致程序崩溃、死机或者运行出错。但如果漏洞的利用者通过调试弄清楚了程序在运行时的内存空间结构(术语叫内存布局),就可以通过构造溢出数据的长度以及内容的方式,让溢出到缓冲区外的数据精确覆盖一个指定的内存地址的内容(大部分情况下是函数的返回地址),而这个内存地址正好容纳着指向程序接下来要执行的指令的指针,就会使得溢出到这个地址的数据被当作指令指针被执行起来。这就实现了缓冲区溢出所能造成的最为危险的一类漏洞:任意代码执行。而通过这种方式被执行的代码叫Shellcode

这也解释了为什么早期图片破解是有一定概率的,不保证每次都成功。之前机核就有播客节目里有悲催老哥好不容易拿到PSP了,结果整整一节课都没能刷机成功。这就是因为进程的内存布局每次运行的时候不一定是一样的,系统状态不同或者之前运行了其他功能都可能导致进程的内存布局发生变化。而注入的指令的内存地址和内容都是写死不可更改的,如果内存布局不是能够触发代码执行的状态,破解就失败了。这一点在后续还会提到。

还记得第一期文章开始提到的冯·诺依曼?冯·诺依曼提出过一个重要的概念:存储程序,即程序可以使用和数据相同的方式共享存储空间,这就是我们所说的“冯·诺依曼架构”(与之对应的是程序和数据分开存储的“哈佛架构”)。因为实现成本低且硬件利用效率较高,现在主流的计算机都采用冯·诺依曼架构。但这也产生了一系列问题,其中之一就是在某些情况下数据可能会被错误地当做程序来执行,缓冲区溢出攻击就是冯·诺依曼架构面临的问题。

(在当今的部分CPU里,数据和指令储存在不同的高速缓存里,在CPU层面使用了哈佛架构)

回到PSP的TIFF漏洞。TIFF(Tagged Image File Formation)是一种格式复杂的图片文件,目前由ADOBE公司维护,可包含多个图像数据以及自定义标签,这种复杂性为其埋下了安全隐患。PSP带的libtiff漏洞如果用正规化术语来描述的话大概是这样的:由于PSP 2.00到2.80版本固件使用的libTIFF第三方组件带有缓冲区溢出漏洞,导致可以通过加载精心构造的TIFF文件的方式在PSP设备上执行任意代码。

要利用缓冲区溢出漏洞,首先通过FUZZ测试、逆向工程或者直接对源代码进行审计等方式找到不安全的内存操作,例如上文提到的没有检查源数据的长度就往缓冲区里拷贝;然后使用调试器(或者代码审计)进行跟踪,顺着执行流程找到这个不安全的操作在程序处理文件、键盘输入或网络数据等外部数据时的触发点和利用点,例如将文件结构的某个字段内容设置为特别大,或者在指定长度的字段写入异常数值,使得程序在处理文件结构的时候写入了不该写入的内存地址,造成漏洞;最后搭建调试环境,将程序运行起来,观察程序运行时的内存布局和引用的模块和库的地址,根据这些信息编写漏洞利用代码和shellcode。

我们都知道PSP是封闭生态,正常情况下只有获得索尼第一方签名的程序才能在PSP上运行。而通过漏洞可以绕过厂商的签名验证机制,在PSP上运行任意代码,后续只要通过这个漏洞执行权限提升和加载自制系统,就可以绕过签名验证机制运行记忆棒上的ISO镜像了。

这里还可以多说一句,通过这种方式实现的代码执行之后做什么。由于通过缓冲区溢出的方式注入一整个实现完整功能的shellcode不太现实,一般是先弄清楚被注入的程序会加载哪些系统API函数,从中找到合适的功能,记下其在内存空间中的地址,注入成功之后将上一个函数的返回地址覆盖为想要执行的系统函数的地址,通过它再加载存储里预先准备好的的文件或者实现提权等操作以实现需求。有点类似军事上的OSP——On-Site Procurement,即武器和装备都从任务区域获取)

顺带一提,在TIFF漏洞之前还有一种破解方式,是通过部分正版游戏里存在的漏洞实现的。这种做法需要一张带有漏洞的游戏的UMD光盘以及一个修改过的游戏存档。其原理是借用了一个可以在PSP上合法运行的正版游戏作为掩护,让这个游戏加载一个精心构造的可以触发漏洞的存档,通过它在游戏的内存空间里执行注入的代码。后续工作一样也是降级、提权和加载自制系统等,实现破解。

任意代码执行是缓冲区溢出漏洞能够实现的最为成功的利用,大多数情况下缓冲区溢出只能导致程序崩溃。例如经典的死亡之Ping(Ping of death,CVE-1999-0345)。这个漏洞是由于操作系统在处理超过正常大小的ICMP PING包时发生错误导致的。具体来说是当接收到长度超过65535字节的Ping包时Windows 95和NT会蓝屏死机。因为ICMP和UDP、TCP一样同属于网络层协议,其协议栈是在操作系统内核实现的。所以一旦它发生崩溃就会导致整个操作系统崩溃。

防御措施

缓冲区安全编译开关

计算机专业朋友可能还有印象,大学C/C++语言课程用的是微软的Visual C++的话,写代码的时候如果字符数组(定长字符串)忘了初始化,打印字符串内容会输出一堆奇怪的“烫烫烫”。

首先说说“烫烫烫”是怎么来的。如果你在调试器里监控数组变量的内容,会发现定长数组声明之后(栈空间内存),如果没有初始化的话,数组内容都是0xcc字节(十进制值204),这是VC++在调试配置(Debug)下所有的未分配的栈内存的默认填充内容。而两个0xcc字节在GB2312或GBK编码里就是汉字的“烫”。之所以用这样的内容填充,是因为0xcc作为单字节指令时是INT3,这是一条中断指令。如果程序发生了缓冲区溢出,大概率会导致指令流程跳转到了写满了INT3指令的未分配的内存空间,执行到这里程序就会被中断,提醒开发者可能发生了缓冲区溢出。

这个功能在VC++的调试配置下默认开启(编译器开关:/GZ,启用堆栈帧运行时错误检查,从VS2005开始被/RTC替代),但在Release(发布)配置下默认是不开启的,这时申请的数组里的初始内容就是这块内存原本的内容,编译器不提供给未使用的内存填充默认值的功能。这里还能CALLBACK第一期讲的“冲击波”蠕虫:“冲击波”的传播是依靠RPC服务的缓冲区溢出漏洞,但这个病毒只能感染Windows 95/98和ME,而同样也开启这个服务的Windows Server 2003就不会感染。这是因为2003的这个服务是开启了另一个用于防止缓冲区溢出攻击编译器开关(/GS,缓冲区安全检查)编译的,当发生缓冲区溢出的时候Server 2003的这个服务只会崩溃,不会执行注入的代码。

安全版内存函数

2005年微软在自家的VC++里加入了安全版内存操作函数,在相应的原版本函数名后边加了“_s”作为区分,意为security。比如字符串拷贝函数strcpy()的安全版本就是strcpy_s()。相对于原版函数,安全版本增加了长度检查和边界检查。这样就可以防止由于写入的目的缓冲区过小导致的缓冲区溢出。但这个规范不是通用的,无法直接移植到linux环境。

防火墙和IDS

缓冲区溢出漏洞最为凶恶的一种利用就是远程利用,即缓冲区溢出漏洞导致的远程任意代码执行。上面讲的TIFF图片漏洞还只是本地利用。可以想象一下如果某个网络服务存在缓冲区溢出导致任意代码执行的漏洞,那只要入侵者构造一个可触发漏洞的数据包发送过去,这个主机就被控制了。远程任意代码执行漏洞在评级里往往属于最危险的那一类。

不过幸运的是,大多数情况下可以通过远程利用的缓冲区溢出漏洞,它的载荷数据包都有很明显的特点,比如数据包的某个字段特别长、某些字段的数值明显超出正常范围之类。这个时候就可以用防火墙来过滤和阻断这些有害的数据包。防火墙一般设置在网络边界,监控所有进出流量。当根据规则发现某个流入数据包结构异常或者有明显的漏洞利用特征,防火墙就会阻断这个连接,并将这个事件记录下来。而IDS一般部署在内网,接受来自交换机的镜像流量,IDS并不会阻断可疑连接和数据,而是向运维人员发出告警。

内容因剧透、敏感不适等原因被隐藏

点击查看

不过防火墙和IDS也有其局限性,它只能防御所有已经被规则定义的攻击,无法防御特征未知的0day漏洞。

地址空间布局随机化(ASLR)

由于缓冲区溢出漏洞的巨大危害以及其发生的频繁程度,让软件厂商们不得不思考有没有一种一劳永逸的解决方案,于是ASLR就诞生了。ASLR的全称是Address Space Layout Randomization,即地址空间布局随机化

缓冲区溢出攻击能够执行注入代码的一个重要条件就是攻击者可以预测程序运行时的内存布局以及要利用的函数的地址(比如程序引用的系统API函数地址)。在以前没有ASLR的时候,相同的操作系统上同一个程序每次运行的时候它的内存基址都是固定的,使得攻击者通过调试就可以很容易弄清运行时的内存布局。而ASLR的作用就是让程序运行时的内存基址随机化,让程序每次运行的时候内存布局都是随机的,这样就使得攻击者无从预测内存布局,也就无法利用缓冲区溢出实现代码执行了。ASLR让那些原本是高危的缓冲区溢出漏洞退化成拒绝服务的中危或低危漏洞了。

ASLR技术需要在操作系统层面实现。目前包括Windows、Linux、Android、iOS和macOS等主流操作系统都已经支持ASLR技术,这项技术对缓冲区溢出漏洞可以说是釜底抽薪,直接让曾经的杀手级漏洞退环境了。

坚固的盾会催生更尖利的矛,ASLR技术也无法完美防御所有的缓冲区溢出攻击,对抗ASLR的技术叫堆喷射(Heap Spray)。基本原理也并不复杂:ASLR把内存空间全部随机化,让攻击者无从预测溢出点函数的返回地址了,那把所有可能的内存空间(这里特指堆空间)都用shellcode填满,并且在shellcode里加入大量的滑板指令(一种shellcode的编写技巧,在shellcode中填充大量的nop指令,其功能是“执行下一条指令”,然后把真正要执行的漏洞利用代码放在最后部分,这样可以大大提升shellcode被返回地址“踩中”的可能性)。当然了,这种类似“火力覆盖”的攻击方式相对于没有ASLR直接利用溢出漏洞相比成功率肯定低了很多,而且由于会产生大量的写内存操作,很容易被发现。虽然使用堆喷射技术可以绕过ASLR技术,但ASLR大幅提升了攻击的成本。

最后还可以讲一个有关缓冲区溢出的趣闻,可能有的朋友已经在别的地方读过了。

在没有网络分发、游戏还都是以实体版发售为主的时代,如果一款游戏如果发现了Bug,就只能在后续生产的碟片和卡带中进行修正,已经卖出的拷贝就没有办法了。这种情况对于纯单机游戏尚可接受,只要不是游戏无法正常运行的恶行Bug,大部分情况下官方只需要在游戏杂志上道个歉,说明一下如何避免Bug,然后在后续生产的拷贝中修正Bug就好。

不过对于包含在线游玩内容的游戏来说就有些不妙了。在线游戏会涉及平衡性和稳定性等多方面因素,在线部分如果存在Bug是必须修正的。PS2平台的《瑞奇与叮当3》当年就遇到了这样的问题。

在高度依赖网络的今天,我们已经难以想象以前的联网游戏是有可能运行在一张只读的光盘上的,但当时就是这样。而且很不幸地,这款游戏发售之后发现存在需要修正的Bug。可能是出于网络连通性测试目的,《瑞奇与叮当3》在联网的时候会从游戏的服务器上下载最新版的最终用户许可协议(End User License Agreement,也就是常说的EULA)文本并显示在界面上。游戏使用了原版的strcpy()函数从网络数据缓冲区中复制EULA内容到长度固定的显示缓冲区,而且没有检查文本长度是否比缓冲区长!

这是一个非常低级的错误,在没有内存安全版本函数的年代,程序员应自行编写代码检查拷贝数据是否比缓冲区长,这也是当年大多数缓冲区溢出漏洞的成因。但这次这个错误反而成为了解决Bug的希望:游戏开发人员打算使用这个缓冲区溢出漏洞来给游戏打热补丁(Hot Fix)。

通过之前对于缓冲区溢出漏洞原理的讲解,我们知道这个方式在理论上是可行的。但实际上仍然要解决很多问题。首先,注入点的内存地址和目标内存地址之间有一定距离,二者之间的数据会被覆盖掉,而这些数据是有用的,要在之后将其恢复;其次,strcpy()的复制会在源数据里第一个零值字节(一般写做“\0”)——字符串结尾标志处停止。这就要求无论是填充部分还是shellcode部分都不能包含零值字节。填充部分还好说,shellcode由于功能要求,出现零值字节不可避免,所以还得先对shellcode进行调制和变换,使其不包含零值字节。这件事具体实施起来是这样做的:

  1. 服务端发送调制好的超长的EULA文本;

  2. 客户端接收超长的EULA文本,这段文本会把原本的EULA缓冲区、一些无辜数据以及一个可由特定网络数据包触发执行的函数的返回地址淹掉;

  3. 服务端再发送一个数据包,来触发刚刚被淹掉返回地址的函数的执行;

  4. 由于返回地址被覆盖,函数执行完毕返回的时候会跳转到一个被溢出的数据内容指定的新的内存地址,这个地址位于溢出覆盖的内存区域,已经预先在那里布置了一段shellcode;

  5. shellcode的作用是解码器,对溢出数据中的载荷数据进行解码,解码后的载荷数据才是真正的业务代码,它的作用是从指定的网络地址下载补丁内容,然后修复由于缓冲区溢出被覆盖的无辜数据;

  6. 在内存中运行补丁。

开发人员就这样通过自家游戏里的缓冲区溢出漏洞用“自己黑自己”的方式完成了修补。这个故事最初刊登在杂志《游戏开发者杂志》(Game Developer Magazine)2013年六月/七月刊,也就是停刊前最后一期上,作者是“失眠组”Insomniac的程序员Jonathan Garrett,现在是“失眠组”的首席引擎程序员。

内容因剧透、敏感不适等原因被隐藏

点击查看

漏洞数据库体系

漏洞数据库

为了规范漏洞信息交换格式,增强漏洞信息通报的及时性和准确性,计算机和网络安全业界曾经成立过不少漏洞信息数据库。目前最具权威性和业界认可度的漏洞数据库叫CVE:Common Vulnerability and Explosure,即通用漏洞和披露。CVE创立于1999年,目前由美国MITRE公司运营,受到美国国土安全部和美国国家网络安全部的资助。CVE有一整套漏洞信息处理机制,包括漏洞信息的收录、验证、评估、通报和披露等。被CVE收录的漏洞都会指派一个编号,格式是“CVE-四位年份-序号”,例如“CVE-2008-4250”(著名的MS08-067漏洞)。截止本文编写期间,CVE累计收录了237725个漏洞。

在CVE之外,各个国家也都成立了隶属于政府机构的漏洞数据库,例如美国国家漏洞数据库NVD(National Vulnerability Database,隶属于美国国家标准与技术研究院)。我国有三个官方建立的漏洞库,分别是:

  • 隶属于中国信息安全测评中心的国家信息安全漏洞库(China National Vulnerability Database of Information Security,CNNVD)

  • 隶属于国家互联网应急中心(CNCERT/CC)的国家信息安全漏洞共享平台(China National Vulnerability Database,CNVD)

  • 隶属于国家工业信息安全发展研究中心的国家工业信息安全漏洞库(China National Industrial Cyber Security Vulnerability Database,CIC-SVD)

1 / 3

此外,一些大型软件公司也有自己的漏洞披露和编号机制,比如微软、Adobe、Apache Foundation等。

POC和EXP

在和漏洞相关的内容里,POC和EXP是两个经常看到的缩写。

先说EXP,在这个语境下它代表Exploit,特指漏洞利用代码。即可以通过触发漏洞实施攻击的工具或者代码。

而POC是Proof of Concept的缩写,在这个语境下一般翻译为“漏洞验证”,指的是以尽量无害的方式证明漏洞存在的手段。POC代码可以以通过无害方式触发漏洞来证明、检查特定组件版本号等方式来证明。完全无害的POC代码一般会被用在漏洞扫描工具上。

对于大多数已知漏洞,可以在exploit-db.com上检索POC和EXP。

1 / 2

下期预告

下一篇将是系列最后一篇,介绍当今计算机和网络的安全基石之一——公钥加密技术。

参考资料

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://wololo.net/2014/01/18/10-days-of-hacking-day-4-the-psp-part-1

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://wololo.net/2014/01/18/10-days-of-hacking-day-5-the-psp-part-2

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://learn.microsoft.com/zh-cn/windows/security/threat-protection/overview-of-threat-mitigations-in-windows-10

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://learn.microsoft.com/zh-cn/cpp/c-runtime-library/security-features-in-the-crt?view=msvc-170

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://en.wikipedia.org/wiki/TIFF

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://www.cvedetails.com/vulnerability-list/vendor_id-2224/Libtiff.html

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://kylehalladay.com/blog/2019/12/04/Recreating-A-Dirty-Gamedev-Hack.html

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://www.cve.org

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://cve.mitre.org

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://www.microsoft.com/en-us/msrc/bounty

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://bughunters.google.com

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://helpx.adobe.com/security/bug-bounty-program.html

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://hackerone.com/nintendo

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://www.cnnvd.org.cn

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://www.cnvd.org.cn

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://www.cics-vd.org.cn

  • 内容因剧透、敏感不适等原因被隐藏

    点击查看

    https://exploit-db.com