CN111143199B - 一种云平台中检测dpdk应用程序内存越界访问的方法 - Google Patents

一种云平台中检测dpdk应用程序内存越界访问的方法 Download PDF

Info

Publication number
CN111143199B
CN111143199B CN201911267320.2A CN201911267320A CN111143199B CN 111143199 B CN111143199 B CN 111143199B CN 201911267320 A CN201911267320 A CN 201911267320A CN 111143199 B CN111143199 B CN 111143199B
Authority
CN
China
Prior art keywords
memory
dpdk
asan
shadow
application program
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.)
Active
Application number
CN201911267320.2A
Other languages
English (en)
Other versions
CN111143199A (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.)
Fiberhome Telecommunication Technologies Co Ltd
Original Assignee
Fiberhome Telecommunication Technologies Co Ltd
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 Fiberhome Telecommunication Technologies Co Ltd filed Critical Fiberhome Telecommunication Technologies Co Ltd
Priority to CN201911267320.2A priority Critical patent/CN111143199B/zh
Publication of CN111143199A publication Critical patent/CN111143199A/zh
Application granted granted Critical
Publication of CN111143199B publication Critical patent/CN111143199B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3644Software debugging by instrumenting at runtime
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3624Software debugging by performing operations on the source code, e.g. via a compiler
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/366Software debugging using diagnostics

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种云平台中检测DPDK应用程序内存越界访问的方法,包括如下步骤:在DPDK链接库的内存访问指令中插入检测代码,以实现访问内存前核实该内存状态是否可访问;虚拟机调用DPDK链接库对目标应用程序进行初始化时,通过截获DPDK初始化函数获取初始化的内存虚拟地址范围,利用ASAN的影子内存区标记所述内存虚拟地址范围;运行内存访问指令时,通过上述检测代码标记检测内存是否标记于ASAN的影子内存区,内存已标记时不可访问,从而解决DPDK应用场景下无法通过ASAN来检测出内存问题。

Description

一种云平台中检测DPDK应用程序内存越界访问的方法
技术领域
本发明属于云计算领域,具体涉及一种云平台中检测DPDK应用程序内存越界访问的方法。
背景技术
典型的LLVM编译器包括三大部分:前端(和实际编程语言相关),后端(和实际芯片或硬件平台相关)以及中间语言IR(Intermediate Representation)。一般来说,编译器会将源语言翻译为一种“中间语言(IR)”,之后再由中间语言,利用后端程序和设备翻译为目标平台的汇编语言。不同编译器的中间语言IR是不一样的,IR集中体现了编译器的主要特征——算法,优化方式,汇编流程等等。在LLVM的架构中,Pass的作用就是优化LLVM IR,Pass作用于LLVM IR,用来处理IR,分析IR,寻找优化的机会并修改IR,从而产生优化的代码。
DPDK是一个linux基金会的开源项目。是在数据平面应用中为快速的数据包处理提供一个简单而完善的架构,并通过大页技术使用了自身的一套内存管理机制。因此DPDK对提高网络通信的效率起着至关重要的作用。C语言是一种非内存安全的系统编程语言,常见的内存问题就是内存越界,其危害非常大,容易产生安全漏洞,严重的时候甚至影响系统的稳定运行。为了防止这些问题的发生,在通过glibc编写的软件场景下,可以在软件编译的时候,通过asan来获取标准的glibc的内存管理函数来进行内存监控。同样类似的可以运用valgrind来检测内存。但是由于valgrind的依赖太多,同时高版本gcc支持asan内存检测,与valgrind相比asan消耗非常低,甚至可以直接在生产环境中启用asan。Asan由于使用了编译时检测,所以速度更快。
在云平台中的虚拟机之间通信流量一般使用软转发,由于软转发远达不到硬件的吞吐量和时延等。为了提高软转发的高性能,所以在虚拟交换机程序上通过调用DPDK链接库来实现高性能转发。由于调用了DPDK链接的程序其内存管理由DPDK托管,但是如果虚拟交换程序出现内存污染问题,由于使用了DPDK大页内存,正常情况下的由于asan是检测标准的glibc函数,导致DPDK场景无法通过ASAN来检测出内存问题。
发明内容
针对现有技术的以上缺陷或改进需求,本发明提供了一种云平台中检测DPDK应用程序内存越界访问的方法,其通过在DPDK链接库的内存访问指令中插入检测代码,通过截获DPDK初始化函数获取初始化的内存虚拟地址范围,利用ASAN的影子内存区标记所述内存虚拟地址范围;运行内存访问指令时,通过上述检测代码标记检测内存是否标记于ASAN的影子内存区,从而解决DPDK应用场景下无法通过ASAN来检测出内存问题。
为实现上述目的,按照本发明的一个方面,提供了一种云平台中检测DPDK应用程序内存越界访问的方法,包括如下步骤:
在DPDK链接库的内存访问指令中插入检测代码,以实现访问内存前核实该内存状态是否可访问;
虚拟机调用DPDK链接库对目标应用程序进行初始化时,通过截获DPDK初始化函数获取初始化的内存虚拟地址范围,利用ASAN的影子内存区标记所述内存虚拟地址范围;
运行内存访问指令时,通过上述检测代码标记检测内存是否标记于ASAN的影子内存区,内存已标记时不可访问。
作为本发明的进一步改进,在DPDK链接库的内存访问指令中插入检测代码具体为:
在目标应用程序的代码编译阶段利用编译器中间语言对ASAN PASS进行优化。
作为本发明的进一步改进,对ASAN PASS进行优化的具体优化方式为:
针对所述目标应用程序进行多种等价交换以生成占用存储空间更小的目标代码。
作为本发明的进一步改进,“通过截获DPDK初始化函数获取初始化的内存虚拟地址范围,利用ASAN的影子内存区标记该内存虚拟地址范围”具体为:
通过ASAN截获DPDK初始化函数rte_eal_init,以获取初始化的内存虚拟地址范围,通过ASAN的影子内存区将内存虚拟地址范围标记为poison。
作为本发明的进一步改进,通过截获DPDK内存管理库函数,对目标应用程序分配的内存去除在ASAN的影子内存区标记。
作为本发明的进一步改进,对目标应用程序分配后又释放的内存在ASAN的影子内存区标记。
为实现上述目的,按照本发明的另一个方面,提供了一种终端设备,包括至少一个处理单元、以及至少一个存储单元,其中,存储单元存储有计算机程序,当程序被处理单元执行时,使得处理单元执行上述方法的步骤。
一种计算机可读介质,其存储有可由终端设备执行的计算机程序,当程序在终端设备上运行时,使得终端设备执行上述方法的步骤。
总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有以下有益效果:
本发明的一种云平台中检测DPDK应用程序内存越界访问的方法,其通过在DPDK链接库的内存访问指令中插入检测代码,通过截获DPDK初始化函数获取初始化的内存虚拟地址范围,利用ASAN的影子内存区标记所述内存虚拟地址范围;运行内存访问指令时,通过上述检测代码标记检测内存是否标记于ASAN的影子内存区,通过ASAN插桩来截获DPDK初始化内存大页的rte_eal_init函数,来获取分配的内存块。将上述ASAN生成的的libasan.so库中增加DPDK中特有的函数rte_malloc/rte_free等堆操作函数,当截获这些函数之后,运行在调用了DPDK的程序运行时调用这些函数出现内存污染的情况,就会发出错误报告,从而解决DPDK应用场景下无法通过ASAN来检测出内存问题。
附图说明
图1是本发明实施例的一种云平台中检测DPDK应用程序内存越界访问的方法的示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。下面结合具体实施方式对本发明进一步详细说明。
DPDK:Data Plane Development Kit,数据平面开发套件。主要基于Linux系统运行,用于快速数据包处理的函数库与驱动集合,可以极大提高数据处理性能和吞吐量,提高数据平面应用程序的工作效率。
GCC:GNU Compiler Collection,GNU编译器套件。由GNU开发的编程语言译器。GNU编译器套件包括C、C++、Objective-C、Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等)。
ASAN:AddressSanitizer,是Google用于检测内存各种buffer overflow(Heapbuffer overflow,Stack buffer overflow,Global buffer overflow)的一个非常有用的工具。
LLVM:构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
IR:编译器中间语言。
图1是本发明实施例的一种云平台中检测DPDK应用程序内存越界访问的方法的示意图。如图1所示,一种云平台中检测DPDK应用程序内存越界访问的方法,其包括如下步骤:
在DPDK链接库的内存访问指令中插入检测代码,以实现访问内存前核实该内存状态是否可访问;
作为一个优选的实施例,在DPDK链接库的内存访问指令中插入检测代码具体为:可在目标应用程序的代码编译阶段(即将目标应用程序转换为可执行文件的过程),利用编译器中间语言(IR)对ASAN PASS进行优化,作为一个示例,具体优化方式为,针对目标应用程序进行多种等价交换以生成占用存储空间更小的目标代码,从而使得目标代码占用空间更小,运行时间更短。作为一个示例,该方案可在LLVM或GCC构架中实现。
虚拟机调用DPDK链接库对目标应用程序进行初始化时,通过截获DPDK初始化函数获取初始化的内存虚拟地址范围,利用ASAN的影子内存区标记该内存虚拟地址范围;ASAN通过影子映射来记录内存状态,追踪受限的内存,验证其合法性。它在进程相应的内存区域固定保存了一个“影子内存区”,影子区通过记录每个字节的状态,可以知道哪些字节被破坏了。影子映射是通过一个简单的规则,即正常内存块每八个字节映射到影子内存的一个字节,那么这个字节就可以追踪八个字节的状态。ASAN在编译或运行时程序插入额外的代码来检查内存的读写操作,一旦发现内存污染就抛出错误,并发送错误报告。
作为一个优选的实施例,DPDK的场景下,在插桩的时候,通过ASAN增加DPDK的初始化函数rte_eal_init的插桩,以检测这个程序中调用这个函数时候的内存状态,可通过Asan截获DPDK初始化函数rte_eal_init,以获取初始化的内存虚拟地址范围,通过ASAN的影子内存区将该内存虚拟地址范围标记为poison。rte_eal_init是调用DPDK库的一个初始化函数,里面包含了大页内存的初始地址,通过这个挂载大页路径,以及mmap来生成目标程序的堆栈地址。通过截获该函数可以获取初始化的大页内存虚拟地址范围,然后标记poison该段地址。
作为进一步的优选,目标应用程序运行时,通过截获DPDK内存管理库函数,对该目标应用程序分配的内存去除在ASAN的影子内存区标记;进一步地,对该目标应用程序分配后又释放的内存在ASAN的影子内存区标记;具体地,在程序运行的时候,通过Asan的libasan.so库增加DPDK只有的库来截获DPDK内存管理库函数rte_malloc_socket,rte_free等,并unpoison分配的内存和posion释放的内存,使得Asan可以监控调用DPDK链接库的程序。
运行内存访问指令时,通过上述检测代码标记检测内存是否标记于ASAN的影子内存区,内存已标记时不可访问。具体地,在目标应用程序运行内存访问指令时候,根据内存访问指令中插桩的指令,在进行访问内存写的时候,由于内存污染该段内存已被使用(shadow内存)不可访问,这时候如果进行访问,那么程序报错并退出,提示具体出错信息。
ASAN主要包括两部分:插桩(Instrumentation)和动态运行库(Run-timelibrary)。Asan的内存检测原理之一是在编译时插桩,在编译时候回插入检测代码,以检测每个内存访问的影子状态,ASAN会在局部数组、局部变量、全局变量前后填充特定字段,然后再程序运行过程中,ASAN会对这些特定字段进行检查,确定是否发生越界。为了检测对全局和栈对象的超出访问,ASAN必须在这些对象周围创建毒性区域(redzone)。Asan的内存检测原理之二是运行时库,ASAN工具提供了一个运行库,它存在于libasan.so动态库中,运行时,会对GLIBC的29个函数进行替换一遍检测内存错误。在应用启动时预加载该动态库,替换libc.so标准库,重新实现了malloc/free,memcpy/memset和相关函数增加越界判断。如果发现了操作长度超过了申请内存的范围就会立即进行错误报告。运行时库的主要目的就是管理影子内存。在应用程序启动时候,映射整个阴影区域,以便程序的其他部分不能使用它,影子内存被bad段保护。在动态运行库中,DPDK未使用标准的libc.so库,而是使用了本身自带的rte_malloc以及rte_free等库函数,所以ASAN无法使用在dpdk的场景下的程序。通过ASAN插桩来截获DPDK初始化内存大页的rte_eal_init函数,来获取分配的内存块。将上述ASAN生成的的libasan.so库中增加DPDK中特有的函数rte_malloc/rte_free等堆操作函数。所以当截获这些函数之后,当运行在调用了DPDK的程序运行时调用这些函数出现内存污染的情况,就会发出错误报告。
一种终端设备,包括至少一个处理单元、以及至少一个存储单元,其中,存储单元存储有计算机程序,当程序被处理单元执行时,使得处理单元执行上述方法的步骤。
一种计算机可读介质,其存储有可由终端设备执行的计算机程序,当程序在终端设备上运行时,使得终端设备执行上述方法的步骤。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

Claims (8)

1.一种云平台中检测DPDK应用程序内存越界访问的方法,其特征在于,包括如下步骤:
在DPDK链接库的内存访问指令中插入检测代码,以实现访问内存前核实该内存状态是否可访问;
对ASAN增加DPDK初始化函数的插桩,虚拟机调用DPDK链接库对目标应用程序进行初始化时,通过截获DPDK初始化函数获取初始化的内存虚拟地址范围,利用ASAN的影子内存区标记所述内存虚拟地址范围;
在ASAN生成的libasan.so库中增加DPDK中特有的内存管理库函数,目标应用程序运行时,通过截获所述内存管理库函数管理ASAN的影子内存区;
运行内存访问指令时,通过上述检测代码标记检测内存是否标记于ASAN的影子内存区,内存已标记时不可访问。
2.根据权利要求1所述的一种云平台中检测DPDK应用程序内存越界访问的方法,其特征在于,在DPDK链接库的内存访问指令中插入检测代码具体为:
在目标应用程序的代码编译阶段利用编译器中间语言对ASAN PASS进行优化。
3.根据权利要求2所述的一种云平台中检测DPDK应用程序内存越界访问的方法,其特征在于,对ASAN PASS进行优化的具体优化方式为:
针对所述目标应用程序进行多种等价交换以生成占用存储空间更小的目标代码。
4.根据权利要求1所述的一种云平台中检测DPDK应用程序内存越界访问的方法,其特征在于,所述“通过截获DPDK初始化函数获取初始化的内存虚拟地址范围,利用ASAN的影子内存区标记该内存虚拟地址范围”具体为:
通过ASAN截获DPDK初始化函数rte_eal_init,以获取初始化的内存虚拟地址范围,通过ASAN的影子内存区将内存虚拟地址范围标记为poison。
5.根据权利要求1-4中任一项所述的一种云平台中检测DPDK应用程序内存越界访问的方法,其特征在于,通过截获DPDK内存管理库函数,对所述目标应用程序分配的内存去除在ASAN的影子内存区标记。
6.根据权利要求5所述的一种云平台中检测DPDK应用程序内存越界访问的方法,其特征在于,对所述目标应用程序分配后又释放的内存在ASAN的影子内存区标记。
7.一种终端设备,其特征在于,包括至少一个处理单元、以及至少一个存储单元,其中,所述存储单元存储有计算机程序,当所述程序被所述处理单元执行时,使得所述处理单元执行权利要求1~6任一权利要求所述方法的步骤。
8.一种计算机可读介质,其特征在于,其存储有可由终端设备执行的计算机程序,当所述程序在终端设备上运行时,使得所述终端设备执行权利要求1~6任一权利要求所述方法的步骤。
CN201911267320.2A 2019-12-11 2019-12-11 一种云平台中检测dpdk应用程序内存越界访问的方法 Active CN111143199B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911267320.2A CN111143199B (zh) 2019-12-11 2019-12-11 一种云平台中检测dpdk应用程序内存越界访问的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911267320.2A CN111143199B (zh) 2019-12-11 2019-12-11 一种云平台中检测dpdk应用程序内存越界访问的方法

Publications (2)

Publication Number Publication Date
CN111143199A CN111143199A (zh) 2020-05-12
CN111143199B true CN111143199B (zh) 2022-08-05

Family

ID=70518467

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911267320.2A Active CN111143199B (zh) 2019-12-11 2019-12-11 一种云平台中检测dpdk应用程序内存越界访问的方法

Country Status (1)

Country Link
CN (1) CN111143199B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112231101B (zh) * 2020-10-16 2024-03-01 北京中科网威信息技术有限公司 内存分配方法、装置及可读存储介质
CN112487438B (zh) * 2020-12-12 2022-11-04 南京理工大学 基于标识符一致性的堆对象Use-After-Free漏洞检测方法

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2015121750A1 (en) * 2014-02-14 2015-08-20 6Wind System and method for data communication between virtual interfaces
CN108062269A (zh) * 2017-12-05 2018-05-22 上海交通大学 一种基于dpdk的计算资源弹性伸缩方法及系统
CN110489291A (zh) * 2019-08-13 2019-11-22 晶晨半导体(上海)股份有限公司 一种内存检测工具的实现方法

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10360117B2 (en) * 2016-06-20 2019-07-23 Stratus Technologies Bermuda Ltd. Method and apparatus for performing checkpointing on a network device
JP6693308B2 (ja) * 2016-07-05 2020-05-13 富士通株式会社 負荷推定プログラム、負荷推定方法及び負荷推定装置
CN108810181A (zh) * 2017-05-03 2018-11-13 普天信息技术有限公司 一种基于Intel DPDK的地址转换方法
US11151018B2 (en) * 2018-04-13 2021-10-19 Baidu Usa Llc Method and apparatus for testing a code file
CN108984427B (zh) * 2018-07-12 2020-07-07 北京中科网威信息技术有限公司 一种基于申威架构的设备中内存的处理方法及装置

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2015121750A1 (en) * 2014-02-14 2015-08-20 6Wind System and method for data communication between virtual interfaces
CN108062269A (zh) * 2017-12-05 2018-05-22 上海交通大学 一种基于dpdk的计算资源弹性伸缩方法及系统
CN110489291A (zh) * 2019-08-13 2019-11-22 晶晨半导体(上海)股份有限公司 一种内存检测工具的实现方法

Also Published As

Publication number Publication date
CN111143199A (zh) 2020-05-12

Similar Documents

Publication Publication Date Title
US11157640B2 (en) Protecting sensitive data in software products and in generating core dumps
US10698668B1 (en) Custom code transformations during compilation process
US8799879B2 (en) Method and apparatus for protecting translated code in a virtual machine
Bruening et al. Practical memory checking with Dr. Memory
US5911073A (en) Method and apparatus for dynamic process monitoring through an ancillary control code system
EP1870829A1 (en) Securing software by enforcing data flow integrity
US20070244942A1 (en) Using dynamic analysis to improve model checking
CN112631893B (zh) 面向异构平台的多层次存储结构内存检测方法
Fioraldi et al. Fuzzing binaries for memory safety errors with QASan
US11507362B1 (en) System and method for generating a binary patch file for live patching of an application
US20060277371A1 (en) System and method to instrument references to shared memory
CN111143199B (zh) 一种云平台中检测dpdk应用程序内存越界访问的方法
US8997066B2 (en) Emulating pointers
US9424004B2 (en) Execution guards in dynamic programming
US7028293B2 (en) Constant return optimization transforming indirect calls to data fetches
US20140245260A1 (en) Distributed implementation of sequential code that includes a future
CN111736846B (zh) 一种面向动态分析的源代码插桩改进方法
US20210141907A1 (en) Method and device for patching vulnerability of binary
US10229046B2 (en) Memory categorization
Isemann et al. Don’t look UB: Exposing sanitizer-eliding compiler optimizations
US11055202B1 (en) Compilation scheme for tagged global variables
CN114065208A (zh) 一种面向堆内存错误的检测方法及装置
CN109947407B (zh) 一种数据获取方法及装置
Lu Securing software systems by preventing information leaks.
US11704101B2 (en) Function-level redundancy detection and optimization

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