CN108090346A - 一种基于数据流监控的代码复用攻击防御方法及系统 - Google Patents

一种基于数据流监控的代码复用攻击防御方法及系统 Download PDF

Info

Publication number
CN108090346A
CN108090346A CN201711257780.8A CN201711257780A CN108090346A CN 108090346 A CN108090346 A CN 108090346A CN 201711257780 A CN201711257780 A CN 201711257780A CN 108090346 A CN108090346 A CN 108090346A
Authority
CN
China
Prior art keywords
instruction
data
code
address
function
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201711257780.8A
Other languages
English (en)
Other versions
CN108090346B (zh
Inventor
金海�
邹德清
刘本熙
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Huazhong University of Science and Technology
Original Assignee
Huazhong University of Science and Technology
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Huazhong University of Science and Technology filed Critical Huazhong University of Science and Technology
Priority to CN201711257780.8A priority Critical patent/CN108090346B/zh
Publication of CN108090346A publication Critical patent/CN108090346A/zh
Application granted granted Critical
Publication of CN108090346B publication Critical patent/CN108090346B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/562Static detection
    • G06F21/563Static detection by source code analysis

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Health & Medical Sciences (AREA)
  • General Health & Medical Sciences (AREA)
  • Virology (AREA)
  • Storage Device Security (AREA)

Abstract

本发明公开了一种基于数据流监控的代码复用攻击防御方法及系统,属于系统安全技术领域。本发明方法首先由目标程序和共享库源码提取函数、数据信息,再对中间语言代码进行分析,识别目标程序和共享库中的内存访问指令,对指令进行插桩并生成函数跳转表和指令重定位信息。在目标程序加载时,将目标程序和共享库的各个段、堆和栈映射到内存地址空间的对应区域,并设置隔离环境。在目标程序运行时,通过监控异常数据流的方式,防止攻击者对隔离区内部进行搜索,从而防止代码复用攻击。本发明还实现了一种基于数据流监控的代码复用攻击防御系统。本发明适用于X86_64平台上的代码复用攻击防御,能避免由攻击造成的巨大损失。

Description

一种基于数据流监控的代码复用攻击防御方法及系统
技术领域
本发明属于系统安全技术领域,更具体地,涉及一种基于数据流监控的代码复用攻击防御方法及系统。
背景技术
开发者在编写程序时,往往会不可避免地产生许多漏洞。代码复用攻击指在程序运行时,利用漏洞在程序的内存地址空间中,搜索可利用的代码片段,并通过修改函数指针或返回地址的方式,将它们链接成可以连续执行的代码序列(包括函数序列、指令序列),并使程序转而执行这些代码序列的攻击方式。通过代码复用攻击,攻击者能够劫持程序、获取系统权限、执行恶意代码,这给应用程序和操作系统的安全带来了极大隐患。代码复用攻击利用了程序执行时的以下特点:(1)程序在执行时,内存中有大量的返回地址和函数指针,它们暴露了代码片段的地址;(2)程序在执行时,代码页的权限是可读可执行;(3)通过修改程序中的返回地址和函数指针,可以劫持程序的执行。
针对代码复用攻击,代码不可读是一类高效的防御方法。现有方法通过将代码页的权限设置为可执行、不可读,阻止攻击者读取代码页并搜索代码片段。Readactor:Practical code randomization resilient to memory disclosure(Crane Stephen,InSecurity and Privacy(SP),2015IEEE Symposium on,pp.763-780)一文中所提出的Readactor方法将代码页中的数据和代码分离,利用英特尔处理器的虚拟化特性,将代码页的权限设置为可执行、不可读。类似的,HideM:Protecting the contents of userspacememory in the face of disclosure vulnerabilities(Gionta Jason等人,InProceedings of the 5th ACM Conference on Data and Application Security andPrivacy,pp.325-336)一文中所提出的Hidem方法利用高速缓存将代码页的权限设置为不可读。现有方法还需要对程序中的所有控制流转移进行插桩,通过加密函数指针和返回地址的方式,防止它们暴露代码片段的地址。这样攻击者在程序执行时,既不能直接搜索代码片段,又不能利用返回地址和函数指针推测代码片段,这样就阻止了攻击者构造代码序列,从而达到防御代码复用攻击的目的。然而,上述方法存在一定的不足和局限性:(1)以页为保护粒度,由于代码页中包含部分数据,因此必须将代码页中的数据和代码分离。(2)需要对所有控制流转移进行插桩,开销较大。(3)只对代码进行了保护,没有对数据进行保护,如某些敏感的数据:指针和返回地址,新型代码复用攻击利用数据中的内容(栈上已被加密的函数指针和返回地址),依然能够推测代码片段的位置。
发明内容
针对现有技术的缺陷或改进需求,本发明提供了一种基于数据流监控的代码复用攻击防御方法及系统,其目的在于,防止攻击者对隔离区内进行搜索,在防御代码复用攻击的同时,保证程序的运行效率。
为实现上述目的,按照本发明的一个方面,提出了一种基于数据流监控的代码复用攻击防御方法,包括如下步骤:
(1)在编译过程中,从目标程序和共享库源码中提取函数和数据信息;所述函数信息包括函数名、函数入口;所述数据信息包括数据名、数据位置和数据类型;系统中,所有内存访问都是由函数中的指令来实现;
(2)分析步骤(1)编译形成的中间语言代码,根据提取的函数信息和数据信息,识别所述中间语言代码中的内存访问指令;对内存读操作指令,不包括对数据段中内容进行访问的指令、取函数地址指令、对栈中数据进行操作的指令进行插桩,并生成所述函数对应的跳转表;所述插桩,指在不影响程序正常执行的前提下,在内存读操作指令前插入新的检查指令,或对原有的指令进行修改;修改包括将取函数地址的指令,替换为取函数对应的跳转表入口的地址;修改对栈中数据进行访问的指令,保证在运行时程序能够正常访问隔离栈和数据区栈中的数据;插桩的目的是增强程序的安全性;
(3)识别所述中间语言代码中对数据段中内容进行访问的指令,生成指令重定位表,并在编译时添加到目标语言代码的指令重定位段中,形成包含指令重定位段的可执行文件;这一步编译是生成可执行代码,前一步编译是生成中间代码;
(4)在目标程序加载时,将目标程序和共享库的各个段、堆和栈映射到内存地址空间中的隔离区和数据区;利用步骤(3)中生成的重定位表对代码段中访问数据段中内容的指令进行修正,对指令中的偏移量进行修改,让它能够找到正确的数据地址并正常的访问数据,并初始化隔离环境;所述初始化是指对%bnd0寄存器进行设置,把它设置为隔离区的边界,启用MPX检查机制;以及为隔离栈分配空间;隔离栈用于保存返回地址和栈上的函数指针;MPX是Intel的内存保护拓展指令集;所述隔离区是本发明定义的安全区域,是需要进行保护的;数据区指的是除了隔离区以外的所有数据区域,该区域只有数据,没有代码;在目标程序加载时,在保证隔离区和数据区足够大的前提下,可随机选择一个地址,将内存地址空间划分为隔离区和数据区;
(5)在目标程序运行时,检测异常数据流,通过检查触发异常指令的访问地址判定其合法性;判定规则为:
如果访问的地址内容为代码或隔离栈数据,则判定为真非法,报出异常,并生成日志信息;
否则判定为假非法;此时对内存读操作指令前由步骤(2)插桩的检查指令进行修改,将检查指令替换成无操作指令,防止假非法情况继续出现;这是由于编译器在编译时,可能会把一部分数据嵌入在代码中,所以可能会出现对代码段进行读取的情况,我们把这种情况定义为假非法;
所述异常数据流指内存读操作指令,不包括对数据段中内容进行访问的指令,对隔离区内的内存进行了访问。
进一步的,所述步骤(2)包括以下子步骤:
(21)根据步骤(1)中提取的函数信息,构造函数跳转表,跳转表中的表项和函数一一对应,表项的内容为跳转到函数;此处步骤(23)中的取函数地址的指令对应的,是所有被取地址的函数入口;
(22)识别内存读操作指令,根据读取内存的地址,插入检查指令,检查这条读操作指令是否访问了隔离区内的内容;
(23)识别取函数地址的指令,将其修改为取函数对应跳转表项的地址;也就是取了一个函数的入口地址,把它放在了一个指针里面;
(24)根据步骤(1)中提取的数据信息,识别对栈中数据进行操作的指令;此时,这里的栈中数据还没有分离开,目前只有一个栈,但是程序运行时,栈上的返回地址和函数指针会被放在隔离栈上,其他数据会被放在数据区的栈上,所以这里进行替换,实际上就是为之后的隔离进行准备,这里栈中数据既包含了数据区也包含了隔离区中的数据;将使用%rsp寄存器、访问除返回地址和函数指针外其他数据的指令,替换为使用保留的其他通用寄存器,优选%r15寄存器;在编译的时候,通过对编译器进行设置,使其保留这个寄存器;
(25)对指令进行优化:如果多条内存读操作指令使用了同一个寄存器,而该寄存器的值没有改变,则将这些读操作的检查指令合并;对于使用%rip寄存器进行访问的指令,删除其检查指令;其中,因为%rip寄存器是PC寄存器,它保存的是当前执行的指令地址,是不能被篡改的,所以它一定不会访问隔离区内的内容;所述寄存器是intel x86_64的CPU上特有的。
进一步的,所述步骤(3)包括以下子步骤:
(31)识别代码中对数据段中内容进行访问的指令,也即使用%rip寄存器对数据段中内容进行访问的指令;此处数据段指的是一个可执行文件的数据段,可执行文件包含代码段和数据段,数据段包含在数据区内,它在隔离区外面,它和代码段共同构成了一个可执行程序;
(32)根据(31)中识别的指令在代码段中的位置,以及指令所访问的数据相对于指令的偏移量,生成指令重定位信息;
(33)在编译过程中,将指令重定位信息编译为指令重定位段,生成包含指令重定位段的可执行文件。通过编译,从而将重定位信息添加到可执行文件中,这部分称为指令重定位段;
进一步的,所述步骤(4)包括以下子步骤:
(41)在目标程序加载时,设置隔离区的边界,将内存地址空间划分为隔离区和数据区;
(42)加载目标程序和共享库,将代码段映射到隔离区内,将数据段、堆、栈映射到数据区内;
(43)根据代码段、数据段映射的地址,以及(3)中生成的指令重定位信息,修正代码段中对数据段中内容进行访问的指令,将指令所访问的数据相对于指令的偏移量,修改为新的偏移量;
(44)为隔离栈分配空间,初始化寄存器的值,将%rsp寄存器设置为隔离区栈顶的地址,将%bnd0寄存器设置为隔离区边界的地址,将保留的其他通用寄存器,如%r15设置为数据区栈顶的地址,并设置%bndcfg寄存器,启用MPX检查机制;这些寄存器是intelx86_64的CPU上特有的;MPX检查机制是由CPU提供的,通过设置寄存器,就能够启用MPX检查机制;
进一步的,所述步骤(5)包括以下子步骤:
(51)监控运行时的读取数据流,如果内存读操作指令(不包括对数据段中内容进行访问的指令),对隔离区内部的内存进行了访问,则被视为异常数据流,并判定其合法性:
(52)通过检查触发异常指令的访问地址判定其合法性:如果该指令访问的地址内容为代码或隔离栈数据,则为真非法情况,报出异常,并生成日志信息;否则为假非法情况,对步骤(2)插桩的检查指令进行修改,将其替换为无操作指令,避免假非法情况继续出现。
本发明还提出一种基于数据流监控的代码复用攻击防御系统,包括:
信息提取模块,用于从目标程序和共享库源码,提取函数、数据信息,函数信息包括函数名和函数入口;数据信息包括数据名、数据位置和数据类型;
指令插桩模块,用于分析中间语言代码,结合信息提取模块提取的函数信息和数据信息,识别代码中的内存访问指令;对内存读操作指令、取函数地址的指令和对栈中数据进行操作的指令进行插桩,并生成函数对应的跳转表;
重定位信息生成模块,用于分析中间语言代码,识别代码中对数据段中内容进行访问的指令,生成指令重定位信息,并在编译时添加到指令重定位段中,生成包含指令重定位段的可执行文件;重定位段是添加到可执行文件中的数据,称为重定位段;重定位段中的每一项,都对应一条访问数据段的指令的(位置,偏移量)二元组;这个二元组在内存映射时,指示如何对指令进行修正;
内存映射模块,用于在目标程序加载时,在保证隔离区和数据区足够大的前提下,随机选择一个地址,将内存地址空间划分为隔离区和数据区;并将目标程序和共享库的各个段、堆、栈映射到内存地址空间中的隔离区和数据区,并根据指令重定位信息对代码段中访问数据段中内容的指令进行修正,并初始化隔离环境;本发明将目标程序和共享库的代码段、栈上的返回地址和函数指针映射到隔离区内,将目标程序和共享库的数据段、堆和栈上的其他数据映射到数据区内;所述初始化是指对%bnd0寄存器进行设置,把它设置为隔离区的边界,启用MPX检查机制;以及为隔离栈分配空间;
运行监控模块,用于在目标程序运行时,检测异常数据流,进行合法性判断;通过检查触发异常指令的访问地址判断其合法性,若为非法行为,则报出异常,生成日志信息;若为合法行为,则对检查指令进行修改,防止假非法情况继续出现;
在编译时,信息提取模块提取函数信息和数据信息,并将这些信息提供给指令插桩模块和重定位信息生成模块;指令插桩模块根据信息提取模块所提供的数据信息识别代码中的内存访问指令,进行相应的插桩;并根据信息提取模块所提供的函数信息生成函数对应的跳转表;重定位信息生成模块利用信息提取模块所提供的数据信息,识别出对数据段中内容进行访问的指令,生成指令重定位信息,并在编译时添加到指令重定位段中,生成包含指令重定位段的可执行文件;
运行时,在目标程序加载时,内存映射模块将目标程序和共享库的各个段、堆、栈映射到内存地址空间中的隔离区和数据区,并根据重定位信息生成模块所生成的指令重定位段,对代码段中访问数据段中内容的指令进行修正,并初始化隔离环境,设置隔离区;在目标程序运行时,运行时监控模块利用指令插桩模块所插桩的指令,判断访问地址是否位于内存映射模块所设置的隔离区内,实现对异常数据流进行检测。
进一步的,所述指令插桩模块包括:
跳转表构造单元,用于根据信息提取模块提取的函数信息,构造一个跳转表,并为每一个函数生成一个对应的表项,其内容为跳转到函数入口;
指令识别单元,用于对中间语言代码进行分析,并根据信息提取模块提取的数据信息,识别出三种类型的指令:内存读操作指令、取函数地址的指令、对栈中数据进行操作的指令;
代码插桩单元,用于根据指令识别单元的结果,对指令进行插桩。对于内存读操作指令,根据读取内存的地址,插入检查指令,检查这条指令是否访问了隔离区内的内容;对于取函数地址的指令,将其修改为取函数对应跳转表项的地址;对于对栈中数据进行操作的指令,将使用%rsp寄存器,访问除返回地址和函数指针外其他数据的指令,替换为使用保留的其他通用寄存器,如%r15寄存器;
代码优化单元,用于合并、删除冗余指令;如果多条内存读操作指令使用了同一个寄存器,而该寄存器的值没有改变,则将这些读操作的检查指令合并;对于使用%rip寄存器进行访问的指令,删除其检查指令。
进一步的,所述重定位信息生成模块包括:
指令识别单元,用于对中间语言代码进行分析,并根据信息提取模块提取的数据信息,识别出对数据段中内容进行访问的指令;
重定位信息生成单元,用于根据指令识别单元的结果,根据指令在代码段中的位置,以及指令所访问的数据相对于指令的偏移量,生成指令重定位信息;
重定位信息编译单元,用于在编译过程中,将指令重定位信息编译为指令重定位段,生成包含指令重定位段的可执行文件。
进一步的,所述内存映射模块包括:
隔离区初始化单元,用于在目标程序加载时,设置隔离区的边界,将内存地址空间划分为隔离区和数据区;
内存映射单元,用于加载目标程序和共享库,将代码段映射到隔离区内,将数据段、堆、栈映射到数据区内;
重定位单元,用于根据代码段、数据段映射的地址,以及指令重定位信息,修改代码段中对数据段中内容进行访问的指令,将指令所访问的数据相对于指令的偏移量,修改为新的偏移量;
隔离栈设置单元。用于为隔离栈分配空间,初始化寄存器的值。将%rsp寄存器设置为隔离栈顶的地址,将%bnd0寄存器设置为隔离区边界的地址,将保留的其他通用寄存器,如%r15设置为数据区栈顶的地址,并设置%bndcfg寄存器的值,启用检查机制。
进一步的,所述运行时监控模块包括:
异常检测单元,用于监控运行时的数据流,对隔离区内的读操作,被视为异常数据流;当出现异常数据流时,交由异常处理单元进行处理;
异常处理单元,用于处理异常情况,通过检查触发异常指令的访问地址判断其合法性;如果访问的地址内容为代码或隔离栈数据,则为非法情况,报出异常,生成日志信息;否则为合法情况,对检查指令进行修改,防止假非法情况继续出现。
进一步地,所述系统用于X86_64平台上的操作系统和软件。
本发明通过对目标程序和共享库的中间语言代码进行分析和插桩,并在加载时将目标程序和共享库的代码段、数据段、堆和栈映射到对应区域,对代码段、栈上的返回地址和函数指针进行隔离,通过在运行时监控异常数据流的方式,防止了攻击者对隔离区内进行搜索,达到了在防御代码复用攻击的同时,保证程序的运行效率的目的。
总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有以下技术特征及有益效果:
(1)安全性:本发明在保护目标程序和共享库代码前提下,还对栈上的返回地址和函数指针进行了保护,对于传统和新型的代码复用攻击,均有良好的防御效果;
(2)高效性:本发明利用了高效的MPX指令进行检查,只对利用函数指针进行的控制流转移进行插桩,并且不需要借助虚拟化手段,其带来的性能开销极低;
(3)通用性:本发明在中间语言上进行处理,不涉及具体的编程语言,因此可以在多种语言编译的程序上使用,具有良好的通用性。
附图说明
图1为本发明实施例的总流程图;
图2为本发明指令插桩方法流程图;
图3为本发明加载时内存映射示意图;
图4为本发明运行时监控方法流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
本实施例利用MPX指令集实现。MPX(Memory Protection Extension)是X86_64平台上的特殊指令集,它提供了一组边界寄存器%bnd0-%bnd3,以及一组检测指令,包括bndcl,bndcu等。MPX通常用来检测缓冲区溢出、数据越界等,具有高效的特点。
如图1所示,本发明实施例包括以下步骤:
(1)获取需要进行保护的目标程序、共享库源码,提取出目标程序和共享库中的函数信息、数据信息。函数信息包括函数名、函数入口;数据信息包括数据名、数据位置、数据类型。
(2)对中间语言代码进行分析。如图2所示,首先构造一个跳转表,并根据中间语言代码中提取的函数名和入口信息,为每一个函数生成一个对应跳转表项,其内容为跳转到函数的入口处。随后,以函数为单位,对函数中的每条指令进行遍历。首先判断这条指令是否为内存读操作指令,如果是,则插入检查指令,检查这条指令是否访问了隔离区内的内容;随后判断这条指令是否为取函数地址的指令,如果是,则将这条指令修改为取函数对应跳转表项的地址;再判断这条指令是否对栈中数据进行操作,如果是,判断它访问的数据是否为函数指针或返回地址。对于访问除函数指针和返回地址外其他数据的指令,将指令所使用的%rsp寄存器,替换为所保留的其他通用寄存器,这里选择%r15寄存器。
本步骤包含以下子步骤:
(21)根据中间语言代码中,函数的个数,生成对应大小的跳转表。对于每一个函数,生成一个对应的跳转表项,其内容为jmp func。对所生成的跳转表项,采用随机化排列的方式,并且记录每个函数所对应的表项。
(22)遍历每个函数中的指令,识别内存读操作指令。如果一条指令,从内存中取值,并且直接或将计算结果放入寄存器中,这条指令就被认为是一条内存读操作指令。根据这条指令读取的内存地址,构造一条bndcu指令,并插入到这条指令之前,检查该内存地址是否在隔离区内。
(23)遍历每个函数中的指令,识别取函数地址的指令。如果一条指令,将某个函数的地址,移动到寄存器中,这条指令就被认为是一条取函数地址的指令。根据这条函数指令所取的函数,将其修改为取该函数对应的跳转表项地址。
(24)遍历每个函数中的指令,识别对栈中数据进行操作的指令。如果一条指令,利用了%rsp寄存器,访问了栈上的数据,这条指令就被认为是一条对栈中数据进行操作的指令。如果这条指令访问的数据,不是函数指针或返回地址,就将指令中使用的%rsp寄存器,替换为%r15寄存器。
(25)对指令进行优化。如果多条内存读操作指令使用了同一个寄存器,而在这个过程中,该寄存器的值没有改变,则可以将这些读操作的检查指令合并;对于使用%rip寄存器进行访问的指令,这些指令是安全的,删除其检查指令。
(3)对中间语言代码进行分析,识别代码中对数据段中内容进行访问的指令。记录下这些指令在代码段中的位置,以及指令所访问的数据相对于指令的偏移量,生成这些指令的重定位信息,记录在二元组中,并在编译时添加一个指令重定位段到可执行文件中。
本步骤包含以下子步骤:
(31)遍历每个函数中的指令,识别对数据段中内容进行访问的指令。如果一条指令,使用了%rip寄存器以及一个相对偏移量,访问了代码段之外的内容,就被认为是一条访问了数据段中内容的指令。
(32)对于每一条对数据段中内容进行访问的指令,根据指令在代码段中的位置,以及指令所访问的数据相对于指令的偏移量,构造一个(位置,偏移量)的二元组,作为指令重定位信息记录下来。
(33)在编译时,将所有指令重定位信息添加到指令重定位段中,并在链接时进一步合并,生成包含有指令重定位段的可执行文件。
(4)在目标程序加载时,由动态链接器设置隔离区边界,将内存地址空间划分为隔离区和数据区。将目标程序、共享库的代码段和数据段,分别映射到隔离区和数据区中。随后,动态链接器根据代码段、数据段映射的地址,结合可执行文件中的指令重定位信息,修改代码段中,对数据段中内容进行访问的指令。随后对隔离栈分配空间,并对寄存器进行设置。
如图3所示,动态链接器设置一个边界值,将内存地址空间划分为隔离区和数据区。其中,隔离区是虚拟地址大于边界值的区域,而数据区是虚拟地址小于边界值的区域。目标程序和共享库的代码段,被映射到隔离区内;而数据段则被映射到数据区内。除代码段外,跳转表和隔离栈也位于隔离区中,目标程序运行时的堆和栈位于数据区中。隔离栈保存了返回地址和栈上的函数指针,数据区栈则保存了其他数据。%bnd0寄存器保存了隔离区边界值,%r15寄存器保存了数据区栈顶的地址,而%rsp寄存器保存了隔离区栈顶的地址。
本步骤包含以下子步骤:
(41)动态链接器在目标程序加载时,在保证隔离区和数据区足够大的前提下,随机选择一个隔离区边界,将内存地址空间划分为隔离区和数据区。其中,隔离区是虚拟地址大于边界值的区域,而数据区是虚拟地址小于边界值的区域;
(42)动态链接器加载目标程序和共享库,根据隔离区和数据区的范围,将代码段映射到隔离区内,将数据段映射到数据区内,并计算代码段和数据段的相对偏移量。
(43)动态链接器提取出可执行文件中的指令重定位信息,识别指令重定位信息中的每一个二元组(位置,偏移量),确定每个二元组所对应指令的地址。通过代码段和数据段的相对偏移量,和二元组中的偏移量,计算出新的偏移量值,对指令中的偏移量进行修改。
(44)为隔离栈分配空间,将%rsp寄存器设置为隔离区栈顶的地址,将%r15寄存器设置为数据区栈顶地址。将%bnd0寄存器设置为隔离区边界地址,并设置%bndcfg寄存器,启用MPX检查机制。
(5)在目标程序运行时,利用MPX指令检测异常数据流,判断是否有内存读取指令访问了隔离区内的内存。如图4所示,如果出现异常数据流,则会触发越界异常(#BR)异常。在捕获异常后,根据触发异常指令访问的地址,判断访问是否合法。若为合法情况,则修改检查指令,防止假非法情况再次出现;否则报出异常,并生成日志信息。
本步骤包含以下子步骤:
(51)在目标程序运行时,利用MPX指令,对内存读取指令进行检查,判断是否有内存读取指令读取了隔离区内的内存。如果出现异常数据流,则会触发#BR异常,并进行异常处理。
(52)当异常发生时,根据触发#BR异常的指令访问的地址,判断访问是否合法。如果该指令访问的地址内容不是代码或隔离栈上的数据,则为合法情况,修改检查指令为nop指令,防止假非法情况再次出现;否则为非法情况,报出异常并生成日志信息。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所做的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种基于数据流监控的代码复用攻击防御方法,其特征在于,所述方法包括:
(1)在编译过程中,从目标程序和共享库源码中提取函数和数据信息;所述函数信息包括函数名、函数入口;所述数据信息包括数据名、数据位置和数据类型;
(2)分析步骤(1)编译形成的中间语言代码,根据提取的函数信息和数据信息,识别所述中间语言代码中的内存访问指令;对内存读操作指令、取函数地址指令、对栈中数据进行操作的指令进行插桩,并生成所述函数对应的跳转表;所述插桩,指在不影响程序正常执行的前提下,插入新的指令,或对原有的指令进行修改;
(3)识别所述中间语言代码中对数据段中内容进行访问的指令,生成指令重定位表,并在编译时添加到目标语言代码的指令重定位段中,形成包含指令重定位段的可执行文件;
(4)在目标程序加载时,将目标程序和共享库的各个段、堆和栈映射到内存地址空间中的隔离区和数据区,利用步骤(3)中生成的重定位表对代码段中访问数据段中内容的指令进行修正,找到正确的数据地址,并初始化隔离环境;所述初始化是指对%bnd0寄存器进行设置,把它设置为隔离区的边界,启用MPX检查机制;以及为隔离栈分配空间,隔离栈用于保存返回地址和栈上的函数指针;
(5)在目标程序运行时,检测异常数据流,通过检查触发异常指令的访问地址判定其合法性;判定规则为:
如果访问的地址内容为代码或隔离栈数据,则判定为真非法,报出异常,并生成日志信息;
否则判定为假非法;此时对内存读操作指令前由步骤(2)插桩的检查指令进行修改,将检查指令替换成无操作指令,防止假非法情况继续出现;
所述异常数据流指内存读操作指令,对隔离区内的内存进行了访问。
2.根据权利要求1所述的一种基于数据流监控的代码复用攻击防御方法,其特征在于,所述步骤(2)包括以下子步骤:
(21)根据步骤(1)中提取的函数信息,构造函数跳转表,跳转表中的表项和函数一一对应,表项的内容为跳转到函数入口;
(22)识别内存读操作指令,根据读取内存的地址,插入检查指令,检查这条读操作指令是否访问了隔离区内的内容;
(23)识别取函数地址的指令,将其修改为取函数对应跳转表项的地址;
(24)根据步骤(1)中提取的数据信息,识别对栈中数据进行操作的指令;将使用%rsp寄存器、访问除返回地址和函数指针外其他数据的指令,替换为使用保留的其他通用寄存器,优选%r15寄存器;
(25)对指令进行优化:如果多条内存读操作指令使用了同一个寄存器,而该寄存器的值没有改变,则将这些读操作的检查指令合并;对于使用%rip寄存器进行访问的指令,删除其检查指令;所述寄存器是intelx86_64的CPU上特有的。
3.根据权利要求1所述的一种基于数据流监控的代码复用攻击防御方法,其特征在于,所述步骤(3)包括以下子步骤:
(31)识别代码中对数据段中内容进行访问的指令,也即使用%rip寄存器对数据段中内容进行访问的指令;
(32)根据(31)中识别的指令在代码段中的位置,以及指令所访问的数据相对于指令的偏移量,生成指令重定位信息;
(33)在编译过程中,将指令重定位信息编译为指令重定位段,生成包含指令重定位段的可执行文件。
4.根据权利要求1所述的一种基于数据流监控的代码复用攻击防御方法,其特征在于,所述步骤(4)包括以下子步骤:
(41)在目标程序加载时,设置隔离区的边界,将内存地址空间划分为隔离区和数据区;
(42)加载目标程序和共享库,将代码段映射到隔离区内,将数据段、堆、栈映射到数据区内;
(43)根据代码段、数据段映射的地址,以及(3)中生成的指令重定位信息,修正代码段中对数据段中内容进行访问的指令,将指令所访问的数据相对于指令的偏移量,修改为新的偏移量;
(44)为隔离栈分配空间,初始化寄存器的值,将%rsp寄存器设置为隔离区栈顶的地址,将%bnd0寄存器设置为隔离区边界的地址,将保留的其他通用寄存器,如%r15设置为数据区栈顶的地址,并设置%bndcfg寄存器,启用MPX检查机制。
5.根据权利要求1所述的一种基于数据流监控的代码复用攻击防御方法,其特征在于,所述步骤(5)包括以下子步骤:
(51)监控运行时的读取数据流,如果内存读操作指令,对隔离区内部的内存进行了访问,则被视为异常数据流,并判定其合法性:
(52)通过检查触发异常指令的访问地址判定其合法性:如果该指令访问的地址内容为代码或隔离栈数据,则为真非法情况,报出异常,并生成日志信息;否则为假非法情况,对步骤(2)插桩的检查指令进行修改,将其替换为无操作指令,避免假非法情况继续出现。
6.一种基于数据流监控的代码复用攻击防御系统,其特征在于,所述系统包括:
信息提取模块,用于从目标程序和共享库源码,提取函数、数据信息,函数信息包括函数名和函数入口;数据信息包括数据名、数据位置和数据类型;
指令插桩模块,用于分析中间语言代码,结合信息提取模块提取的函数信息和数据信息,识别代码中的内存访问指令;对内存读操作指令、取函数地址的指令和对栈中数据进行操作的指令进行插桩,并生成函数对应的跳转表;
重定位信息生成模块,用于分析中间语言代码,识别代码中对数据段中内容进行访问的指令,生成指令重定位信息,并在编译时添加到指令重定位段中,生成包含指令重定位段的可执行文件;
内存映射模块,用于在目标程序加载时,在保证隔离区和数据区足够大的前提下,随机选择一个地址,将内存地址空间划分为隔离区和数据区;并将目标程序和共享库的各个段、堆、栈映射到内存地址空间中的隔离区和数据区,并根据指令重定位信息对代码段中访问数据段中内容的指令进行修正,并初始化隔离环境;
运行监控模块,用于在目标程序运行时,检测异常数据流,进行合法性判断;通过检查触发异常指令的访问地址判断其合法性,若为非法行为,则报出异常,生成日志信息;若为合法行为,则对检查指令进行修改,防止假非法情况继续出现;
在编译时,信息提取模块提取函数信息和数据信息,并将这些信息提供给指令插桩模块和重定位信息生成模块;指令插桩模块根据信息提取模块所提供的数据信息识别代码中的内存访问指令,进行相应的插桩;并根据信息提取模块所提供的函数信息生成函数对应的跳转表;重定位信息生成模块利用信息提取模块所提供的数据信息,识别出对数据段中内容进行访问的指令,生成指令重定位信息,并在编译时添加到指令重定位段中,生成包含指令重定位段的可执行文件;
运行时,在目标程序加载时,内存映射模块将目标程序和共享库的各个段、堆、栈映射到内存地址空间中的隔离区和数据区,并根据重定位信息生成模块所生成的指令重定位段,对代码段中访问数据段中内容的指令进行修正,并初始化隔离环境,设置隔离区;在目标程序运行时,运行时监控模块利用指令插桩模块所插桩的指令,判断访问地址是否进入内存映射模块所设置的隔离区,实现对异常数据流进行检测。
7.根据权利要求6所述的一种基于数据流监控的代码复用攻击防御系统,其特征在于,所述指令插桩模块包括:
跳转表构造单元,用于根据信息提取模块提取的函数信息,构造一个跳转表,并为每一个函数生成一个对应的表项,其内容为跳转到函数入口;
指令识别单元,用于对中间语言代码进行分析,并根据信息提取模块提取的数据信息,识别出三种类型的指令:内存读操作指令、取函数地址的指令、对栈中数据进行操作的指令;
代码插桩单元,用于根据指令识别单元的结果,对指令进行插桩。对于内存读操作指令,根据读取内存的地址,插入检查指令,检查这条指令是否访问了隔离区内的内容;对于取函数地址的指令,将其修改为取函数对应跳转表项的地址;对于对栈中数据进行操作的指令,将使用%rsp寄存器,访问除返回地址和函数指针外其他数据的指令,替换为使用保留的其他通用寄存器,如%r15寄存器;
代码优化单元,用于合并、删除冗余指令;如果多条内存读操作指令使用了同一个寄存器,而该寄存器的值没有改变,则将这些读操作的检查指令合并;对于使用%rip寄存器进行访问的指令,删除其检查指令。
8.根据权利要求6所述的一种基于数据流监控的代码复用攻击防御系统,其特征在于,所述重定位信息生成模块包括:
指令识别单元,用于对中间语言代码进行分析,并根据信息提取模块提取的数据信息,识别出对数据段中内容进行访问的指令;
重定位信息生成单元,用于根据指令识别单元的结果,根据指令在代码段中的位置,以及指令所访问的数据相对于指令的偏移量,生成指令重定位信息;
重定位信息编译单元,用于在编译过程中,将指令重定位信息编译为指令重定位段,生成包含指令重定位段的可执行文件。
9.根据权利要求6所述的一种基于数据流监控的代码复用攻击防御系统,其特征在于,所述内存映射模块包括:
隔离区初始化单元,用于在目标程序加载时,设置隔离区的边界,将内存地址空间划分为隔离区和数据区;
内存映射单元,用于加载目标程序和共享库,将代码段映射到隔离区内,将数据段、堆、栈映射到数据区内;
重定位单元,用于根据代码段、数据段映射的地址,以及指令重定位信息,修改代码段中对数据段中内容进行访问的指令,将指令所访问的数据相对于指令的偏移量,修改为新的偏移量;
隔离栈设置单元。用于为隔离栈分配空间,初始化寄存器的值。将%rsp寄存器设置为隔离栈顶的地址,将%bnd0寄存器设置为隔离区边界的地址,将保留的其他通用寄存器,如%r15设置为数据区栈顶的地址,并设置%bndcfg寄存器的值,启用检查机制。
10.根据权利要求6所述的一种基于数据流监控的代码复用攻击防御系统,其特征在于,所述运行时监控模块包括:
异常检测单元,用于监控运行时的数据流,对隔离区内的读操作,被视为异常数据流;当出现异常数据流时,交由异常处理单元进行处理;
异常处理单元,用于处理异常情况,通过检查触发异常指令的访问地址判断其合法性;如果访问的地址内容为代码或隔离栈数据,则为非法情况,报出异常,生成日志信息;否则为合法情况,对检查指令进行修改,防止假非法情况继续出现。
CN201711257780.8A 2017-12-04 2017-12-04 一种基于数据流监控的代码复用攻击防御方法及系统 Active CN108090346B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201711257780.8A CN108090346B (zh) 2017-12-04 2017-12-04 一种基于数据流监控的代码复用攻击防御方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201711257780.8A CN108090346B (zh) 2017-12-04 2017-12-04 一种基于数据流监控的代码复用攻击防御方法及系统

Publications (2)

Publication Number Publication Date
CN108090346A true CN108090346A (zh) 2018-05-29
CN108090346B CN108090346B (zh) 2020-06-02

Family

ID=62173608

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201711257780.8A Active CN108090346B (zh) 2017-12-04 2017-12-04 一种基于数据流监控的代码复用攻击防御方法及系统

Country Status (1)

Country Link
CN (1) CN108090346B (zh)

Cited By (20)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109189607A (zh) * 2018-08-13 2019-01-11 南京翼辉信息技术有限公司 一种应用程序断点恢复的方法
CN110224947A (zh) * 2019-06-05 2019-09-10 东软集团股份有限公司 一种多核转发系统中的报文处理方法、装置及设备
CN110717181A (zh) * 2019-09-09 2020-01-21 中国人民解放军战略支援部队信息工程大学 基于新型程序依赖图的非控制数据攻击检测方法及装置
CN111027059A (zh) * 2019-11-29 2020-04-17 武汉大学 一种基于llvm的抵御内存泄露的系统及方法
CN111310171A (zh) * 2020-02-21 2020-06-19 华大半导体有限公司 一种硬件级主动防御的实现方法及装置
CN111562916A (zh) * 2019-02-13 2020-08-21 百度在线网络技术(北京)有限公司 共享算法的方法和装置
CN111949984A (zh) * 2020-08-24 2020-11-17 北京天融信网络安全技术有限公司 一种漏洞防御方法及电子装置
CN112199681A (zh) * 2020-10-22 2021-01-08 中国人民解放军国防科技大学 基于多编码模式cpu的代码注入型攻击防护方法及装置
CN112380529A (zh) * 2020-10-26 2021-02-19 浙江大学 一种基于操作的嵌入式裸机系统安全隔离系统
CN112579409A (zh) * 2020-12-05 2021-03-30 西安翔腾微电子科技有限公司 一种OpenGL图形任务分析方法
CN112905998A (zh) * 2021-02-26 2021-06-04 中国人民解放军国防科技大学 基于代码段随机切换的地址导向型攻击防护方法及装置
CN112988507A (zh) * 2021-02-26 2021-06-18 北京百度网讯科技有限公司 业务监控方法、装置、设备、存储介质和计算机程序产品
CN113536297A (zh) * 2021-07-16 2021-10-22 中国科学院软件研究所 基于RISC-V与Canary机制的缓冲区溢出攻击防御方法及装置
CN113625995A (zh) * 2020-05-07 2021-11-09 武汉斗鱼网络科技有限公司 一种自适应获取数据的方法和装置
CN113672922A (zh) * 2021-08-17 2021-11-19 中国科学院软件研究所 基于risc-v与o-cfi机制的代码重用攻击防御方法及装置
CN114385189A (zh) * 2022-03-23 2022-04-22 东南大学 一种面向深度嵌入式系统的函数地址空间布局随机化方法
CN114707143A (zh) * 2022-03-15 2022-07-05 中国科学院信息工程研究所 内存数据损坏攻击的监测方法和装置
CN114756856A (zh) * 2022-06-15 2022-07-15 中国海洋大学 一种基于函数动态载入的代码重用攻击防御方法
CN115659322A (zh) * 2022-12-15 2023-01-31 中国海洋大学 一种基于运行时顺序调度装载的代码复用攻击防御方案
CN112579409B (zh) * 2020-12-05 2024-06-04 西安翔腾微电子科技有限公司 一种OpenGL图形任务分析方法

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102521079A (zh) * 2011-12-02 2012-06-27 华中科技大学 软件栈缓冲区溢出的容错方法
CN106022166A (zh) * 2016-06-02 2016-10-12 东北大学 一种代码复用攻击防御系统及方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102521079A (zh) * 2011-12-02 2012-06-27 华中科技大学 软件栈缓冲区溢出的容错方法
CN106022166A (zh) * 2016-06-02 2016-10-12 东北大学 一种代码复用攻击防御系统及方法

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
俞能海等: "云安全研究进展综述", 《电子学报》 *
林闯等: "云计算安全:架构、机制与模型评价", 《计算机学报》 *
陈全等: "云计算及其关键技术", 《计算机应用》 *
陈平: "代码复用攻击与防御技术研究", 《中国博士学位论文全文数据库 信息科技辑》 *

Cited By (30)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109189607B (zh) * 2018-08-13 2020-08-04 南京翼辉信息技术有限公司 一种应用程序断点恢复的方法
CN109189607A (zh) * 2018-08-13 2019-01-11 南京翼辉信息技术有限公司 一种应用程序断点恢复的方法
CN111562916A (zh) * 2019-02-13 2020-08-21 百度在线网络技术(北京)有限公司 共享算法的方法和装置
CN110224947A (zh) * 2019-06-05 2019-09-10 东软集团股份有限公司 一种多核转发系统中的报文处理方法、装置及设备
CN110717181B (zh) * 2019-09-09 2021-07-02 中国人民解放军战略支援部队信息工程大学 基于新型程序依赖图的非控制数据攻击检测方法及装置
CN110717181A (zh) * 2019-09-09 2020-01-21 中国人民解放军战略支援部队信息工程大学 基于新型程序依赖图的非控制数据攻击检测方法及装置
CN111027059A (zh) * 2019-11-29 2020-04-17 武汉大学 一种基于llvm的抵御内存泄露的系统及方法
CN111027059B (zh) * 2019-11-29 2022-07-19 武汉大学 一种基于llvm的抵御内存泄露的系统及方法
CN111310171A (zh) * 2020-02-21 2020-06-19 华大半导体有限公司 一种硬件级主动防御的实现方法及装置
CN113625995A (zh) * 2020-05-07 2021-11-09 武汉斗鱼网络科技有限公司 一种自适应获取数据的方法和装置
CN111949984A (zh) * 2020-08-24 2020-11-17 北京天融信网络安全技术有限公司 一种漏洞防御方法及电子装置
CN112199681B (zh) * 2020-10-22 2024-03-26 中国人民解放军国防科技大学 基于多编码模式cpu的代码注入型攻击防护方法及装置
CN112199681A (zh) * 2020-10-22 2021-01-08 中国人民解放军国防科技大学 基于多编码模式cpu的代码注入型攻击防护方法及装置
CN112380529A (zh) * 2020-10-26 2021-02-19 浙江大学 一种基于操作的嵌入式裸机系统安全隔离系统
CN112579409A (zh) * 2020-12-05 2021-03-30 西安翔腾微电子科技有限公司 一种OpenGL图形任务分析方法
CN112579409B (zh) * 2020-12-05 2024-06-04 西安翔腾微电子科技有限公司 一种OpenGL图形任务分析方法
CN112988507A (zh) * 2021-02-26 2021-06-18 北京百度网讯科技有限公司 业务监控方法、装置、设备、存储介质和计算机程序产品
CN112905998B (zh) * 2021-02-26 2023-10-03 中国人民解放军国防科技大学 基于代码段随机切换的地址导向型攻击防护方法及装置
CN112988507B (zh) * 2021-02-26 2024-01-12 北京百度网讯科技有限公司 业务监控方法、装置、设备、存储介质和计算机程序产品
CN112905998A (zh) * 2021-02-26 2021-06-04 中国人民解放军国防科技大学 基于代码段随机切换的地址导向型攻击防护方法及装置
CN113536297A (zh) * 2021-07-16 2021-10-22 中国科学院软件研究所 基于RISC-V与Canary机制的缓冲区溢出攻击防御方法及装置
CN113536297B (zh) * 2021-07-16 2022-07-22 中国科学院软件研究所 基于RISC-V与Canary机制的缓冲区溢出攻击防御方法及装置
CN113672922B (zh) * 2021-08-17 2022-03-25 中国科学院软件研究所 基于risc-v与o-cfi机制的代码重用攻击防御方法及装置
CN113672922A (zh) * 2021-08-17 2021-11-19 中国科学院软件研究所 基于risc-v与o-cfi机制的代码重用攻击防御方法及装置
CN114707143A (zh) * 2022-03-15 2022-07-05 中国科学院信息工程研究所 内存数据损坏攻击的监测方法和装置
CN114385189A (zh) * 2022-03-23 2022-04-22 东南大学 一种面向深度嵌入式系统的函数地址空间布局随机化方法
CN114756856B (zh) * 2022-06-15 2022-08-23 中国海洋大学 一种基于函数动态载入的代码重用攻击防御方法
CN114756856A (zh) * 2022-06-15 2022-07-15 中国海洋大学 一种基于函数动态载入的代码重用攻击防御方法
CN115659322B (zh) * 2022-12-15 2023-03-10 中国海洋大学 一种基于运行时顺序调度装载的代码复用攻击防御方法
CN115659322A (zh) * 2022-12-15 2023-01-31 中国海洋大学 一种基于运行时顺序调度装载的代码复用攻击防御方案

Also Published As

Publication number Publication date
CN108090346B (zh) 2020-06-02

Similar Documents

Publication Publication Date Title
CN108090346A (zh) 一种基于数据流监控的代码复用攻击防御方法及系统
Zhang et al. VTint: Protecting Virtual Function Tables' Integrity.
CN105393255B (zh) 用于虚拟机中的恶意软件检测的过程评估
CN103620613B (zh) 用于基于虚拟机监视器的反恶意软件安全的系统和方法
Huang et al. Software crash analysis for automatic exploit generation on binary programs
Ahmadvand et al. A taxonomy of software integrity protection techniques
Li et al. Fine-cfi: fine-grained control-flow integrity for operating system kernels
US9038161B2 (en) Exploit nonspecific host intrusion prevention/detection methods and systems and smart filters therefor
CN101183414A (zh) 一种程序检测的方法、装置及程序分析的方法
CN102043915A (zh) 一种非可执行文件中包含恶意代码的检测方法及其装置
CN111428239B (zh) 一种恶意挖矿软件的检测方法
D’Elia et al. Rope: Covert multi-process malware execution with return-oriented programming
Ahmed et al. Integrity checking of function pointers in kernel pools via virtual machine introspection
Wang et al. Tunter: assessing exploitability of vulnerabilities with taint-guided exploitable states exploration
He et al. Exploiting binary-level code virtualization to protect Android applications against app repackaging
Parida et al. PageDumper: a mechanism to collect page table manipulation information at run-time
Nasim et al. Uncovering self code modification in Android
Pék et al. Membrane: a posteriori detection of malicious code loading by memory paging analysis
Botacin et al. Near-memory & in-memory detection of fileless malware
CN115964758A (zh) 一种基于TrustZone的内核数据完整性保护方法
Borck et al. Frankencode: Creating diverse programs using code clones
Filho et al. Reducing the attack surface of dynamic binary instrumentation frameworks
Lin et al. Control flow integrity enforcement with dynamic code optimization
Otsuki et al. Toward the Analysis of Distributed Code Injection in Post-mortem Forensics
Yu et al. Minergate: A novel generic and accurate defense solution against web based cryptocurrency mining attacks

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant