基于SM3的Android文件完整性检测系统
2019-06-27杨中皇何便便
杨中皇, 何便便
(1. 高雄师范大学 软件工程与管理学系,台湾 高雄 824442;2.西安邮电大学 无线网络安全技术国家工程实验室, 陕西 西安 710121)
Android是一种基于Linux平台开放源代码的操作系统,其开源性给Android平台带来了各种各样的风险,如黑客通过攻击智能手机应用软件提取用户信息等[1]。根据安全公司G Date2017年调查数据显示[2],市场已经出现了350万全新的 Android 恶意软件,比上一年增长了约7.6%。恶意软件在攻击Android系统时会修改系统配置文件,以便再次进入运行时不被发现,从而盗取敏感信息进行非法交易。
目前,采用MD5哈希算法可检测文件数据的完整性,在保证文件完整性的条件下,再进行内存数据完整性检测,最终获得数据完整性结果[3];基于模糊哈希的Android变种恶意软件检测方法[4]根据Apk中字符串以及函数长度分布特征,生成模糊哈希值,使得同类变种的恶意软件间的哈希值相似。但是,上述两种检测都从软件层面实现检测,未从Android系统底层源码层面实现检测功能,而对系统内核层实现文件完整性检测比较安全且容易检测。
本文拟设计一种基于SM3的Android文件完整性检测系统,通过修改Android开放源代码项目,实现对设备的文件完整性检测。利用SM3密码杂凑算法[5]计算文件哈希值,将其存储在内存文件中。对文件进行完整性检测时,再次对文件进行SM3密码杂凑算法计算,生成新的哈希值,将其与存储的哈希值进行对比,检测文件是否完整,以此发现入侵行为。
1 文件完整性检测
文件完整性检测[6]是指对于一个没有被攻击数据信息完好的系统,选取系统中的关键文件,采用哈希算法对关键文件进行计算,生成哈希值并保存。检测时对比关键文件重新生成的哈希值与保存的哈希值,如果不相同,说明该关键文件被篡改,文件完整性被破环。
2 SM3密码杂凑算法
SM3密码杂凑算法采用分组和迭代的方式,将消息经过填充、扩展和迭代压缩,最终生成256比特的固定长度哈希值[7]。
2.1 消息填充
对于长度为l的消息m,将比特“1”添加到消息的末尾,再添加k个“0”,k是满足
l+1+k=448 mod 512
的最小非负整数,最后再添加一个64位比特串,由长度l的二进制表示。填充后的消息m′的比特长度为512的倍数,将消息m′按512比特分组[7],即
m′=M0M1…Mn-1,
其中n=(l+k+65)/512。
2.2 消息扩展
分组消息Mi扩展生成W0,W1,…,W67,W′0,…,W′63等132个字的具体步骤如下,其中1个字表示32位的比特串。
步骤1将Mi按32比特划分为16个字W0,W1,…,W15。
步骤2在W0,W1,…,W15的基础上,扩展Mi。根据前52个字的生成表达式[8]
Wj=P1[Wj-16⨁Wj-9⨁(Wj-5<<<15)]⨁(Wj-13<<<7)⨁Wj-6(16≤j≤67),
计算得出W16,W17,…,W67。
步骤3根据后64个字的生成表达式[8]
W′j=Wj⨁Wj+4, 0≤j≤63,
计算得出W′0,W′1,…,W′63。
将每个分组消息按照上述步骤扩展为132个字,用于压缩函数的计算。
2.3 消息压缩与迭代
令A、B、C、D、E、F、G和H均为32位寄存器;S1,S2,T1和T2为中间变量,分别表示为
S1=[(A<<<12)+E+(Tj<< 利用压缩函数 V(i+1)=L(V(i),Mi), 0≤i≤n-1, 分别计算寄存器A、B、C、D、E、F、G和H的值。 1)分别将V(i)值赋给寄存器A、B、C、D、E、F、G和H。先将初始值V(0)赋给寄存器,则寄存器的初始化值可表示为 A=7380166f,B=4914b2b9, 2)计算新一轮寄存器的值。寄存器D的值是上一轮寄存器C的值;寄存器C的值是将上一轮寄存器B的值循环左移9比特;寄存器B的值是上一轮寄存器A的值;寄存器A的值是中间变量T1赋的值;寄存器H的值是上一轮寄存器G的值;寄存器G值是将上一轮寄存器F的值循环左移19比特;寄存器F的值是上一轮寄存器E的值;寄存器E的值由置换函数[8] P0(X)=X⨁(X<<<9)⨁(X<<<17),0≤j≤63,X=T2。 计算得出。将A、B、C、D、E、F、G和H寄存器新一轮的值,用于迭代运算。 3)将新一轮A、B、C、D、E、F、G和H寄存器的值与V(i)进行异或运算得出的值赋给V(i+1),进行迭代运算。 当消息的每个512分组处理完成后,最后一个分组的输出就是消息的哈希值,即 ABCDEFGH←V(n), 哈希值 y=ABCDEFGH。 基于SM3的Android文件完整性检测系统主要由创建内存文件、计算文件SM3值、检测、上报文件及更新等5个部分组成。模型如图1所示。 图1 Android文件完整性检测模型 在内存中创建一个文件,选择需要检测的文件,使用SM3密码杂凑算法,计算得出文件哈希值并自动保存在内存文件中。对文件进行检测时,需要重新对选择的文件进行SM3计算,将重新生成的哈希值与保存的哈希值进行对比,若不同,则系统会进行提示。第一次检测时会生成一个上报文件,里面记录完整性被破坏的文件信息,即文件存储位置及文件名。检测完成后,更新内存文件哈希值,以免影响下一次检测。 创建的内存文件位于Android的内部存储中,其他应用无法访问这些数据。所以,将文件哈希值存储内存文件中,安全性增加。 文件完整性检测系统在Ubuntu平台上使用Android Studio开发环境开发应用程序,利用Android开放源代码项目(Android Open Source Project,AOSP)平台[9-10],在Android 9.0源代码基础上添加文件完整性检测应用程序,将该应用改为系统应用,并编译Android 9.0源代码。 3.2.1 AOSP下载及编译 1)下载源码 考虑到Android官方网站国内网站无法直接访问,系统使用清华镜像网站下载repo工具获取Android 9源码的具体步骤如下。 步骤1在清华镜像网站下载repo工具并赋予其权限。将repo工具内的REPO_URL地址改为清华镜像源地址[11]http://mirrors.tuna.tsinghua.edu.cn/git/git-repo/。 步骤2建立工作目录“Android_9”,仓库初始化命令后,出现Android源码版本信息。 步骤3选择需要的Android版本,并进行同步源码树。当源码同步结束后,工作目录里就是源码文件。 2)编译Android 9.0源码 编译Android 9.0源码时,需要在Ubuntu平台配置编译环境,如安装OpenJDK8软件和Android官方网站提供的依赖包[12-14]。具体编译源码步骤如下。 步骤1配置好编译环境后,执行#source build/envsetup.sh命令编译源码文件。 步骤2执行lunch选择需要编译设备的对应编号,Pixel2手机是46。 步骤3设备对应编号选择完后,使用make命令即源码开始编译。 3.2.2 刷机 源码编译成功后在源码目录下会有/out目录,此目录下有系统镜像文件,可以将这些镜像文件“刷入”设备中。 刷机时需要打开“开发者选项”中的设备“USB调试”,将设备数据线连接计算机后,执行以下操作。 1)设备处于Bootloader模式,使用命令#fastboot oem unlock对Bootloader进行解锁。 2)解锁后使用命令#fastboot flashall -w将编译好的镜像文件一起刷入设备。 3.2.3 系统应用的实现 文件检测应用开发完成后,需要将应用置于Android源码中再次编译出新的镜像文件,在刷机之后,文件检测应用将成为系统应用,具体方法如下。 1)将“FileDetection” 代码加入到Android_9/packages/apps中。 2)在FileDetection代码的根目录下,新建Android.mk文件,内容为 LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS:=user LOCAL_SRC_FILES:= $(call all-java-files-under,src)/ LOCAL_PACKAGE_NAME:= FileDetectioninclude $(BUILD_PACKAGE) 3)在Android_9/build/target/product目录中,修改core.mk、min_dev.mk和sdk.mk文件,将工具代码加入其中。 4)进入Android源码根目录,重新编译源码,最后使用“make snod”命令,重新编译系统镜像。编译完成后重新刷机,文件完整性检测应用成为系统应用程序。 系统功能测试环境由Android 9.0系统和Pixel2设备组成。Android 9.0系统内置文件完整性检测应用程序,在Pixel2设备中运行并测试。 系统应用程序使用SM3密码杂凑算法对初次登陆密钥进行哈希运算并保存,再一次登陆时,将输入密钥进行SM3计算,生成的哈希值和初始登陆保存的哈希值进行对比,如果哈希值一致,则登陆成功。进入系统主界面,进行创建文件、文件选择、检测和更新等4个功能。选取名为aaa、bbb、ccc、ddd和eee 等5个文件对系统功能进行测试。 1)创建文件 在Android设备内存中,创建名为Hash的内存文件,具体操作如图2所示。 图2 创建文件 2)文件选择 通过“文件选择”按钮进入文件管理器,选取5个测试文件进行SM3计算,生成的哈希值自动保存在Hash文件中。具体实现的界面分别如图3和图4所示,生成的哈希值如表1所示。 图3 选取测试文件 图4 SM3计算 表1 文件的哈希值 3)检测 对5个文件进行删除、修改和增添,通过修改文件内容进行文件完整性检测。重新对5个文件进行SM3计算,生成新的哈希值如表2所示。检测时,将新的哈希值和保存在Hash文件中哈希值进行比较。系统第一次进行检测,生成上报文件,如图5所示,再将比较结果记录上报文件中,上报文件内容如图6所示。 表2 文件的新哈希值 图5 生成的上报文件 图6 上报文件内容 4)更新 检测完成后,将内存中的哈希值进行更新,以便下次检测时不再报告上次检测结果。 综上系统功能测试结果,应用程序中的创建文件、文件选择、检测和更新的功能都可实现并使用。从表1和表2可以看出,哈希值发生变化的文件有aaa、bbb、ccc、ddd和eee,上报文件记录结果也是aaa、bbb、ccc、 ddd和eee,表明系统应用在Android系统上运行良好且功能均可实现。 基于SM3的文件完成性检测系统在Android Studio环境下使用C语言开发。服务器使用Ubuntu操作系统,修改和编译Android 9.0源码,将应用改为系统应用。在Pixel2设备上对系统应用进行功能测试和效能测试。 设备CPU的频率随着功耗时刻变化,将会对测试结果造成影响,因此在测试前,尽可能清除设备中的应用进程并关闭WiFi和蓝牙服务等设置[15]。测试环境如表3所示。 表3 测试环境 Pixel2设备为高通骁龙835处理器、4 G 运行内存和128 GB内置存储。 基于SM3的文件完整性检测系统在Android 9.0系统上运行,使用Pixel 2手机的测试结果为系统每秒可以计算43.73 MB的文件,即C语言实现的SM3算法对文件Hash计算的速率为43.73 M/s。在相同环境下,使用Java语言实现的SM3算法对文件Hash计算的速率为5.89 M/s,即每秒可计算大小为5.89 MB的文件。 从测试结果中可以得出,使用C语言实现的SM3算法对文件Hash计算速率高于Java语言实现的速率。因此,文件完整性检测系统使用C语言实现比较高效,可以提高文件检测速率。 基于SM3的Android文件完整性检测系统,利用SM3密码杂凑算法计算文件的哈希值并保存,通过对比保存的哈希值和新生成的哈希值,判断文件的完整性。通过修改Android开放源代码项目,从Android系统内核进行文件完整性检测。测试结果表明,该系统应用内置Android 9.0系统上运行良好,文件完整性检测功能可实现,使用C语言实现的SM3算法对文件Hash计算的速率优于Java语言。
C=172442d7,D=da8a0600,
E=a96f30bc,F=163138aa,
G=e38dee4d,H=b0fb0e4e。2.4 输出
3 系统设计与实现
3.1 系统设计
3.2 系统应用实现
4 系统功能测试
5 系统性能测试及分析
5.1 测试环境
5.2 测试结果
6 结语