刘建华, 郑晓坤, 郑 东, 杨中皇, 4
(1. 西安邮电大学 信息中心, 陕西 西安 710121; 2. 西安邮电大学 计算机学院, 陕西 西安 710121;3. 西安邮电大学 无线网络安全技术国家工程实验室, 陕西 西安 710121;4. 高雄师范大学 软件工程与管理学系, 台湾 高雄 82444)
随着移动终端的迅速发展,利用手机、平板电脑等设备进行移动办公逐渐成为企业日常办公的趋势。据Newzoo2018年全球移动市场报告[1],智能手机用户将达到33亿,使用移动办公的人员还在持续增加。Android操作系统具有开源性和可定制性,且兼容性强,已成为最受欢迎的操作系统之一。但是,仍有不少恶意的开发者利用Android操作系统的漏洞,获取用户隐私数据[2-3]、暴露用户位置及相关信息,将恶意代码植入到应用程序中,导致企业用户遭受到威胁和伤害[4-5]。因此,为了提高移动办公的安全性,并完善移动设备管控的功能,开发合理的移动设备管控系统(mobile device management,MDM)[6]尤为重要。
目前,已有的Android移动设备管控方法[7],可对相机、蓝牙、WiFi和恶意应用等功能全面管控,通过调用Android系统提供的应用程序编程接口(application programming interface, API)实现相应管控功能,但是管控功能均在应用层实现,是从软件层面对功能进行管控;基于Android的移动终端安全管理系统[8],是将可信平台模块嵌入移动终端,通过可信计算的思想加固移动终端,对用户口令、设备、用户识别模块(subscriber identification module,SIM)卡进行绑定,从而进行功能管控。上述两种管控系统均未从Android系统底层源码修改策略文件实现对相关权限的全面管控,而对系统内核层实现权限管控是最为安全且彻底的管控。
本文针对Android 9.0,根据SELinux[9-10]安全机制和移动设备管控机制,设计一种基于SELinux的Android移动设备管控系统。通过修改Android开放源代码项目,以期实现对设备的远程管理,远程获取设备内部信息、设备目录、短信信息和通知富媒体推送;通过获取并修改设备CPU频率,实现对系统内核策略的修改,从而进行权限控制以及应用权限检测。
SELinux是Linux内核提供的强制访问控制(mandatory access control,MAC)系统。由中央策略文件确定访问控制决策的结果,并在类型强制服务器中合并多级安全性或一种可选的多类策略,采用基于角色的访问控制概念[11-12]。SELinux 支持默认拒绝的原则,即任何未经明确允许的行为都会被拒绝。它有两种全局运行模式,(1)宽容模式:权限拒绝事件会被记录下来,但不会被强制执行;(2)强制模式:权限拒绝事件会被记录下来并强制执行。Android 系统中包含 SELinux(处于强制模式)和默认适用于整个Android开放源代码(android open source project,AOSP)[13-14]的相应安全政策。在强制模式下,非法操作会被阻止,并且尝试进行的所有违规行为都会被内核记录到dmesg和logcat 中。
SELinux决策过程如图1所示。当应用(Subject)尝试访问文件(object)时,内核Kernel中的策略执行服务器会对访问向量缓存(access vector cache,AVC)进行检查, 在AVC中,主题和对象的权限被缓存(cached)。如果基于访问向量缓存中的数据无法做出有效决定,进而会请求安全服务器,安全服务器在一个矩阵中查找“应用+文件”的安全环境。根据查询的结果允许或拒绝访问,拒绝消息细节位于/var/log/messages中。
图1 SELinux决策过程
SELinux policy 是由核心的AOSP策略(平台)和设备专用策略(供应商)结合而成。SELinux policy 从Android 4.4 到Android 7.0 编译时合并了所有的策略片段,然后在根目录中生成单一文件。Android 8.0 和Android 9.0的平台和供应商是分开编译,因此,芯片级系统(system on chip,SoC) 和原始设计制造商(original equipment manufacturer,OEM)可以各自更新它们的策略部分,编译images (vendor.img, boot.img等),然后独立更新这些images。
Android的系统架构[15-16]包括应用程序层、应用框架层、系统运行库层和Linux内核层等4层,系统架构所含组件如图2所示。
图2 Android系统架构组件
应用程序层包括系统附带的用于电子邮件、短信、日历、互联网浏览和联系人等核心应用。应用框架层是Android开发的基础,多数核心应用程序通过框架层实现其核心功能,可以直接使用其提供的组件进行快速的应用程序开发,也可以通过继承而实现个性化的拓展,例如提供活动管理器和内容提供者等及用以访问核心功能的API框架。系统运行库层分为系统库和Android应用程序[17],系统库是应用程序框架的支撑,作为纽带将应用程序框架层与Linux内核层连接起来,例如提供多媒体库及SQLite小型关系型数据库等其他组件;Android应用程序是通过Java语言开发使用,运行时分为核心库和Dalvik虚拟机。Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动,例如音频、蓝牙和无线模块等,内核存在于硬件与软件之间,有强大的内存管理和进程管理及其他功能。
基于SELinux的Android移动设备管控系统由客户端和服务器端两部分组成。客户端提供IP端口和服务端保持连接,与服务端使用Socket套接字进行通信连接,连接后保持服务端持续的远程控制。系统架构如图3所示。
图3 系统架构
客户端实现获取并修改Android移动设备CPU频率、获取设备安装程序列表、更新sepolicy文件实现对蓝牙、近场通信(near field communication,NFC)、WiFi的权限控制以及应用权限检测的功能。客户端与服务端之间进行信息传递时,使用国密算法SM4[18]进行加密,保护信息传递的安全性。服务端可以对移动设备进行远程管理,推送通知或富媒体信息到客户端,获取设备基本信息、文件目录和短信信息等。
客户端使用Eclipse结合Android开发工具(Android developments tools,ADT)集成Android APIs进行设计。服务端是对Android远程管理工具 (Android remote administration tool,AndroRAT)修改并添加新的管理功能。服务端具有跨平台的特性,只需在安装Java环境的电脑上运行即可。
2.2.1 客户端功能实现
在客户端功能实现过程中,Android设备CPU频率的获取是通过使用Java代码读取Android设备根目录/sys/devices/system/cpu/cpu0/cpufreq文件中内容,并显示在TextView控件上;修改设备CPU频率命令是通过使用Java代码运行Android调试桥工具(Android debug bridge tools,ADB)命令进行修改。Android设备CPU频率只有在userspace模式下用户才可以拥有权限进行调频,所以首先需要设置调频模式为userspace。点击调频模式userspace按钮,程序后台会执行"echo ”userspace”> /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"命令,此命令的功能是切换调频模式到userspace模式,然后点击设置CPU最大频率,将设备的CPU设置为最大频率。客户端通过更改CPU频率增加设备运行和数据处理速度。
获取设备应用信息功能是通过Android提供的PackageManager类,获取PackageInfo信息,进而获取应用版本号,应用版本名,最后获取应用名称。主要获取PackageInfo信息、ApplicationInfo信息和ActivityInfo信息,然后将获取的结果通过ListView控件显示在设备屏幕上。
从Android系统底层实现权限控制的功能需要修改sepolicy相关文件,而sepolicy策略文件在Android系统源码AOSP/system/sepolicy下,通过Setools-Android工程经过工具集合(native development kit,NDK)编译可以产生一种读取sepolicy文件的工具seinfo。在Android设备的adb shell模式下可以读取sepolicy文件内容, Android 9系统sepolicy文件读取如图4所示。
图4 sepolicy文件读取
权限控制的功能实现方法是通过对设备的sepolicy策略文件进行更新,可以禁止用户使用蓝牙、NFC和WiFi等组件。SELinux Policy语言将进程与资源都打上“标签”,通过“标签”将系统内的资源(包括进程分成不同的角色)(比如:用户、客体),进而对整个系统资源(包括进程)进行合理安全的管控。SELinux的安全模型MAC有两种管理机制,分别为TEAC(type enforcement access control)和RBAC(role based access control)。TE是SELinux的管理核心,所以从底层进行权限管理需要修改Android源码中的te策略文件,SELinux的策略文件主要集中在源码AOSP/system/sepolicy下,这是添加修改安全策略的所在路径。修改AOSP/system/sepolicy/private下的bluetooth.te、nfc.te、wificond.te规则文件,对修改后的源码进行编译,提取AOSP/out/target/product/blueline下的新编译生成的sepolicy文件并将其放在设备的 /sdcard目录下。通过客户端加载新的sepolicy文件实现权限控制的功能。
应用权限检测功能的实现是通过对设备所安装的App程序检测其安装时授权的各个权限,每一项授权权限设置相应的分数,获取通讯录或相册信息等权限分数较高,获取系统时间及电池电量等分数较低,然后进行获取综合计算得到权限检测评估分数,分数小于5分为风险低等,分数大于5分小于7分为风险中等,分数大于7分为风险高等。分数越低表明程序对设备要求的权限越少,分数越高表明程序要求的设备授权的权限越多,对程序授权的权限过多会对设备的隐私有影响。
2.2.2 服务端功能实现
在服务端功能实现过程中,设备信息获取是通过Android源码的Build和TelephonyManager类获取设备基本信息,然后回传到服务端,显示在服务端界面;设备文件目录是通过I/O流读取Android系统特定目录在/storage/emulated/0下;短信获取是通过广播接收器接收广播进行获取;通知和富媒体推送使用到了百度云推送的功能,具体实现方式是在项目libs文件夹下加入百度云推送jar架包文件,在Manifest文件中声明service组件以及所需的相关的权限,后书写代码完成信息推送的功能。
系统功能验证环境由客户端环境和服务端环境两部分组成。客户端使用谷歌Pixel 3实验设备,硬件采用高通骁龙845处理器、4GB运行内存,内置Android 9系统;服务端环境使用Win10系统,利用Eclipse搭建的服务端工程,定制客户端应用程序时使用的Linux(Ubuntu16.04)系统,实现对Android开放源代码的修改编译。
客户端具有获取并修改CPU频率、获取设备已安装应用程序列表、更新sepolicy策略文件实现对系统部分组件的权限管理等功能。将App应用程序定制到Android 9源码中,对修改后的源码进行编译产生系统镜像后进行刷机,赋予客户端系统应用权限,且用户无法卸载更改客户端。启动服务让客户端和服务端保持通信连接,停止服务则中断双方连接。客户端主界面如图5所示。
图5 客户端主界面
3.1.1 CPU控制
CPU控制活动界面设置有CPU调频模式,点击按钮修改CPU调频模式,修改模式有schedutil和userspace两种。在schedutil模式下,设备会自动进行动态调频,设备出厂默认是在此模式运行;而当用户运行在userspace模式下,用户可以自由修改调节当前设备CPU频率,实现设置CPU的最大和最小频率的功能。最大频率会增加设备数据处理和运行软件的速度,使设备时刻处于高频率状态;最小频率会使设备运行速度变慢,减少电量损耗增加设备使用时间,用户可以使用耗资源较少的App例如网页、论坛等。在按钮的下方设置TextView控件实时获取设备CPU信息功能,如可以获取到CPU的最大最小以及当前频率、CPU核数、CPU架构和CPU调频策略等信息。CPU控制如图6所示。
图6 CPU控制
为了验证CPU频率是否成功修改并有效果,首先设置设备CPU频率为576 000 Hz,这是userspace模式下可设置的最低频率,使用adb命令分别测试QQ、微信、支付宝、百度、淘宝、京东、优酷和贴吧等8个App的启动响应时间。通过对比不同CPU频率下打开App应用的速度和总启动响应时间,判断应用修改频率是否成功。
连接设备的adb shell模式,运行logcat -b events -s am_activity_launch_time命令获取App包名和activity名,运行am start -W packagename/activity命令获取应用响应时间,获取淘宝App启动耗时如图7所示。
图7 淘宝App获取应用启动响应时间
TotalTime表示新应用启动的耗时,包括新进程的启动和 Activity 的启动是真正的启动耗时。为了减少设备因功耗的原因影响设备的性能,在测试前,强制退出所有非系统应用及相关服务,然后分别对每个应用测试10次计算平均启动耗时。计算频率为576 000 Hz时打开App的启动响应时间,然后点击设置CPU最大频率按钮(此功能将设备CPU频率调至最大,Pixel 3设备的最大频率为1 766 400 Hz),分别计算点击按钮前后两个频率下打开应用的时间,8个App应用不同频率下的启动响应时间如表1所示。由表1可见,频率越高启动应用速度和数据处理速度越快,CPU频率设置是有效的。
表1 应用启动响应时间
3.1.2 获取安装应用信息
点击获取设备App信息按钮会出现设备程序列表,如图8所示。获取设备App信息功能可以获取到安装在设备中的系统应用及非系统应用。
图8 获取设备应用程序信息
3.1.3 权限管理
更新的命令通过Java代码调用adb命令执行,程序加载预先编译好的sepolicy策略文件,执行的命令为load_policy /sdcard/sepolicy,实现的界面如图9所示。
图9 更新sepolicy策略文件
图10为蓝牙禁止界面。禁止蓝牙后,设备的蓝牙功能未能在附近找到新设备,无法显示设备蓝牙地址且蓝牙传输功能被禁止。
图10 蓝牙禁止
3.1.4 应用权限检测
应用权限检测功能实现的结果如图11所示。用户通过查看每个应用被计算后的分数,评判软件风险高低,根据权限检测的结果卸载相应的应用,防止恶意软件的破坏。
图11 权限检测功能
服务端可以获取到设备基本信息,发送实时信息显示在设备上,获取设备文件目录,获取设备短信信息,通过百度云推送服务推送通知和多媒体信息显示到设备上。客户端与服务端连接后,通过IP地址建立稳定的连接,服务端可以发送命令到客户端。
3.2.1 获取设备信息
为了保证信息传递的安全性,在客户端与服务端通信的过程中加入国产密码算法SM4进行加密。服务端主界面如图12所示,点击图中已连接的客户端显示的设备,可以获取到设备具体信息。
服务端获取到的部分信息如图13所示,可获取到设备SIM信息、设备IMEI号、设备WiFi状态、设备运营商所在地以及Android设备专属软件开发工具包(software development kit,SDK)版本等信息。Android SDK提供的了一些API接口,例如有TelephonyManager()、ConnectivityManager ()等,通过这些接口程序可以调用设备的基本信息。
3.2.2 获取设备文件目录
获取的设备底层文件目录如图14所示,通过对Android系统底层文件类的访问获取具体列表信息并下载指定文件到相应位置。Android系统为开发者提供了访问内部存储的API方法,通过getExternalStorageDirectory()方法获取到的路径为/storage/emulated/0。
3.2.3 短信获取
设备的短信信息获取如图15所示。在服务端显示获取短信的具体信息,注册广播接收器接收广播,管理者可以对其设备短信进行管控。
图12 服务端主界面
图13 设备基本信息获取
图14 获取设备文件目录
图15 短信信息获取
3.2.4 通知富媒体推送
点击普通通知,设备会立刻进入App;点击富媒体通知,可以看到图文并茂的页面,增加了用户信息量的获取,然后再选择性地进入App。由百度提供的SDK开发完成,需要在百度云推送平台注册一个开发者账户,建立推送的工程并正确集成Android SDK,生成应用的ApiKey和SecretKey, 在代码中ApiKey需要手动修改为指定应用的ApiKey,书写调试代码完成此功能。图16为成功的通知与富媒体推送。
综上功能验证的结果,客户端中CPU控制、获取应用信息、权限管理以及应用权限检测的功能都可实现并使用;服务端实现对设备的远程管控的功能,表明其系统软件功能正常且运行良好。
图16 通知与富媒体推送
基于SELinux的Android移动设备管控系统,客户端通过获取并修改设备的CPU频率,更新sepolicy策略文件,从Android系统内核进行相关组件的权限控制,并对设备App进行应用权限检测;服务端则实现了对设备的远程管控。验证结果表明,该系统软件运行良好,客户端与服务端的功能均可实现,可实现对移动办公设备的有效管控。