VeilSwap
← 全部文章
隐私2026-10-289 分钟阅读

手机钱包的隐私面:三个安卓钱包拆包实测

我们拆了三个安卓钱包的安装包,读它们的清单和代码:没有推送 SDK、没有崩溃上报、备份不交给系统云——但默认节点和权限表差别很大。

手机上只有一类软件同时知道你的地址、余额和 IP:钱包。不是兑换站,也不是浏览器——是钱包,因为它既拿着私钥,又替你发网络请求。所以我们把它拆了。2026 年 10 月 28 日,我们从各自项目的 GitHub Release 下载 arm64 安卓包,解析包内的二进制 AndroidManifest.xml,并在编译后的 Dart 与 Java 代码里搜「会说话的东西」:推送、崩溃上报、分析、备份,以及一个全新安装默认连的节点。

我们拆了什么,静态扫描又看不到什么。

三个包:Cake Wallet 6.5.0(com.cakewallet.cake_wallet,versionCode 6428),APK 130,627,556 字节,解包 2,525 个文件、605,160,712 字节;Monero.com 6.5.0(com.monero.app,6171),75,292,742 字节,同一套代码砍掉大部分币种;Stack Wallet 2.7.1(com.cypherstack.stackwallet,2316),211,733,750 字节,639 个文件、解包 433,735,450 字节。方法有硬边界,只说一次:这是对已发布安装包的静态读取,不是运行时抓包。我们能证明某个库在包里,不能证明它从没连向我们没看的地方,也看不到节点运营方或流动性提供方那一侧留了什么。下面每个结论都是字节数、清单属性或二进制里确实存在的字符串,没有一条是从隐私政策里猜的。 (门罗钱包指南)

泄漏面一:推送通知。

三个包在 firebase/messaging、FirebaseMessagingService、gcm_defaultSenderId、OneSignal、UnifiedPush、ntfy 上全是 0 命中。唯一的通知组件是 flutter_local_notifications,它在设备本地排程。这点重要:推送 token 是绑定 Google/Apple 账号的、按安装唯一且稳定的标识符,而消息元数据本身就暴露了你什么时候醒着、什么时候在线。没有推送 SDK 就没有 token 可漏——但也没人能从网络上把你叫醒,所以应用得自己发现问题。差别正落在这里:Stack Wallet 声明 10 项权限、0 个 service、2 个 receiver;Cake Wallet 21 项权限、8 个 service、11 个 receiver,其中含 RECEIVE_BOOT_COMPLETED、WAKE_LOCK 与 FOREGROUND_SERVICE_DATA_SYNC。Cake 重启后还会继续同步,Stack 不会。 (门罗钱包指南)

泄漏面二:崩溃上报与第三方 SDK。

三个包里都没有 Crashlytics、io/sentry、AppsFlyer、Adjust、Amplitude、Mixpanel。Firebase 只剩下三个异常类名(FirebaseException、FirebaseExceptionMapper、FirebaseApiNotAvailableException)——是依赖残留,不是消息或分析服务。差别在别处:Stack Wallet 里 com/google/android/gms 字符串为 0,WalletConnect 为 0;Cake Wallet 带着 Google Play services 的认证与凭据类(play/core 下 70 条字符串)和 88 条 WalletConnect 字符串,指向 pulse.walletconnect.org、verify.walletconnect.org、rpc.walletconnect.org。WalletConnect 只在你打开 dApp 浏览器时才动,但一旦动了,你的 IP 就到了一个你没选的 relay。崩溃上报会带上机型、系统版本和调用栈;这三个包在本次构建里都没有。 (门罗钱包指南)

泄漏面三:备份。

三个包都设了 android:allowBackup="false" 与 android:fullBackupContent="false"。就这一个属性,决定了助记词会不会顺路进 Google Drive 的备份:关掉自动备份,安卓的云备份服务就对应用数据没有主张。它们改用的是一条你自己导出的、带密码的文件——字符串写得很清楚(backup_service.dart、「Backup password」、「Enter backup password here」、「Incorrect backup password」)。代价也要说清楚:把密钥挡在 Google 存储之外的那个开关,同时意味着手机坏掉而你没导出备份,钱包就跟着一起没了;而把导出的文件传到网盘的人,等于把开发者刚拆掉的风险又装了回去。导出到离线介质,密码与文件分开存放。

泄漏面四:你连的那个节点。

全新安装会解析一个默认主机,而这个主机在每一次钱包查询旁边都看到你的 IP。Cake Wallet 指向 node.cakewallet.com、mempool.cakewallet.com、ohttp.cakewallet.com,DNS 走 DoH:cloudflare-dns.com/dns-query 与 dns.google.com/resolve。Stack Wallet 指向 nodes.nanswap.com、chain.so、chainz.cryptoid.info、mempool.space、api.coingecko.com。两者都带 Tor:Stack 直接打了 libtor_ffi_plugin.so(16,610,776 字节)和 socks5_proxy;Cake 有 torch_dart 绑定与 socks5_proxy,但这个 APK 里没有 tor 二进制,所以要以应用内的 Tor 开关为准,别只看文件列表。Tor 把「谁看到 IP」从节点运营方换成出口节点;DoH 把「谁看到 DNS 查询」从运营商换成 Cloudflare 或 Google。两个都是改善,都不是匿名。Cake 还把兑换方编进同一个二进制(sideShift、StealthEX、SimpleSwap、Trocador、SwapTrade、Exolix、ChangeNOW、LetsExchange),Stack 编入 Exolix、Trocador、ShopInBit、WizardSwap、Nanswap——你按下兑换时,看到目的地址和金额的就是这些名字。 (门罗钱包指南)

泄漏面五:权限表。

Cake Wallet 声明 21 项权限,Stack Wallet 10 项,有意思的是老权限怎么被限定的。ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION、BLUETOOTH、BLUETOOTH_ADMIN 全部带 maxSdkVersion="30",只在 Android 11 及更早存在;WRITE_EXTERNAL_STORAGE 封顶 29。在 Android 12 及以上,BLUETOOTH_SCAN 带 usesPermissionFlags=0x10000,也就是 neverForLocation——应用在告诉系统「我扫描不是为了定位」。现代手机上真正还活着的,是相机、通知、生物识别、网络状态,以及 Cake 上的后台三件套:RECEIVE_BOOT_COMPLETED、WAKE_LOCK、明确的 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS。这该被读成设计取舍而不是丑闻:会在后台同步的钱包必然更频繁地找节点,节点看到的就不是一次查询,而是一串带时间戳的模式。 (门罗钱包指南)

这对一次兑换意味着什么。

对下单表单几乎没影响,对表单周围影响很大。一笔订单要五个字段——兑出资产、兑入资产、金额、收款地址、退款地址——不需要签名;钱包在兑换里什么都不签,所以兑换站的日志政策只是图的一半(另一半我们单独写过)。钱包能控制的那一半是:哪個 IP 与那些地址在收款链上一起出现,以及一个默认节点会不会在 09:00 看到你的全部余额、09:05 看到交易所充值地址。给个量级:2026 年 10 月 28 日 14:12 UTC,本站报价 100 USDT-TRC20 兑 0.14643508 XMR、1,000 兑 1.62493375 XMR、1 XMR 兑 581.25007 USDT、0.05 BTC 兑 6.64115532 XMR(132.82311 XMR/BTC),目录 519 个资产、73 条网络。报价会动,这只是快照,不是承诺。 (转错网络如何找回)

在你自己的手机上花五分钟查一遍。

不需要我们的拆包脚本也能重复。设置 → 应用 → 选中钱包 → 权限:凡不是相机、通知、网络的权限,都值得问一句为什么。再看 设置 → 系统 → 备份,钱包是否出现在自动备份列表里;在的话而你不想,就关掉该应用的备份并自己导出文件。有 adb 的电脑上跑 adb shell dumpsys package com.cakewallet.cake_wallet,grep granted 看真实授权状态而不是清单里的愿望清单;dumpsys 还能看出应用有没有在跑前台服务。想听第二种意见,可看 Exodus Privacy 对同一版本的报告,它独立列出内嵌库。以上都不能证明服务器端行为——只能证明包里有什么。

一句话版本。

在这三个构建里,钱包不是漏的那个环节:没有推送 token、没有崩溃上报、没有云备份开关。剩下的是无聊但决定性的部分——看到你 IP 的默认节点,以及「后台同步的应用产生的是模式而不是一次查询」这件事。先修这一层:打开应用内 Tor 开关,或把钱包指向自己跑的节点;保持自动备份关闭并自己导出加密文件;一个订单一个地址;永远不要把交易所充值地址当退款地址。以上全部是 2026 年 10 月 28 日对三个 APK 的静态读取;版本会变,请对你实际安装的那个构建重跑一遍。 (Tor 换币安全吗)

常见问题

手机钱包会把助记词上传到云端吗?

不是我们拆的这三个构建:Cake Wallet 6.5.0、Monero.com 6.5.0、Stack Wallet 2.7.1 都设了 android:allowBackup="false" 与 android:fullBackupContent="false",安卓的自动云备份拿不到应用数据。备份是你自己导出的、带密码的文件。你要是把那个文件传到网盘或 iCloud,暴露就是你自己的选择,不是钱包做的。

没有推送 SDK,钱包怎么通知我到账?

本地通知。三个都用 flutter_local_notifications 在设备上排程;Cake Wallet 另外声明了 RECEIVE_BOOT_COMPLETED、WAKE_LOCK、FOREGROUND_SERVICE_DATA_SYNC,所以重启后还能继续同步,Stack Wallet 一项都没有。代价是与节点接触更频繁——这就是为什么开 Tor 或自建节点比通知形式更重要。

VPN 足以对钱包节点隐藏我的 IP 吗?

有条件地够。VPN 把你的 IP 换成服务商的,节点看到的是 VPN 不是你——但 DNS 通常是漏水点;这两个钱包里 Cake 会把 DNS 走 HTTPS 发给 cloudflare-dns.com 与 dns.google.com,这等于把观察者搬了个家而不是删掉。Tor 加自建节点才能把节点运营方从等式里去掉;VPN 只是换一家公司持有记录。

准备好换币了吗?

无账户 · 无 KYC · 无邮箱

立即兑换
手机钱包的隐私面:三个安卓钱包拆包实测 — VeilSwap