20199319 2019-2020-2 《网络攻防实践》综合实践

HexType: Efficient Detection of Type Confusion Errors for C++

Hextype:c++类型混淆错误的快速检测,论文选自CCS'17

1、引言

C++非常适合大型软件项目,因为它将高级模块化和抽象与低级内存访问和性能相结合,但它运行时的效率和对C的向后兼容性是以安全为代价的。类型转换是在 c++中实现模块化的核心原则。为了提高性能,大多数类型转换仅进行静态检查,即该检查仅测试是否允许给定的类型层次结构进行强制类型转换,而忽略对象的实际运行时类型。这种安全性的缺乏导致了类型混淆漏洞,利用这类漏洞攻击程序,攻击者可以获得受害程序的全部特权。

HexType:一种保护c++软件免受类型混淆的机制,它使所有类型转换都显式化。源语言中的每个强制转换(显式或隐式、静态或动态)都转换为动态运行时检查。本文主要贡献如下:

  • 实现了具有低开销和高覆盖率的开源类型混淆检测器(性能优于最先进的检测器);
  • 提出一个新颖的优化,大大减少了需要跟踪的对象的数量从而减少了开销;
  • 设计了有效的数据结构,该结构使用快速路径(O(1)时间复杂度)进行类型信息的插入和查找;
  • 实现强大的分配标识,可大大提高覆盖率同时还涵盖了替代的转换方法;
  • 发现QT基本库和 ApacheXerces-C++中的四个新漏洞;

2、背景介绍

(1)c++类和继承

  • c++是一种面向对象程序设计语言,以类作为主要的抽象。类允许程序员创建新类型。一个类可以从多个祖先类继承。子孙类具有与其祖先相同的所有成员(方法和变量),并且可以选择在子孙类定义中定义其他成员。

(2)什么时候类型转换安全?

  • 在 c++中,a 类型的指针可以强制转换为b类型的指针。实际上告诉编译器将 指向的对象视为b类型。
  • 答案取决于指向对象的类型和目标类型(上例中的类型b)。从子孙类到祖先类的转换始终是安全的,因为子孙类的成员是祖先类的成员的超集。此操作称为向上转换。如果祖先丢失任何子孙类别的成员,从祖先到子孙的向下转换可能会不安全。攻击者已在众多流行的c++程序中滥用了这种向下转换的方式如Google Chrome(CVE-2017-5023)、PHP(CVE-2016-3185)。

(3)类型混淆漏洞

  • 是由于不安全的类型转换将一种数据类型误认为另一种数据类型时导致的漏洞,从而导致在语义不匹配的上下文中重新解释基础类型表示形式。
  • 例如:在一个上下文中作为常规域,在另一个上下文中作为虚拟函数表(vtable)指针,这种类型混淆漏洞广泛存在而且易于利用。

(4)c++转换操作

  • C++语法允许四种不同类型的强制转换。
  • static_cast:将 a 类型的对象强制转换为 b 类型的对象。检查仅在编译时执行,不执行运行时检查,并且检查限于检查两种类型是否兼容。
  • dynamic_cast:可以在同一类层次结构中的类之间安全地转换类型。依赖于虚拟函数表来定位元数据运行时类型信息(RTTI),但虚拟函数表只存在于多态对象中,故它的使用被严格限制为多态对象。
  • reinterpret_cast:在任意两种(可能不兼容)的类型之间进行转换。只会改变对象的类型,故只是返回相同的地址。
    这种行为可能会导致多态类或带有多重继承的类出现问题
  • const_cast:不会影响类型混淆问题,因为这种情况下不涉及类型层次结构。

3、HEXTYPE设计与实现

(1)HexType的系统概述

给定源代码作为输入,①HexType 生成一个包含所有类型关系信息的类型表,并且在运行时,②在对象映射表中收集关于每个分配对象的真实类型的信息。③Hextype使用类型关系信息和对象映射表来确定每个强制转换的正确性。

(2)信息类型表

  • 为了验证类型转换操作,HexType需要知道一组可以从给定源类型转换的有效目标类型;
  • 在编译期间,HexType提取所有类型关系信息,它不是简单地在类型表中存储类型名称,而是存储类型名称的字符串散列,以避免代价高昂的字符串匹配操作。

(3)对象类型跟踪

  • 为了在运行时验证类型转换操作, HexType 需要基于转换操作中源指针地址所定义的底层对象来定位类型信息。
  • Hextype维护一个对象映射表,该表将运行时对象映射到类型表中的关联类型信息。更具体地说,对象映射表中的一个键是对象地址,其映射值是指向类型表中相关条目的地址。
  • 为了执行有效的查找操作,HexType采用了新的数据结构类型表,该表既支持快速路径(使用哈希表)以提高性能,又支持慢速路径(使用红黑树)以提高完整性。当 HexType查找类型信息时,使用对象地址获取对相应映射表条目的引用,如果对象在快速路径中的地址匹配,它就会重用快速路径中的值。否则,HexType就会搜索相应的红黑树到第二类信息(慢速路径),并相应地更新快速路径。如下图所示:

(4)类型转换验证化

  • HexType在编译时使用附加的验证代码进行类型转换操作。 在运行时,该工具会在类型表中找到对象的真实类型信息,然后在转换站点将目标类型与预期类型进行比较,以确定转换是否合法。
  • 如果HexType在运行时检测到类型混淆,它将显示一个详细的报告,其中包括分配的对象类型、预期的对象类型和类型转换位置。

(5)性能优化

  • 优化:只跟踪不安全对象,只验证不安全的转换和有效的动态转换。
  • 我们认为t是一个安全的对象类型,当且仅当t从不受类型转换的影响。否则,t是一个潜在的不安全对象类型。
  • HexType 执行以下两个步骤来识别不安全的对象。首先,它标识与类型转换相关的对象集,该对象集可用于类型转换操作。HexType标识转换场所和转换对象的所有类型信息。接下来,当检测对象分配站点时,HexType 选择性地为类型转换相关的对象分配工具。如下图所示,假设B和C类型的对象是类型转换。Hextype将识别这些潜在的不安全类型及其所有子类型为不安全类型。

(6)测试

  • 试验在SEED Ubuntu16.04上执行。首先将程序传到码云上,这样下载速度会快一些。【git clone https://gitee.com/fan_xiao_nan/HexType.git】下载程序。

  • 执行【./build.sh】下载所需的资源,此过程非常漫长。
  • 利用【$BUILD_DIR/bin/export HEXTYPE_LOG_PATH="/tmp/hextype"】设置HexType路径。
  • 在lib/hextype/hextype_rbtree.h中的#define中可以启用/禁用功能。
  • 对一些用例的测试。

(7)性能开销

根据运行时速度来度量性能开销。CaVer,TypeSan和HexType的对于 SPECCPU2006 中的所有七个c++基准测试的性能开销。×1列表示CaVer和HexType之间的比率,×2列表示TypeSan和HexType之间的比率。HexType 在所有情况下都超过了以前的工作。主要是因为 HexType 的对象映射表设计。

4、总结与心得

  • 因为这段时间被分配的工作是与c++有关的,所以选择了本篇论文,通过本次实践,我对c++类型转换有了更多的了解,在以后的使用过程中夜壶更注意程序的安全性。
  • 从搭建一个网络攻防的实验环境到可以进行简单的信息收集、学习网络嗅探以及协议分析,最后到可以利用漏洞进行攻击以及案例分析等,不知不觉已经完成了十几周的实践,收获很多,除了有点忧伤自己多掉了几根头发。通过这门课程,网络攻防方面的知识了解了许多,动手实践的能力也有了很大提升,尤其网络安全意识提升很多,使用电子产品时更加的谨慎、个人隐私保护意识增强。通过这门课我也发现了自己很多的不足,比如编程水平较差,尤其是在Web攻防时深刻体会到这一点。后期在实践内容越来越复杂的时候,有一点囫囵吞枣跟不上节奏的感觉。就是感觉这周的任务刚刚完成,还需要消化消化的时候,就开始了新一周的学习,再加上其他的课业任务,自己可能就这样过去了,这样学习效果确实会打一些折扣,以后我会吸取经验吧,把自己所有的任务尽量规划的时间合理。
  • 最后,这门课真的是这学期压力最大的一门,但也是收获满满的一门。虽然课程结束了,但我还是希望自己不要就此丢弃,以后还是要继续的学习。

参考文献

HexType: Efficient Detection of Type Confusion Errors for C++
c++之多态性
c++类的继承与派生
C++中的四种强制类型转换符详解
深入理解红黑树及C++实现

posted @ 2020-07-01 23:18  1993Fxn  阅读(306)  评论(0编辑  收藏  举报