CN118246007A - 一种基于内存标记扩展的eBPF程序隔离方法 - Google Patents

一种基于内存标记扩展的eBPF程序隔离方法 Download PDF

Info

Publication number
CN118246007A
CN118246007A CN202410045832.9A CN202410045832A CN118246007A CN 118246007 A CN118246007 A CN 118246007A CN 202410045832 A CN202410045832 A CN 202410045832A CN 118246007 A CN118246007 A CN 118246007A
Authority
CN
China
Prior art keywords
ebpf
pointer
memory
program
stack
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.)
Pending
Application number
CN202410045832.9A
Other languages
English (en)
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.)
Zhejiang University ZJU
Original Assignee
Zhejiang University ZJU
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 Zhejiang University ZJU filed Critical Zhejiang University ZJU
Priority to CN202410045832.9A priority Critical patent/CN118246007A/zh
Publication of CN118246007A publication Critical patent/CN118246007A/zh
Pending legal-status Critical Current

Links

Landscapes

  • Storage Device Security (AREA)

Abstract

本发明公开了一种基于内存标记扩展的eBPF程序隔离方法,包括:将eBPF程序使用的内存与指针打上标记,以区分允许当前eBPF程序访问的内存、指针与其他内存,动态地阻止eBPF程序访问非法的内存;禁止eBPF的指针与64位的立即数进行算数运算,以保护eBPF寄存器上的指针;通过检查被从栈上加载的指针的完整性以确保指针的高位标记值未被修改,从而保护eBPF栈上的指针;在辅助函数的入口处插桩,以校验参数的合法性,阻止了eBPF程序通过调用辅助函数实施预期以外的操作,有效地隔离了eBPF程序与Linux内核,动态地阻止恶意的eBPF程序攻击内核。

Description

一种基于内存标记扩展的eBPF程序隔离方法
技术领域
本发明属于操作系统内核防护领域,尤其涉及一种基于内存标记扩展的eBPF程序隔离方法。
背景技术
Linux是目前最成功且广泛应用的操作系统之一,在整个计算机生态系统中占据关键地位。内核是操作系统的核心部分,负责管理硬件资源和提供系统调用接口,其安全性直接影响整个系统的稳定性和可信度。然而,正是由于其广泛的使用和开源的特性,近年来Linux内核已成为黑客和恶意软件攻击的主要目标。因此,确保Linux内核的安全性至关紧要。
eBPF(扩展伯克利包过滤器)是一种用于安全内核扩展的子系统,自Linux 4.4版本引入。eBPF的设计目标是允许在不修改内核的情况下,动态加载并安全地执行不受信任的用户自定义扩展程序。尽管在内核中执行任意代码一直被认为是不明智的做法,但eBPF通过引入验证器,在将eBPF程序执行于内核空间之前对其进行检查以确保安全性。由于这一安全保障,相较于可加载内核模块,eBPF被视为更安全的内核扩展方式。eBPF已在多个领域广泛应用,包括内核调试和跟踪、网络性能提升、云原生运行时监控和安全策略实施。
eBPF在很大程度上依赖其验证器来检测恶意的eBPF程序,并阻止它们对内核造成危害,因此,验证器的正确性对于eBPF的安全性至关重要。然而,由于eBPF验证器检查的复杂性,其中存在的错误无法完全避免。更严峻的是,作为一个新兴的Linux子系统,eBPF的特性仍处于剧烈的演变中,因此开发者需要不断适配验证器,进一步提升了引入新漏洞的风险。事实上,近年来eBPF验证器中被披露的漏洞层出不穷,攻击者可以利用这些漏洞加载并执行恶意的eBPF程序,对操作系统实施攻击。
内存标记扩展技术是ARMv8.5指令集架构推出的硬件特性,它可以用来给内存标记给内存和指针打上标记(染色),并在访存时匹配标记,以追踪非法内存操作,加强内存安全。内存标记扩展技术可被用于实现内存隔离,并且相对于其它的类似技术,由于其无需显示地切换内存域,因此具有更小的性能开销。
现有的验证器只在eBPF程序加载时执行一次静态检查,而不在eBPF程序被执行时施加任何限制,因此无法动态阻止eBPF程序实施恶意的操作。由于eBPF验证器检查的复杂性,其中存在的错误无法完全避免,导致攻击者可以利用其检查错误以加载恶意的eBPF程序并执行。
因此,需要提供一种隔离eBPF程序的方法,以动态地阻止恶意的eBPF程序攻击内核。
发明内容
本发明公开一种基于内存标记扩展的eBPF程序隔离方法。该方法通过使用内存标记扩展的硬件特性,为eBPF使用的指针与内存打上标记,当eBPF程序使用指针访问标记不匹配的内存时,该操作将被检测到并阻止,从而确保eBPF程序不会访问预期以外的内存。通过这种方式可以将eBPF程序和Linux内核隔离,动态地阻止恶意的eBPF程序攻击内核。
根据本申请实施例的第一方面,提供一种基于内存标记扩展的eBPF程序隔离方法,包括:
(1)将eBPF程序使用的内存与指针打上标记,以区分允许当前eBPF程序访问的内存、指针与其他内存;
(2)禁止eBPF的指针与64位的立即数进行算数运算,以保护eBPF寄存器上的指针;
(3)通过检查被从栈上加载的指针的完整性以确保指针的高位标记值未被修改,从而保护eBPF栈上的指针;
(4)在辅助函数的入口处插桩,以校验参数的合法性。
进一步地,所述步骤(1)中需要打标记的内存包括eBPF程序的栈、使用的map和eBPF程序被执行时内核传入的上下文,而需要打标记的指针包括eBPF程序被执行时内核传入的上下文以及调用辅助函数返回的地址。
进一步地,步骤(1)中,相同标记值作用的粒度为用户命名空间,为相同用户空间的eBPF程序分配相同的标记,以避免标记的浪费。
进一步地,所述步骤(2)中,限制参与eBPF的指针算数运算的立即数为32位。
进一步地,将原本参与运算的64位立即数截断成32位,并用32位的运算指令替换原本的指令。
进一步地,所述步骤(3)中,在向栈上存储指针的指令前插入指针签名指令,并在从栈上加载指针的指令前插入指针验证指令。
进一步地,指针验证操作使用与内存标记扩展不同的指针保留比特,以避免两种机制的冲突。
进一步地,通过读取eBPF程序验证过程中的状态信息来识别与定位将指针存储到栈上和从栈上加载指针的指令。
根据本申请实施例的第二方面,提供一种电子设备,包括:
一个或多个处理器;
存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如第一方面所述的方法。
根据本申请实施例的第三方面,提供一种计算机可读存储介质,其上存储有计算机指令,该指令被处理器执行时实现如第一方面所述方法的步骤。
本申请的实施例提供的技术方案可以包括以下有益效果:
本发明公开一种基于内存标记扩展的eBPF程序隔离方法。该方法通过使用内存标记扩展的硬件特性为eBPF使用的指针与内存打上标记,动态地阻止eBPF程序访问非法的内存。并且本发明通过检验参数的方式限制eBPF的辅助函数,阻止了eBPF程序通过调用辅助函数实施预期以外的操作。因此本发明有效地隔离了eBPF程序与Linux内核,动态地阻止恶意的eBPF程序攻击内核。
相比于现有的技术,本方法通过使用内存标记扩展的硬件特性,可以动态地检测并阻止eBPF程序实施恶意的操作。其次,本防护使用了内存标记扩展这一硬件机制,在运行时无需任何内存域的切换操作,相比其它隔离机制具有更小的开销。最后,本发明的机制对用户进程具有透明性,不会干扰现有的eBPF生态。由于防护机制没有修改eBPF规范或用户接口,因此用户态的eBPF程序和相关接口无需重新适配。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。
图1是基于内存标记扩展的eBPF程序隔离方法的实施流程图。
图2是基于内存标记扩展的eBPF程序隔离方法的原理示意图。
图3是根据一示例性实施例示出的一种基于内存标记扩展的eBPF程序隔离装置的框图。
图4是根据一示例性实施例示出的一种电子设备的示意图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。
在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本申请可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
图1是使用基于内存标记扩展的eBPF程序隔离方法实施流程图,具体包括以下步骤(步骤①②③发生在eBPF程序的加载阶段,④发生在其执行阶段):
(1)将eBPF程序使用的内存与指针打上标记,以区分允许当前eBPF程序访问的内存、指针与其他内存;
具体地,需要打标记的内存包括eBPF程序的栈,使用的map和eBPF程序被执行时内核传入的上下文,而需要打标记的指针包括上下文指针以及调用辅助函数返回的地址。如图1所示,为允许当前eBPF程序访问的内存和指针打上与其它内存不同的标记,这样一来该eBPF程序可以正常地访问合法的内存,而当其访问内核的内存或其它的eBPF程序的内存(使用标记不匹配的指针)时将会被阻止。通过这种方式,可以扩展原先由页表的访问权限比特设定的单一内存访问控制,对eBPF程序的内存访问实施进一步的限制。
其中,相同标记值作用的粒度为用户命名空间。考虑到内存标记扩展提供4个比特以存储标记值,其最多支持16个不同标记。而相同用户空间的用户进程加载的eBPF程序之间无需隔离,因此如图1所示,可以为相同用户空间的eBPF程序分配相同的标记,以避免标记的浪费。
为eBPF程序的map内存打上标记:加载eBPF程序前需要先创建其使用的map,内核需要为map分配内存并打上标记(栈和上下文在被分配的时候打上标记)。具体而言,首先申请一个标记值,若此前该用户命名空间已分配过eBPF程序使用的内存并申请过标记值,则直接使用该标记值(同一用户命名空间的eBPF程序无需隔离),以避免标记的浪费,反之则申请一个未使用的标记值。随后,为所有map值区域的内存打上标记。此外,eBPF使用的指针在上下文创建时和辅助函数返回时通过内存标记扩展指令打上标记。
(2)禁止eBPF的指针与64位的立即数进行算数运算,以保护eBPF寄存器上的指针;
步骤(1)中由内存标记扩展实施的内存访问控制依赖于指针的完整性(存储在指针高位比特的标记不能被篡改),然而,eBPF允许对指针(存储在eBPF寄存器中)进行算数运算操作,攻击者可以通过将指针与一个64位的立即数进行加(减)运算以修改高位比特(标记),因此需要保护被加载到寄存器的指针防止其标记被篡改。本申请通过限制eBPF的指针运算,即禁止eBPF的指针与64位的立即数进行算数运算,以防止指针存储在高位比特的标记被篡改。
具体而言,限制参与eBPF的指针算数运算的立即数为32位。考虑到32位最多支持正负2GB的内存偏移量,远大于eBPF程序可以访问的内存范围,因此可以满足其正常工作的需要,同时避免eBPF指针的高位标记由于算数运算被篡改。
替换eBPF程序中不合法的指针算数运算指令;用户加载eBPF程序后,内核使用验证器模拟执行该程序的每一条指令的检查其安全性。在验证过程中本发明识别并替换所有对指针进行算数运算操作的指令,具体而言,本发明检查每条算数运算的指令的操作数是否为指针类型,并且每找到这样一条指令,将原本参与运算的64位立即数截断成32位,用32位的运算指令替换原本的指令(使用截断后的32位立即数)。这样一来,现有的eBPF程序无需进行额外的适配。
(3)通过检查被从栈上加载的指针的完整性以确保指针的高位标记值未被修改,从而保护eBPF栈上的指针;
与步骤(2)类似,eBPF允许将指针暂时存储到栈上以及对栈的读写操作,因此攻击者可以通过篡改栈内存以操纵指针的高位标记值。本发明通过检查被从栈上加载的指针的完整性以确保指针的高位标记值未被修改。
其中,检查被从栈上加载的指针的完整性的操作通过指针验证指令实现。具体的,在向栈上存储指针的指令前插入指针签名指令,并在从栈上加载指针的指令前插入指针验证指令。通过这种方式,可以为指针生成签名,并在指针被使用时校验签名已验证指针的完整性。所述指针验证指令使用与内存标记扩展不同的指针保留比特,以避免两种机制的冲突,通过读取eBPF程序验证过程中的状态信息来识别与定位将指针存储到栈上和从栈上加载指针的指令。
在验证过程中,本申请首先识别所有指针存储与加载指令。具体而言,本发明通过检查每条内存访问指令的两个操作数是否其中一个为指针类型而另一个为栈上的地址。随后,对于符合上述条件的内存访问指令,若其为存储指令,则在其之前插入签名指令,若其为加载指令,则在其之前插入验证指令。
(4)在辅助函数的入口处插桩,以校验参数的合法性;
eBPF程序还可以调用辅助函数(内核函数)来实施各种操作,因此需要在辅助函数中添加额外的检查,本申请中通过在辅助函数的入口处插桩以校验传入的参数,从而阻止辅助函数实施预期以外的操作。
其中,将辅助函数进行分类。具体的,参照《Lu H,Wang S,Wu Y,et al.MOAT:Towards Safe BPF Kernel Extension[J].arXiv preprint arXiv:2301.13421,2023.》将辅助函数分类为无参数类型、只访问eBPF内存类型、只读类型、写类型以及特殊类型(数量较少)。通过这种方式,可以忽略本身安全的类型(无参数类型),而重点关注危险的类型,在减少人工工作量的同时避免遗漏,以系统性地限制eBPF程序通过调用辅助函数实施恶意操作。
本申请实现了动态限制eBPF程序的行为。经过上述步骤处理的eBPF程序将执行阶段受到本申请的动态限制:
a)硬件检测并阻止访问非法内存;当eBPF程序尝试访问非法内存时(包括内核内存与其它用户命名空间的eBPF程序内存),将会由于标记不匹配被内存标记扩展的硬件机制阻止,而合法的内存访问不受影响。
b)通过指针验证指令检查被从栈上加载的指针的完整性;当eBPF程序从栈上加载指针时,本发明使用指针验证指令检查指针的完整性,以防止eBPF程序使用被篡改的指针。
c)防止eBPF程序通过调用辅助函数执行恶意的操作;在内核执行辅助函数前检验参数的安全性,以防止eBPF程序传入非法的参数使辅助函数实施预期以外的操作以打破隔离攻击内核。
与前述的基于内存标记扩展的eBPF程序隔离方法的实施例相对应,本申请还提供了基于内存标记扩展的eBPF程序隔离装置的实施例。
图3是根据一示例性实施例示出的一种基于内存标记扩展的eBPF程序隔离装置框图。
参照图3,该装置可以包括:
内存及指针标记模块21:将eBPF程序使用的内存与指针打上标记,以区分允许当前eBPF程序访问的内存、指针与其他内存;
指针保护模块22:禁止eBPF的指针与64位的立即数进行算数运算,以保护eBPF寄存器上的指针;
指针完整性检查模块23:通过检查被从栈上加载的指针的完整性以确保指针的高位标记值未被修改,从而保护eBPF栈上的指针;
参数校验模块24:在辅助函数的入口处插桩,以校验参数的合法性。
关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
相应的,本申请还提供一种电子设备,包括:一个或多个处理器;存储器,用于存储一个或多个程序;当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如上述的基于内存标记扩展的eBPF程序隔离方法。如图4所示,为本发明实施例提供的一种基于内存标记扩展的eBPF程序隔离方法所在任意具备数据处理能力的设备的一种硬件结构图,除了图4所示的处理器、内存以及网络接口之外,实施例中装置所在的任意具备数据处理能力的设备通常根据该任意具备数据处理能力的设备的实际功能,还可以包括其他硬件,对此不再赘述。
相应的,本申请还提供一种计算机可读存储介质,其上存储有计算机指令,该指令被处理器执行时实现如上述的基于内存标记扩展的eBPF程序隔离方法。所述计算机可读存储介质可以是前述任一实施例所述的任意具备数据处理能力的设备的内部存储单元,例如硬盘或内存。所述计算机可读存储介质也可以是外部存储设备,例如所述设备上配备的插接式硬盘、智能存储卡(Smart Media Card,SMC)、SD卡、闪存卡(Flash Card)等。进一步的,所述计算机可读存储介还可以既包括任意具备数据处理能力的设备的内部存储单元也包括外部存储设备。所述计算机可读存储介质用于存储所述计算机程序以及所述任意具备数据处理能力的设备所需的其他程序和数据,还可以用于暂时地存储已经输出或者将要输出的数据。
本领域技术人员在考虑说明书及实践这里公开的内容后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。

Claims (10)

1.一种基于内存标记扩展的eBPF程序隔离方法,其特征在于,该方法包括以下步骤:
(1)将eBPF程序使用的内存与指针打上标记,以区分允许当前eBPF程序访问的内存、指针与其他内存;
(2)禁止eBPF的指针与64位的立即数进行算数运算,以保护eBPF寄存器上的指针;
(3)通过检查被从栈上加载的指针的完整性以确保指针的高位标记值未被修改,从而保护eBPF栈上的指针;
(4)在辅助函数的入口处插桩,以校验参数的合法性。
2.根据权利要求1所述的基于内存标记扩展的eBPF程序隔离方法,其特征在于,所述步骤(1)中需要打标记的内存包括eBPF程序的栈、使用的map和eBPF程序被执行时内核传入的上下文,而需要打标记的指针包括eBPF程序被执行时内核传入的上下文以及调用辅助函数返回的地址。
3.根据权利要求1所述的基于内存标记扩展的eBPF程序隔离方法,其特征在于,步骤(1)中,相同标记值作用的粒度为用户命名空间,为相同用户空间的eBPF程序分配相同的标记,以避免标记的浪费。
4.根据权利要求1所述的基于内存标记扩展的eBPF程序隔离方法,其特征在于,所述步骤(2)中,限制参与eBPF的指针算数运算的立即数为32位。
5.根据权利要求4所述的基于内存标记扩展的eBPF程序隔离方法,其特征在于,将原本参与运算的64位立即数截断成32位,并用32位的运算指令替换原本的指令。
6.根据权利要求1所述的基于内存标记扩展的eBPF程序隔离方法,其特征在于,所述步骤(3)中,在向栈上存储指针的指令前插入指针签名指令,并在从栈上加载指针的指令前插入指针验证指令。
7.根据权利要求6所述的基于内存标记扩展的eBPF程序隔离方法,其特征在于,指针验证操作使用与内存标记扩展不同的指针保留比特,以避免两种机制的冲突。
8.根据权利要求6所述的基于内存标记扩展的eBPF程序隔离方法,其特征在于,通过读取eBPF程序验证过程中的状态信息来识别与定位将指针存储到栈上和从栈上加载指针的指令。
9.一种电子设备,其特征在于,包括:
一个或多个处理器;
存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-8任一项所述的方法。
10.一种计算机可读存储介质,其上存储有计算机指令,其特征在于,该指令被处理器执行时实现如权利要求1-8中任一项所述方法的步骤。
CN202410045832.9A 2024-01-12 2024-01-12 一种基于内存标记扩展的eBPF程序隔离方法 Pending CN118246007A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202410045832.9A CN118246007A (zh) 2024-01-12 2024-01-12 一种基于内存标记扩展的eBPF程序隔离方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202410045832.9A CN118246007A (zh) 2024-01-12 2024-01-12 一种基于内存标记扩展的eBPF程序隔离方法

Publications (1)

Publication Number Publication Date
CN118246007A true CN118246007A (zh) 2024-06-25

Family

ID=91559669

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202410045832.9A Pending CN118246007A (zh) 2024-01-12 2024-01-12 一种基于内存标记扩展的eBPF程序隔离方法

Country Status (1)

Country Link
CN (1) CN118246007A (zh)

Similar Documents

Publication Publication Date Title
KR102189296B1 (ko) 가상 머신 보안 어플리케이션을 위한 이벤트 필터링
RU2615664C2 (ru) Способы, системы и машиночитаемый носитель для активного контроля, защиты памяти и проверки целостности целевых устройств
JP5487479B2 (ja) オペレーティングシステム(os)に依存しないウイルス対策(av)スキャナに対して強制的なセキュリティポリシーを実施する方法および装置
JP4759059B2 (ja) メモリページをプログラムに対応付けるページカラーリング
US20120216281A1 (en) Systems and Methods for Providing a Computing Device Having a Secure Operating System Kernel
US20090300370A1 (en) Enabling byte-code based image isolation
CN111400702A (zh) 一种虚拟化的操作系统内核保护方法
JP6370098B2 (ja) 情報処理装置、情報処理監視方法、プログラム、及び記録媒体
US10114948B2 (en) Hypervisor-based buffer overflow detection and prevention
CN112805710A (zh) 验证堆栈指针
EP4073634A1 (en) Domain transition disable configuration parameter
Kittel et al. Code validation for modern os kernels
CN113032737B (zh) 软件的保护方法、装置、电子设备及存储介质
CN112948863B (zh) 敏感数据的读取方法、装置、电子设备及存储介质
CN118246007A (zh) 一种基于内存标记扩展的eBPF程序隔离方法
Crandall et al. A security assessment of the minos architecture
Liu et al. A buffer overflow detection and defense method based on RISC-V instruction set extension
KR20100026195A (ko) 시스템 보호 장치 및 방법
Zhu et al. Diffguard: Obscuring sensitive information in canary based protections
CN111898120A (zh) 控制流完整性保护方法及装置
US8321668B2 (en) Control of data access by dynamically verifying legal references
CN114981811A (zh) 用于软件安全的装置和方法
Kuzuno et al. Protection Mechanism of Kernel Data Using Memory Protection Key
EP4073635B1 (en) Intermodal calling branch instruction
CN111382433B (zh) 模块加载方法、装置、设备以及存储介质

Legal Events

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