1 APP常见漏洞与对策
1.1 APP安全趋势总结
- 软件安全演变为信息安全
- 信息安全离大众越来越近
- 信息安全越来越受重视
- 信息安全会影响大众的生活
1.2 OWASP Mobile TOP 10
1.2.1 平台使用不当
- 糟糕的Web服务强化
- 逻辑缺陷
- 弱认证
- 弱会话管理或没有会话管理
- 会话固定
- 不安全的Web服务器配置
- 默认内容
- 管理界面
- Web服务和支持移动的网站上的注入
- 身份验证缺陷
1.2.2 不安全的数据存储
敏感数据未加密存储、本地文件未加密、Webview本地明文存储cookie等问题
- 常见类型
- SQL数据库
- 日志文件
- XML数据存储和清单文件
- Cookie
- 影响:
- 身份盗用
- 侵犯隐私
- 欺诈
- 声誉受损
- 物质损失
1.2.3 不安全通信
使用了不安全的通信协议,传输未加密的数据
- 常见类型
- 缺少证书检查
- 自定义SSL x509 TrustManager
- 缺少证书检查
- 影响
- 隐私泄露
- 身份盗用
- 网络钓鱼
- 中间人攻击
- 欺诈
- 声誉受损
1.2.4 不安全的身份验证
身份验证功能不完善,对用户的请求不进行验证
- 常见类型:
- 隐藏服务请求
- 影响
- 信息窃取
- 未经授权的数据访问
- 无法识别执行操作的用户请求
1.2.5 弱加密
加密容易被破解
- 常见类型:
- 内置代码加密
- 硬编码密钥
- 不安全或过时的算法(RC2/MD4/MD5/SHA1)
1.2.6 不安全的授权
授权不加的技术影响在性质上与认证不良的技术影响相似
- 常见类型:
- 隐藏端点:
- 用户角色或权限传输:
- 影响
- 声誉损失
- 欺诈
- 信息盗用
1.2.7 客户端代码质量
可以将不受信任的输入传递给移动代码中的方法调用的实体。这些类型的问题本身不一定是安全问题,但是会导致安全漏洞,被人利用漏洞,成为安全问题
目前规范代码协作和代码安全扫描。
- 常见类型:
- 不正确的资源关闭
- 信任用户输入
- 变量使用问题
- 运算符使用问题
- 函数问题
- 条件语句问题
- 循环语句问题
- 数值类型转换问题
1.2.8 代码篡改
对代码和资源的保护不足,应用被修改和重新打包后可以正常运行。
- 常见类型:
- 修改代码
- 修改资源
- 修改API
- 影响:
- 未经授权的新功能
- 身份盗用
- 欺诈
1.2.9 逆向
对代码或资源的保护不足,应用可以被反编译出易读的代码或伪代码
- 常见类型:
- 保留的符号表
- 反编译
- 影响:
- 显示有关后端服务器的信息
- 显示加密常量和密码
- 窃取知识产权
- 对后端系统进行攻击
- 修改代码并执行获取所需的信息
- 知识产权盗窃
1.2.10 无关的功能
存在了不该存在的代码,且这些代码中包含的的内容或实现的功能存在敏感信息。
- 常见类型:
- 开发人员可能会在混合应用程序中意外将密码作为注释包含在内
- 测试期间禁用双因素认证
- 遗留的测试组件
- 影响:
- 暴露后端系统的工作方式
- 未经授权的访问
1.3 对策与方案
1.3.1 十大安全编码(事前)
- 验证输入
- 安全策略的架构与设计
- 默认拒绝
- 筛选发送到其他系统的数据
- 使用有效的质量保证技术
- 注意编译器警告
- 保持简洁
- 坚持最小特权原则
- 深度防御练习
- 采用安全的编码标准
1.3.2 开发者对策
- 安全设计(事前)
- 安全编码(事中)
- 模块化
- 封装性
- 信息隐藏
- 限制防御性编程
- 代码扫描和测试(事后)
- 功能测试
- 渗透测试
- APP安全监测
- 代码扫描
2 APP漏洞检测与应对
- 本地文件存储
- 安全通信
- 加密
- 组件安全
- webview组件安全
2.1 本地文件存储
- 基本概念:在程序中如果使用了SharedPreference或者SQLiteDatabase,要查看 SharedPreference或SQLiteDatabase是否设置了安全权限,否则可能会导致敏感信息泄露
- 漏洞危害:
- 数据丢失
- 提取程序额敏感信息
- 业务影响很大程度上取决于被盗信息的性质
- 解决方法:
- 禁止全局读写
- 敏感信息加密存储
- 敏感数据加密存储的同时可以对本地数据库文件也进行加密,
- 开源库:SQLCipher
- 收费版:SQLite Encryption Extension;
2.2 安全通信
- 基本概念:特征是存在两个设备而且它们之间会传递某些数据
- 漏洞危害:
- 敏感信息泄露
- 中间人攻击
- 解决方法:
- 真正实现TrustManager
- 禁止使用AllowAllHostnameVerifier和 ALLOWALLHOSTNAMEVERIFIER实例化,应该使用 STRICTHOSTNAME_VERIFIER严格校验。
- 禁止使用SSLCertificateSocketFactory;->getInsecure()函数禁用 所有SSL安全校验
- 禁止使用proceed()函数忽略证书错误,应该抛给系统进行安 全警告
2.3 组件安全
- 基本概念:
- 最小化原则,减少程序权限申请
- 防止非法调用:自定义权限,设置调用方白名单
- 私有化:内部使用的类、变量和接口,防止外部非法调用
- 漏洞危害:
- 网络钓鱼,盗取各类用户账户
- 绕过本地认证
- 本地拒绝服务
2.4 Web组件
-
漏洞危害:
- UXSS漏洞攻击
- 远程命令执行攻击
- File域同源策略绕过攻击
-
解决方法:
- 禁止使用AddJavaScriptInterface方法
- 设置WebView建议关闭file协议
mWebView.setAllowFileAccess(false)setAllowFileAccessFromFile URLs(false),setAllowUniversalAccessFromFileURLs(false)
- 移除危险方法
removeJavascriptInterface("searchBoxJavaBridge_") removeJavascriptInterface("accessibility") removeJavascriptInterface("accessibilityTraversal")
- 使用handler.cancel()
2.5 敏感信息泄露
- 基本概念:
- 敏感信息:财务数据、医疗数据和个人可标识信息数据
- 通过窃取或修改未加密的数据来实施诈骗或其他犯罪行为
- 未加密的敏感数据容易遭到破坏
- 可能泄露的数据:传输过程中的数据、存储的数据以及交互数据
- 漏洞与危害:
- 错误响应暴露敏感信息
- 要求:
- 传输敏感数据做脱敏加密处理
- catch中避免打印堆栈信息,使用友好的错误提示信息
2.6 日志安全
- 基本概念:
- 禁止将敏感信息打印到客户端日志中
- 包括应用程序本身和应用程序调用的第三方库的程序
2.7 其他常见问题【流未关闭的问题】
- 漏洞与危害:
- 流使用未正常关闭,不能释放资源,导致资源枯竭攻击
- 未关闭会占用资源,导致其他程序访问异常,也可能导致资源过度占用内存溢出等情况