Android⼿机App安全漏洞整理(⼩结)
本⽂主要介绍了APP安全漏洞整理,分享给⼤家,具体如下:app登录界面
1.源码安全漏洞
1.1 代码混淆漏洞
当前APK⽂件的安全性是⾮常令⼈堪忧的。APK运⾏环境依赖的⽂件/⽂件夹 res、DEX、主配⽂件Lib 只有简单的加密或者甚⾄没有任何加密。诸如apktool这类⼯具可轻易将其破解,再配合其他例如dex2jar、jd-gui等⼯具基本可以做到:源码暴露、资源⽂件暴露、主配⽂件篡改、核⼼SO库暴露、暴⼒破解恶意利⽤等。因此需要对安卓代码进⾏代码混淆。
代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成⼀种功能上等价,但是难于阅读和理解的形式的⾏为。将代码中的各种元素,如变量,函数,类的名字改写成⽆意义的名字。⽐如改写成⽆意义的单个或多个字母,如a,Ac,甚⾄改写成“__”这样的符号,使得阅读的⼈⽆法根据名字猜测其⽤途。代码混淆并不能真正阻⽌反向⼯程,只能增⼤其难度。因此,对于对安全性要求很⾼的场合,仅仅使⽤代码混淆并不能保证源代码的安全,但是可以在⼀定程度上保护开发者的劳动成果。
1.2 Dex保护漏洞
Dex是Dalvik VM executes的全称,即Android Dalvik执⾏程序,相当于安卓中的.exe⽂件,Dex为Android应⽤的核⼼,保护不当容易被反编译,暴露程序重要信息,⾯临被植⼊⼴告、恶意代码、病毒等风险。
另外当使⽤DexClassLoader加载外部的 apk、jar 或 dex⽂件,当外部⽂件的来源⽆法控制时或是被篡改,此时⽆法保证加载的⽂件是否安全。加载恶意的dex⽂件将会导致任意命令的执⾏。
1.3 so保护漏洞
so库⼀般是程序⾥⾯核⼼代码块,通过Android提供的NDK技术将核⼼代码⽤安全性更⾼的C/C++语⾔实现并提供给Java层调⽤来保证程序核⼼代码的安全。⾼性能的代码⼀般都会采取C/C++实现,通过Android的NDK技术来让Java层直接使⽤。其安全性相对于Java会⾼很多,相对于Java代码来说其反编译难度要⼤很多,但对于经验丰富的破解者来说,仍然是很容易的事,可以通过暴⼒破解或国外⾼价⼯具来将其破解。应⽤的关键性功能或算法,都会在so中实现,如果so被逆向,应⽤的关键性代码和算法都将会暴露。
1.4 调试设置漏洞
如果在l配置⽂件中设置了application属性为debuggable=“true”,则应⽤可以被任意
调试,这就为攻击者调试和破解程序提供了极⼤⽅便。如果开启,可被Java调试⼯具例如jdb进⾏调试,获取和篡改⽤户敏感信息,甚⾄分析并且修改代码实现的业务逻辑,例如窃取⽤户密码,绕过验证码防护等。
2. 组件安全漏洞
2.1组件导出漏洞
组成Apk的四个组件,Activity,Service,Broadcast Receiver 和Content Provider,如果设置了导出权限,都可能被系统或者第三⽅的应⽤程序直接调出并使⽤。组件导出可能导致登录界⾯被绕过、信息泄露、数据库SQL注⼊、DOS、恶意调⽤等风险。
2.2 Activity组件漏洞
Activity是Android组件中最基本也是最为常见⽤的四⼤组件之⼀,是⼀个负责与⽤户交互的组件。Activity组件中存在以下常见的漏洞。
(1)activity绑定browserable与⾃定义协议
activity设置“android.intent.category.BROWSABLE”属性并同时设置了⾃定义的协议android:scheme意味着可以通过浏览器使⽤⾃定义协议打开此activity。可能通过浏览器对app进⾏越权调⽤。
(2)ActivityManager漏洞
ActivityManager类中的killBackgroundProcesses函数,⽤于杀死进程,属于风险API。
还有通过ActivityManager被动嗅探intent。Intent嗅探脚本⾸先调⽤⼀个SystemService()函数,并传给它⼀个ACTIVITY_SERVICE标志的标识符,该函数返回⼀个ActivityManager类的实例,它使得该脚本能够与activity manager进⾏交互,并通过这个对象调⽤RecentTasks()⽅法。最后把intent相关的信息格式化成字符串返回出来。
2.3 Service组件漏洞
Service作为Android中四⼤组件之⼀,拥有重要的地位。Service具有和Activity⼀样的级别,只是没有界⾯,是运⾏于后台的服务。其他应⽤组件能够启动Service,并且当⽤户切换到另外的应⽤场景,Service将持续在后台运⾏。另外,⼀个组件能够绑定到⼀个service与之交互(IPC机制),例如,⼀个service可能会处理⽹络操作,播放⾳乐,操作⽂件I/O或者与内容提供者(content provider)交互,所有这些活动都是在后台进⾏。从表⾯上看service并不具备危害性,但实际上service可以在后台执⾏⼀些敏感的操作。
Service存在的安全漏洞包括:权限提升,拒绝服务攻击。没有声明任何权限的应⽤即可在没有任何提⽰的情况下启动该服务,完成该服务所作操作,对系统安全性产⽣极⼤影响。
2.4 Broadcast Receiver组件漏洞
Broadcast Receiver是“⼴播接收者”的意思,就是⽤来接收来⾃系统和应⽤中的⼴播。
(1)权限管理不当
Broadcast Receiver执⾏⼀些敏感操作时,会通过intent来传递这些信息,这种传递数据的⽅式是容易被恶意攻击的。在发掘broadcastreceiver中的漏洞时,最⼤的问题是确定输⼊是否可信,以及破坏性有多强。
以下⾯这段代码为例(有缩略):
<receiver
android:name=”.broadcastreceivers.SendSMSNowReceiver”
android:label=”Send SMS”>
…………
<actionandroid:name=”atdroid.SOCIAL_SMS” />
…………
<uses-permissionandroid:name=”android.permission.SEND_SMS”/>
…………
在上⾯这段代码中,滥⽤了⼀个没有进⾏适当权限保护的broadcast receiver,由于这个组件缺乏权限保护,使得攻击者可以在没有权限的情况下,这个漏洞的危害在于,攻击者可以在⽤户不知情的情况下去订购⼀个付费服务,或者泄漏设备中的信息。
(2)BroadcastReceiver导出漏洞
当应⽤⼴播接收器默认设置exported='true',导致应⽤可能接收到第三⽅恶意应⽤伪造的⼴播,利⽤这⼀漏洞,攻击者可以在⽤户⼿机通知栏上推送任意消息,通过配合其它漏洞盗取本地隐私⽂件和执⾏任意代码。
(3)动态注册⼴播组件暴露漏洞
Android 可以在配置⽂件中声明⼀个receiver或者动态注册⼀个receiver来接收⼴播信息,攻击者假冒APP构造⼴播发送给被攻击的receiver,是被攻击的APP执⾏某些敏感⾏为或者返回敏感信息等,如果re
ceiver接收到有害的数据或者命令时可能泄露数据或者做⼀些不当的操作,会造成⽤户的信息泄漏甚⾄是财产损失。
2.5 Content Provider组件漏洞
Content Provider为存储和获取数据提供统⼀的接⼝。可以在不同的应⽤程序之间共享数据。
(1)读写权限漏洞
Content Provider中通常都含有⼤量有价值的信息,⽐如⽤的电话号码或者社交帐号登录⼝令,⽽确认⼀个content provider是否有能被攻击的漏洞的最好的办法,就是尝试攻击它⼀下。
可以⽤drozer来寻⼀些不需要权限的contentprovider:
dz> runapp.provider.info –permission null
这条命令能列出所有不需要任何读写权限的Content Provider,然后到相对应的包,去访问给定包存放在它的Content Provider中的数据。如果⼀些Content Provider的URI不需要读权限,那就可以通过drozer⼯具提取其中的数据。在某些情况下,设置和执⾏读写权限不当,也会将ContentProvider中的数据暴露给攻击者。除了提取数据,对于写权限管理不当的Content Provider还可以向其中写⼊数据,使得攻击者可以将恶意数据插⼊到数据库中。
(2)Content Provider中的SQL注⼊漏洞
和Web漏洞类似,安卓APP也要使⽤数据库,那就也有可能存在SQL注⼊漏洞。主要有两类,第⼀类是SQL语句中的查询条件⼦语句是可注⼊的,第⼆类是投影操作⼦句是可注⼊的。使⽤drozer可以很容易的出查询条件⼦句可注⼊的content provider。
dz> runapp.provider.query [URI] –selection “1=1”
也可以使⽤其他恒为真的值,例如“1-1=0”,“0=0”等等。如果APP存在SQL注⼊漏洞,那么输⼊这⾏指令后就会返回数据库中的整张表。
(3)Provider⽂件⽬录遍历漏洞
当Provider被导出且覆写了openFile⽅法时,没有对Content Query Uri进⾏有效判断或过滤。攻击者可以利⽤openFile()接⼝进⾏⽂件⽬录遍历以达到访问任意可读⽂件的⽬的。
2.6 Intent组件漏洞
Intent(意图)主要是解决Android应⽤的各项组件之间的通讯。
(1)隐式意图调⽤漏洞
封装Intent时采⽤隐式设置,只设定action,未限定具体的接收对象,导致Intent可被其他应⽤获取并读取其中数据。Intent隐式调⽤发送的意图可能被第三⽅劫持,可能导致内部隐私数据泄露。
(2)意图协议URL漏洞
intent schemeURLs(意图协议URL),可以通过解析特定格式的URL直接向系统发送意图,导致⾃⾝的未导出的组件可被调⽤,隐私信息泄露。
2.7 WebView组件漏洞
WebView是⼀个基于webkit引擎、展现web页⾯的控件。
(1)Webview明⽂存储密码风险
Android的Webview组件中默认打开了提⽰⽤户是否保存密码的功能,如果⽤户选择保存,⽤户名和密码将被明⽂存储到该应⽤⽬录databases/webview.db中。⽽本地明⽂存储的⽤户名和密码,不仅会被该应⽤随意浏览,其他恶意程序也可能通过提权或者root的⽅式访问该应⽤的webview数据库,从⽽窃取⽤户登录过的⽤户名信息以及密码。
(2)Webview远程代码执⾏漏洞
Webview是Android⽤于浏览⽹页的组件,其包含的接⼝函数addJavascriptInterface可以将Java类或⽅法导出以供JavaScript 调⽤,实现⽹页JS与本地JAVA的交互。由于系统没有限制已注册JAVA类的⽅法调⽤,因此未注册的其它任何JAVA类也可以被反射机制调⽤,这样可能导致被篡改的URL中存在的恶意代码被执⾏,⽤户⼿机被安装⽊马程序,发送扣费短信,通信录或者短信被窃取,甚⾄⼿机被远程控制。
(3)Webview绕过证书校验漏洞
客户端的Webview组件访问使⽤HTTPS协议加密的url时,如果服务器证书校验错误,客户端应该拒绝继续加载页⾯。但如果重载WebView的onReceivedSslError()函数并在其中执⾏handler.proceed(),客户端可以绕过证书校验错误继续访问此⾮法URL。这样将会导致“中间⼈攻击”,攻击者冒充服务器与银⾏客户端进⾏交互,同时冒充银⾏客户端与银⾏服务器进⾏交互,在充当中间⼈转发信息的时候,窃取⼿机号,账号,密码等敏感信息。
(4)未移除有风险的Webview系统隐藏接⼝
android webview组件包含3个隐藏的系统接⼝:searchBoxJavaBridge, accessibilityTraversal以及accessibility,恶意程序可以利⽤它们实现远程代码执⾏。需通过显⽰调⽤removeJavascriptInterface移除这三个系统隐藏接⼝。
(5)WebView忽略SSL证书错误
WebView调⽤onReceivedSslError⽅法时,直接执⾏handler.proceed()来忽略该证书错误。忽略SSL证书错误可能引起中间⼈攻击。
3.数据安全漏洞
3.1 数据存储漏洞
(1)SharedPreferences漏洞
当使⽤getSharedPreferences打开⽂件,第⼆个参数设置为MODE_WORLD_READABLE或
MODE_WORLD_WRITEABLE。当前⽂件可以被其他应⽤读取或写⼊篡改,导致信息泄漏或更严重的问题。
(2)File任意读写漏洞
如果开发者使⽤openFileOutput(String name,int mode)⽅法创建内部⽂件时,使⽤MODE_WORLD_READABLE或
MODE_WORLD_WRITEABLE模式,就会让这个⽂件变为全局可读或全局可写的。
3.2 数据加密漏洞
(1)明⽂数字证书漏洞
Apk中使⽤的数字证书可被⽤来校验服务器的合法⾝份,以及在与服务器进⾏通信的过程中对传输数据进⾏加密、解密运算,保证传输数据的保密性、完整性。明⽂存储的数字证书如果被篡改,客户端可能连接到假冒的服务端上,导致⽤户名、密码等信息被窃取;如果明⽂证书被盗取,可能造成传输数据被截获解密,⽤户信息泄露,或者伪造客户端向服务器发送请求,篡改服务器中的⽤户数据或造成服务器响应异常。
(2)AES/DES弱加密
在AES加密时,使⽤“AES/ECB/NoPadding”或“AES/ECB/PKCS5padding”的模式。ECB是将⽂件分块后对⽂件块做同⼀加密,破解加密只需要针对⼀个⽂件块进⾏解密,降低了破解难度和⽂件安全性。
(3)setSeed伪随机数漏洞
本地加密时如果使⽤SecureRandom中的setSeed⽅法设置种⼦将会造成⽣成的随机数不随机,使加密
数据容易被破解。在SecureRandom⽣成随机数时,如果不调⽤setSeed⽅法,SecureRandom会从系统中到⼀个默认随机源。每次⽣成随机数时都会从这个随机源中取seed。
3.3 数据传输漏洞
(1)SSL通信服务端检测信任任意证书
⾃定义SSL x509 TrustManager,重写checkServerTrusted⽅法,⽅法内不做任何服务端的证书校验。⿊客可以使⽤中间⼈攻击获取加密内容。
(2)未使⽤HTTPS协议的数据传输
⽆线传输的数据能被第三⽅轻易截获,由于客户端与服务器之间的传输数据遵循通信协议指定的格式和内容类型,如果未使⽤加密措施,传输数据可被还原成⽹络层的数据包并进⾏解包分析,直接暴露⽤户的各种关键数据,例如⽤户名,密码等。加⼊了SSL(Secure SocketLayer)⼦层实现的HTTPS协议可确保数据在⽹络上加密传输,即使传输的数据被截获,也⽆法解密和还原。
(3)HTTPS未校验服务器证书漏洞
使⽤HTTPS协议时,客户端必须对服务器证书进⾏完整校验,以验证服务器是真实合法的⽬标服务器。
如果没有校验,客户端可能与仿冒的服务器建⽴通信链接,即“中间⼈攻击”。仿冒的中间⼈可以冒充服务器与银⾏客户端进⾏交互,同时冒充银⾏客户端与银⾏服务器进⾏交互,在充当中间⼈转发信息的时候,窃取⼿机号,账号,密码等敏感信息。
(4)HTTPS关闭主机名验证
构造HttpClient时,设置HostnameVerifier时参数使⽤ALLOW_ALL_HOSTNAME_VERIFIER或空的HostnameVerifier。关闭主机名校验可以导致⿊客使⽤中间⼈攻击获取加密内容。
(5)开放socket端⼝
app绑定端⼝进⾏监听,建⽴连接后可接收外部发送的数据。攻击者可构造恶意数据对端⼝进⾏测试,对于绑定了IP 0.0.0.0的app可发起远程攻击。
3.4 ⽇志信息漏洞
(1)调试⽇志函数调⽤风险
调试⽇志函数可能输出重要的⽇志⽂件,其中包含的信息可能导致客户端⽤户信息泄露,暴露客户端代码逻辑等,为发起攻击提供便利,例如:Activity的组件名,是Activity劫持需要的信息;通信交互的⽇志,会成为发动服务器攻击的依据;跟踪的变量值,可能泄露⼀些敏感数据,输⼊的账号、密码等。
4.业务逻辑漏洞
4.1 权限漏洞
(1)全局⽂件可读写
APP在创建内部存储⽂件时,将⽂件设置了全局的可读权限。攻击者恶意读取⽂件内容,获取敏感信息,或恶意写⽂件,破
坏完整性。
(2)敏感权限调⽤
在Manifest⽂件中调⽤⼀些敏感的⽤户权限,敏感⾏为包括发送、拦截短信,读取、修改通讯录、通话记录,,发送地理位置,使⽤摄像头,访问浏览器历史记录等。函数调⽤这些敏感⾏为,可能导致⽤户隐私数据泄露,钓鱼扣费等风险。
(3)冗余权限
如果调⽤了⾮必须的权限,就会出现冗余权限,冗余权限可导致串谋攻击,串权限攻击的核⼼思想是程
序A有某个特定的执⾏权限,程序B没有这个权限。但是B可以利⽤A的权限来执⾏需要A权限才能完成的功能。
4.2 业务漏洞
业务漏洞需要依靠机器和⼈共同检测,需要根据应⽤功能作⽤的不同来进⾏判断。机器可以检测⼀些通⽤的业务漏洞,例如⼴告、⾮授权下载、扣费短信等业务,⽽⼈⼯则判断应⽤在⾯向不同业务逻辑时产⽣的漏洞,例如登录验证不完善、不可信的敏感数据交付等。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。