iOS 可以几行代码绕过系统代理, 为什么大家都不这么做?

2020-11-24 10:32:27 +08:00
 FaiChou

昨天经过测试, 发现这样的代码, 可以绕过系统代理:

let sessionConfig = URLSessionConfiguration.default
var proxyDict = [AnyHashable : Any]()
sessionConfig.connectionProxyDictionary = proxyDict // 主要是这一行
let session = URLSession.init(configuration: sessionConfig, delegate: nil, delegateQueue: OperationQueue.current)
// 网络请求

普通的抓包工具(应用层抓包)是抓取不到请求的, 只有 wireshark 这种作用在上层协议的工具才可以.

为什么要绕过系统代理? 可以避免 MITM, 手机上现在很多软件可以 hack 其他软件, 比如圈 X, 在收到网络请求时候可以对请求进行更改, 或者修改 body 信息.

既然开发者可以一行代码来 bypass 绕过系统代理, 为什么不做呢? 猜测如下两点:

  1. 网络请求不使用 URLSession, 用其他的网络请求框架比如 Alamofire 没有这功能
  2. 软件没必要绕过系统代理, 有些场景是要考虑系统代理的

我不是 iOS 开发者, 目前只能猜测以上两条. 希望专业的朋友指正.

延伸自这个帖子: /t/715477

16637 次点击
所在节点    iDev
62 条回复
mxalbert1996
2020-11-24 11:14:56 +08:00
我用几行代码就可以恶心用户,为什么不这么做?
FaiChou
2020-11-24 11:16:45 +08:00
@zycode277 #18

@Leonard #17

A 设备连接在局域网下, 通过 B 设备(同一局域网下)的代理服务, 访问互联网. 这种情况作为开发者还是不用考虑了, 除非你这 app 需要特定 VPN 的情况. 而且, 我的例子代码, 是可以让它成功请求的, 只是在手机系统上的其他软件就看不到.
weizhen199
2020-11-24 11:18:37 +08:00
加个选项呗
yov123456
2020-11-24 11:20:48 +08:00
surge 照样能抓到,走 tun 分析包头的
FaiChou
2020-11-24 11:21:03 +08:00
@mxalbert1996 #21
@GM #20

bypass system proxy 为啥会恶心用户自作聪明? iOS 下有个第三方微博 VVebo, 应该就是用的这种方法规避 MITM 抓包. 对用户来说一点感觉没有, 即使我开着全局代理, 也不影响它正常请求. 但对于想要抓包的人, 就需要多做点准备了.
Lax
2020-11-24 11:22:07 +08:00
什么理论? proxy == MITM ?
icyalala
2020-11-24 11:24:08 +08:00
在 M1 Mac 上已经一览无余了,管你怎么搞。。
FaiChou
2020-11-24 11:28:26 +08:00
@Lax #26 可能表达有误, 大家都能懂就行. proxy 代理, 在 iOS 上通常以 V 批 N 形式存在, MITM 可以解析 https 请求.
also24
2020-11-24 11:31:15 +08:00
@FaiChou #25
如果 『系统代理』这个功能的存在,只是为了抓包做服务,那大可以用各种手段规避跳过。

但是这里有一个问题:
『系统代理』这个功能,为什么会存在?只是为了方便抓包么?
SingeeKing
2020-11-24 11:31:35 +08:00
真要防止被抓包正确做法不应该是 HTTPS + SSL Pinning 吗,就算再考虑防止 SSL Kill Switch 再加一层应用加密就好了,为什么要直接禁止用户用代理(楼主做法还是好的,银行那种不用 bypass 而是检测到用代理直接弹窗让你关才是最恶心的)

另外,我个人觉得 SSL Pinning 其实也不是很好,因为某些特殊的情况确实必须让网络走指定代理并且信任根证书做审计……
Lax
2020-11-24 11:31:52 +08:00
@FaiChou MITM 已经是个专用名词了,不建议滥用。

Google Drive 的 macOS 客户端不尊重系统的 proxy 设置,非常恶心,不开全局 VPN 几乎不能用。
gefranks
2020-11-24 11:33:44 +08:00
最烦这种不按套路出牌的歪门邪道, 我这里有个东西,用了 3 个不同的库, 分别要在 java 本身, 源代码, 运行的 profile 里设代理,反胃中
weixiangzhe
2020-11-24 11:35:45 +08:00
我知道支付宝和银行 app 都有做
lululau
2020-11-24 11:36:15 +08:00
mitmproxy 透明模式轻松抓
wwqgtxx
2020-11-24 11:38:31 +08:00
因为有很多的公司网络就是要设置系统代理才能访问外网,你是要把这些用户都赶走么
ooxxcc
2020-11-24 11:44:45 +08:00
我用几行代码就可以让一小部分正常用户无法使用,还可以给更小一部分不正常用户增加抓包的麻烦程度,为什么不这么做呢?
FaiChou
2020-11-24 11:50:26 +08:00
@wwqgtxx #35
@ooxxcc #36
用这个方法并不会影响正常用户使用. 即使他用设置系统代理, 也能使用.




@lululau #34 是的, 我用的就是 mitmproxy client 配合电脑上的 mitmproxy 可以抓取. 它从 tcp 层进行抓包.


@Lax #31 macOS 下要分开讨论, 的确很多软件即使开了全局代理也没办法, 只能借助 Surge 或者 Proxifier 等工具才可以.
Rekkles
2020-11-24 11:53:25 +08:00
0.01%的用户的恶意行为 要其他 99.99%的用户买单的代码
FaiChou
2020-11-24 11:55:25 +08:00
@Rekkles #38 请看我的补充, 不会影响用户正常使用.
GM
2020-11-24 11:55:53 +08:00
@FaiChou
对想抓你包的人来说,你加一万行代码都没用,照抓不误。
对需要设置系统代理才能上网的用户来说,他想骂娘。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/728603

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX