就拿Android系统这个具体实例来说,首先从整体上看APP安全是整个Android系统安全的一部分。Android安全可以划分成4部分: APP 安全, Framework 层安全, Linux 内核安全和硬件安全。
APP 层安全又可以分服务端和客户端。服务则可能的安全问题跟传统web安全问题类似,如sql注入、CSRF、XSS、越权等,整体的解决办法是在开发中使用成熟的安全框架,比如ESAPI等。另外可能存在一些私有协议问题,比如畸形报文导致缓冲区溢出,命令注入等问题,解决办法是针对性Fuzz。
Android的APP面临的威胁:
一是被逆向。 逆向会导致公司关键的资产、创新思路被窃取。解决办法一般是
-
代码混淆,包括java和c两个方面,混淆加大了逆向的难度和时间,不能根本上解决被逆向问题。
-
dex和so加固,dex加固也是提高了逆向难度,但目前通过xposed这些框架或定制daivik虚拟机,很容易脱壳。相对来说so加密是比较好的办法,毕竟能跟看小说一样读ARM汇编的人要少的多。
-
反动态调试,一般有多进程ptrace,加入执行时间检查逻辑,检查gdb,ida 等调试器等手段。
-
引入PC上的VT机制,自己实现一套虚拟机指令运行,但面临安卓碎片带来的兼容性问题和性能问题。
二是APP被重打包。导致植入病毒,广告,恶意扣费等,在应用市场中特别常见。防御方法一是加固, 二是在Server端加入对APP证书合法性的校验。
三是组件的安全。比如Activity对外暴露导致的权限绕过。Provider暴露导致的信息泄露等。防护方法是正确进行编码和权限配置,在开发阶段做好代码安全审计,开发完成进行各组件的渗透测试,比如Intent Fuzz这些。Intent、Webview这些也算到组件里吧,Intent 有很多DoS问题,主要集中在处理空Intent未捕获异常等。
四是敏感信息泄露;现在市场上很多应用对用户等的敏感信息明文保存或使用的弱加密算法,或打印到调试日志等。建议是将用户敏感数据用像AES256,sha-512等高强度算法加密保存。
五是传输过程中不加密。很多APP在与Server交互时不加密传输比如姓名,电话这些内容。防护方法是传输内容使用ILS等加密,使用正确的会话管理。
对于Framework层和Linux内核的安全问题,就划到二进制安全里面了 。
问题主要发生在系统处理用户传入参数的时候,对参数校验不充分。比如处理一段报文 ,或读取一个配置文件。主要的问题有缓中区溢出,目前比较少发生了,解决办法是在编码时使用memcpy_s等安全函数。另外有整形溢出,UAF,double- free等都可能被利用执行任意代码,还有条件竞争导致的问题,对路径校验不当导致的目录遍历,命令注入在二进制中也存在, 另外一些特殊函数比如mmap对参数没做限制,也是一个攻击面。
从代码层面解决这类漏洞问题, 一个是代码安全审计,二是代码静态扫描,比如使用Forit等工具。
从系统层面的话,可以依靠系统自身的防护机制,如DEP, ASLR, SafeSEH, /GS等。当然这不会消除漏洞本身,只是加大利用难度。