首页 科技内容详情
『新』2【网址大】全(www.22223388.com):对用于缓解malloc()行使的Safe-Linking平安机制的研究

『新』2【网址大】全(www.22223388.com):对用于缓解malloc()行使的Safe-Linking平安机制的研究

分类:科技

网址:

反馈错误: 联络客服

点击直达

万利逆商官网

www.ipfs8.vip)是FiLecoin致力服务于使用FiLecoin存储和检索数据的官方权威平台。IPFS官网实时更新FiLecoin(FIL)行情、当前FiLecoin(FIL)矿池、FiLecoin(FIL)收益数据、各类FiLecoin(FIL)矿机出售信息。并开放FiLecoin(FIL)交易所、IPFS云矿机、IPFS矿机出售、租用、招商等业务。

,

0x01 基本形貌

我们在Check Point Research从事的每个研究项目的目的之一就是对软件的事情方式有深入的领会:它们包罗哪些组件?他们容易受到哪些攻击?攻击者若何行使这些破绽?更主要的是,我们若何提防此类攻击?

在我们的最新研究中,我们确立了一种称为“平安链接”的平安机制,以珍爱malloc()的单链接列表不被攻击者改动。我们乐成地向焦点开放源代码库的维护者先容了我们的方式,现在它已集成到最常见的尺度库实现中:glibc(Linux),以及盛行的嵌入式对等版本:uClibc-NG。

主要的是要注重,平安链接不是万能的法宝,它可以阻止针对现代堆实现的所有行使实验。 然则[,这是朝准确偏向迈出的又一步,凭证我们已往的履历,这种特殊的缓解措施会阻止我们多年来展示的几项重大破绽行使,从而将“易受攻击的”软件产物转变为“无法行使的”产物。

0x02 研究靠山

从二进制行使的早期最先,堆内部数据结构一直是攻击者的主要目的。通过明白的方式堆的malloc()和free()事情中,攻击者能够行使堆缓冲区的破绽,如线性缓冲区溢出,开发一个更壮大的原始行使诸如随便写。

在2001年的Phrack文章中详细先容了此示例:Vudo Malloc Tricks。本文探讨了多个堆实现的内部,并形貌了现在所谓的“不平安-作废链接”。修改双向链接列表(例如Small-Bins)的FD和BK指针的攻击者可以使用该unlink()操作来触发随便写入,从而在目的程序上执行代码。

 http://phrack.org/issues/57/8.html

现实上,2005年的glibc版本2.3.6嵌入了对这一已知行使破绽原语的修复程序,称为“平放置除链接”。这个精巧的修复程序在从列表作废链接之前,先验证了双向链接节点的完整性,如图1所示:

图1:操作时平放置除链接-检查p->fd->bk == p。

只管这一行使原语已于15年前被阻止,但那时没有人想出类似的解决方案来珍爱单链列表的指针。行使这一弱点,攻击者将重点转移到了这些不受珍爱的单链接列表,例如快速绑定和TCache(线程缓存)。损坏单个链接列表将使攻击者获得随便Malloc原语,即在随便内存地址中的受控受控分配。

在本文中,我们修复了快要20年的平安破绽,并展示了我们若何确立一种平安机制来珍爱单链接列表。

在深入研究平安链接的设计之前,让我们回首针对易受攻击的快速绑定的示例行使。在此类行使手艺方面具有厚实履历的读者应该随时跳到“ 平安链接简介”这一节。

0x03 CVE-2020-6007

在研究智能灯泡的历程中,我们发现了一个基于堆的缓冲区溢露马脚:CVE-2020-6007。通过行使此高危破绽,我们说明晰攻击者若何行使Fast-Bins的不受珍爱的单链接列表将基于堆的线性缓冲区溢出转换为功效更壮大的Arbitrary-Write。

在我们的测试案例中,堆是一个简朴的dlmalloc实现,或更详细地说,是编译为32位版本的uClibc(微型LibC)的“ malloc-standard”实现。图2显示了此堆实现所使用的元数据:

图2:malloc_chunk堆实现中使用的结构。

条记:

· 分配和使用缓冲区时,前两个字段存储在用户的数据缓冲区之前。

· 当释放缓冲区并将其放置在快速绑定中时,也会使用第三个字段,它指向快速绑定的链接列表中的下一个节点。该字段位于用户缓冲区的前4个字节。

· 当缓冲区被释放而且没有放置在快速绑定中时,第三个字段和第四个字段都将用作双向链接列表的一部门。这些字段位于用户缓冲区的前8个字节。

快速合并是种种巨细的“块”的阵列,每个“块”都包罗一个单链列表,最多不跨越特定巨细。最小bin巨细包罗最多0x10字节的缓冲区,下一个最大缓冲区包罗0x11至0x18字节的缓冲区,依此类推。

溢出思绪

在不深入研究细节的情形下,我们的破绽为我们提供了一个小的但可控制的基于堆的缓冲区溢出。我们的总体设计是溢出位于快速绑定中的相邻空闲缓冲区,图3显示了缓冲区在溢出之前的情形:

图3:我们的受控缓冲区(蓝色)放置在释放的缓冲区(紫色)之前。

图4显示了我们的溢出后相同的两个缓冲区:

图4:我们的溢出修改了释放缓冲区的size和ptr字段(以红色显示)。

使用溢出,我们修改我们希望的是快速绑定纪录的单链接指针。通过将此指针更改为我们自己的随便地址,我们可以触发堆以为现在有一个新的释放块存储在那里,图5显示了Fast-Bin损坏的单链接列表,该列表在堆中看起来如下所示:

图5:以红色符号的快速绑定损坏的单链列表。

通过触发一系列巨细与相关快速绑定匹配的分配序列,我们获得了Malloc-Where原语。有关构建完整代码执行破绽的其余手艺细节以及完整的研究,将在以后的博客文章中宣布。

注重:某些人可能会说,我们获得的Malloc-Where原语受到限制,由于虚拟“ Free Chunk”应以与当前Fast-Bin匹配的size字段开头。 然则[,此附加的验证检查仅在glibc中实现,而在uClibc-NG中却没有。因此,对于我们的Malloc-Where原语,我们没有任何限制。

0x04 平安链接简介

在完成了这个研究之后,在36C3最先之前,我另有一些时间可以用来做准备,我的设计是解决最近的CTF竞赛中的一些问题。近十年来,我一直在以相同的方式行使基于堆的缓冲区溢出,始终以堆中的单链接列表为目的。纵然在CTF挑战中,我仍然专注于TCache的易受攻击的单链接列表,固然,有某种方式可以减轻这种盛行的行使原语。

这就是平安链接看法的泛起。平安链接行使了地址空间结构随机化(ASLR)中的随机性(现在已普遍部署在大多数现代操作系统中)来“署名”列表的指针。与块对齐完整性检查连系使用时,此新手艺可珍爱指针免遭挟制实验。

我们的解决方案可防止现代破绽中经常使用的3种常见攻击:

· 部门指针笼罩:修改指针的低字节(Little Endian)。

· 全指针笼罩:挟制指向所选随便位置的指针。

· 未对齐的块:将列表指向未对齐的地址。

威胁建模

在我们的威胁模子中,攻击者具有以下功效:

· 堆缓冲区上的受控线性缓冲区上溢/下溢。

· 相对随便写入堆缓冲区。

主要的是要注重,我们的攻击者不知道堆位于那边,由于堆的基地址与mmap_baseASLR 一起被随机分配了(下一节中将对此主题举行更多先容)。

我们的解决方案提高了尺度,并阻止了攻击者基于堆的行使实验。部署后,攻击者必须具有堆泄露/指针泄露形式的其他功效。我们珍爱的一个示例场景是位置相关的二进制文件(不带ASLR的加载),在剖析传入的用户输入时会发生堆溢出。在我们之前的研究示例中,就是这种情形。

到现在为止,攻击者仅依赖二进制文件的牢靠地址,就能够在没有任何堆泄露的情形下行使此类目的,而且仅对堆的分配举行最少的控制。当我们将堆分配重定向到目的二进制文件中的牢靠地址时,我们可以阻止此类行使实验,并行使堆的ASLR获得随机基址。

珍爱措施

在Linux机械上,通过mmap_base以下逻辑将堆随机化:

  random_base = (((1 << rndbits )-1 )<< PAGE_SHIFT )

rndbit 在32位Linux盘算机上默以为8,在64位盘算机上默以为28。

我们将单链接列表指针存储为L的地址。现在,我们界说以下盘算:

 Mask := (L >> PAGE_SHIFT)

凭证上面显示的ASLR公式,移位未来自存储器地址的第一个随机位定位在掩码的LSBit处。

这将我们引向我们的珍爱方案。我们用P来示意单链接列表指针,方案如下所示:

· PROTECT(P) := (L >> PAGE_SHIFT) XOR (P)

· *L = PROTECT(P)

代码实现:

 ,define PROTECT_PTR(pos, ptr, type)  \
         ((type)((((size_t)pos) >> PAGE_SHIFT) ^ ((size_t)ptr)))
 ,define REVEAL_PTR(pos, ptr, type)   \
         PROTECT_PTR(pos, ptr, type)

‘这样’,来自地址L的随机位被放置在存储的受珍爱指针的LSB的顶部,如图6所示:

图6:被屏障的指针P’被随机位笼罩,如红色所示。

新2网址大全

新2网址大全(www.22223388.com)实时更新发布最新最快最有效的新2网址和新2最新网址,包括新2手机网址,新2备用网址,皇冠最新网址,新2足球网址,新2网址大全。

此珍爱层可防止不知道随机ASLR位(以红色显示)的攻击者将指针修改为受控值。

然则[,若是你注重的话,你很容易看到我们在平安作废链接机制方面处于晦气职位。只管攻击者无法准确挟制指针,但我们也受到限制,由于我们无法检查指针是否发生了修改,这是举行分外检查的地方。

堆中所有已分配的块均与已知的牢靠偏移对齐,该偏移通常在32位盘算机上为8个字节,在64位盘算机上为16个字节。通过检查每个reveal()ed指针是否对齐,我们添加了两个主要的层:

· 攻击者必须准确预测对齐位。

· 攻击者无法将块指向未对齐的内存地址。

在64位盘算机上,这种统计珍爱会导致攻击实验失败16次中的15次失败。若是回到图6,我们可以看到受珍爱的指针的值以零字节0x3末尾,这意味着攻击者必须在溢出中使用值0x3,否则攻击者将损坏该值并使对齐检查失败。

纵然是单独使用,此对齐检查也可以防止已知的行使原语,例如本文中形貌的原语,该原语形貌了若何将Fast-Bin指向malloc() hook以立刻获取代码执行。

旁注:在intel CPU上,glibc在32位和 64位系统结构上仍使用0x10字节的对齐方式,这与我们上面刚刚形貌的常见情形差异。这意味着对于glibc,我们在32位上提供了增强的珍爱,而且可以统计地阻止16次攻击实验中的15次。

现实示例

图7显示了我们提交给glibc的初始补丁的片断:

图7:来自补丁程序初始版本的示例代码片断,发送给glibc。

自从整理了补丁之后,我们仍然可以看到,珍爱glibc的TCache所需的代码修改既小又简朴。

基准测试

基准测试解释,所添加的代码总计对的2-3条ASM指令free()和对的3-4条ASM指令总计malloc()。在glibc上,纵然在GCP中的单个vCPU上总计10亿次(!)malloc()/ free()操作,更改也可以忽略不计。测试在该库的64位版本上运行。以下是在malloc-simple统一GCP服务器上的巨细为128(0x80)字节的缓冲区上运行glibc的基准测试后的效果:

图8: glibc malloc-simple测试的基准测试效果。

每个测试的较快效果以粗体符号。正如我们所看到的,效果险些是相同的,而且在一半的测试中,补丁版本的速率更快,这现实上没有任何意义。这通常意味着服务器上的噪声水平远高于所添加功效对整体效果的现实影响。简而言之,这意味着我们新功效所增添的开销可以忽略不计,这是个好新闻。

再举一个例子,对tcmalloc(gperftools)基准测试的最坏影响是1.5%的开销,而平均值仅为0.02%。

这些基准测试效果归因于所建议机制的精简设计:

· 该珍爱没有内存开销。

· 珍爱不需要初始化。

· 不需要特殊的随机性泉源。

· 该珍爱仅使用L,P而且在需要protect()编辑或reveal()编辑指针时都存在。

需要稀奇注重的是,快速绑定和TCache都使用单链接列表来保留数据,而且在glibc的文档中举行了详细说明。它们仅支持put / get API,而且没有通用功效遍历整个列表并保持完整。只管确实存在‘这样’的功效,但它仅用于网络malloc统计信息(mallinfo),因此接见单链接指针的分外开销可以忽略不计。

回首线程模子

对齐检查削减了攻击面,并要求快速绑定或TCache块指向对齐的内存地址。如上所述,这直接阻止了已知的行使程序变体。

就像平安作废链接(用于双向链接的列表)一样,我们的珍爱依赖于以下事实:攻击者不知道正当的堆指针是什么样。在双链列表中,攻击者可以伪造一个内存结构,而且知道一个有用的堆指针是什么样子,可以乐成地伪造一对有用的FD/ BK不会触发随便写原语的指针, 然则[允许块位于攻击者控制的地址。

在单链列表方案中,由于珍爱层依赖于从部署的ASLR继续的随机性,因此没有指针泄露的攻击者将无法完全控制笼罩的指针。建议PAGE_SHIFT将随机位放在存储的指针的第一位上。连同对齐检查一起,这从统计角度上阻止了攻击者更改已存储的单链接指针的最低位/字节(Little Endian)。

Chromium’s MaskPtr()

我们的目的是将平安链接合并到实现种种包罗单链接列表的堆的开源库代码包中。一种‘这样’的实现是Google的tcmalloc(线程缓存Malloc),那时它仅作为gperftools存储库的一部脱离源。在将补丁提交给gperftools之前,我们决议看看Chromium的Git存储库,以防万一他们可能使用其他版本的tcmalloc。事实证实,他们做到了。

我们将直接查看效果:

· gperftools自2007年以来已经宣布了公共刊行版,最新版本是2.7.90。

· Chromium的tcmalloc看起来似乎是基于gperftool的2.0版本。

· 2020年2月,我们已经向所有开放源代码提交了补丁程序之后,谷歌宣布了官方的TCMalloc GitHub存储库,该存储库与之前的两种实现都不相同。

在检查Chromium的版本时,我们发现他们的TCache现在不仅基于双向链接列表(现在称为FLFree List),不是基于单链接列表(最初称为SLL),还添加了一个怪异的功效MaskPtr()。从2012年最先仔细研究他们的问题,显示了以下代码片断:

 inline void* MaskPtr(void* p) {
   // Maximize ASLR entropy and guarantee the result is an invalid address.
   const uintptr_t mask =
       ~(reinterpret_cast(TCMalloc_SystemAlloc) >> 13);
   return reinterpret_cast(reinterpret_cast(p) ^ mask);
 }

该代码与我们的PROTECT_PTR实现异常相似。此外,该补丁的作者稀奇提到:“此处的目的是防止在破绽行使程序中流传自由列表。”

看起来Chromium的平安团队在Chromium的tcmalloc中引入了自己的平安链接版本,他们在8年前就做到了,这给人留下了深刻的印象。

通过检查他们的代码,我们可以看到他们的掩码基于代码部门(TCMalloc_SystemAlloc)中的(随机值)指针,而不是实现中使用的堆位置。另外,它们将地址移位硬编码值13,而且还反转其掩码的位,由于未能找到有关其设计选择的文档,因此我们可以从代码中读取到,位反转用于确保效果为无效地址。

通过阅读他们的日志,我们还领会到他们估量此功效的性能开销不到2%。

与我们的设计相比,Chromium的实现暗含了一个分外的内存引用(对代码功效)和一个分外的asm指令,用于位翻转。不仅云云,它们的指针掩码无需分外的对齐检查即可使用,因此代码无法在不导致历程溃逃的情形下预先捕捉指针修改。

0x05 堆分配器研究

我们实行并测试了补丁程序,以将建议的缓解措施乐成集成到最新版本的glibc(ptmalloc),uClibc-NG(dlmalloc),gperftools(tcmalloc)和更高版本的Google全新TCMalloc。此外,我们还指出了Chromium的开发团队使用我们提交给gperftools的版本的“平安链接”,以期我们某些gperftools特定的性能提升可以融入Chromium的版本中。

当我们最先研究平安链接时,我们信托将平安链接集成到这3个(现在为4个)主导库中,将会导致其他库在开源社区和行业内的封锁软件中获得更普遍的接纳。自2012年以来,基本版本的平安链接已嵌入Chromium中,这一事实证实晰该解决方案的成熟性。

glibc(ptmalloc)

状态:集成。将于2020 年8月以2.32版宣布。 激活:默认情形下为open。 GNU glibc项目的维护者异常互助而且反映迅速。主要的障碍是签署执法文件,这将使我们作为公司的雇员可以将GPL允许的源代码捐赠给GNU的存储库。一旦解决了这个问题,历程就异常顺遂了,我们的补丁程序的最新版本已提交到库中,可以在即将宣布的版本中使用。

我们要谢谢glibc的维护者在整个历程中的互助。他们愿意将“默认情形下”的平安功效集成到他们的项目中,这真是令人心动,稀奇是与我们最初的期望以及我们从其他存储库获得的响应相比。

uClibc-NG(dlmalloc)

状态:已在v1.0.33版本中宣布。 激活:默认情形下为open。 向uClibc-NG提交我们的功效异常容易,而且已将其立刻集成到此commit中。我们可以自豪地说,平安链接已作为uClibc-NG版本v1.0.33的一部门宣布。若是我们回到对智能的研究,此功效将阻止我们的行使,并迫使我们在产物中发现其他破绽。

我们再次谢谢uClibc-NG的维护者在此历程中的互助。

gperftools(tcmalloc)

现状:正在举行整合。 激活:默以为关闭。 只管我们之条件到了Chromium的MaskPtr()功效(自2012年起可用),但该功效并未在tcmalloc的两个公然版本中找到它。因此,我们很幸运能向gperftools的tcmalloc实现提交平安链接。

由于gperftools信息库的状态庞大,现在Google的官方TCMalloc信息库是公然的,因此此历程正在取得希望,但希望缓慢。在2020年1月最先的请求请求中,你可以看到我们为将此功效集成到存储库中所做的起劲。『最初的反映是』我们恐惧的反映:我们的功效“损坏性能”。提醒一下,使用存储库的基准测试套件时,最糟糕的情形是开销为1.5%,平均值仅为0.02%。

最终,我们有些委屈地决议将此功效添加为“默认情形下处于禁用状态”,希望有一天有人能够自行激活此功效。此功效尚未合并,但我们希望它将在不久的未来。

我们仍然要谢谢这个项目的唯一维护者,他提供了做所有需要管道的方式,以便允许用户设置选项以启用平安链接。

TCMalloc(tcmalloc)

状态:已拒绝。 激活: N / A。 我们在此pull请求中将补丁提交给了TCMalloc ,但不幸的是,该请求被立刻拒绝了。我们再一次听到“此功效的性能成本太高而无法合并”,而且纵然作为““默认关”闭”可设置功效,他们也不会将其集成:“在受宏珍爱的同时,它添加了另一种设置需要举行构建并定期举行测试,以确保一切正常。” 我们找不到Google的任何代表来辅助我们解决与存储库维护者的这种冲突,因此我们将其保留。

不幸的是,似乎malloc()在大多数C / C ++项目中使用了Google最常见的实现(如TCMalloc的文档中所述),但并没有集成一个平安功效,该功效将使其在项目中更难以行使破绽。

0x06 研究总结

平安链接不是万能的灵丹妙药,它可以阻止针对现代堆实现的所有行使实验。 然则[,这是朝准确偏向迈出的又一步,通过迫使攻击者在甚至没有最先基于堆的攻击之前就存在指针泄露破绽,我们逐渐提高了尺度。

凭证我们已往的履历,这种特殊的缓解措施将阻止我们多年来实行的几项重大攻击,从而将“易受攻击”的软件产物转变为“无法行使”(至少在我们各自研究项目时存在破绽)。

还需要注重的是,我们的解决方案不仅限于堆实现。它还可以通过位于用户缓冲区周围的单链接列表指针来使濒临灭绝的数据结构获得完整性珍爱,而不会增添任何内存开销,而且对运行时的影响可以忽略不计。该解决方案可以轻松扩展到具有ASLR的系统中的每个单链列表。

从我们在2019年底首次剖析此问题最先,到设计平安缓解措施,最后将其集成为平安功效,这是一段艰难的旅程,默认情形下,该功效可在天下上两个最著名的libc实现中使用:glibc和uClibc-NG。最后,我们在集成此功效方面取得了比最初预期更好的效果,因此,我们再次谢谢所有辅助实现此想法的维护者和〖研究职员〗。我们逐步地逐步提高了行使水平,并辅助珍爱全天下的用户。

本文翻译者自:https://research.checkpoint.com/2020/safe-linking-eliminating-a-20-year-old-malloc-exploit-primitive/:
  • 新2足球网址(www.22223388.com) @回复Ta

    2021-09-15 00:00:05 

    usdt自动充提接口www.caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

    蛮用心的

  • USDT自动充提教程(www.6allbet.com) @回复Ta

    2021-10-11 00:00:52 

    人设正能量满满,就像她本人说的一样,这是文工团的同志应该做的事情,有不少观众都吐槽她跟陆觉民都在统一个战区事情,总是见不着面,多若干少都有些拉垮剧情,实在否则,要知道,陆觉民是在测绘队,天天事情的地方都说禁绝,东南西北四处乱跑人物关系好清楚

发布评论