基于SM3的Android文件完整性检测系统

2019-06-27 04:21杨中皇何便便
西安邮电大学学报 2019年6期
关键词:源码哈希寄存器

杨中皇, 何便便

(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,
C=172442d7,D=da8a0600,
E=a96f30bc,F=163138aa,
G=e38dee4d,H=b0fb0e4e。

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),进行迭代运算。

2.4 输出

当消息的每个512分组处理完成后,最后一个分组的输出就是消息的哈希值,即

ABCDEFGH←V(n),

哈希值

y=ABCDEFGH。

3 系统设计与实现

3.1 系统设计

基于SM3的Android文件完整性检测系统主要由创建内存文件、计算文件SM3值、检测、上报文件及更新等5个部分组成。模型如图1所示。

图1 Android文件完整性检测模型

在内存中创建一个文件,选择需要检测的文件,使用SM3密码杂凑算法,计算得出文件哈希值并自动保存在内存文件中。对文件进行检测时,需要重新对选择的文件进行SM3计算,将重新生成的哈希值与保存的哈希值进行对比,若不同,则系统会进行提示。第一次检测时会生成一个上报文件,里面记录完整性被破坏的文件信息,即文件存储位置及文件名。检测完成后,更新内存文件哈希值,以免影响下一次检测。

创建的内存文件位于Android的内部存储中,其他应用无法访问这些数据。所以,将文件哈希值存储内存文件中,安全性增加。

3.2 系统应用实现

文件完整性检测系统在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”命令,重新编译系统镜像。编译完成后重新刷机,文件完整性检测应用成为系统应用程序。

4 系统功能测试

系统功能测试环境由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系统上运行良好且功能均可实现。

5 系统性能测试及分析

基于SM3的文件完成性检测系统在Android Studio环境下使用C语言开发。服务器使用Ubuntu操作系统,修改和编译Android 9.0源码,将应用改为系统应用。在Pixel2设备上对系统应用进行功能测试和效能测试。

5.1 测试环境

设备CPU的频率随着功耗时刻变化,将会对测试结果造成影响,因此在测试前,尽可能清除设备中的应用进程并关闭WiFi和蓝牙服务等设置[15]。测试环境如表3所示。

表3 测试环境

Pixel2设备为高通骁龙835处理器、4 G 运行内存和128 GB内置存储。

5.2 测试结果

基于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语言实现比较高效,可以提高文件检测速率。

6 结语

基于SM3的Android文件完整性检测系统,利用SM3密码杂凑算法计算文件的哈希值并保存,通过对比保存的哈希值和新生成的哈希值,判断文件的完整性。通过修改Android开放源代码项目,从Android系统内核进行文件完整性检测。测试结果表明,该系统应用内置Android 9.0系统上运行良好,文件完整性检测功能可实现,使用C语言实现的SM3算法对文件Hash计算的速率优于Java语言。

猜你喜欢
源码哈希寄存器
面向数据可靠传输的高译码率带反馈的LT码
STM32和51单片机寄存器映射原理异同分析
基于特征选择的局部敏感哈希位选择算法
国内一站式工程设备租赁平台众能联合完成C2、C3两轮融资
哈希值处理 功能全面更易用
浅谈开源操作系统的历史
文件哈希值处理一条龙
企业如何保护源码
Lite寄存器模型的设计与实现
移位寄存器及算术运算应用