Page 334 - 《软件学报》2021年第10期
P. 334

3306                                 Journal of Software  软件学报 Vol.32, No.10, October 2021

                 EXIT 损耗,且在获取所需进程偏移量后会还原修改使其不再陷入,故此后 TVM 的运行与未部署 VMOffset 无异.
                 由实验结果可知:VMOffset 仅对 TVM 的启动阶段引入 0.05%之内的时间损耗,对其运行阶段无明显影响.
                    除了评估 VMOffset 对 TVM 启动阶段及运行阶段的性能影响,本节还测试了 VMOffset 重构 TVM 进程视
                 图及对 TVM 中进程代码段进行完整性度量的效率.其中,图 12 展示了不同 VMI 方法重构 TVM 中进程视图所
                 用时间的结果,表 4 则为 VMOffset 对 TVM 中不同进程代码段度量 10 次所用时间的均值.














                                             Fig.12    Process view reconstruction time
                                                  图 12   进程视图重构时间

                                   Table 4    Time for VMOffset measuring the process code segment
                                             表 4   VMOffset 度量进程代码段时间

                               进程名称         进程 pid       进程位置         代码段页数         度量时间/s
                                 init          1            2            46           1.64
                                getty         768           53            6           1.89
                                sshd          455           36           128          2.21
                              bluetoothd      505           41           210          3.28
                                 sh          1 489          93           24           3.52
                                xorg          869           63           498          10.10
                    图 12 中,VMOffset+Libvmi 为修改 Libvmi 使其直接使用 VMOffset 所得进程偏移量进行视图重构,第 2 列
                 的 Libvmi 则为初始通过读取配置文件中的进程偏移量以重构 TVM 进程视图.实验时,TVM 进程链表中共有 97
                 个进程.由图可知:VMOffset+Libvmi 重构进程视图所用时间为 2.48s,Libvmi 为 2.92s.可见:前者无需手动配置进
                 程偏移量,且重构进程链表所用时间相比原始 Libvmi 要少,效率更高.图 12 还列出了两种具有代表性的 VMI 方
                 法的进程视图重构时间,其中,HyperLink          [27] 基于内存搜索完成语义重构,其重构进程链表需 1 分钟左右;
                 ModSG [28] 则通过在后端离线解析不同版本内核结构生成语义静态库,前端模块基于语义静态库完成视图的重
                 构.ModSG 生成 Ubuntu12.04 操作系统对应的语义静态库所用时间约为 110s,当 TVM 中进程数量为 100 个时,
                 其前端重构时间约为 0.1s,因此,其重构进程视图时间为 110.1s.对比可知,VMOffset 重构 TVM 中进程视图的效
                 率是较高的.
                    表 4 中,进程位置用于说明待度量进程为 TVM 进程链表中的第几个进程,代码段页数为待度量进程代码段
                 总页数.进程代码段的度量需首先遍历进程链表判断待度量进程是否存在,此后获取代码段各页内容进行度量,
                 因此其效率与进程位置及代码段页数两者相关.由表 4 可知:所度量进程在链表中的位置越靠后,以及代码段页
                 数越大,所需度量时间也越长.多数进程的度量时间在 3.5s 之内,但当进程所处位置较后,且代码段页数较大时,
                 其度量时间也会相应增加,如 Xorg 进程度量所用时间为 10s 左右.因代码段的重构与度量均在 TVM 外部实现,
                 对 TVM 本身不会产生影响,结合需要进行的哈希运算与地址翻译的次数来看,这样的时间效率是可以接受的.
                    为了进一步评估 VMOffset 的有效性,本节将 VMOffset 与现有部分 VMI 方法进行了对比,见表 5.
                    表 5 中,VMwatcher 的自省过程依赖内核源码,Virtuoso 及 VMST 需引入与 TVM 环境一致的 SVM,Volatility,
                 Libvmi 及 vDetector 需在 TVM 中加载内核模块获取进程偏移量,ModSG 需在后端离线解析不同版本内核结构
                 生成语义静态库.上述方法对于不同内核版本的 TVM,均需要重新修改、配置或解析.其中,HyperLink 的实现对
   329   330   331   332   333   334   335   336   337   338   339