V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shiguiyou
V2EX  ›  Android

问下安卓如何防止 root 下抓包, app 接口请求并没有做加密措施

  •  
  •   shiguiyou · 2021-09-16 18:14:03 +08:00 · 13895 次点击
    这是一个创建于 1167 天前的主题,其中的信息可能已经有所发展或是发生改变。

    要改接口的话,加密每一个接口改动比较多,隐私整改需要快速上线

    第 1 条附言  ·  2021-09-16 20:51:22 +08:00
    工信部最近查 app 的“隐私整改”(权限之类的),我们是免费阅读 app,然后领导的意思是查我们的 app 的时候发现 root 下数据传输是明文数据,对用户不好。应用已经存七八年了,改接口的话时间上来不及,领导要早点上线
    第 2 条附言  ·  2021-09-16 21:07:06 +08:00
    目前就是用的 https,但是由于项目时间久,架构老,不统一,也是才接手的项目,改动所有接口有点危险,还要全量测,跟后端配合,已经被暂时否定这个方案了
    第 3 条附言  ·  2021-09-17 20:41:15 +08:00
    找到一个快捷方法:禁止代理
    connection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);
    如果只是防止抓包应该有效果,明天有空再看下信任证书,证书固定啥的方法
    75 条回复    2021-09-26 11:43:45 +08:00
    SenLief
        1
    SenLief  
       2021-09-16 18:16:39 +08:00
    解锁了 root 的手机不能运行。
    MoeMoesakura
        2
    MoeMoesakura  
       2021-09-16 18:18:02 +08:00
    @SenLief 不现实:MagiskHide
    rbq123456
        3
    rbq123456  
       2021-09-16 18:21:27 +08:00
    可以在 app 内加入一个 https 证书,不信任系统证书。
    ch2
        4
    ch2  
       2021-09-16 18:23:41 +08:00
    安卓处处都有内鬼,IOS 越狱了也一样,frida 了解一下
    除非你自己搞 tcp 协议+非常恶心人的加密方法
    1018ji
        5
    1018ji  
       2021-09-16 18:24:30 +08:00
    双向认证先整下

    后端限制下 IP,弹验证中心
    SenLief
        6
    SenLief  
       2021-09-16 18:24:50 +08:00
    @MoeMoesakura 那就没啥办法了,抓包模拟的也算是正常的操作,这怎么识别。除非不认可系统的证书。
    PMR
        7
    PMR  
       2021-09-16 18:26:03 +08:00 via Android
    写死证书 hash 不对应不连接


    不方便证书迭代
    AoEiuV020
        8
    AoEiuV020  
       2021-09-16 18:26:45 +08:00
    不可能的,无论如何实在不行人家也可以在路由器抓包,
    locoz
        9
    locoz  
       2021-09-16 18:27:53 +08:00
    你要说防非 root 环境下的抓包还可以,root 环境下的抓包你就别做梦了,随便就干翻...即使是腾讯维纳斯那种外面套层私有协议的做法,也只能是缓解一下,真要搞的话花点时间一样能搞。
    zoharSoul
        10
    zoharSoul  
       2021-09-16 18:30:31 +08:00
    不可能, 人家大不了在路由器抓
    XiLingHost
        11
    XiLingHost  
       2021-09-16 18:31:17 +08:00
    每次会话从服务端生成一个代理解密的一次性二进制文件,写死证书哈希
    deplivesb
        12
    deplivesb  
       2021-09-16 18:36:06 +08:00
    除非你只信任特定的证书,连系统证书都不信任,否则无解吧
    efaun
        13
    efaun  
       2021-09-16 18:36:51 +08:00
    自建协议
    ctro15547
        14
    ctro15547  
       2021-09-16 19:04:23 +08:00
    没加密想抓总有办法的 建议加班加密
    est
        15
    est  
       2021-09-16 19:06:40 +08:00
    > app 接口请求并没有做加密措施

    就这一条就已经死刑了。别想办法了。建议放弃。不用 root 都能直接抓
    ikas
        16
    ikas  
       2021-09-16 19:29:16 +08:00
    这种需求就不现实
    starsky007
        17
    starsky007  
       2021-09-16 19:35:58 +08:00 via Android   ❤️ 1
    没人关注楼主用途吗?什么“隐私整改”?
    deavorwei
        18
    deavorwei  
       2021-09-16 19:45:45 +08:00   ❤️ 2
    电脑开热点给手机不就能抓了 ~
    jim9606
        19
    jim9606  
       2021-09-16 19:47:23 +08:00   ❤️ 1
    哪家隐私整改会要求这个,上 https 不就完了?
    yolee599
        20
    yolee599  
       2021-09-16 19:49:50 +08:00 via Android
    手机抓不了还能直接在路由器抓
    2i2Re2PLMaDnghL
        21
    2i2Re2PLMaDnghL  
       2021-09-16 19:53:33 +08:00
    ssl pinning
    到底是谁让你隐私整改,你就算自己设计协议,都 root 了直接 hook 函数不好吗?
    sadfQED2
        22
    sadfQED2  
       2021-09-16 20:16:18 +08:00 via Android
    应该不是隐私整改吧,我们最近也在隐私整改,但是整改的是所有日志,数据库内容,传输层只要上了 https 就没问题
    cweijan
        23
    cweijan  
       2021-09-16 20:42:52 +08:00
    想要完全屏蔽是不可能的, 只能增加抓包难度, 最好的方式就是强制验证 HTTPS 证书.
    shiguiyou
        24
    shiguiyou  
    OP
       2021-09-16 20:56:00 +08:00
    @starsky007 append 了,领导说抓包发现是明文,我也不知道是领导的意思还是工信部的意思,不管谁的意思,都要改...
    shiguiyou
        25
    shiguiyou  
    OP
       2021-09-16 20:56:34 +08:00
    @sadfQED2 分配到我的任务就是数据传输加密,其他小伙伴是其他的隐私问题修改
    lait
        26
    lait  
       2021-09-16 20:56:57 +08:00 via Android
    你把请求参数简单加密一下,不就非明文了嘛。隐私整改检测的时候它也不会去破解你的加密算法。
    ysc3839
        27
    ysc3839  
       2021-09-16 20:57:37 +08:00 via Android
    所以真实情况是程序和服务器通信没有加密吗?那改用 https 不就好了?
    ysc3839
        28
    ysc3839  
       2021-09-16 20:58:39 +08:00 via Android
    @MoeMoesakura #2 MagiskHide 已有办法检测,还有 hardware attestation 。
    shiguiyou
        29
    shiguiyou  
    OP
       2021-09-16 21:00:11 +08:00
    @jim9606 就是 https,但是抓包工具可以在 root 的情况下抓到明文数据,接口没加密导致
    shiguiyou
        30
    shiguiyou  
    OP
       2021-09-16 21:01:33 +08:00
    @lait 改接口来不及,因为 app 存在时间长,换了十几波人了,架构老,还不统一,还需要重新全量测试
    WebKit
        31
    WebKit  
       2021-09-16 21:02:56 +08:00 via Android
    不 root 都能抓包啊
    WebKit
        32
    WebKit  
       2021-09-16 21:03:51 +08:00 via Android
    @PMR hack 下改一下就可以了
    x86
        33
    x86  
       2021-09-16 21:06:42 +08:00
    wooyuntest
        34
    wooyuntest  
       2021-09-16 21:12:00 +08:00
    即使你改了接口,那以前的老版本全部连不上服务端了? 这个代价能接受吗?
    shiguiyou
        35
    shiguiyou  
    OP
       2021-09-16 21:13:48 +08:00
    @wooyuntest 对,不能改...
    wooyuntest
        36
    wooyuntest  
       2021-09-16 21:15:53 +08:00
    @wooyuntest 如果能接受这个代价的话,可以新发一个版本。app 中将所有 http 请求的 header 、body 和后端约定好格式以及加密方式,将加密后的密文通过 https 发送到后端,后端再接口上部署一个 apigateway 负责解密发送过来的密文以及转发给真正的后端接口。
    这个方案能在不改动服务端的情况下,完成这个需求,但还有许多细节需要考虑,比如加密密钥的生成,每个请求一次一密,每次请求加密密钥的传输等等问题。
    jim9606
        37
    jim9606  
       2021-09-16 21:21:48 +08:00   ❤️ 3
    只要你是用正常的方式使用 HTTPS,使用系统证书库且 TargetAPI>=24,所谓的 root 下明文只是被 root 篡改系统证书存储区后 MITM 了,传到网上流量依然是加密的,服务器可以禁止明文 HTTP 访问。

    骗领导的方法是将报文用 base64 编码后用一个硬编码密钥 xor 一下,服务器还是得加个 api proxy 。

    别的方法我就不推荐了,通过 root 安装证书搞 MITM 这种事都不应该是常规 APP 该去预防的事。其他诸如 HPKP 还有硬编码信任根都有不小的运维风险。
    HarryQu
        38
    HarryQu  
       2021-09-16 23:54:15 +08:00
    工信部要求你们整改时,会给你们个文档,说明整改内容。

    首先我们明确下需求:我们不是为了防止 Root 抓包,而是为了绕过工信部的审核。

    那么问题在哪里呢?是在用户登录页面。工信部说的应该是是用户登录时,用户账号、密码是明文传输。

    事实上你需要做的只是和服务器升级下接口即可,例如只需要将登录时账号、密码经过编码后,传递给服务器,服务器解码后,登录即可。

    工信部也是委托第三方做的检测。第三方检测很恶心,它还会检测用户登录页面,然后弹出一个透明 Activity,骗用户输入账号、密码,还会要求你做防劫持。
    HarryQu
        39
    HarryQu  
       2021-09-16 23:55:21 +08:00
    我们 App 当时是被粤通网检测到违规。
    coolcoffee
        40
    coolcoffee  
       2021-09-17 00:32:18 +08:00
    我觉得后端加一个网关或者中间件,然后前后端都用 RSA 单向公私钥加解密。没有什么是绝对安全的,但这个已经拦住绝大部分只会使用 Charles 、Fiddler 的工具小子了。

    然后实施起来的话,接口做好新老版本共存机制。先尝试走加密协议,要是出错了就降级到明文协议。 这样至少过整改够了,万一整出问题还能有个补救。
    illl
        41
    illl  
       2021-09-17 01:17:58 +08:00 via iPhone
    post 的内容用 aes 加个密,后端再解密。不过需要考虑后端的开销
    eason1874
        42
    eason1874  
       2021-09-17 05:02:35 +08:00
    非侵入式的改造:套一个 API 网关去实现加密和鉴权

    APP <SSL 双向认证、应用级加密> API 网关 <解密、内部通信> 原本真实 API 地址
    MoeMoesakura
        43
    MoeMoesakura  
       2021-09-17 08:50:34 +08:00
    @ysc3839 那确实,但是要是还有绕过 magiskhide 的法子呢(?)
    硬件确实好,但是成本略高(?)
    MoeMoesakura
        44
    MoeMoesakura  
       2021-09-17 08:51:54 +08:00
    @MoeMoesakura 呸,比 magiskhide 再高明一点的绕过
    ysc3839
        45
    ysc3839  
       2021-09-17 08:53:32 +08:00 via Android
    tanranran
        46
    tanranran  
       2021-09-17 08:55:16 +08:00
    只要数据不加密,安卓不管任何版本都有办法抓包。判断 root 什么之类的,都可以绕过的

    最好的办法就是数据流二次加密
    weixiangzhe
        47
    weixiangzhe  
       2021-09-17 08:56:05 +08:00 via iPhone
    银行和支付宝我都试过,银行类 root 后抓的了,支付宝官方页面貌似有校验 https 证书搞不定,可以可以试试
    meshell
        48
    meshell  
       2021-09-17 09:05:00 +08:00
    我上次直接 root 用 frida 都不用抓包
    sadfQED2
        49
    sadfQED2  
       2021-09-17 09:08:56 +08:00 via Android
    @shiguiyou 我们目前的整改方案
    1.数据库储存内容加密
    2.传输层 ssl pin
    timethinker
        50
    timethinker  
       2021-09-17 09:59:50 +08:00
    这个应付一下领导就行了,技术上实现绝对的安全是不可能的,只要你的 APP 在我的设备上能跑,加不加密都没啥区别,只是时间问题。终端的安全问题不需要考虑在内,https 也只是为了防止中间人。
    MoeMoesakura
        51
    MoeMoesakura  
       2021-09-17 10:06:33 +08:00
    @ysc3839 thx,我 naive 了
    kiotech
        52
    kiotech  
       2021-09-17 10:18:23 +08:00
    不防抓包,只保证请求内容不被串改便可
    Visitor233
        53
    Visitor233  
       2021-09-17 10:28:05 +08:00
    其他程序不知道,但我在非 root 下抓过微信小程序的包。开发时忘了写日志,接口出现异常直接抓包复原现场。
    acbot
        54
    acbot  
       2021-09-17 10:31:44 +08:00
    你只能是自己实现一套传输协议不使用 http 或者是内容加密后基于 http 传输,因为常规的 ssl 只能保证终端设备和服务器之前的传输安全,到你本机已经解密了并且设备本身又是 root 过的所以要抓 http 包很容易。
    fregie
        55
    fregie  
       2021-09-17 10:39:08 +08:00
    @rbq123456
    可以在 app 内加入一个 https 证书,不信任系统证书。
    最简单可靠的方案。
    2bNot2b
        56
    2bNot2b  
       2021-09-17 10:45:26 +08:00
    @x86 #33 大佬!
    geshenjibigmail
        57
    geshenjibigmail  
       2021-09-17 10:55:51 +08:00
    需要安卓保活吗?最强黑科技
    azhangbing
        58
    azhangbing  
       2021-09-17 12:43:55 +08:00
    我们是双向证书 签名得逻辑写 SO 里 SO 用 LLVM 混淆 ,OKHTTP 可以配置 OkHttpClient client = new OkHttpClient().newBuilder().proxy(Proxy.NO_PROXY).build (); 系统的可以 URL url = new URL(urlStr);
    urlConnection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY); 用这个属性 Charles finder 这种中间人代理抓不了包 wireshark 还是可以抓的
    azhangbing
        59
    azhangbing  
       2021-09-17 12:49:44 +08:00
    如果是安全性再高就检测 frida,,这就是后话了 看你们 APP 的安全级别有多高了 银行应该都会检查的
    clf
        60
    clf  
       2021-09-17 13:03:12 +08:00
    这个不可能做到无法检测的,不过简单点的做法就是 https 请求里的 body 内容二次非对称加密,从客户端到服务器间的通信全是传递的密文。

    不过解密的过程在客户端,理论上 root 了也是可以拿到的。
    siyehua
        61
    siyehua  
       2021-09-17 14:31:07 +08:00
    你权限类相关,跟你的请求一点关系都没有。工信部是查你调用某个权限相关的声明或者 api 调用,然后被抓住了。并不是分析你请求的数据有没有相关隐私
    skye
        62
    skye  
       2021-09-17 14:57:10 +08:00
    服务端不配合的话。。。你咋改都没用啊,服务端只能识别明文。
    palxie
        63
    palxie  
       2021-09-17 16:57:21 +08:00
    感觉你们搞错了方向. 所谓的隐私数据, 应该是用户的联系人短信, 手机 iemi, mac 等这些数据, 好好看下这些有没有读取, 还有一个整改是获取用户的必要信息, 这个看你的 app 就清楚了
    GOURIDE
        64
    GOURIDE  
       2021-09-17 18:17:21 +08:00
    不 root 都能抓包呢?更别说 root 后了
    shiguiyou
        65
    shiguiyou  
    OP
       2021-09-17 18:58:58 +08:00
    @palxie 都有,只不过我分配到我的任务就是传输数据安全,其他人做的是你说的那些
    kings0527
        66
    kings0527  
       2021-09-18 10:30:53 +08:00
    永远无法防止
    只能提高门槛
    https 仅仅防止中间人
    证书信任 仅仅防止不会过 ssl pinning 的人
    证书校验 仅仅防止没有逆向能力的人
    参数加密 仅仅防止逆向能力很低的人
    自写协议 仅仅防止逆向能力不高的人

    所以 看情况 看成本 加策略
    不要为了防止抓包而防止抓包
    应该是 你为什么要防止抓包???

    防爬虫???那可以加请求频率限制 可以加风险等级评估
    比如是不是正常用户????是不是正常手机???是不是正常操作流程???

    防攻击???
    那可以加 web 防火墙 可以提高自己 router 容错率

    防刷推广安装量???
    加溯源 加留存 加异常打点 建数据模型观察

    还有防止什么呢?我暂时想不到
    shiguiyou
        67
    shiguiyou  
    OP
       2021-09-18 10:56:26 +08:00
    @kings0527 我知道防不住,任务哎,不做咋办... 先混过检查吧
    jetpy
        68
    jetpy  
       2021-09-18 11:42:41 +08:00
    应用内开一个本地端口,应用内所有请求转发至该端口,该端口所有请求加密转发至远程端口,远程端口解密后转送至标准地址, 中间加密转发解密可参考使用现有某某不能说系统
    kings0527
        69
    kings0527  
       2021-09-18 11:57:31 +08:00
    @jetpy 第一句话就木桶定律了 等于做了一个高级防盗门但是窗户没关
    jetpy
        70
    jetpy  
       2021-09-18 14:26:29 +08:00
    @kings0527 这种请求都没有出应用, 应该是已经好一些了。 那如果再要进一步的话就是把相关协议加密代码集成到 app 里, 直接封装 socket, 使用封装的 socket 发送 http 请求,使用这个新的发送 http 请求的包替换系统已有的所有原包
    liuidetmks
        71
    liuidetmks  
       2021-09-18 22:38:57 +08:00 via iPhone
    @starsky007 工信部大规模检查 app,要求很苛刻,都在整改,因此还产生一些咨询公司,一个 APP 一年十多万 给你咨询建议几次
    liuidetmks
        72
    liuidetmks  
       2021-09-18 22:42:24 +08:00 via iPhone
    证书是一个方面,整个 http 参数加密传一次,简单的话就 aes,复杂就 ecc rsa
    zhanlanhuizhang
        73
    zhanlanhuizhang  
       2021-09-20 17:59:47 +08:00
    接口加密,使用拦截器呀。怎么可能每个接口都写一遍。一般现在采用 RSA+DES 。
    lushan
        74
    lushan  
       2021-09-20 20:43:25 +08:00
    使用拦截器是工作量最小的解法。 毕竟是个对抗的过程,没有一劳永逸的方法
    Jione
        75
    Jione  
       2021-09-26 11:43:45 +08:00
    没办法.攻防无绝对,防不了的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1067 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:32 · PVG 06:32 · LAX 14:32 · JFK 17:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.