王 斌,李 峰,杨慧婷,樊树铭
(国网新疆电力有限公司电力科学研究院,新疆 乌鲁木齐 830011)
Android是移动设备和智能设备的主流操作系统之一,然而,由于开发生命周期较短且没有集成适当的安全机制,尤其是Android APP在发布时并未强迫检测代码漏洞,因此大大增加了APP隐藏漏洞的可能性。
作者从ACM,IEEE,Web of Science,EI ScienceDirect和中文核心数据库检索并查阅了2016年至2022年发表相关的687篇英文文献和32篇中文文献,从中选取了70篇重要的文献和数据集进行了引用和总结。
由于移动设备很容易丢失或被盗,可以随时随地与多个网络连接,并且由于多数为个人使用设备,因此Android系统包含更多的隐私数据,传统的安全机制不足以应对Android系统。Mayrhofer等[1]认为恶意行为(包括获取设备的物理访问权、连接不受信任的网络、安装和运行不受信任应用程序、执行未测试的代码块和内容等)也应作为Android系统的漏洞威胁,并提出了Android安全模型包括的规则:多方同意(multi-party consent)、开放生态系统访问(open eco-system access)、安全和兼容性要求(security and compatibility requirements)、工厂将设备恢复到安全状态(factory restores the device to a safe state)以及应用程序的安全原则(applications’ security principles)等。Zhang等[2]提出了Android系统的三种安全机制:进程沙盒(process sandbox)、签名机制(signature mechanism)和权限机制(permission mechanism)。
Gao等[3]总结了Android APP漏洞产生的具体来源:安全套接字层(Secure Sockets Layer)、传输层安全命令(Transport Layer Security Commands)、权限(permissions)、Web视图(Web views)、密钥存储(key stores)、碎片(fragments)、加密(encryptions)、意图(intents)、意图过滤器(intent ilters)和泄漏(leaks)等。此外,用户的错误操作也会导致风险,Malik[4]指出多数安全问题都是由用户的操作引起的。
CyBOK组织[5]给出了Android系统的几种典型漏洞:内存管理漏洞(memory management vulnerabilities)、结构化输出生成漏洞(structured output generation vulnerabilities)、竞争条件漏洞(race condition vulnerabilities)、API漏洞(API vulnerabilities)和侧通道漏洞(side-channel vulnerabilities)。Garg等[6]列出了563个与Android相关的漏洞,包括获取特权和信息(gain privileges and information)、内存损坏(memory corruption)、拒绝服务(DoS)、恶意代码执行(malicious code execution)、溢出(overflow)和绕过安全措施(bypass security measures)等。Linares-Vasquez等[7]通过实证研究讨论了Android相关漏洞的类型、可能受到漏洞影响的Android层和子系统,以及漏洞的生存能力,囊括了来自CVE[8]和Android官方安全公告[9]的660个漏洞,其中大多数漏洞都可能来自数据处理问题、访问控制、内存缓冲区和不正确的输入验证等。
特征提取是进行漏洞检测的基础。Android应用程序的特征提取有两个主要路径:一是检测源代码中的结构特征,二是检测应用程序安装包(APK)执行时的行为特征。特征提取方法主要包括静态分析法、动态分析法和混合分析法。
静态分析法检查程序代码结构中隐藏的特征,程序代码的获取有两种方式,除了开发人员直接対编写的源代码进行分析外,更普遍的是对Android APK实施逆向工程获得源代码。Garg等[10]总结了静态分析的四个关键因素:分析技术(analysis techniques)、敏感性分析(sensitivity analysis)、数据结构(data structure)和代码表示(code representation)。除了源代码,Android应用程序还包含若干重要的XML文件,例如AndroidManifest、用户界面布局和应用程序所需的资源。因此,静态分析对源代码和XML文件进行分析,分别称为代码分析法和清单分析法。代码分析法从源代码文件中提取API调用(API calls)、信息流(information flow)、污点跟踪(taint tracking)、本地代码(native code)、明文分析(clear-text analysis)和操作码(opcodes)等信息。清单分析法从Manifest.xml文件中提取包名称(package names)、权限(permissions)、活动(activities)、服务(services)、意图(intents)和提供者(providers)。
动态分析关注程序在运行时的实际行为,通过在沙箱运行时环境中执行APK来提取特征,因此需要一个完整的产品(APK)。Garg等[10]给出了动态分析的两个关键因素:检查级别(inspection level)和方法。检查级别分为内核(kernel)、应用(application)和模拟器(emulator)。方法包括污点分析(taint analysis)和异常检测(anomaly detection)。
混合分析法同时使用静态分析和动态分析来检测给定的应用程序。多数混合分析方法先采用静态分析,再采用动态分析进行漏洞检测。Nawaz等[11]同时使用静态特征(权限和意图)和动态特性(IP、电子邮件和URL)来检测与应用程序相关的各种漏洞。APKTool[12]首先对APK进行反编译,在提取数据后,使用分解的索引文件创建静态特征向量以进行进一步分析。随后APK文件在模拟器中执行,以提取动态特征的行为。Tang等[13]使用静态分析法获取元数据和数据流,使用动态分析法检测API挂钩(hooks)和可执行脚本。
目前在Android漏洞检测中常用的机器学习/深度学习方法主要包括:NB(Naive Bayesian)、LR(Logistic Regression)、DT(Decision Tree)、RF(Random Forest)、GB(Gradient Boosting)、LSTM(Long Short-Term Memory)、CNN(Convolutional Neural Networks)、DNN(Deep Neural Networks)、RNN(Recurrent Neural Network)和MLP(Multilayer Perceptron)等。为了训练机器学习/深度学习模型,需要进行特征抽取。后续依据特征抽取的静态、动态或混合方法进行分类总结。
Vulvet[14]是一个基于Soot[15]的框架,使用静态分析方法和多层多管齐下(multi-tier multi-pronged)的分析技术检测Android漏洞,并给出了一个针对漏洞的自动补丁生成过程。该框架在3 700个应用程序上达到了95.23%的准确率和97.5%的F-score。其局限性在于不能分析和修补本机代码中的漏洞,也不支持Java相关和动态代码加载,并直接将从外部存储读取的所有文件标记为恶意文件。Sun等[16]提出了WaleDetector模型,使用极限学习机(Extreme Learning Machine)进行Android恶意代码和漏洞的检测,涉及了敏感权限、程序功能和API调用等特征。WaleDetector在包含腾讯应用宝商店的625个良性应用程序和Contagio网站的525个恶意应用程序的数据集上进行了实验,除了F-score外,其检测率远高于其它商业软件。秦佳伟等[17]提出了一种基于代码切片的程序特征提取方法,基于Bi-LSTM和注意力机制提出了一个上下文感知的Android APP漏洞检测模型VulDGArcher,在包含隐式Intent通信漏洞和Pending Intent权限绕过漏洞的41 812个代码片段(其中漏洞代码片段有16 218个)的数据集上取得了96%的准确率。
数据流分析对于检测恶意代码和应用程序也很重要。Yang等[18]提出了一种主题特定数据流签名的挖掘方法用于描述恶意程序特征,分析了3 691个无害程序和1 612个恶意应用程序并利用LDA(Latent Dirichlet Allocation)和遗传算法建立主题模型,发现主题特定数据流签名比总体数据低签名能更好地描述恶意程序和漏洞。
从APK文件或可移植可执行(Portable Executable,PE)文件中可抽取出源代码,因此可通过对其静态分析发现漏洞。Kim等[19]基于PE文件结构进行分析,使用了RF,GB,DT和CNN模型对恶意代码和安全代码进行分类,达到98.77%的准确率。Bilgin等[20]构建了能够在APP发布之前预测软件代码漏洞的机器学习模型,使用了来自NIST[21],SAMATE[22]和SATE IV Juliet Test Suites[23]数据集的Python,C和C++源代码,将其表达为抽象语法树进行训练,在平衡数据集上部分漏洞取得了近90%的准确率,其缺点是无法精确定位漏洞代码的位置。邵帅等[24]提出了一种基于机器学习的Android APP组件暴露漏洞的分析方法,结合组件暴露漏洞模型,建立了相应的机器学习系统,能够对Android漏洞特征进行提取、数据清理和向量化。在1 000个Android APK组成的数据集上取得了90%以上的准确率。
在APP执行时,动态分析技术可以抽取特征,从而训练机器学习/深度学习模型检测漏洞。Mahindru等[25]使用了动态分析和NB,K-Star,RF,DT和Simple Logistic模型检测漏洞和恶意程序,其中Simple Logistic模型表现最好,准确度达到99.7%,召回率达到99.6%。
Wu等[26]讨论了利用深度学习模型进行漏洞检测的机制,比较了CNN,LSTM,CNN-LSTM等深度学习模型,其中CNN-LSTM取得了最佳的83.6%的准确率。Pang等[27]利用DNN对漏洞代码进行预测,利用N-gram分析和统计特征构建特征向量,在Java代码编写的APP代码中进行了验证。Gupta等[28]探讨了基于机器学习的漏洞检测规则抽取方法,对比了32种监督学习方法,其中J48机器学习算法取得了最佳的96%的准确率。Sikder等[29]提出了一种名为6th Sense的上下文感知入侵检测系统,利用了NB,马尔可夫链和逻辑模型树等模型,通过移动设备中的传感器数据的变化来检测漏洞。Malik等[30]利用机器学习模型和系统调用异常进行漏洞检测,使用了kNN,LSTM和遗传算法LSTM等模型,精确度、召回率和F-Score都超过了85%,其中遗传算法LSTM的表现略好于其它算法。
Lu等[31]利用混合分析特征和机器学习方法进行漏洞检测,应用了DT,ID3(Iterative Dichotomiser 3),C4.5,NB和AB(Adaptive Boosting)等多种算法,重点研究了与Android Intent及其组合相关的漏洞检测。实验数据集包括150个有漏洞和150个无漏洞的APP,平均检测准确率为77%。
Garg等[32]提出了一种用于Android漏洞检测的并行分类模式,利用了权限、API调用、版本、服务、已用库、广播接收器等静态特征和系统调用、网络调用等动态特征,对Android中零日(zero-day)恶意软件和其它漏洞进行检测,其中MLP获得了96.11%的最高准确率。进一步考虑并行分类的效率,发现最大概率法是最优方案,可获得98.27%的准确率。
Jannat等[33]首先利用Androguard工具[34]从APK文件中提取Manifest数据并转化为Json文件用于静态分析,之后利用Kaggle[35]和MalGenome[36]数据集对LR,SVM和kNN等机器学习模型进行训练,在动态执行APK时利用训练好的机器学习模型开展漏洞检测,准确率可达93%。Surendran等[37]提出了一种基于树增强朴素贝叶斯网络的机制,利用权限、系统和API调用等特征进行建模。在AZ[38],Drebin[39],Android Malware Dataset[40]和GitHub[41]等数据集上的实验取得了97%的准确率。
表1总结了主流的机器学习/深度学习模型,描述了其方法、分析技术、使用的方法或框架、数据集、准确性及局限性。
常规方法指非基于机器学习的方法,包括基于启发式方法、形式化方法等,该文也依据特征抽取的静态、动态或混合技术对其进行分类总结。
Bagheri等[42]引入了一个用于检测基于Alloy语言[43]的Android许可协议中安全问题的规范模型,使用静态分析技术自动分析和识别协议中的潜在缺陷,能够识别三种典型的漏洞:URI权限漏洞、不当委派漏洞和自定义权限漏洞。胡英杰等[44]提出了基于静态污点分析的Android隐私泄露检测方法,首先创建敏感权限与API之间的映射关系,再生成函数调用图,实现了APP中潜在隐私数据泄露行为的检测。
Chang等[45]提出了一个漏洞解析器模型,首先利用phython脚本执行APK解压缩,然后利用Manifest.xml解析器将APK反编译,再用Dex解析器将其进行处理获得漏洞向量,并将每个漏洞划分为严重、警告、通知和建议四个级别。
由于第三方函数库的广泛应用,因此对其进行漏洞检测非常必要。ATVHunter工具[46]可用于对第三方库的可靠版本检测,能够提取不同版本的第三方库中的漏洞,并给出控制流图和操作码等详细信息。实验数据集包含189 545个第三方库,共有3 006 676个版本,涵盖了1 180个常见的易受攻击漏洞。ATVHunter在第三方库级别获得了98.58%的准确率和88.79%的召回率,在版本级别获得了90.55%的准确率和87.16%的召回率。马杰[47]选择了35个使用较为广泛的非官方SDK,使用FlowDroid[48]和Droidbox软件工具并结合污点追踪、二进制插值方法进行了分析研究。结果表明有19个(54.3%)SDK存在SSL/TLS错误配置、不合理的敏感数据权限分配、HTTP的非必要调用、用户日志泄漏、开发人员考虑不周等漏洞和威胁。为了使开发者能遵守第三库的安全规约,张磊等[49]提出了一个基于安全提示的Android APP通用漏洞检测框架TipTracer,定义了一个能形式化描述安全规约的安全性语言,并据此对已知的安全规约进行形式化表述,开发了一个静态代码分析器,用于检查应用程序是否满足安全规约,并通过实例对TipTracer进行了验证。
由于Android Web视图对象也可能导致漏洞,El-Zawawy[50]提出了一个WebVSec框架对其进行检测,主要涉及四种漏洞:Interface to Interface,Interface to WebViewClient,WebViewClient to WebViewClient和Reverse。实验分析了AndroZoo[51]数据集中的2 000个Android应用程序,检测到48个具有漏洞的应用程序,其检测一个应用程序的平均速度为49秒。其缺陷在于仅考虑了JavaScript的代码而不能处理Java代码生成的WebView漏洞。朱璋颖等[52]提出了一种基于Soot构建的数据流分析的静态检测方案,以检测由于WebView跨域访问漏洞引起的应用克隆攻击。
DroidRA模型[53]通过驯化App中的关联关系来增强静态分析的能力,通过监测Android应用程序,以显式标准Java调用来增强关联关系,建立约束解决机制用于分解关联关系调用。其优点是可以发现危险代码,如敏感数据泄漏和敏感API调用,缺点在于单入口点方法无法涵盖所有的相关调用。
考虑动态分析的传统方法研究相对较少。Qin等[54]提出了一种启发式漏洞搜索算法VulArcher来验证分析的准确率,输入可能导致漏洞的敏感API与方法、漏洞修复规则以及漏洞触发规则,输出漏洞的详细代码片段及所在路径。重点分析了四种漏洞:阿里云OSS凭证泄露漏洞、证书验证不当、Web View远程代码执行漏洞、Web View绕过证书验证漏洞(来自中国国家漏洞数据库[55]、CVE[11]和CWE[56])。在6 177个Android应用程序(浏览器、购物和金融类)的实验取得了91%的准确率。其缺点是使用的数据集和第三方工具较旧,无法检测最新的漏洞。
靖二霞等[57]提出了一种基于Dalvik寄存器污点分析的Android应用漏洞检测方法,实现对污点的前向分析和后向分析功能,最后使用脚本执行器连接预分析模块、污点分析模块和漏洞检测脚本,共同实施漏洞检测。
石加玉等[58]设计了基于libdft API程序脆弱性检测工具,可直接对二进制程序进行检测。结果表明该工具可有效检测出心脏滴血攻击、格式化字符串攻击、数据泄露、ReturnToLibc攻击等多种程序脆弱性漏洞。
Shezan等[59]利用混合分析进行了实证研究,选择了三种质量工具:AndroBugs[60],SandDroid[61]和Qark[62]来测试和发现漏洞。从随机选择的EATL应用商店[63]中的29个APP和Google Play商店中的6个APP中检测到了8个常见漏洞,涉及到存储访问、Web视图、SQLite数据库加密、意图、广告模块、过时或敏感的API、短信、电话和Android调试模式等。
Wang等[64]提出了一种先执行静态分析后进行动态分析的混合漏洞挖掘方法。在静态分析中,使用Dex2Jar[65]和JD-GUI工具库[66]对APK文件进行反编译以获取源文件,再通过特征提取过程创建API函数、特权、组件和库文件的特征向量,然后通过扫描引擎基于漏洞规则库执行数据流分析、正则表达式匹配和文件检测,以获得静态分析结果。随后利用模糊测试技术进行动态分析,包括测试用例、半有效数据、执行数据、污点跟踪和监控异常等。通过在华为应用市场上下载的290个应用程序进行测试,该模型获得了95%以上的漏洞检测准确率。
AndroShield[67]是一个基于混合分析的框架,采用了APK逆向工程、清单文件解码、元数据提取、静态分析和动态分析等方法,能够给出APP风险级别和识别出的漏洞。
针对同家族恶意软件行为具有相似性的特点,陈鹏等[68]提出通过静态分析与动态运行程序相结合的方式度量软件行为的相似性实现漏洞检测。通过逆向工程和Soot代码转换框架获取程序控制流图,利用行为子图匹配算法对程序行为相似性进行度量,通过自动化测试框架运行程序。实验表明该方法能够准确度量程序之间行为的相似性,在准确率上相较于Androguard有大幅提升。
表2总结了主流的漏洞检测传统,描述了其方法、分析技术、使用的方法或框架、数据集、准确性及局限性。
表2 常规的Android漏洞检测方法对比
该文对2016年至2022年6月最新的Android源代码漏洞检测技术进行了总结,回顾了应用程序和代码分析技术,以及用于检测漏洞的机器学习/深度学习和常规方法。
虽然目前已有若干与恶意软件相关的数据集,但仍需要Android专用的源代码漏洞数据集,专门用于进一步的实验,以训练ML模型来高精度地检测和预测代码漏洞。此外,建议引入一种全面的代码分析机制,在移动程序开发时就能识别安全问题,例如将检测方法作为工具或插件集成到Android应用程序开发环境中。同时需要研究漏洞产生原因的自动分析方法,如将机器/深度学习的可解释性方法应用于漏洞原因分析。