上架前 APK 安全自检清单:我发版前固定过这 4 轮

0 阅读8分钟

分类建议:Android / 移动开发 / 信息安全标签建议:APK安全、上架自检、漏洞扫描、APK加固、安固云、独立开发者类型:实操清单(可收藏)(csdn-分享-加固后验收清单.md)


先说用途

这不是等保审计表,也不是银行级渗透报告模板。

它面向 个人开发者、外包交付、中小企业常规业务 App:在点「提交审核 / 发给客户」之前,用 30~90 分钟 把「裸奔问题」和「加固前该修什么」过一遍。

我自己的顺序固定是:

本地快检 → 云端扫描留报告 → 该改的改 → 再加固 → 加固后验收

前两轮本文讲;后两轮见系列下一篇《加固后怎么验收》。


使用说明(建议收藏这一节)

符号含义
未检查
通过
不通过,发版前必须处理
已知风险,写进 release note 或后续迭代

四轮分别是什么:

轮次耗时做什么工具
第 1 轮10~15 分钟包体 / 签名 / 权限 / Debug 开关本机
第 2 轮15~30 分钟明文密钥、日志、网络、组件暴露jadx + grep
第 3 轮20~60 分钟防护与漏洞扫描,留 PDF/HTML云端(如 安固云
第 4 轮10~20 分钟混淆规则、64K、加固兼容性预检构建脚本 + 真机

原则:第 3 轮尽量在加固之前做。 加固只能抬高逆向成本,修不掉业务里的明文密钥和错误权限。


第 1 轮:包能不能上架(10~15 分钟)

1.1 签名与版本

#检查项怎么验通过标准
1.1.1Release 用正式 keystore看 CI / 本地打包脚本不是 debug.keystore
1.1.2versionCode 递增对比上一版 APK商店 / 渠道不接受回退
1.1.3versionName 与 changelog 一致人工对照客户 / 审核能对上
1.1.4签名方案apksigner verify --verbose至少 V2;目标商店若要求 V3 则一并满足
1.1.5包名与渠道登记一致对比控制台包名、签名指纹未变(除非刻意迁移)

1.2 Debug / 测试残留

#检查项怎么验通过标准
1.2.1android:debuggable解包看 Manifest 或 jadxRelease 为 false
1.2.2测试 Server / 开关stagingtest192.168无硬编码内网地址进 Release
1.2.3调试入口 ActivityManifest + jadx无「隐藏调试页」留在线上包
1.2.4BuildConfig.DEBUG 分支代码检索调试 Toast / 埋点 / 跳过校验 不应在 Release 生效

1.3 权限与隐私(粗筛)

#检查项怎么验通过标准
1.3.1权限是否最小化Manifest 清单不申请用不到的敏感权限(如无关 App 要 READ_SMS
1.3.2隐私政策链接App 内 + 商店页收集个人信息时有 reachable 说明
1.3.3备份策略android:allowBackup含本地敏感数据的 App 谨慎开全量备份
1.3.4导出组件exported="true" 的 Activity/Service/Receiver每个都有业务必要性和权限保护

第 1 轮小结: 这一轮不过,后面扫再漂亮也别上架。


第 2 轮:裸奔代码快检(15~30 分钟)

用 jadx 打开 未加固的 Release APK(或 mapping 对齐的构建产物),配合简单 grep。

2.1 密钥与凭证

#检查项怎么验通过标准
2.1.1API Key / SecretkeysecrettokenAKIA无明文长期密钥
2.1.2对称密钥常量搜 16/32 字节 hex、Base64 长串业务加密钥不放 Java 常量
2.1.3内嵌证书私钥assets / res / raw无私钥文件打进 APK
2.1.4本地数据库密码SQLite / Room 配置非硬编码弱口令
2.1.5OAuth / 支付回调密钥配置类、BuildConfig敏感项走服务端或 NDK + 服务端下发

2.2 日志与崩溃

#检查项怎么验通过标准
2.2.1Log 级别logback / LogUtil 配置Release 非 DEBUG 洪泛
2.2.2日志落盘mylogs/sdcard/ 写文件不默认把请求体、token 写文件
2.2.3崩溃栈外泄自定义 UncaughtHandler给用户看的错误信息不含内部路径 / SQL
2.2.4WebView 调试setWebContentsDebuggingEnabledRelease 关闭

2.3 网络与存储

#检查项怎么验通过标准
2.3.1明文 HTTPManifest usesCleartextTraffic + 代码 URL无核心业务走 http(除非有明确例外并文档化)
2.3.2证书校验自定义 TrustManager / HostnameVerifier无「信任所有证书」
2.3.3敏感 SharedPreferencesMODE_PRIVATE + 是否加密token 等不明文存 SP
2.3.4外部存储下载 / 缓存路径敏感文件不进公有目录

2.4 组件与 Deep Link

#检查项怎么验通过标准
2.4.1导出 Activity 鉴权jadx + adb am start 试跳不能无登录进敏感页
2.4.2Deep Link 参数Intent 处理逻辑无 SQL 拼接、路径穿越
2.4.3FileProviderpaths 配置不过度暴露根目录

第 2 轮小结: 这里查的是 加固替你做不了的事。DEX 加密挡不住「字符串还在业务 dex 里」——只是让别人多看几步。


第 3 轮:云端扫描留报告(20~60 分钟,建议加固前)

一个人扛发版时,第 2 轮容易漏项。我习惯在 安固云 补一轮 防护等级评估漏洞扫描,主要是为了 报告可归档,不是替代自己看代码。

3.1 先登记包名,再上传已签名 APK

站点要求对已登记包名做评估 / 扫描 / 加固。我习惯:

  1. 「包名资产」里添加包名
  2. 「我的 APK」上传 已签名的 Release 包
  3. 防护等级漏洞扫描 提交任务

服务器侧文件大约 48 小时 清理——发版窗口内够用。政企合同禁止上传第三方云的,跳过本轮,走内网方案。

3.2 两种扫描怎么选

类型偏什么我什么时候跑
防护等级评估是否已有壳、对抗项、证书 / 壳识别等想知道「现在裸奔程度」;或加固前后对比
漏洞扫描应用层可改项、密钥 / URL / 接口专扫交付前、大版本上线前

3.3 报告里我会重点看的字段

#检查项动作
3.3.1综合建议 / 风险等级✗ 的高危先修再加固
3.3.2密钥 / 硬编码类命中回到第 2 轮改代码,别指望加壳
3.3.3组件 / 权限 / 网络安全项能改 Manifest 或配置的当场改
3.3.4加固 / 壳相关提示若尚未加固,记下「加固后应改善」的项,留给下一篇验收
3.3.5报告归档HTML 在线查看或 PDF 摘要存一份(外包交付尤其有用)

3.4 扫描 vs 加固的顺序(重要)

推荐:登记包名 → 上传 Release APK → 扫描 → 修代码 → 再加固 → 加固后验收
不推荐:加固 → 扫描 → 发现密钥明文 → 再改代码 → 再加固(多一轮工)

扫描和加固在同一账号里做的好处是:加固前的裸奔报告加固后的防护报告 可以对照,客户问「你们做没做安全处理」时有东西拿。


第 4 轮:加固与上架兼容性预检(10~20 分钟)

即使还没点「加固」,也建议先过一遍,减少加固后闪退返工。

#检查项怎么验通过标准
4.1MultiDex / 64K冷启动 + 主流程无 ClassNotFound
4.2ProGuard / R8 规则Release 包跑全功能反射类、JNI、数据类未误删
4.3壳 Application 兼容minSdk常见 minSdk=21 时,加固平台若要求兼容模式(如保证 Android 8.0+),提交前勾选
4.4Native SO 架构lib/ 目录目标机型架构齐全(arm64-v8a 等)
4.5动态加载 / 插件若有文档化;加固后单独回归
4.6真机 smoke至少 1 台日常机安装、冷启动、登录 / 主链路 OK

第 4 轮小结: 加固不是万能药。混淆配错、MultiDex 问题,加固只会放大排查难度。


可打印总表(收藏用)

复制到 Notion / 飞书即可当发版模板:

【APK 上架前安全自检 — 包名:________ 版本:________ 日期:________】

第 1 轮 包体与上架
  ☐ 正式 keystore    ☐ debuggable=false    ☐ versionCode 递增
  ☐ 权限最小化       ☐ 导出组件已复核     ☐ 隐私政策可达

第 2 轮 裸奔代码
  ☐ 无明文 API Key   ☐ Release 日志收敛    ☐ 无信任所有证书
  ☐ token 不明文 SP  ☐ 无测试环境 URL 残留

第 3 轮 云端扫描(加固前)
  ☐ 包名已登记       ☐ 防护/漏洞扫描已完成
  ☐ 高危项已修复     ☐ 报告已归档 PDF/HTML

第 4 轮 加固预检
  ☐ R8 规则 Release 全通过    ☐ 真机 smoke 通过
  ☐ 已确认 minSdk / 兼容模式  ☐ 准备同一 keystore 做本地重签

签字 / 备注:________________________________

我常用的最短路径(30 分钟档)

时间紧时我只做「最小必做集」:

  1. 第 1 轮 全做(15 分钟)
  2. 第 2 轮 只查密钥 + 日志 + 导出组件(10 分钟)
  3. 第 3 轮 漏洞扫描提交任务,边等边修明确问题(异步)
  4. 扫描报告无阻塞项后 → 普通版加固 → 本地重签 → 按下一篇做验收

站点入口:www.anguyun2026.cn/


边界(避免 checklist 变成迷信)

误区实际情况
扫描通过 = 绝对安全扫描是抽样与规则匹配,不能替代代码 review
加固可以代替修密钥不能;明文字符串仍在,只是更难找
清单打完就能上金融级本文不覆盖 VMP、等保、渗透复测
任何 APK 都能上传公有云合同禁上传的走内网或私有化

结语

上架前安全,我现在的固定口诀是:

先扫裸奔,再谈加壳;报告归档,加固验收分开做。

第 1~4 轮解决「包本身干不干净、该不该现在加固」;加固完成后,用系列用工具检测检测,参考上一篇文章 回答「钱花对了没有」。

试用扫描 + 加固:安固云 APK Guard

欢迎评论区补充:你们发版前 必查但本文没写 的一项是什么?我可以攒进 v2 清单。