简单的活着

POMP

Posted on By Mista Cai

POMP: Postmortem Program Analysis with Hardware-Enhanced Post-Crash Artifacts

摘要

论文利用Intel PT技术重构指令流序列,这是感兴趣的地方。

简介

相比record-and-reply, core dump analysis 不需要二进制插桩,不需要记录程序执行状态,是轻量级技术。但是core dump analysis只能分析部分控制流和数据流,所以利用硬件特性PT技术恢复指令序列。

PT可以追踪执行指令,并将其存储在环形区域中。程序崩掉的时候,OS会将追踪信息包含在core dump中。由于同时拥有进程内存状态和执行历史,可以完全重建控制流。

dump文件中有大量指令,定位crash需要大量手工作业,耗时。

POMP以程序崩溃时的artifacts为输入进行分析,不用担心控制流被劫持以及静态分析的不稳定性。

设计

我们依靠英特尔PT来跟踪程序的控制流程并将其集成到崩溃后的工件中。

PT是最近的英特尔处理器(例如,Skylake系列)中的低开销硬件功能。

它的工作原理是捕获每个硬件线程上有关软件执行的信息。 捕获的信息存储在不同类型的数据包中。 关于程序流的数据包编码控制流的传输(例如,间接分支的目标和有条件直接分支的采用/不采用标识)。 通过控制流传输和程序二进制文件,可以完全重建执行指令的跟踪。 我们配置和使用PT的详细信息见第5节。

实现

为了使英特尔PT能够以正确可靠的方式记录执行,我们按如下方式实现了第二个子系统。

我们使Intel PT能够在物理地址表(ToPA)模式下运行,这允许我们将PT数据包存储在多个不连续的物理存储区中。我们在ToPA中添加了一个指向16 MB物理内存缓冲区的条目。在我们的实现中,我们使用此缓冲区来存储数据包。为了能够跟踪缓冲区是否被完全占用,我们清除END位并设置INT位。通过此设置,Intel PT可以在缓冲区完全占用时发出性能监视中断信号。考虑到中断可能有一个打滑(skid),导致PT数据包可能丢失,我们进一步分配了一个2 MB的物理内存缓冲区来保存那些可能被丢弃的数据包。在ToPA中,我们引入了一个额外的条目来引用此缓冲区。

在硬件级别,Intel PT缺乏区分每个进程内线程的能力。结果,我们也拦截了上下文切换(我理解是,线程切换)。有了这个,我们的系统能够检查切换进出的线程,并单独存储线程的PT数据包。具体而言,对于软件开发人员和安全分析师感兴趣的每个线程,我们在其用户空间中分配了32MB循环缓冲区。每次切换线程时,我们都会将存储在上述物理内存缓冲区中的PT数据包迁移到用户空间中相应的循环缓冲区。迁移后,我们还会重置相应的寄存器,并确保物理内存缓冲区可用于保存其他感兴趣的线程的数据包。请注意,我们的经验实验表明,前面提到的16 MB缓存不会在连续的上下文切换间完全占用,而POMP在上下文切换间保存所有数据包并没有难度。