7、OWASP Mobile Top 10:M1-M5漏洞详解与检测方法

OWASP Mobile Top 10,说白了就是移动安全领域的「必考清单」。我入行那会儿,这玩意儿还没这么普及,踩了不少坑才明白它的分量。今天咱们就聊聊前五个最要命的漏洞——M1到M5。你想想看,一个App如果连这五关都过不了,上线基本就是裸奔。

7.1 M1:不当使用平台特性

这个漏洞,我习惯叫它「滥用系统API」。说白了就是开发者调用了不该调用的接口,或者用错了方式。比如WebView的addJavascriptInterface,很多人图方便直接暴露给JS,结果被远程代码执行。

核心风险点:

  • WebView组件未正确配置(JavaScript接口暴露)
  • Intent隐式调用导致组件劫持
  • Content Provider权限配置不当
  • Keychain/Keystore使用错误

我在项目中遇到过一家金融App,他们的登录页面用了WebView加载H5,结果addJavascriptInterface暴露了一个能读取本地文件的方法。攻击者只要诱导用户点个链接,就能把通讯录、短信全拿走。嗯,这锅得开发背。

检测方法

// 静态扫描:检查WebView配置
adb shell dumpsys package com.example.app | grep "WebView"

// 动态检测:尝试Intent劫持
adb shell am start -a android.intent.action.VIEW -d "example://open"

我的建议:别用addJavascriptInterface,改用JavaScriptInterface注解,并且只暴露最小必要接口。实在要用,记得做URL白名单校验。

7.2 M2:不安全的身份验证

这个漏洞太常见了。我见过最离谱的——某App的登录接口,直接把用户名和密码明文POST出去,连HTTPS都没用。你想想看,这跟在大街上喊「我密码是123456」有什么区别?

M2的核心问题在于:身份验证机制存在缺陷。包括但不限于:

  • 本地存储明文密码或Token
  • 弱密码策略(允许123456)
  • 会话Token固定或可预测
  • 生物认证绕过(比如指纹验证被降级)

注意:我曾经在审计一个社交App时发现,他们的Token生成算法居然是System.currentTimeMillis()拼接用户ID。攻击者只要注册几个账号,就能推算出别人的Token。这漏洞我报了高危。

检测方法

// 抓包检查认证流程
mitmproxy -p 8888

// 检查本地Token存储
adb shell run-as com.example.app cat /data/data/com.example.app/shared_prefs/*.xml

7.3 M3:不安全的通信

说白了就是数据传输没加密,或者加密方式不对。我经常跟团队说:「网络传输就像寄明信片,谁都能看」。如果你不用HTTPS,或者证书校验不严格,中间人攻击分分钟教你做人。

常见的坑有:

  • HTTP明文传输(还在用?)
  • HTTPS证书校验关闭(allowAllCerts=true)
  • 自定义协议实现有漏洞(比如WebSocket没加密)
  • SSL Pinning未实现或实现错误

真实案例:我审计过一个IoT配套App,它和硬件通信用的是自定义TCP协议,数据只做了简单的XOR加密。我用Wireshark抓包,5分钟就还原了控制指令。嗯,这App后来被要求重写通信模块。

检测方法

// 设置代理抓包
export http_proxy=http://127.0.0.1:8888
export https_proxy=http://127.0.0.1:8888

// 检查证书锁定
adb shell dumpsys wifi | grep "ssl"

7.4 M4:不安全的存储

这个漏洞,我习惯叫它「数据裸奔」。很多开发者觉得数据存本地就安全了,其实Android的SharedPreferences、SQLite数据库、甚至外部存储,都是攻击者的提款机。

常见问题:

存储方式 风险 检测方法
SharedPreferences 明文存储密码/Token 查看XML文件
SQLite数据库 未加密的敏感数据 导出db文件分析
外部存储 任何App都可读取 检查/sdcard目录
KeyStore 密钥保护不当 检查密钥生成方式

避坑指南:我曾经在逆向一个电商App时,直接在/data/data/com.example.app/databases/下找到了明文信用卡号。开发者把加密密钥硬编码在代码里,用AES加密后存到数据库——但密钥就在隔壁的so文件里。这跟没加密有啥区别?

检测方法

// 导出数据库
adb shell run-as com.example.app cat databases/app.db > /tmp/app.db

// 检查外部存储
adb shell ls -la /sdcard/Android/data/com.example.app/

7.5 M5:不充分的加密

M5和M4是孪生兄弟。M4是「没存好」,M5是「没加密好」。说白了就是:你加密了,但加密方式有问题。比如用DESMD5这种过时算法,或者自己实现加密算法——我见过有人用Base64当加密用的,哭笑不得。

核心问题:

  • 使用弱加密算法(DES、RC4、MD5)
  • 密钥硬编码在代码或资源文件中
  • IV(初始化向量)固定或可预测
  • 加密模式使用不当(比如ECB模式)

警告:我审计过一个医疗App,它用AES/ECB/PKCS5Padding加密患者数据。ECB模式有个致命问题:相同的明文块会产生相同的密文块。攻击者通过分析密文模式,就能推断出部分数据内容。这要是被曝光,公司得赔到破产。

检测方法

// 静态分析:搜索加密相关API
grep -r "Cipher\|SecretKey\|KeyGenerator" app/

// 动态分析:Hook加密函数
frida -U -l hook_crypto.js com.example.app

知识体系总览

下面这张图,是我梳理的M1-M5核心逻辑。你看一眼就能明白这些漏洞之间的关系:

OWASP Mobile Top 10 - M1至M5 漏洞关系图 M1:不当使用平台特性 WebView / Intent / Provider M2:不安全的身份验证 Token / 会话 / 生物认证 M3:不安全的通信 HTTPS / 证书 / 协议 M4:不安全的存储 数据库 / 文件 / KeyStore M5:不充分的加密 算法 / 密钥 / IV 攻击路径:从平台特性滥用 → 身份认证绕过 → 通信劫持 → 数据泄露 💡 核心思路:M1-M5 覆盖了 App 从「输入」到「存储」的完整攻击面 检测时建议从 M3(通信)入手,再回溯到 M2(认证)和 M4/M5(存储加密)

这五个漏洞,说白了就是App安全的「五毒」。我个人的经验是:先抓M3和M4,因为通信和存储是最容易被攻击者利用的入口。M1和M2往往需要逆向分析才能发现,而M5通常是M4的「并发症」——存储没做好,加密再强也白搭。

总结一下:

  • M1:别乱用系统API,尤其是WebView和Intent
  • M2:认证机制要严谨,Token生成别偷懒
  • M3:通信必须加密,证书校验不能关
  • M4:敏感数据别裸奔,KeyStore用起来
  • M5:加密算法选对,密钥别硬编码

嗯,这五个漏洞讲完了。你想想看,如果能把M1-M5都堵住,你的App至少能挡住80%的常见攻击。剩下的,就是M6-M10的事了。