我把跳转链路追了一遍:这种“APP安装包”可能在用“升级通道”让你安装远控

前言 最近看到一类看起来“正常”的安装包和安装链路不断出现:表面是某个工具或游戏的更新包,实际通过一个“升级通道”再拉下一个隐蔽的 APK 并完成安装,最终往往带着强权限或远控能力。把跳转链路从最外层追到最后一跳,细看几个技术细节后,会发现这并不是普通的自动更新那么简单。把我这次的排查过程、关键发现和应对建议整理在这里,供大家在遇到可疑安装包或安装行为时参考。
我怎么追踪的(方法与流程)
- 初始样本:通过广告/第三方下载页拿到一个“安装包”链接(后缀通常是 .apk 或跳转到 HTML)。
- 捕获跳转链路:用浏览器 devtools、curl -I、或者 Burp Suite / mitmproxy 拦截 HTTP(S) 请求,记录所有 3xx 重定向、跳转页面中的 meta refresh / JS 动态跳转、以及 iframe / form 提交。
- 下载并比对文件:把所有跳转链路里出现的 APK 都下载下来,比较文件名、MD5/SHA256、签名证书、包名(package name)。
- 静态分析:用 jadx / apktool 反编译,查看 AndroidManifest、请求权限、内嵌的第三方库、常见字符串(域名、API 路径、类名如 RemoteService、Accessibility 等)。
- 动态验证:用 Android 模拟器或真实机(在受控环境,关闭隐私账号),抓包(mitmproxy)观察安装过程是否有二次下载、是否有接口注册、是否发起远程命令请求。
- 检查安装来源:在设备上查看应用的 installer package(getInstallerPackageName / Settings -> Apps -> 查看“安装来源”),看是否由 Play 商店以外的安装器触发。
关键发现(为什么叫“升级通道”)
- 表面 APK 只是一个“引导器”:很多样本本身体积小、功能简单,主要职责是做页面展示、权限诱导、或通过 WebView/JS 打开下载链接,真正的功能性 APK 在链路后面。也就是“升级通道”——先给用户一个看起来像更新的交互,再偷偷拉下真正的主程序。
- 二次下载并静默或半静默安装:引导器会向一个指定域名请求下载第二个 APK。某些情况下,它会使用 Android 的 ACTION_VIEW 调用系统 APK 安装界面(需要用户确认);更隐蔽的实现会尝试借助已存在的安装器(某些手机厂商自带的安装服务)、利用反射调用 PackageInstaller API,或利用 Accessibility 权限模拟点击来完成安装。
- 签名与包名不一致:引导器和主 APK 往往签名不同,包名也不同。通过对比签名可以发现这类“分包链路”并非同一开发者的正常更新流程。
- 权限与能力升级:主 APK 在安装后请求大量敏感权限(Accessibility、Device Admin、SYSTEMALERTWINDOW、读写存储、录音、读取短信、拨打电话等),并包含用于远程控制或持久化的代码(动态加载 dex、反射调用、使用 WebSocket/长连接与 C2 服务器通信)。
- 常见技术栈:WebView 动态注入 JavaScript、利用 okhttp/retrofit 进行二次下载、采用加密字符串或简单混淆隐藏 C2 域,使用 native 库(.so)做关键逻辑或反检测。
一个典型跳转链(简化示例) 1) 广告或第三方页面 -> 点击后重定向到中间页面(tracking/click)。 2) 中间页面 -> 返回带参数的下载页面(可能通过 302、meta refresh、JS)。 3) 下载页面 -> 提供第一个 APK(引导器)或直接触发系统安装对话。 4) 引导器安装并启动 -> 在 WebView 中加载远端配置,解析出“升级包”URL。 5) 引导器下载主 APK -> 根据策略触发安装(可能需要用户确认,或通过已获得的权限绕过确认)。 6) 主 APK 安装完成 -> 启动并申请高权限,连接 C2,开始控制或数据窃取。
具体可疑行为与检测线索(IoC 思路)
- 文件层面:下载到的多个 APK 的签名不一致;APK 中含有明显的 C2 域名、IP、长连接地址;classes.dex 或 lib 中包含 “RemoteService”、“Accessibility”、“device_admin”等关键词。
- 网络层面:安装或第一次启动时对未知域名发起大量请求、上传设备信息(IMEI、Android ID、联系人、SMS 列表)或建立 WebSocket/长连接。
- 设备层面:应用请求或获取 AccessibilityService、申请设备管理员、显示悬浮窗并模拟点击、在后台静默下载并触发安装。
- 用户界面:首次启动引导页面异常强调“必须升级/安装新版以继续使用”,并带有模糊的权限解释或诱导用户勾选“允许未知来源”。
用户自查与排查步骤(非技术/普通用户可操作)
- 在安装后但未信任前:暂停并不要点击安装确认。如果是意外下载,直接删除 APK 文件并清除浏览器缓存/历史。
- 检查应用安装来源:设置 -> 应用 -> 在安装的可疑应用中查看“安装来源”或“安装权限”,如不是 Play 商店则提高警惕。
- 查看权限:设置 -> 应用 -> 权限,检查是否有 Accessibility、设备管理员、显示在其他应用上方等权限;若有可疑项,立即撤销。
- 使用安全软件做进一步扫描(选择声誉良好的厂商)。
- 若怀疑已被远控:断网(关闭 Wi‑Fi 和移动数据),将可疑应用禁用或卸载;在无法卸载时,可尝试通过 Safe Mode 卸载或在电脑上用 adb uninstall(需要调试模式)执行卸载命令:adb shell pm uninstall -k --user 0 <包名>。
- 最后一招:备份重要数据后重置手机为出厂设置(factory reset)。对于高度怀疑的场景,这往往是最安心的清理方式。
给开发者与普通用户的建议(能做的防护)
- 普通用户:
- 尽量通过官方渠道(Google Play、厂商应用商店)安装应用。
- 关闭“允许来自未知来源”的全局开关,给每个安装来源单独授权时保持谨慎。
- 遇到要求 Accessibility/Device Admin 的应用,多问一句:这个功能真的需要这些权限吗?
- 对包含“必须更新/安装才能继续使用”的强制性提示保持怀疑。
- 应用开发者/安全研究者:
- 若你的分发链需要二次下载,保证所有下载包都由同一签名并在流量中进行签名验证(签名校验、checksum、TLS pinning)。
- 在安装器或更新逻辑里不要把“引导器”和“主程序”分割为不同签名的独立 APK,避免被恶意替换。
- 对第三方 SDK 的安装行为进行审计,避免引入会请求高权限或动态加载未签名代码的 SDK。
结语 这类看起来像“升级包”的链路,核心风险在于:第一步给你建立起信任(这是个更新),第二步通过另一个通道把真实功能拉进来(可能是远控/强权限模块)。当追踪跳转链路时,签名不一致、二次下载、可疑权限申请和与未知域名的长连接是最直接的红旗。遇到可疑情况,先断网、撤销关键权限、卸载并彻底查验,必要时恢复出厂设置并更换重要账号密码。