拓冰建站拓冰建站
首页 / 资讯中心 / 正文

APP安全测试实战:内测分发前如何排查风险与加固防护

先说明一下背景。我最近在帮团队做一个应用上线前的安全评审用的就是咕噜分发做内测包托管和下发。过程里踩了不少坑也把整个测试链路从头到尾捋了一遍。这篇文章就把这套咕噜分发 APP安全测试的完整打法写出来从原理、步骤到工具和坑位一次性讲透。我默认读到这篇文章的人要么是独立开发者要么是团队里负责测试或者质量保障的同学。不管你是刚接触安全测试还是已经做过几轮基础检测这篇文章都能帮你把安全测试到底该做什么、怎么做才能说清楚这件事理顺。1. 为什么内测分发之前必须做一轮完整的安全测试很多开发团队有一个思维惯性安全测试是大厂才做的事小团队、小产品先上线跑起来再说。这个想法在早期可能勉强行得通但一旦你的APP开始通过咕噜分发这类平台做内测、做企业分发情况就完全不一样了。原因很简单分发链路一旦打开你的安装包就不再只存在于你的电脑里。它会被下载、被解包、被分析、被二次打包。我见过太多的案例开发者自己都还没搞清楚APK里有哪些敏感信息别人已经通过反编译把接口地址、加密密钥、甚至后端管理后台入口翻了个底朝天。用咕噜分发做内测尤其要注意因为它的下载页可以被转发只要拿到链接的人都能下载安装。你原本只发给10个测试人员的包可能已经被转发到了完全不可控的环境里。这时候如果包本身存在明显的安全问题比如调试日志外泄、接口无鉴权、密钥硬编码那风险就是实打实的。所以说安全测试不是上线前的加分项而是分发前的必选项。尤其是当你使用第三方平台做托管分发时你无法控制下载者是谁但你可以控制这个包本身够不够硬。测试的目的是回答三个问题这个包暴露了多少不该暴露的信息这个包在传输和存储环节有没有明显漏洞业务逻辑上的弱点被利用后会造成什么后果把这三个问题回答清楚安全测试这关就算基本过关了。2. 安全测试的完整拆解从检测目标到测试原则2.1 测试对象与核心风险点APP安全测试的对象不是一整坨代码而是几个具体的面。按我的习惯会分成五个层面来看客户端安全APK/IPA文件本身的安全状况包括是否可逆向、是否被加固、资源文件和代码里是否藏了敏感信息传输层安全客户端和服务端交互时数据是否加密、是否校验证书、是否容易被抓包或篡改本地存储安全APP在用户设备上存储的数据是否安全比如token、用户信息、缓存数据是否明文写入业务逻辑安全登录、支付、下单、注册等核心业务流程是否存在逻辑漏洞比如越权、重放、批量调用组件与权限安全Android的四大组件是否被暴露、权限申请是否合理、是否存在导出组件被外部应用恶意调用的问题这五个层面覆盖了APP从静态文件到运行时行为的全部环节。任何一层出现明显短板都可能成为被攻击的突破点。2.2 测试的基本原则先黑后白先外后内拿到一个测试包之后先做什么、后做什么是有讲究的。我的顺序是先黑盒后白盒先外部观察再内部深挖。黑盒测试就是把自己当成一个普通用户只通过安装和使用APP来观察它的行为。比如用抓包工具看它请求了哪些接口、传输了什么数据、本地生成了哪些文件、申请了哪些权限。这一步的好处是快速建立起对整个APP的网络行为和数据流的基本认知不需要碰代码就能发现大量问题。白盒测试是对APK文件本身做逆向分析。用反编译工具把包解开看代码逻辑、看资源文件、看配置项。这一步能找到黑盒阶段看不见的问题比如硬编码的密钥、隐藏的后门逻辑、未加保护的加密算法。先外后内的顺序很重要。如果一上来就逆向分析看到代码里一堆历史遗留的东西很容易陷入细节反而忽略了大方向上的问题。先用黑盒把整体画像画出来再针对性地去代码里验证效率会高得多。2.3 安全评估的量化标准测试不能只停留在有问题和没问题的层面要尽量做到可量化。我常用的做法是给每个发现定优先级等级定义处理要求严重可直接造成资金损失、数据泄露或远程控制上线前必须修复高需要特定条件利用但利用成本低一星期内修复中信息泄露、体验影响无直接利用路径下个版本修复低不符合最佳实践但暂无实际风险记录归档择机优化这个优先级不是拍脑袋定的而是结合业务场景来的。比如一个记笔记的APP如果接口返回了其他用户的数据那属于严重如果只是日志里打印了设备型号就属于低。同样的漏洞在不同业务里的危害程度完全不同测试报告一定要结合业务场景去定性而不是机械地对照漏洞字典。3. 实操全流程从咕噜分发拿到包到输出测试报告3.1 准备阶段安装包获取与测试环境搭建3.1.1 从分发平台获取测试包用咕噜分发做内测的时候测试包的管理其实是比较灵活的。通常开发会上传一个新的APK然后在后台生成下载链接或二维码。测试人员拿到这个链接之后在手机浏览器里打开并下载安装。安全测试的第一步就是从这条链接上下载到原始安装包。这里注意一定要下载原包而不是从某些第三方下载站获取的包。第三方站点上的包可能已经被人动过手脚用它做测试结论会完全不准确。下载完先做一步哈希校验。用MD5或者SHA256算一下文件的哈希值和开发那边提供的原始哈希比对一下确保你手里的包就是编译产物本身。这一步很多人会跳过但一旦出问题所有分析结论都会失去意义。3.1.2 测试机与测试工具的准备安全测试至少要准备两台设备一台root过的Android手机一台普通未root手机用于对照。root过的手机可以配合调试工具做动态分析普通手机用来验证在无特殊权限情况下APP是否存在问题。电脑端需要安装以下工具我用的是市面上主流且稳定的方案jadx-gui最常见也最好用的APK反编译工具图形化界面可以直接查看反编译后的Java代码Frida动态插桩框架适合Hook关键函数、绕过SSL校验、动态修改参数Burp Suite专业级HTTP抓包与改包工具社区版就够用Fiddler轻量的抓包工具适合快速查看HTTPS流量MobSF移动应用安全扫描框架自动化做静态和动态分析效率很高apktool资源文件解包和回编译工具适合看AndroidManifest.xml和做二次打包验证工具有很多不需要全装。我的建议是Fiddler或Burp二选一jadx和Frida必装MobSF可以作为辅助做一轮自动化扫描。3.2 静态分析直接拆开安装包看代码3.2.1 用jadx查看反编译代码将APK文件用jadx-gui打开程序会自动反编译并展示项目结构。此时优先看几个关键目录AndroidManifest.xml // 应用配置信息权限、组件声明都在这里 com/xxx/xxx/ // 业务代码目录 res/ // 资源文件目录 assets/ // 原始资源文件目录打开AndroidManifest.xml第一件事是检查权限声明。看看有没有申请了超出业务需求的权限比如一个单机游戏要READ_CONTACTS、一个计算器要CAMERA这是明显不合理的。第二件事是看导出的组件。Android组件Activity、Service、Receiver、Provider如果设置了android:exportedtrue就等于对外打开了访问入口。通过adb命令可以直接查看adb shell dumpsys package com.example.app | grep -E Activity|Service|Receiver|Provider如果发现业务核心组件没有做权限校验就导出那是一个高优先级的安全缺陷。攻击者可以通过构造恶意Intent调用你的组件导致越权操作或信息泄露。3.2.2 检查硬编码密钥和信息泄漏在jadx里搜索关键词可以快速定位敏感信息。我常用的搜索词组合如下api_key、apiKey、secret、tokenhttp://注意搜索明文HTTP链接password、passwd、pwdBEGIN RSA PRIVATE KEY私钥AES_KEY、DES_KEY搜索时要重点看两个位置一是BuildConfig文件很多团队会把API地址和密钥写在这里二是资源文件string.xml和assets目录下的配置文件。很多APP在开发调试阶段会在代码里临时写死一些测试密钥上线时忘记删除。这类问题的本质是管理流程问题但暴露在安全测试里就是要被记为一笔的。3.2.3 判断是否做了加固通过jadx打开APK后如果代码显示为类似com.stub.StubApp或者com.secneo.apkwrapper之类的入口说明应用做了加固。加固之后jadx直接反编译出来的代码是加壳后的入口代码真正的业务逻辑是隐藏的。没有加固的直接后果是代码裸奔。任何人拿到APK用jadx一打开就能像读源码一样阅读你的业务逻辑。这虽然不直接等于漏洞但它大幅降低了攻击者发现漏洞的成本。所以我会把是否加固作为一项重要的安全评分项。金融类、支付类APP必须加固一般业务APP也强烈建议加固。市面上主流的加固方案有腾讯乐固、360加固保、爱加密等。3.3 动态分析让APP跑起来观察它的行为3.3.1 抓包用Fiddler/Burp查看网络请求动态分析第一步是抓包。用Fiddler或者Burp配置好代理在手机上设置好代理地址然后操作APP的各个功能观察网络请求。要重点看以下几个方面请求接口是否使用HTTPS加密请求中是否携带敏感的请求头信息如Authorization token请求参数是否存在可以被篡改的字段比如金额、数量、用户ID返回值中是否包含敏感数据比如其他用户的信息、内部接口地址是否存在未鉴权的接口以登录接口为例正常流程应该是客户端把账号密码通过HTTPS POST请求发送到服务端服务端验证后返回token。如果这个过程使用的是HTTP明文传输那账号密码在传输链路中可以被任意中间人截获。抓包数据建议保存一份完整的HTTPS会话作为测试报告的附件。这里有一个技术重点值得说一下证书校验绕过。很多APP做了SSL Pinning证书绑定就是客户端只信任指定的服务器证书导致你用Fiddler抓HTTPS包时出现证书不受信任或者连接直接失败。遇到这种情况有两种处理路径如果你有root手机可以安装Frida然后运行unpin脚本绕过证书校验如果你的APP是用Flutter或者React Native这类跨端框架开发的绕过方式又不一样需要针对框架做特殊处理3.3.2 用Frida做动态Hook测试Frida是动态测试里最强的工具。通过注入JavaScript代码到运行中的APP进程可以Hook任意函数在函数执行前、执行后、甚至替换返回值。举个例子如果我们想测试一个支付接口的金额是否可被篡改可以用Frida Hook住支付相关的函数修改传入的金额参数。如果服务端没有对金额做二次校验篡改后的请求就能通过这就是一个严重的业务逻辑漏洞。Java.perform(function() { var PaymentActivity Java.use(com.example.app.PaymentActivity); PaymentActivity.pay.implementation function(amount) { console.log(Original amount: amount); var hackedAmount 0.01; console.log(Hooked amount: hackedAmount); return this.pay(hackedAmount); }; });同样的逻辑可以用于绕过VIP校验、修改会员到期时间、批量调用接口等场景。这也是为什么我会把Frida列为首选动态测试工具。3.3.3 二次打包与签名校验测试二次打包测试是检测APP防篡改能力的重要手段。操作思路是这样的用apktool解包APK - 修改需要修改的内容比如Smali代码、资源文件 - 用apktool重新打包 - 签名 - 安装到手机看是否能正常运行。# 解包 apktool d app.apk # 修改代码后重新打包 apktool b app -o modified.apk # 生成签名 keytool -genkey -v -keystore test.keystore -alias test -keyalg RSA -keysize 2048 -validity 10000 apksigner sign --ks test.keystore --out signed.apk modified.apk # 安装并运行 adb install signed.apk如果APP在重打包后还能正常登录、正常使用业务功能说明它缺少签名校验。攻击者完全可以注入恶意代码比如盗取用户信息的代码重新签名后放到第三方下载站诱导用户下载。而用户根本无法分辨这是不是原版APP因为界面和功能都一样。这个测试非常重要。进一步说如果一个APP在重打包之后无法使用或启动即闪退那说明它至少做了基础的签名校验安全性要上一个台阶。3.4 本地存储安全检测APP在运行后会在设备的私有目录/data/data/com.example.app/下存放各种数据。用root过的手机进入这个目录把所有文件扒一遍是发现本地存储问题的直接方法。adb shell su cd /data/data/com.example.app/ ls -laR # 重点看 databases/、shared_prefs/、files/、cache/ 这几个目录需要重点关注的文件类型SharedPreferences文件XML格式检查是否有明文存储的token、密码、用户身份信息数据库文件SQLite数据库检查关键业务数据是否有加密缓存文件检查图片缓存、网络请求缓存里是否有敏感内容WebView缓存如果APP嵌入了WebView检查DOM存储和localStorage中的数据在过往的项目里我看到过把用户的完整手机号、身份证号明文存在SharedPreferences里的案例。这种数据被恶意的其他应用读取在root环境下或者通过备份提取后就是一笔严重的数据泄露。3.5 编写安全测试报告做完以上所有测试之后输出一份结构清晰的安全测试报告是必要的交付物。报告的价值不只是给开发看问题更是给整个团队同步风险等级和修复排期。我的报告模板基本是这样的测试概述被测应用名称、版本号、测试时间、测试环境测试范围本次测试覆盖的功能模块和层面问题汇总表所有发现的问题按严重级别排序标注状态问题详情每个问题附上复现步骤、截图/抓包数据、影响范围、修复建议修复验证开发修复后的复测结果安全评分整体安全水平打分我会按维度打分比如静态安全、传输安全、业务安全、存储安全各占25%报告的受众不一定是技术背景的人所以问题描述要尽量能让非技术角色比如产品经理、老板看懂。比如数据泄露风险除了写技术细节还要补一句如果被恶意利用可能导致用户隐私泄露和法律责任这样管理层才会真正重视。4. 常见问题与排查技巧实录4.1 抓包失败APP网络请求完全看不到这个场景我遇到太多次了。测试人员在手机上配好代理之后打开APP怎么操作都看不到任何请求。常见原因有三种场景一APP内部使用了WSS/HTTP2等非HTTPS协议如果APP用的是WebSocket或者HTTP/2Fiddler和Burp默认是不好抓的。解决思路是给这两类协议补专门的解析配置或者通过Frida Hook掉WebSocket的握手过程从内存里直接看传输内容。场景二检测到代理就断网有一些安全要求比较高的APP会在代码里做代理检测一旦检测到系统代理设置就主动断开网络或隐藏关键请求。这种情况下可以试试用Burp的非标准代理端口或者用透明代理的方式绕过检测。场景三SSL Pinning导致抓不到解密后的内容这个是最常见的。APP做了证书绑定代理工具拿着自己的证书去冒充服务器客户端拒绝信任。这种情况可以用前面提到的Frida unpin脚本解决。也可以尝试在手机上安装代理的CA证书到系统证书目录需要root但不是所有APP都认系统证书所以Frida更通用。4.2 抓包抓到的是乱码或加密数据有些APP对传输数据做了二次加密即使通过HTTPS解密看到的body内容仍是一串Base64或者十六进制字符串。这说明服务端与客户端之间还有一层自定义加密协议。处理思路不是去硬解加密算法而是用Frida Hook住加密和解密的函数在数据加密前、解密后把它打印出来。这就相当于站在代码内部去看数据流比在外部抓包更直接。4.3 加固APP无法直接反编译查看代码拿到加固后的APKjadx打开只有几行壳代码看不到真实业务逻辑。这时候有几个办法脱壳用Frida脚本做基于内存Dump的脱壳把运行中的真实代码从内存里拉出来。Xposed框架下的FDex2、DexDump等工具也可以做动态监控不追求一次性看到完整代码而是在APP运行过程中通过Frida Hook关键流程做定向分析自动化平台有些在线检测平台能直接识别加固厂商并自动脱壳比如Dexcalibur就是针对性较强的工具脱壳是一个比较深的技术活不是所有包都能完美脱出来。但没关系安全测试的核心是评估风险如果加固做得到位脱壳难度本身就说明了一件事——这个APP的抗逆向能力是过关的。4.4 本地存储目录空的找不到数据测试时发现/data/data/下面没有预期中的数据可能是APP本身就设计了动态加载或者外置存储逻辑也可能是用了一份普通的测试账号登录、还没产生足够多的数据。技巧是先正常使用APP一段时间登录、浏览、支付、聊天把功能都走一遍再去查看存储目录。也可以设置里退出登录、清除缓存、切换账号触发APP重新写入数据的时间点这样能最大概率抓取到数据落盘的瞬间。另外我发现很多开发者在做安全测试的时候容易陷入必须找大漏洞的思维定式实际上测试的核心价值是发现可控风险而不是真的证明你的系统有多安全。哪怕只测出这个APP没有做签名校验也已经给团队提了重要的醒。5. 安全测试完成之后正确的加固与修复姿势测试的目的不是列出一堆问题然后甩给开发而是要给出合理的修复优先级和落地路径。我一般的建议是严重和高危问题优先处理没有商量的余地。比如支付金额可篡改、用户数据越权访问这属于事故级别的风险必须在分发前修复接口层做统一的鉴权与参数校验。大多数业务逻辑漏洞的根源是服务端信任了客户端的输入主动做二次校验能从根上堵住一类问题客户端做加固和混淆。只要抗逆向能力上去了攻击者分析成本大增90%以上的路过型攻击者会因此放弃完整的接口传输走HTTPS 证书校验敏感存储走加密数据库或者KeyStore这里插一句关于咕噜分发平台的体验。它在做应用分发的时候本身也能配置一些基础的下载策略比如下载有效期、访问密码、扫码限制。在内测阶段我会建议团队把这些限制打开不要让安装包链接长期裸奔在公网上。配合这些分发侧的策略安全测试的结论才更有意义——既管住了包本身的安全性也管住了分发路径的可见性。6. 做个简单总结也说说我踩过的坑说实在话安全测试这个事最大误区就是要么不做要么想一次做到满分级。实际上安全是一个持续过程现在做一轮测试发现并修复问题比上线后被人利用了再补救成本和代价都小得多。用咕噜分发做内测的阶段恰恰是发现问题最好的窗口——包还没有广而告之知道它存在的人还在可控范围内修复了再发一轮对用户影响为零。我一开始做移动端安全测试的时候犯过一个很低级的错误只测了抓包和权限没有做重打包测试结果内部评审时被问住才发现自己的APP压根没有任何签名校验。后来在做二次打包验证时重打包后的包居然能正常登录、正常下单当时冷汗都下来了。这个坑希望你不要再踩一遍。最后再分享一个小习惯每次测试结束把抓包导出的HTTP会话、jadx的搜索记录、Frida的执行脚本全部归档进项目目录。下次新版要再测直接对比上一次的测试结果看变化效率高很多而且能非常清楚地看出团队在安全层面的进步。如果你正在用咕噜分发做内测分发又还没跑过一轮完整的安全测试强烈建议看完这篇文章就动手。从抓包开始搭建环境再对APK做一轮静态代码审查然后做一次重打包验证。一个下午的时间换来的是一份对风险清清楚楚的安全认知这笔账怎么算都不亏。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门