【外评】Python 与苹果应用商店的拒绝作斗争
Python 3.11 升级到 3.12 后,苹果应用商店拒绝了一些 Python 应用程序。这导致 Eric Froemling 提交了一份针对 CPython 的错误报告。这反过来又在 Python 开发者中引发了一场有趣的讨论,即项目愿意在多大程度上适应应用商店的审核流程。开发者们很快达成了共识,解决方案可能会在 Python 3.13 中出现。
目前的问题是,苹果的 macOS 应用商店会自动拒绝包含 “itms-services “字符串的应用程序。这是应用程序要求苹果 iTunes Store 安装另一个应用程序的 URL 方案。通过苹果 macOS 商店发布的软件是沙盒软件,禁止沙盒应用程序使用包含 itms-services
方案的 URL。该字符串位于 Python 标准库中的 urllib 解析器中,但应用程序可能永远不会实际使用 itms-services
处理程序。
当然,苹果公司并没有这么直接地向 Froemling 解释这一点。当他就被拒绝一事向苹果公司提出上诉后,苹果公司终于告诉他,parse.py
和 parse.pyc
是违规文件。他说,在此之后,问题就不难找到了:
现在回想起来,我很懊恼之前没有想到在 Python 上对
itms-services
进行全文检索,或者偶然发现其他一些人遇到过这种情况。
Russell Keith-Magee 于 6 月 17 日在 Python 核心开发讨论区发起了讨论。他想知道 “应用程序商店可接受 “是否应该成为 CPython 的设计目标,或者是否应该由为应用程序商店生成应用程序捆绑包的工具来解决这个问题。
偏执而难以捉摸
Keith-Magee 在最初的问题中指出,苹果公司的审查流程是应用程序商店审查流程中最 “偏执和难以捉摸 “的,但其他应用程序商店也有 “完全不透明的验证和验收流程”。一种解决方案可能是混淆违规字符串以通过审核,但这可能 “导致混淆军备竞赛”,而且不能保证这将是该项目最后一次解决应用程序验证问题。他说,另一种选择是将其视为分发问题,交给 Briefcase, py2app,和buildozer 等工具来解决。他说,由于 CPython “开箱即不支持 “Android 或 iOS,因此传统上他们不得不给 CPython 打补丁。但随着 Python 3.13 的发布,这种情况将有所改变,届时无需为这些平台打补丁。
Alex Gaynor 建议项目尝试一种 Keith-Magee 没有提出的方法,这种方法的灵感来自 Gaynor 使用 cryptography 库的经验。该项目经常收到投诉,称加密库拒绝解析技术上无效但被广泛使用的证书。他说,我们的政策是接受解决这些问题的拉取请求,”前提是这些请求要小,要本地化,而且一般不会太糟糕”。但他补充说,接受这些补丁的前提条件是有人向第三方(这里指苹果公司)投诉,并获得某种承诺,即他们会对此采取一些措施。他建议,这种变通办法应该有时间限制,以便给用户一个体面的体验,”同时也不能让大公司简单地将其怪异问题外部化到开放源码软件项目中”。
Brandt Bucher 想知道是否允许混淆,或者混淆是否会被视为规避审查程序。这个问题似乎没有人能够回答;Keith-Magee用一个 8 球表情符号和 “稍后再问 “来回答。他补充说,盖诺的方法听起来很有吸引力,但这无异于对着虚空大喊大叫。他说,苹果公司几乎没有上诉程序,Python 项目也没有渠道 “提出我们有理由相信会导致政策改变的投诉”。
Alyssa Coghlan 建议的另一种方法是使用 JSON 配置文件,urllib 将读取该文件来设置模块级属性,”而不是硬编码它对所有相关方案的了解”。这将允许应用程序生成器从配置文件中删除 “itms-services”,而不是直接修补 urllib.py。Keith-Magee 说这可能行得通,但 “对于边缘情况来说,这让我觉得有点矫枉过正”,而这种情况可以通过混淆或发行版级修补来处理。
6 月 20 日,Keith-Magee 写道,他想到了另一种方法:添加一个名为”--with-app-store-patch
“的构建时选项,删除已知有问题的代码。他说,iOS 平台将默认启用该选项,其他平台则禁用。如果开发者打算通过 macOS 应用商店发布应用程序,那么在为 macOS 构建应用程序时可以使用该选项。他建议,该选项还可以接受带有补丁的文件路径,以便在 Python 发布维护窗口关闭后应用商店改变规则时,发行商可以提供更新的补丁。
为自行车棚上色
Coghlan 问现在是否到了 “粉刷配置方案自行车棚(paint a config option bikeshed) “的时候。她说,提议的选项名称既过于宽泛,又过于狭窄。名称中的 “应用商店 “部分过于宽泛,因为它可以包含任何应用商店,而不仅仅是苹果应用商店。补丁 “部分过于狭窄,因为补丁指定的是遵守政策的方法,而不是意图。遵守应用程序商店合规性检查可能还需要其他方法。Keith-Magee 喜欢将 “补丁 “从选项名称中删除的建议,并建议将”--with-app-store-compliance
“的颜色涂得漂亮一些,这样就可以与平台识别互动,从而找出所需的内容。
6 月 25 日,Keith-Magee 对参与讨论者的意见表示感谢,并指出有一个拉取请求可以实现--with-app-store-compliance
配置选项。他在请求中指出,可以在 iOS 或 macOS 以外的平台上使用该选项,但目前还没有这方面的用例。如果一切顺利,Python 3.13 将提供该选项。
令人沮丧的是,像 Python 这样的自由软件项目不得不浪费时间,想方设法绕过不透明的审查程序,以便开发人员能够为非自由平台编写软件。不过,Keith-Magee 和其他 CPython 开发者所采取的方法似乎是为 Python 应用程序开发者提供最佳体验的最省事的选择。几乎可以肯定,这不会是最后一次有项目遇到这样的问题。
本文文字及图片出自 Python grapples with Apple App Store rejections
你也许感兴趣的:
- 【外评】Python 为何如此糟糕…
- 【外评】用 Python 解释 Rust 背后的思想或理念
- Python 版本之间的主要变化摘要
- 【外评】使用不安全的 Python 将速度提高 100 倍
- 谷歌裁掉整个 Python 团队!PyTorch 创始人急得直骂人:“WTF!核心语言团队无可替换”
- 谷歌Python团队全员被裁——负责内部Python所有基础设施、曾对数亿行代码执行自动重构
- 【译文】Python–一种深受喜爱但永远存在缺陷的语言
- 再同意不过了
- 【译文】减轻 Python 打包的痛苦
- 【译文】Python 打包,一年之后:回顾 2023 年的 Python 打包
不只是苹果公司会这样搞鬼。
试试用 PyInstaller 编译 Python 应用程序,同时开启 Windows Defender 实时扫描(默认设置)。如果没有 Defender 的阻止,你甚至无法编译二进制文件。
同样,试试在开启 Windows Defender 的情况下运行 PyInstaller 生成的二进制文件。Defender 会说这是恶意软件,并不会运行它。
两个主要的操作系统平台都不遗余力地阻止你发布和运行 Python 应用程序,这有点像乌托邦。
不仅仅是 Python 应用程序。没有昂贵证书的小开发者也会遇到这种情况。我曾用 MSVC 编译过一个 C 语言程序,它只不过是一个 “Hello, World”,而 Defender 却称它为 Win32/Wacatac 木马。
微软要求的代码签名证书贵得离谱。这是一个由证书颁发者组成的卡特尔。这简直就是抢劫。我们需要类似于 Let’s Encrypt 的代码签名证书。
SignPath 为开放源码软件项目提供免费证书:
https://signpath.org/about/
我们(sqlitebrowser.org)最近开始使用它们来签署我们的 Windows 版本。
卫士称任何东西为 Wacatac。
具有讽刺意味的是,我见过大量真正的恶意软件,它们甚至不会发出丝毫警告。
即使合法的恶意软件被标记为 “Wacatac”,也一定会有一部分用户在谷歌上搜索这个名字,看到多年来(如果不是几十年的话)微软错误地将大量合法软件标记为该病毒,然后在他们的机器上将真正的恶意软件列入白名单,认为微软肯定又搞砸了。我对 MS 这么多年来一直没有解决这个问题并不感到惊讶,只是感到失望。
这就是恶意软件的传播方式。大多数从有问题的地方获取的应用程序都有说明,说要禁用杀毒软件。我明白….,但我不想玩这么糟糕的游戏。
我在工作时用围棋做了一个 for 循环给同事看,结果二进制被标记为恶意软件。
这通常是他们的机器学习病毒扫描仪造成的。出于某种原因,只要是你自己编译的程序,基本上都会被认定为病毒。我想,如果把所有东西都称为病毒,就不会漏掉病毒了。
在游戏开发社区,我们看到有人将特洛伊木马提交到游戏竞赛中。
这与主题无关。
不,是相关的。在没有沙盒的情况下运行未签名的 exes 实际上是有风险的,游戏卡顿就是出现这种情况的一种特殊情况。
可以吗?
好的)
> 不只是 Python 应用程序。没有昂贵证书的小开发者的任何应用程序都是如此。
情况确实如此,我的经验也是如此。
当涉及到小型开发者构建和共享任何东西时,我们生活在一个黑暗的时代,尤其是当你构建的东西是免费的时候。
我停止了更新我的开源 Mac 应用程序,因为我无法证明跨越苹果设置的人为障碍的成本是合理的,这些障碍会确保用户无法运行他们想要使用的应用程序。我还有其他的爱好,在这些爱好中,花钱能给我带来实实在在的商品和利益,而不是为了制造最终能让苹果公司受益的东西而每年随意交税。
我们的开源应用程序也是这种情况。我们使用苹果的唯一原因是,我们的一位用户非常喜欢这款应用,他们负责办理证书。
仔细想想,这真是莫大的讽刺。
超级有趣的是,一个不是你的人可以负责向苹果公司证明你真的是你,这样苹果公司就可以向所有其他用户宣称,他们已经验证了你真的是你,因为他们让你证明了这一点。
这个世界真是太棒了。)
我认为,如果你不想支付开发费用或通过任何障碍,Homebrew 是发布开源 Mac 应用程序的最佳解决方案,前提是你的用户有足够的技术能力使用它。
另一种选择是不对二进制文件签名,并向用户解释他们可以通过右键单击并从菜单中选择 “打开 “来运行它们。
不幸的是,让用户安装 Homebrew 对我来说是一个难以逾越的障碍。尽管 Homebrew 现在有 .pkg 安装程序,但如果用户必须打开终端才能安装任何东西,那就不可能成功。用户通常连终端是什么都不知道。
> 另一种选择是不为二进制文件签名,并向用户解释他们可以通过右键单击并从菜单中选择 “打开 “来运行它们。
我现在就是这么做的,但不幸的是,这仍然是个问题。非 “超级用户 “不会记住 “右键单击”->”打开 “的仪式,因为他们只会双击其他东西。
而且,Gatekeeper 显示的警告也会让用户以为自己的应用程序甚至电脑被破解或黑客攻击了。
你为什么不……每年支付 100 美元来签署你的应用程序?
> 我不再更新我的开源 Mac 应用程序了,因为我无法解释为什么要花钱跨越苹果设置的人为障碍,以确保用户无法运行他们想要使用的应用程序。我还有其他的爱好,在这些爱好中,花钱能给我带来实实在在的商品和利益,而不是为了制造最终能让苹果公司受益的东西而每年缴纳任意的税款。
> 停止更新我的开源 Mac 应用程序,因为我无法证明跨越苹果设置的人为障碍的成本是合理的,这些障碍确保用户无法运行他们想使用的应用程序。
哈,这正是我在 8 年前停止使用 OS X 并在我的旧 Mac book air 上全面使用 Linux 的原因。
这不是我的经验,但也许我做的事情与众不同。我发布了一个电子应用程序。我使用 electron-builder 将其构建为安装程序。我不确定是否设置了任何配置。它被设置为安装在用户文件夹中,而不是系统级别。我的理解是这是允许的,而且可以正常工作。
对 Windows Defender 来说,PyInstaller 二进制文件看起来确实像恶意软件。如果它不这样做,它就会很快成为恶意软件的标准传播方式。不幸的是,每有一个人试图在 Windows PC 上编译或运行来自网络的有效 python 程序,就会有 1000 个恶意软件/木马实例试图感染他们。
理想情况下,代码签名/验证的成本会更低
https://www.reddit.com/r/learnpython/comments/e99bhe/comment…
> 两个主要的操作系统平台都不遗余力地阻止您发布和运行 Python 应用程序
这不仅仅是 Python 应用程序的问题。要通过 Windows SmartScreen 的签名程序,您需要购买证书,或者深度集成 Windows 开发的黄金路径。如果偏离微软认可的路径,你的所有用户都会收到一个可怕的警告。这样做的部分原因是出于安全考虑,但也有主要操作系统推行””开发方式的苦涩滋味。
这足以成为不使用 Windows 或 Macos 的理由。说这些程序是恶意的,完全是谎言。他们没有证明这一点。他们最多只能说程序不受信任或未经验证。但称其为恶意程序就是不实之词,因此属于失信行为。
几个月前,我在 Windows 上构建了 PyInstaller 二进制文件,Windows Defender 完全没有发现问题。
是的,它大部分时间都能工作,但不是经常工作。我用 Pyinstaller 开发过一个跨平台的 PyQt 专有应用程序,用了好几年。签名帮了大忙,但发布过程中还是要把二进制文件提交给一个网站,该网站会用大多数已知的杀毒软件进行检查,以确保我们不会为大多数 Windows 用户发布一个哑弹。有趣的是,有时重建后问题就解决了。
Windows 不是开发人员的平台。它是一个面向普通用户的平台。这还不明显吗?
如果你想要一个工程操作系统,那就用 GNU/Linux。
在使用 WINE(据说有一些拦截器,我和其他几个人都试过)和 PyInstaller 运行无 Windows 构建系统之前,跨平台应用程序将要求开发者在 Windows 本身编译其 Windows 移植。
Windows 是用户所在的地方。不将其作为目标是一个错误的财务决策。
过去 10 年中,我们通过 WINE / Ubuntu 发布了基于 py2exe 的 Win32/Win64 软件,没有任何问题 – 我们没有签署 (https://www.vintech.bg)
感谢您提供的信息,我一直在犹豫是否要引入更多特定平台的工具,因此我坚持使用 PyInstaller。我会看看 py2exe 能否满足我的需求。
让跨平台见鬼去吧。为 Windows 开发会延续有害的生态系统。这跟卖弹药给西内洛亚贩毒集团没什么区别。
有点不同。
是的,当你没有工作时,这是个很容易遵循的建议
我希望有一天我会没有工作!
什么意思?
我的工作是开发跨平台软件,但我们是在 Linux 上开发的。软件可以在 Windows 上运行,但在 Windows 上构建软件是一种折磨,所以我们几乎所有的开发机器都是 Linux 的。
我遇到过很多 Mac 用户,他们无法浏览 Mac 上的文件系统,这让我很不舒服。
我工作的这家价值数十亿美元的公司不明白这一点。我被迫在虚拟 Windows 机器上完成所有开发工作。他们有自己的理由,其中很多都是合理的,但还是很麻烦
你的个性是从 /g/ 下载的?
我觉得这很有趣
> Alex Gaynor 建议项目尝试一种 Keith-Magee 没有提出的方法,这种方法的灵感来自 Gaynor 在密码学库方面的经验。该项目经常收到投诉,称加密库拒绝解析技术上无效但被广泛使用的证书。他说,我们的政策是接受解决这些问题的拉取请求,””前提是这些请求要小,要本地化,而且一般不会太糟糕”。但他补充说,接受这些补丁的前提条件是,有人向第三方(这里指苹果公司)投诉,并获得某种承诺,表示他们会对此采取一些措施。他建议,这种变通办法应该有时间限制,以便给用户一个体面的体验,””同时也不能让大公司简单地将其怪异的问题外部化到开放源码软件项目中””。
用户希望开放源码软件绕过商业软件中的错误,因为开放源码软件的维护者更容易被欺负,而且他们知道向大公司报告错误会直接进入黑洞。
鉴于苹果公司的错误报告系统是个黑洞,这句话似乎是无稽之谈。Pythonistas 的大话一如既往,与现实毫无关联。
我们能在数字平台上实现三权分立吗?
卖手机的也能决定手机上的内容,这实在是太糟糕了。
你是想买没有操作系统的主流手机吗?
我选择苹果作为我手机上应用程序的监护人。有一种平台是由用户来决定手机上的应用,那就是安卓。
虽然我很高兴你可以选择成为数字农奴–为使用土地(设备)向领主付费,但我更愿意选择不成为数字农奴。
这样,你可以选择成为数字农奴,而像我这样的人则可以选择退出。
–
这里的 “农奴 “不是贬义词,而是形容词。苹果公司的行为就像一个封建领主。甚至还声称要保护土地和仲裁纠纷。
为什么你表现得好像安卓系统不存在一样?你可以选择退出 “数字农奴制”。
安卓系统有什么不同?
在某些情况下,人们可以安装去谷歌化版的安卓系统,并通过其他应用商店或直接安装他们想要的任何应用(.apk)。
对于 99.9% 的人来说,安卓和 iOS 在自由度方面几乎是一样的,因为他们只需从 play 商店安装应用程序,并在制造商提供的(且已膨胀的)安卓安装程序上使用谷歌服务。
尽管如此,对于那些关心手机的人来说,能够控制自己的手机并运行 AOSP(一种真正的自由和开放源码软件发行版)、只运行自由和开放源码软件应用程序或安装任何自己想要的应用程序,这在 Android 和 iOS 上是无与伦比的。
你的思路错得离谱,跟你争论也是浪费时间,因为你根本帮不上忙。
当然,那为什么其他使用 iOS 设备的人也要做出同样的选择呢?
那些拥有 iOS 设备的用户可以做出完全相同的选择–购买安卓设备。如果我不想让苹果成为我的监护人,这就是我的选择。
我不明白为什么人们觉得有必要强迫苹果公司采取特定的策略,因为他们并不是垄断者。他们不是城里唯一的游戏,你不需要 iPhone。每个拥有 iPhone 的人都是自己选择的。
人们之所以不喜欢 “如果你想要选择,就选择能给你选择的平台 “这一观点,也许是因为安卓就是一堆垃圾。
即使是在这里,人们也不关心在自己拥有的硬件上运行任何代码的权利,这实在是太可悲了。
你错了,你实际上并不拥有它。
这是不正确的 – 如果您直接付款,您确实拥有您的手机。苹果公司不能拿走你的手机。
至于软件,苹果公司拥有 iOS 系统,并将其授权给您的设备使用。
苹果,这家市值上万亿美元的公司,不需要你为他们糟糕的商业行为辩护。
> 我不明白,既然苹果公司不是垄断企业,为什么人们还要强迫他们采取特定的策略。
根据你的论点,他们___是___垄断。即数字农奴制。因为很显然,安卓属于另一个领域。
>每一个拥有 iPhone 的人都是自己选择的。
我并不想要 iPhone。我是被逼无奈才买的,因为苹果公司不允许在他们的平台上使用任何网络浏览器,除了他们的网络浏览器。因此,如果没有真正的 iPhone 作为开发平台,我就无法为 iPhone 用户提供可用的网站。这绝对是苹果公司强加给全世界的一种滥用、反竞争和低劣的人为限制。我真的宁愿告诉我的用户安装 Chrome 或 Firefox 并使用它们,而不是被迫使用 Safari。这对开发者不利,对他们的客户也不利,不管他们是否知道。
他们不是垄断,而是双头垄断。这是个稍好的位置,但我不知道你如何自圆其说,把消费者的权力交给世界上最大的科技公司。
因为这是一组权衡,而不是严格意义上的更好/更坏?
苹果公司完全有能力生产出一款能运行你自己的软件的手机,而且只需极少的权衡取舍,只是他们不想这么做,因为他们的目的不是为用户赋权,而是创造一类依赖性消费者。
混淆视听似乎是让你的开发者账户被暂停的好办法。我怀疑苹果所做的远不止是对磁盘上的二进制文件进行基本的静态分析。
很高兴他们选择了配置选项。
要看情况。实际 “违反 “的规则并不是应用程序不能包含 “itms-services “字符串。而是
也就是说,应用程序不能试图触发另一个 App Store 应用程序的安装。问题中的应用程序并没有这样做,只是基本的检查对于它应该检查的规则来说是不称职的,而且审查员也没有在此之后进行任何手动检查,以确定是否是假阳性。因此,如果你真的不想安装其他应用程序,混淆字符串应该会让你的应用程序和以前一样不违规……只是不会触发糟糕的检查。
当然,在此之后,苹果就可以任意妄为了。
他们在二进制文件中不透明地拒绝包含 “itms-services “字符串的应用程序,而你还在为他们更复杂的分析点赞?笑死我了
你是在假设这就是他们正在做的一切,也是他们将要做的一切,但这两种假设都没有任何证据支持。
苹果公司说的是哪个测试出了问题,而不是说其他测试没有运行。
更多信息请参阅上述文章,特别是链接 [1] 的讨论。
> 对魔法字符串进行一些轻度混淆似乎可以避免这个问题。
这是一个简单的字符串匹配导致的故障。
[1] https://discuss.python.org/t/handling-incompatibilities-with…
很有道理,不过我其实只是想说,他们在做一些简单的事情,并不意味着他们不会(或者更重要的是,不会)做一些复杂的事情。在 LWN 文章的讨论中提到,苹果不喜欢混淆,这大概意味着他们可以检测到某些形式的混淆。
换一种说法:如果这是我的应用程序,而这个字符串对我来说并不重要,我不会希望它被混淆,我会希望它被移除。
如果他们做得更多,为什么应用程序会被拒绝?
我们可以认为,在进行更高级的检查之前,简单的字符串搜索是他们进行的基本检查之一。
多年来,我所看到的有关 MAS/iOS AS 被拒的每一个故事都表明,他们的检查根本就不先进。
为什么我们可以这么认为?
因为实施起来更省力?
为什么苹果公司不能在沙盒级别添加 “itms-services “作为禁止的 URL 方案?我不明白为什么应用程序沙盒不能阻止(而且还没有阻止)某些协议。
哎呀,如果我的应用程序中有一个恶意网页框架试图调用 “itms-services “呢?
我不知道 url 处理程序有什么大不了的,但我无法想象它会导致远程代码执行或其他实际的恶意行为。
在这一点上,苹果似乎使用的是简单的子串匹配,因此如果有任何漏洞载体,恶意软件作者可以使用 “itms “+”-services “或更复杂的 ROT13 来规避检查。
这也正是为什么……App Store 的审核程序声称这是一个问题,这似乎没有任何意义。
想象一下,你的应用在 myapp.com/terms 上嵌入了一个 WebView。这是你的服务条款,你会在每个人注册时向他们展示。每个人都点击了 “确定”。
上架 App Store 后,出于某种原因,您修改了 WebView,使其包含 “itms-services”。你刚刚完全绕过了 App Store 的审核,并将 URL 处理程序带入了你的应用程序。沙盒本应阻止你,但审查流程显然没有考虑到这种可能性,并在你发布之前强制执行。为什么会这样?
我的观点是,如果苹果不想允许使用该处理程序,那么如果他们希望禁令真正有效,那么扫描该处理程序似乎是错误的。
审核过程中,苹果会给你一个明确的方向,告诉你什么是可以接受的。
有很多方法可以绕过他们的限制。但这样做会让你被禁用。
我还没听说苹果打算在审核过程中给出明确的指示。
他们拒绝告诉他被拒绝的原因,很难说是 “明确的指导”。
> 该应用程序安装或启动了可执行代码。具体来说,该应用程序使用 itms-services URL 方案安装应用程序。
对我来说,这似乎是一个非常明确的方向:
https://github.com/python/cpython/issues/120522
不过,这个应用程序实际上并没有做这样的事情。
措辞可以更好一些。
但众所周知,苹果搜索二进制文件中的字符串已有十多年历史。他们从未进行过运行时执行检查,而这种检查会发现你确实在进行这样的 HTTP 调用。
我的基准线与现代编译器和自动测试的基准线类似。比如
为了获得 “为您提供明确指导 “的荣誉,我希望他们提供并建议修复方法。一般来说,这可能是 “如果这是一个假阳性,请单击以请求人工审核员进行豁免”,但理想的情况是首先监测此类问题(相同拒绝的突然增加)并修复损坏的检查。
相反,苹果公司似乎忽略了第一行的信息,而这些信息很可能已经从他们的内部工具中获得,而且不仅没有提出修复建议,反而使适当的修复变得如此难以获得,以至于修改语言本身比在他们的审核框架中进行检查更容易。
> 但众所周知,苹果搜索二进制文件中的字符串已有十多年历史。他们从来没有进行过运行时执行检查,从而发现你实际上是在进行这样的 HTTP 调用。
诚然,如果有人对苹果公司的检查方式有所了解,并从其他受挫用户那里了解到这一过程,那么他很可能会推断出苹果公司的测试存在漏洞,从而最终从第二行推断出第一行。这并不是苹果公司给出了一个明确的方向,而是开发人员设法绕过了一个难以捉摸的系统。
如果出现以下情况,就可以进行这样的检查
1.苹果公司收到您的源代码副本以进行源代码分析
2.苹果实际上支持将运行 Python 代码作为编写 iOS 应用程序的一个选项,并为 Python 编写了源代码分析工具,用于报告合规性问题
这些都不是事实。
我并不建议使用任何特定语言的功能,比如告诉你它在哪个函数中–只需提供文件名、位置和匹配字符串。这是 Apple 已经掌握的信息,即使对编译后的/对象代码也很有用。
摘自链接的 Github 问题:
> 在多次被告知 “我们无法为您提供更多信息 “之后,我终于提交了一份拒绝申诉,结果苹果终于告诉我,parse.py 及其 .pyc 是违规文件。
它的作用与明确的方向完全相反。它是一个任意的黑盒子
该 URL 很可能在苹果框架内用于各种目的,因此即使应用程序本身不知道该 URL,应用程序进程也有可能打开该 URL。
Python 只需对方案进行 rot13 并对加密方案进行散列。
在原帖中提到了混淆是否是一种可接受的变通办法,但后来发现苹果公司真的不喜欢混淆技术。目前的解决方法是使用编译器标记,将有问题的代码排除在 iOS 编译之外。
但我还是要问,如果苹果不喜欢使用这种协议的应用程序,为什么沙盒不进行干预呢?
沙盒应用程序可以使用 itms-services:// 链接,只是不允许在 App Store 中使用。使用内部部署的 iOS 企业应用程序可以使用它进行安装和更新,部署在 App Store 以外的沙盒 Mac 应用程序也可以使用它。
不过,《App 审核指南》禁止 App Store 应用程序安装其他应用程序,因此在审核过程中会对该方案进行扫描。
可以通过授予企业应用程序打开该方案的权限,而不授予普通 App Store 应用程序来解决这个问题。依靠字符串扫描根本不安全。
欢迎使用苹果备受赞誉的安全模式。
更严重的是,我相信他们也会阻止该 URI 方案的权限。这很可能是某种深层防御方法的一部分。就像他们在执行程序中搜索私有符号的名称一样,即使链接器直接拒绝提供这些名称。我非常讨厌这种普遍存在的无用安全层,它们几乎什么也没增加。但是,既然几乎什么都没有,那就不是什么都没有,没有人可以删除任何一层。就像蟑螂纸一样,我把它们叫做 “蟑螂安全”。如今,几乎所有东西都充斥着这些东西。
这有点道理,但我又有了一个新问题:为什么苹果公司不针对内部和 App Store 采用不同的证书方案(如果还没有的话)?在这种情况下,iOS 沙盒应该足够智能,而且可能已经根据应用程序是通过 App Store 还是通过私有部署来划分允许的功能。
> 为什么苹果公司不针对内部和 App Store 采用不同的证书方案(如果还没有的话)?
企业分发允许您将应用程序部署到企业管理的设备上,而无需经过 App Store 审查。限制主要是在业务协议中,即你可以向哪些人(如员工和承包商)提供企业分发,以及你的应用程序可以做什么。这样做的理由是,企业与员工/承包商有关系,最终要为他们通过 MDM 在员工设备上的滥用/伤害行为负责。
几年前,Facebook 和谷歌就是在这种情况下被暂时禁止企业账户的,因为它们都将企业账户作为市场分析项目的一部分–它们提供在消费者设备上安装 VPN 软件的服务,以监控网络和第三方应用程序的使用情况。根据企业开发者账户协议,即使是员工也不允许进行此类监控。
> 目前的解决方法是使用编译器标记,将有问题的代码排除在 iOS 版本之外。
这听起来是正确的解决方法,因为它最不可能让你的开发者账户被禁用。
为什么基础 Python 中会有 “itms-services URL scheme”?为什么 Python 开箱就有与 iTunes 交互的代码?
很显然,这是另一种黑客行为,目的是防止服务器端对此类 URL 进行错误解析,而不会发生实际交互 [1]。
[1] https://github.com/python/cpython/issues/104139
这是一个该死的测试用例,用来检测 URL 方案中的连字符?改成 asdf-zxcv就行了。或者从最终用户的 python 安装中删除测试用例。我们这是在干什么?
之所以出现违规字符串,是因为 Python 的 urllib 有一个硬编码的使用主机名组件或 “netloc “的方案列表。该列表包含 RFC 中的已知方案。其他任何内容,包括专有的第三方方案,都应该使用启发式。
该列表称为 uses_netloc,用于帮助解析 https、ftp 等域的 user@host:port 部分。正是这个方案列表包含了被禁止的字符串 itms-services,用于苹果公司专有的 iTunes 软件。
唯一需要这样做的代码是 urlunsplit 和 urljoin。如果您解析的 URL 有 netloc,那么该列表甚至都不重要–如果您有 netloc,那么您就会被认为是 uses_netloc。
比起按照某些公司的消极要求,有选择性地从源代码中包含或排除不良字符串,这种方法似乎要明智得多。
为什么 urllib 要使用这种 URL 方案?如果 Python 库硬编码了有关苹果专有内容的知识,那么苹果可能会对此提出异议也就不足为奇了。
我认为,添加这一内容是因为 `itms-services://?` URL 格式是非标准的,破坏了 `urllib.parse` 中的现有逻辑: https://github.com/python/cpython/pull/104312
根据 RFC 3986,我认为这是一个有效的 URL。
权限由主机、空白名称和空白路径(path-abempty)组成。
问题是很多库都没有区分明确声明为空白的字段和未声明的字段(例如 nil 与””)。看起来他们并没有修改 python 的 URL 库来识别这种区别,而是创建了一个异常列表来硬编码输出行为。
可以说,客户端软件应该足够强大,能够处理两种形式的 URL(例如,itms-service URL 很可能只是 URI,但最初的开发者认为所有 URI 都应该有两个正斜杠)。我可以明确地说,对于 “scheme://”调用,接收方的这种稳健性是非常罕见的,因为如果他们对 URI 有足够的理解,就不会多出两个他们永远不会使用的斜杠。
在 PR 链接到的问题上的一条评论引用了 https://url.spec.whatwg.org/#url-serializing,作为 itms-services 通常不会有”//”,因此需要异常的理由。然而,该标准说的是 “非空”,而不是 “非空¹”,所以听起来好像 python 的 URL 库在这里把空主机与空主机同等对待是错误的。
¹此外,我还检查了一下,该标准确实将空主机 (https://url.spec.whatwg.org/#empty-host) 定义为与空主机不同的概念。
这篇文章非常清楚,它之所以有这个字符串,是因为这是 Apple 推荐的启动新应用程序的方法,而 MacOS 上的 Python 也是这么做的。它是标准库的一部分。
不只是苹果公司会这样搞鬼。
试试用 PyInstaller 编译 Python 应用程序,同时开启 Windows Defender 实时扫描(默认设置)。如果没有 Defender 的阻止,你甚至无法编译二进制文件。
同样,试试在开启 Windows Defender 的情况下运行 PyInstaller 生成的二进制文件。Defender 会说这是恶意软件,并不会运行它。
两个主要的操作系统平台都不遗余力地阻止你发布和运行 Python 应用程序,这有点像乌托邦。
不仅仅是 Python 应用程序。没有昂贵证书的小开发者也会遇到这种情况。我曾用 MSVC 编译过一个 C 语言程序,它只不过是一个 “Hello, World”,而 Defender 却称它为 Win32/Wacatac 木马。
微软要求的代码签名证书贵得离谱。这是一个由证书颁发者组成的卡特尔。这简直就是抢劫。我们需要类似于 Let’s Encrypt 的代码签名证书。
SignPath 为开放源码软件项目提供免费证书:
https://signpath.org/about/
我们(sqlitebrowser.org)最近开始使用它们来签署我们的 Windows 版本。
卫士称任何东西为 Wacatac。
具有讽刺意味的是,我见过大量真正的恶意软件,它们甚至不会发出丝毫警告。
即使合法的恶意软件被标记为 “Wacatac”,也一定会有一部分用户在谷歌上搜索这个名字,看到多年来(如果不是几十年的话)微软错误地将大量合法软件标记为该病毒,然后在他们的机器上将真正的恶意软件列入白名单,认为微软肯定又搞砸了。我对 MS 这么多年来一直没有解决这个问题并不感到惊讶,只是感到失望。
这就是恶意软件的传播方式。大多数从有问题的地方获取的应用程序都有说明,说要禁用杀毒软件。我明白….,但我不想玩这么糟糕的游戏。
我在工作时用围棋做了一个 for 循环给同事看,结果二进制被标记为恶意软件。
这通常是他们的机器学习病毒扫描仪造成的。出于某种原因,只要是你自己编译的程序,基本上都会被认定为病毒。我想,如果把所有东西都称为病毒,就不会漏掉病毒了。
在游戏开发社区,我们看到有人将特洛伊木马提交到游戏竞赛中。
这与主题无关。
不,是相关的。在没有沙盒的情况下运行未签名的 exes 实际上是有风险的,游戏卡顿就是出现这种情况的一种特殊情况。
可以吗?
好的)
> 不只是 Python 应用程序。没有昂贵证书的小开发者的任何应用程序都是如此。
情况确实如此,我的经验也是如此。
当涉及到小型开发者构建和共享任何东西时,我们生活在一个黑暗的时代,尤其是当你构建的东西是免费的时候。
我停止了更新我的开源 Mac 应用程序,因为我无法证明跨越苹果设置的人为障碍的成本是合理的,这些障碍会确保用户无法运行他们想要使用的应用程序。我还有其他的爱好,在这些爱好中,花钱能给我带来实实在在的商品和利益,而不是为了制造最终能让苹果公司受益的东西而每年随意交税。
我们的开源应用程序也是这种情况。我们使用苹果的唯一原因是,我们的一位用户非常喜欢这款应用,他们负责办理证书。
仔细想想,这真是莫大的讽刺。
超级有趣的是,一个不是你的人可以负责向苹果公司证明你真的是你,这样苹果公司就可以向所有其他用户宣称,他们已经验证了你真的是你,因为他们让你证明了这一点。
这个世界真是太棒了。)
我认为,如果你不想支付开发费用或通过任何障碍,Homebrew 是发布开源 Mac 应用程序的最佳解决方案,前提是你的用户有足够的技术能力使用它。
另一种选择是不对二进制文件签名,并向用户解释他们可以通过右键单击并从菜单中选择 “打开 “来运行它们。
不幸的是,让用户安装 Homebrew 对我来说是一个难以逾越的障碍。尽管 Homebrew 现在有 .pkg 安装程序,但如果用户必须打开终端才能安装任何东西,那就不可能成功。用户通常连终端是什么都不知道。
> 另一种选择是不为二进制文件签名,并向用户解释他们可以通过右键单击并从菜单中选择 “打开 “来运行它们。
我现在就是这么做的,但不幸的是,这仍然是个问题。非 “超级用户 “不会记住 “右键单击”->”打开 “的仪式,因为他们只会双击其他东西。
而且,Gatekeeper 显示的警告也会让用户以为自己的应用程序甚至电脑被破解或黑客攻击了。
你为什么不……每年支付 100 美元来签署你的应用程序?
> 我不再更新我的开源 Mac 应用程序了,因为我无法解释为什么要花钱跨越苹果设置的人为障碍,以确保用户无法运行他们想要使用的应用程序。我还有其他的爱好,在这些爱好中,花钱能给我带来实实在在的商品和利益,而不是为了制造最终能让苹果公司受益的东西而每年缴纳任意的税款。
> 停止更新我的开源 Mac 应用程序,因为我无法证明跨越苹果设置的人为障碍的成本是合理的,这些障碍确保用户无法运行他们想使用的应用程序。
哈,这正是我在 8 年前停止使用 OS X 并在我的旧 Mac book air 上全面使用 Linux 的原因。
这不是我的经验,但也许我做的事情与众不同。我发布了一个电子应用程序。我使用 electron-builder 将其构建为安装程序。我不确定是否设置了任何配置。它被设置为安装在用户文件夹中,而不是系统级别。我的理解是这是允许的,而且可以正常工作。
对 Windows Defender 来说,PyInstaller 二进制文件看起来确实像恶意软件。如果它不这样做,它就会很快成为恶意软件的标准传播方式。不幸的是,每有一个人试图在 Windows PC 上编译或运行来自网络的有效 python 程序,就会有 1000 个恶意软件/木马实例试图感染他们。
理想情况下,代码签名/验证的成本会更低
https://www.reddit.com/r/learnpython/comments/e99bhe/comment…
> 两个主要的操作系统平台都不遗余力地阻止您发布和运行 Python 应用程序
这不仅仅是 Python 应用程序的问题。要通过 Windows SmartScreen 的签名程序,您需要购买证书,或者深度集成 Windows 开发的黄金路径。如果偏离微软认可的路径,你的所有用户都会收到一个可怕的警告。这样做的部分原因是出于安全考虑,但也有主要操作系统推行””开发方式的苦涩滋味。
这足以成为不使用 Windows 或 Macos 的理由。说这些程序是恶意的,完全是谎言。他们没有证明这一点。他们最多只能说程序不受信任或未经验证。但称其为恶意程序就是不实之词,因此属于失信行为。
几个月前,我在 Windows 上构建了 PyInstaller 二进制文件,Windows Defender 完全没有发现问题。
是的,它大部分时间都能工作,但不是经常工作。我用 Pyinstaller 开发过一个跨平台的 PyQt 专有应用程序,用了好几年。签名帮了大忙,但发布过程中还是要把二进制文件提交给一个网站,该网站会用大多数已知的杀毒软件进行检查,以确保我们不会为大多数 Windows 用户发布一个哑弹。有趣的是,有时重建后问题就解决了。
Windows 不是开发人员的平台。它是一个面向普通用户的平台。这还不明显吗?
如果你想要一个工程操作系统,那就用 GNU/Linux。
在使用 WINE(据说有一些拦截器,我和其他几个人都试过)和 PyInstaller 运行无 Windows 构建系统之前,跨平台应用程序将要求开发者在 Windows 本身编译其 Windows 移植。
Windows 是用户所在的地方。不将其作为目标是一个错误的财务决策。
过去 10 年中,我们通过 WINE / Ubuntu 发布了基于 py2exe 的 Win32/Win64 软件,没有任何问题 – 我们没有签署 (https://www.vintech.bg)
感谢您提供的信息,我一直在犹豫是否要引入更多特定平台的工具,因此我坚持使用 PyInstaller。我会看看 py2exe 能否满足我的需求。
让跨平台见鬼去吧。为 Windows 开发会延续有害的生态系统。这跟卖弹药给西内洛亚贩毒集团没什么区别。
有点不同。
是的,当你没有工作时,这是个很容易遵循的建议
我希望有一天我会没有工作!
什么意思?
我的工作是开发跨平台软件,但我们是在 Linux 上开发的。软件可以在 Windows 上运行,但在 Windows 上构建软件是一种折磨,所以我们几乎所有的开发机器都是 Linux 的。
我遇到过很多 Mac 用户,他们无法浏览 Mac 上的文件系统,这让我很不舒服。
我工作的这家价值数十亿美元的公司不明白这一点。我被迫在虚拟 Windows 机器上完成所有开发工作。他们有自己的理由,其中很多都是合理的,但还是很麻烦
你的个性是从 /g/ 下载的?
我觉得这很有趣
> Alex Gaynor 建议项目尝试一种 Keith-Magee 没有提出的方法,这种方法的灵感来自 Gaynor 在密码学库方面的经验。该项目经常收到投诉,称加密库拒绝解析技术上无效但被广泛使用的证书。他说,我们的政策是接受解决这些问题的拉取请求,””前提是这些请求要小,要本地化,而且一般不会太糟糕”。但他补充说,接受这些补丁的前提条件是,有人向第三方(这里指苹果公司)投诉,并获得某种承诺,表示他们会对此采取一些措施。他建议,这种变通办法应该有时间限制,以便给用户一个体面的体验,””同时也不能让大公司简单地将其怪异的问题外部化到开放源码软件项目中””。
用户希望开放源码软件绕过商业软件中的错误,因为开放源码软件的维护者更容易被欺负,而且他们知道向大公司报告错误会直接进入黑洞。
鉴于苹果公司的错误报告系统是个黑洞,这句话似乎是无稽之谈。Pythonistas 的大话一如既往,与现实毫无关联。
我们能在数字平台上实现三权分立吗?
卖手机的也能决定手机上的内容,这实在是太糟糕了。
你是想买没有操作系统的主流手机吗?
我选择苹果作为我手机上应用程序的监护人。有一种平台是由用户来决定手机上的应用,那就是安卓。
虽然我很高兴你可以选择成为数字农奴–为使用土地(设备)向领主付费,但我更愿意选择不成为数字农奴。
这样,你可以选择成为数字农奴,而像我这样的人则可以选择退出。
–
这里的 “农奴 “不是贬义词,而是形容词。苹果公司的行为就像一个封建领主。甚至还声称要保护土地和仲裁纠纷。
为什么你表现得好像安卓系统不存在一样?你可以选择退出 “数字农奴制”。
安卓系统有什么不同?
在某些情况下,人们可以安装去谷歌化版的安卓系统,并通过其他应用商店或直接安装他们想要的任何应用(.apk)。
对于 99.9% 的人来说,安卓和 iOS 在自由度方面几乎是一样的,因为他们只需从 play 商店安装应用程序,并在制造商提供的(且已膨胀的)安卓安装程序上使用谷歌服务。
尽管如此,对于那些关心手机的人来说,能够控制自己的手机并运行 AOSP(一种真正的自由和开放源码软件发行版)、只运行自由和开放源码软件应用程序或安装任何自己想要的应用程序,这在 Android 和 iOS 上是无与伦比的。
你的思路错得离谱,跟你争论也是浪费时间,因为你根本帮不上忙。
当然,那为什么其他使用 iOS 设备的人也要做出同样的选择呢?
那些拥有 iOS 设备的用户可以做出完全相同的选择–购买安卓设备。如果我不想让苹果成为我的监护人,这就是我的选择。
我不明白为什么人们觉得有必要强迫苹果公司采取特定的策略,因为他们并不是垄断者。他们不是城里唯一的游戏,你不需要 iPhone。每个拥有 iPhone 的人都是自己选择的。
人们之所以不喜欢 “如果你想要选择,就选择能给你选择的平台 “这一观点,也许是因为安卓就是一堆垃圾。
即使是在这里,人们也不关心在自己拥有的硬件上运行任何代码的权利,这实在是太可悲了。
你错了,你实际上并不拥有它。
这是不正确的 – 如果您直接付款,您确实拥有您的手机。苹果公司不能拿走你的手机。
至于软件,苹果公司拥有 iOS 系统,并将其授权给您的设备使用。
苹果,这家市值上万亿美元的公司,不需要你为他们糟糕的商业行为辩护。
> 我不明白,既然苹果公司不是垄断企业,为什么人们还要强迫他们采取特定的策略。
根据你的论点,他们___是___垄断。即数字农奴制。因为很显然,安卓属于另一个领域。
>每一个拥有 iPhone 的人都是自己选择的。
我并不想要 iPhone。我是被逼无奈才买的,因为苹果公司不允许在他们的平台上使用任何网络浏览器,除了他们的网络浏览器。因此,如果没有真正的 iPhone 作为开发平台,我就无法为 iPhone 用户提供可用的网站。这绝对是苹果公司强加给全世界的一种滥用、反竞争和低劣的人为限制。我真的宁愿告诉我的用户安装 Chrome 或 Firefox 并使用它们,而不是被迫使用 Safari。这对开发者不利,对他们的客户也不利,不管他们是否知道。
他们不是垄断,而是双头垄断。这是个稍好的位置,但我不知道你如何自圆其说,把消费者的权力交给世界上最大的科技公司。
因为这是一组权衡,而不是严格意义上的更好/更坏?
苹果公司完全有能力生产出一款能运行你自己的软件的手机,而且只需极少的权衡取舍,只是他们不想这么做,因为他们的目的不是为用户赋权,而是创造一类依赖性消费者。
混淆视听似乎是让你的开发者账户被暂停的好办法。我怀疑苹果所做的远不止是对磁盘上的二进制文件进行基本的静态分析。
很高兴他们选择了配置选项。
要看情况。实际 “违反 “的规则并不是应用程序不能包含 “itms-services “字符串。而是
也就是说,应用程序不能试图触发另一个 App Store 应用程序的安装。问题中的应用程序并没有这样做,只是基本的检查对于它应该检查的规则来说是不称职的,而且审查员也没有在此之后进行任何手动检查,以确定是否是假阳性。因此,如果你真的不想安装其他应用程序,混淆字符串应该会让你的应用程序和以前一样不违规……只是不会触发糟糕的检查。
当然,在此之后,苹果就可以任意妄为了。
他们在二进制文件中不透明地拒绝包含 “itms-services “字符串的应用程序,而你还在为他们更复杂的分析点赞?笑死我了
你是在假设这就是他们正在做的一切,也是他们将要做的一切,但这两种假设都没有任何证据支持。
苹果公司说的是哪个测试出了问题,而不是说其他测试没有运行。
更多信息请参阅上述文章,特别是链接 [1] 的讨论。
> 对魔法字符串进行一些轻度混淆似乎可以避免这个问题。
这是一个简单的字符串匹配导致的故障。
[1] https://discuss.python.org/t/handling-incompatibilities-with…
很有道理,不过我其实只是想说,他们在做一些简单的事情,并不意味着他们不会(或者更重要的是,不会)做一些复杂的事情。在 LWN 文章的讨论中提到,苹果不喜欢混淆,这大概意味着他们可以检测到某些形式的混淆。
换一种说法:如果这是我的应用程序,而这个字符串对我来说并不重要,我不会希望它被混淆,我会希望它被移除。
如果他们做得更多,为什么应用程序会被拒绝?
我们可以认为,在进行更高级的检查之前,简单的字符串搜索是他们进行的基本检查之一。
多年来,我所看到的有关 MAS/iOS AS 被拒的每一个故事都表明,他们的检查根本就不先进。
为什么我们可以这么认为?
因为实施起来更省力?
为什么苹果公司不能在沙盒级别添加 “itms-services “作为禁止的 URL 方案?我不明白为什么应用程序沙盒不能阻止(而且还没有阻止)某些协议。
哎呀,如果我的应用程序中有一个恶意网页框架试图调用 “itms-services “呢?
我不知道 url 处理程序有什么大不了的,但我无法想象它会导致远程代码执行或其他实际的恶意行为。
在这一点上,苹果似乎使用的是简单的子串匹配,因此如果有任何漏洞载体,恶意软件作者可以使用 “itms “+”-services “或更复杂的 ROT13 来规避检查。
这也正是为什么……App Store 的审核程序声称这是一个问题,这似乎没有任何意义。
想象一下,你的应用在 myapp.com/terms 上嵌入了一个 WebView。这是你的服务条款,你会在每个人注册时向他们展示。每个人都点击了 “确定”。
上架 App Store 后,出于某种原因,您修改了 WebView,使其包含 “itms-services”。你刚刚完全绕过了 App Store 的审核,并将 URL 处理程序带入了你的应用程序。沙盒本应阻止你,但审查流程显然没有考虑到这种可能性,并在你发布之前强制执行。为什么会这样?
我的观点是,如果苹果不想允许使用该处理程序,那么如果他们希望禁令真正有效,那么扫描该处理程序似乎是错误的。
审核过程中,苹果会给你一个明确的方向,告诉你什么是可以接受的。
有很多方法可以绕过他们的限制。但这样做会让你被禁用。
我还没听说苹果打算在审核过程中给出明确的指示。
他们拒绝告诉他被拒绝的原因,很难说是 “明确的指导”。
> 该应用程序安装或启动了可执行代码。具体来说,该应用程序使用 itms-services URL 方案安装应用程序。
对我来说,这似乎是一个非常明确的方向:
https://github.com/python/cpython/issues/120522
不过,这个应用程序实际上并没有做这样的事情。
措辞可以更好一些。
但众所周知,苹果搜索二进制文件中的字符串已有十多年历史。他们从未进行过运行时执行检查,而这种检查会发现你确实在进行这样的 HTTP 调用。
我的基准线与现代编译器和自动测试的基准线类似。比如
为了获得 “为您提供明确指导 “的荣誉,我希望他们提供并建议修复方法。一般来说,这可能是 “如果这是一个假阳性,请单击以请求人工审核员进行豁免”,但理想的情况是首先监测此类问题(相同拒绝的突然增加)并修复损坏的检查。
相反,苹果公司似乎忽略了第一行的信息,而这些信息很可能已经从他们的内部工具中获得,而且不仅没有提出修复建议,反而使适当的修复变得如此难以获得,以至于修改语言本身比在他们的审核框架中进行检查更容易。
> 但众所周知,苹果搜索二进制文件中的字符串已有十多年历史。他们从来没有进行过运行时执行检查,从而发现你实际上是在进行这样的 HTTP 调用。
诚然,如果有人对苹果公司的检查方式有所了解,并从其他受挫用户那里了解到这一过程,那么他很可能会推断出苹果公司的测试存在漏洞,从而最终从第二行推断出第一行。这并不是苹果公司给出了一个明确的方向,而是开发人员设法绕过了一个难以捉摸的系统。
如果出现以下情况,就可以进行这样的检查
1.苹果公司收到您的源代码副本以进行源代码分析
2.苹果实际上支持将运行 Python 代码作为编写 iOS 应用程序的一个选项,并为 Python 编写了源代码分析工具,用于报告合规性问题
这些都不是事实。
我并不建议使用任何特定语言的功能,比如告诉你它在哪个函数中–只需提供文件名、位置和匹配字符串。这是 Apple 已经掌握的信息,即使对编译后的/对象代码也很有用。
摘自链接的 Github 问题:
> 在多次被告知 “我们无法为您提供更多信息 “之后,我终于提交了一份拒绝申诉,结果苹果终于告诉我,parse.py 及其 .pyc 是违规文件。
它的作用与明确的方向完全相反。它是一个任意的黑盒子
该 URL 很可能在苹果框架内用于各种目的,因此即使应用程序本身不知道该 URL,应用程序进程也有可能打开该 URL。
Python 只需对方案进行 rot13 并对加密方案进行散列。
在原帖中提到了混淆是否是一种可接受的变通办法,但后来发现苹果公司真的不喜欢混淆技术。目前的解决方法是使用编译器标记,将有问题的代码排除在 iOS 编译之外。
但我还是要问,如果苹果不喜欢使用这种协议的应用程序,为什么沙盒不进行干预呢?
沙盒应用程序可以使用 itms-services:// 链接,只是不允许在 App Store 中使用。使用内部部署的 iOS 企业应用程序可以使用它进行安装和更新,部署在 App Store 以外的沙盒 Mac 应用程序也可以使用它。
不过,《App 审核指南》禁止 App Store 应用程序安装其他应用程序,因此在审核过程中会对该方案进行扫描。
可以通过授予企业应用程序打开该方案的权限,而不授予普通 App Store 应用程序来解决这个问题。依靠字符串扫描根本不安全。
欢迎使用苹果备受赞誉的安全模式。
更严重的是,我相信他们也会阻止该 URI 方案的权限。这很可能是某种深层防御方法的一部分。就像他们在执行程序中搜索私有符号的名称一样,即使链接器直接拒绝提供这些名称。我非常讨厌这种普遍存在的无用安全层,它们几乎什么也没增加。但是,既然几乎什么都没有,那就不是什么都没有,没有人可以删除任何一层。就像蟑螂纸一样,我把它们叫做 “蟑螂安全”。如今,几乎所有东西都充斥着这些东西。
这有点道理,但我又有了一个新问题:为什么苹果公司不针对内部和 App Store 采用不同的证书方案(如果还没有的话)?在这种情况下,iOS 沙盒应该足够智能,而且可能已经根据应用程序是通过 App Store 还是通过私有部署来划分允许的功能。
> 为什么苹果公司不针对内部和 App Store 采用不同的证书方案(如果还没有的话)?
企业分发允许您将应用程序部署到企业管理的设备上,而无需经过 App Store 审查。限制主要是在业务协议中,即你可以向哪些人(如员工和承包商)提供企业分发,以及你的应用程序可以做什么。这样做的理由是,企业与员工/承包商有关系,最终要为他们通过 MDM 在员工设备上的滥用/伤害行为负责。
几年前,Facebook 和谷歌就是在这种情况下被暂时禁止企业账户的,因为它们都将企业账户作为市场分析项目的一部分–它们提供在消费者设备上安装 VPN 软件的服务,以监控网络和第三方应用程序的使用情况。根据企业开发者账户协议,即使是员工也不允许进行此类监控。
> 目前的解决方法是使用编译器标记,将有问题的代码排除在 iOS 版本之外。
这听起来是正确的解决方法,因为它最不可能让你的开发者账户被禁用。
为什么基础 Python 中会有 “itms-services URL scheme”?为什么 Python 开箱就有与 iTunes 交互的代码?
很显然,这是另一种黑客行为,目的是防止服务器端对此类 URL 进行错误解析,而不会发生实际交互 [1]。
[1] https://github.com/python/cpython/issues/104139
这是一个该死的测试用例,用来检测 URL 方案中的连字符?改成 asdf-zxcv就行了。或者从最终用户的 python 安装中删除测试用例。我们这是在干什么?
之所以出现违规字符串,是因为 Python 的 urllib 有一个硬编码的使用主机名组件或 “netloc “的方案列表。该列表包含 RFC 中的已知方案。其他任何内容,包括专有的第三方方案,都应该使用启发式。
该列表称为 uses_netloc,用于帮助解析 https、ftp 等域的 user@host:port 部分。正是这个方案列表包含了被禁止的字符串 itms-services,用于苹果公司专有的 iTunes 软件。
唯一需要这样做的代码是 urlunsplit 和 urljoin。如果您解析的 URL 有 netloc,那么该列表甚至都不重要–如果您有 netloc,那么您就会被认为是 uses_netloc。
比起按照某些公司的消极要求,有选择性地从源代码中包含或排除不良字符串,这种方法似乎要明智得多。
为什么 urllib 要使用这种 URL 方案?如果 Python 库硬编码了有关苹果专有内容的知识,那么苹果可能会对此提出异议也就不足为奇了。
我认为,添加这一内容是因为 `itms-services://?` URL 格式是非标准的,破坏了 `urllib.parse` 中的现有逻辑: https://github.com/python/cpython/pull/104312
根据 RFC 3986,我认为这是一个有效的 URL。
权限由主机、空白名称和空白路径(path-abempty)组成。
问题是很多库都没有区分明确声明为空白的字段和未声明的字段(例如 nil 与””)。看起来他们并没有修改 python 的 URL 库来识别这种区别,而是创建了一个异常列表来硬编码输出行为。
可以说,客户端软件应该足够强大,能够处理两种形式的 URL(例如,itms-service URL 很可能只是 URI,但最初的开发者认为所有 URI 都应该有两个正斜杠)。我可以明确地说,对于 “scheme://”调用,接收方的这种稳健性是非常罕见的,因为如果他们对 URI 有足够的理解,就不会多出两个他们永远不会使用的斜杠。
在 PR 链接到的问题上的一条评论引用了 https://url.spec.whatwg.org/#url-serializing,作为 itms-services 通常不会有”//”,因此需要异常的理由。然而,该标准说的是 “非空”,而不是 “非空¹”,所以听起来好像 python 的 URL 库在这里把空主机与空主机同等对待是错误的。
¹此外,我还检查了一下,该标准确实将空主机 (https://url.spec.whatwg.org/#empty-host) 定义为与空主机不同的概念。
这篇文章非常清楚,它之所以有这个字符串,是因为这是 Apple 推荐的启动新应用程序的方法,而 MacOS 上的 Python 也是这么做的。它是标准库的一部分。
不只是苹果公司会这样搞鬼。
试试用 PyInstaller 编译 Python 应用程序,同时开启 Windows Defender 实时扫描(默认设置)。如果没有 Defender 的阻止,你甚至无法编译二进制文件。
同样,试试在开启 Windows Defender 的情况下运行 PyInstaller 生成的二进制文件。Defender 会说这是恶意软件,并不会运行它。
两个主要的操作系统平台都不遗余力地阻止你发布和运行 Python 应用程序,这有点像乌托邦。
不仅仅是 Python 应用程序。没有昂贵证书的小开发者也会遇到这种情况。我曾用 MSVC 编译过一个 C 语言程序,它只不过是一个 “Hello, World”,而 Defender 却称它为 Win32/Wacatac 木马。
微软要求的代码签名证书贵得离谱。这是一个由证书颁发者组成的卡特尔。这简直就是抢劫。我们需要类似于 Let’s Encrypt 的代码签名证书。
SignPath 为开放源码软件项目提供免费证书:
https://signpath.org/about/
我们(sqlitebrowser.org)最近开始使用它们来签署我们的 Windows 版本。
卫士称任何东西为 Wacatac。
具有讽刺意味的是,我见过大量真正的恶意软件,它们甚至不会发出丝毫警告。
即使合法的恶意软件被标记为 “Wacatac”,也一定会有一部分用户在谷歌上搜索这个名字,看到多年来(如果不是几十年的话)微软错误地将大量合法软件标记为该病毒,然后在他们的机器上将真正的恶意软件列入白名单,认为微软肯定又搞砸了。我对 MS 这么多年来一直没有解决这个问题并不感到惊讶,只是感到失望。
这就是恶意软件的传播方式。大多数从有问题的地方获取的应用程序都有说明,说要禁用杀毒软件。我明白….,但我不想玩这么糟糕的游戏。
我在工作时用围棋做了一个 for 循环给同事看,结果二进制被标记为恶意软件。
这通常是他们的机器学习病毒扫描仪造成的。出于某种原因,只要是你自己编译的程序,基本上都会被认定为病毒。我想,如果把所有东西都称为病毒,就不会漏掉病毒了。
在游戏开发社区,我们看到有人将特洛伊木马提交到游戏竞赛中。
这与主题无关。
不,是相关的。在没有沙盒的情况下运行未签名的 exes 实际上是有风险的,游戏卡顿就是出现这种情况的一种特殊情况。
可以吗?
好的)
> 不只是 Python 应用程序。没有昂贵证书的小开发者的任何应用程序都是如此。
情况确实如此,我的经验也是如此。
当涉及到小型开发者构建和共享任何东西时,我们生活在一个黑暗的时代,尤其是当你构建的东西是免费的时候。
我停止了更新我的开源 Mac 应用程序,因为我无法证明跨越苹果设置的人为障碍的成本是合理的,这些障碍会确保用户无法运行他们想要使用的应用程序。我还有其他的爱好,在这些爱好中,花钱能给我带来实实在在的商品和利益,而不是为了制造最终能让苹果公司受益的东西而每年随意交税。
我们的开源应用程序也是这种情况。我们使用苹果的唯一原因是,我们的一位用户非常喜欢这款应用,他们负责办理证书。
仔细想想,这真是莫大的讽刺。
超级有趣的是,一个不是你的人可以负责向苹果公司证明你真的是你,这样苹果公司就可以向所有其他用户宣称,他们已经验证了你真的是你,因为他们让你证明了这一点。
这个世界真是太棒了。)
我认为,如果你不想支付开发费用或通过任何障碍,Homebrew 是发布开源 Mac 应用程序的最佳解决方案,前提是你的用户有足够的技术能力使用它。
另一种选择是不对二进制文件签名,并向用户解释他们可以通过右键单击并从菜单中选择 “打开 “来运行它们。
不幸的是,让用户安装 Homebrew 对我来说是一个难以逾越的障碍。尽管 Homebrew 现在有 .pkg 安装程序,但如果用户必须打开终端才能安装任何东西,那就不可能成功。用户通常连终端是什么都不知道。
> 另一种选择是不为二进制文件签名,并向用户解释他们可以通过右键单击并从菜单中选择 “打开 “来运行它们。
我现在就是这么做的,但不幸的是,这仍然是个问题。非 “超级用户 “不会记住 “右键单击”->”打开 “的仪式,因为他们只会双击其他东西。
而且,Gatekeeper 显示的警告也会让用户以为自己的应用程序甚至电脑被破解或黑客攻击了。
你为什么不……每年支付 100 美元来签署你的应用程序?
> 我不再更新我的开源 Mac 应用程序了,因为我无法解释为什么要花钱跨越苹果设置的人为障碍,以确保用户无法运行他们想要使用的应用程序。我还有其他的爱好,在这些爱好中,花钱能给我带来实实在在的商品和利益,而不是为了制造最终能让苹果公司受益的东西而每年缴纳任意的税款。
> 停止更新我的开源 Mac 应用程序,因为我无法证明跨越苹果设置的人为障碍的成本是合理的,这些障碍确保用户无法运行他们想使用的应用程序。
哈,这正是我在 8 年前停止使用 OS X 并在我的旧 Mac book air 上全面使用 Linux 的原因。
这不是我的经验,但也许我做的事情与众不同。我发布了一个电子应用程序。我使用 electron-builder 将其构建为安装程序。我不确定是否设置了任何配置。它被设置为安装在用户文件夹中,而不是系统级别。我的理解是这是允许的,而且可以正常工作。
对 Windows Defender 来说,PyInstaller 二进制文件看起来确实像恶意软件。如果它不这样做,它就会很快成为恶意软件的标准传播方式。不幸的是,每有一个人试图在 Windows PC 上编译或运行来自网络的有效 python 程序,就会有 1000 个恶意软件/木马实例试图感染他们。
理想情况下,代码签名/验证的成本会更低
https://www.reddit.com/r/learnpython/comments/e99bhe/comment…
> 两个主要的操作系统平台都不遗余力地阻止您发布和运行 Python 应用程序
这不仅仅是 Python 应用程序的问题。要通过 Windows SmartScreen 的签名程序,您需要购买证书,或者深度集成 Windows 开发的黄金路径。如果偏离微软认可的路径,你的所有用户都会收到一个可怕的警告。这样做的部分原因是出于安全考虑,但也有主要操作系统推行””开发方式的苦涩滋味。
这足以成为不使用 Windows 或 Macos 的理由。说这些程序是恶意的,完全是谎言。他们没有证明这一点。他们最多只能说程序不受信任或未经验证。但称其为恶意程序就是不实之词,因此属于失信行为。
几个月前,我在 Windows 上构建了 PyInstaller 二进制文件,Windows Defender 完全没有发现问题。
是的,它大部分时间都能工作,但不是经常工作。我用 Pyinstaller 开发过一个跨平台的 PyQt 专有应用程序,用了好几年。签名帮了大忙,但发布过程中还是要把二进制文件提交给一个网站,该网站会用大多数已知的杀毒软件进行检查,以确保我们不会为大多数 Windows 用户发布一个哑弹。有趣的是,有时重建后问题就解决了。
Windows 不是开发人员的平台。它是一个面向普通用户的平台。这还不明显吗?
如果你想要一个工程操作系统,那就用 GNU/Linux。
在使用 WINE(据说有一些拦截器,我和其他几个人都试过)和 PyInstaller 运行无 Windows 构建系统之前,跨平台应用程序将要求开发者在 Windows 本身编译其 Windows 移植。
Windows 是用户所在的地方。不将其作为目标是一个错误的财务决策。
过去 10 年中,我们通过 WINE / Ubuntu 发布了基于 py2exe 的 Win32/Win64 软件,没有任何问题 – 我们没有签署 (https://www.vintech.bg)
感谢您提供的信息,我一直在犹豫是否要引入更多特定平台的工具,因此我坚持使用 PyInstaller。我会看看 py2exe 能否满足我的需求。
让跨平台见鬼去吧。为 Windows 开发会延续有害的生态系统。这跟卖弹药给西内洛亚贩毒集团没什么区别。
有点不同。
是的,当你没有工作时,这是个很容易遵循的建议
我希望有一天我会没有工作!
什么意思?
我的工作是开发跨平台软件,但我们是在 Linux 上开发的。软件可以在 Windows 上运行,但在 Windows 上构建软件是一种折磨,所以我们几乎所有的开发机器都是 Linux 的。
我遇到过很多 Mac 用户,他们无法浏览 Mac 上的文件系统,这让我很不舒服。
我工作的这家价值数十亿美元的公司不明白这一点。我被迫在虚拟 Windows 机器上完成所有开发工作。他们有自己的理由,其中很多都是合理的,但还是很麻烦
你的个性是从 /g/ 下载的?
我觉得这很有趣
> Alex Gaynor 建议项目尝试一种 Keith-Magee 没有提出的方法,这种方法的灵感来自 Gaynor 在密码学库方面的经验。该项目经常收到投诉,称加密库拒绝解析技术上无效但被广泛使用的证书。他说,我们的政策是接受解决这些问题的拉取请求,””前提是这些请求要小,要本地化,而且一般不会太糟糕”。但他补充说,接受这些补丁的前提条件是,有人向第三方(这里指苹果公司)投诉,并获得某种承诺,表示他们会对此采取一些措施。他建议,这种变通办法应该有时间限制,以便给用户一个体面的体验,””同时也不能让大公司简单地将其怪异的问题外部化到开放源码软件项目中””。
用户希望开放源码软件绕过商业软件中的错误,因为开放源码软件的维护者更容易被欺负,而且他们知道向大公司报告错误会直接进入黑洞。
鉴于苹果公司的错误报告系统是个黑洞,这句话似乎是无稽之谈。Pythonistas 的大话一如既往,与现实毫无关联。
我们能在数字平台上实现三权分立吗?
卖手机的也能决定手机上的内容,这实在是太糟糕了。
你是想买没有操作系统的主流手机吗?
我选择苹果作为我手机上应用程序的监护人。有一种平台是由用户来决定手机上的应用,那就是安卓。
虽然我很高兴你可以选择成为数字农奴–为使用土地(设备)向领主付费,但我更愿意选择不成为数字农奴。
这样,你可以选择成为数字农奴,而像我这样的人则可以选择退出。
–
这里的 “农奴 “不是贬义词,而是形容词。苹果公司的行为就像一个封建领主。甚至还声称要保护土地和仲裁纠纷。
为什么你表现得好像安卓系统不存在一样?你可以选择退出 “数字农奴制”。
安卓系统有什么不同?
在某些情况下,人们可以安装去谷歌化版的安卓系统,并通过其他应用商店或直接安装他们想要的任何应用(.apk)。
对于 99.9% 的人来说,安卓和 iOS 在自由度方面几乎是一样的,因为他们只需从 play 商店安装应用程序,并在制造商提供的(且已膨胀的)安卓安装程序上使用谷歌服务。
尽管如此,对于那些关心手机的人来说,能够控制自己的手机并运行 AOSP(一种真正的自由和开放源码软件发行版)、只运行自由和开放源码软件应用程序或安装任何自己想要的应用程序,这在 Android 和 iOS 上是无与伦比的。
你的思路错得离谱,跟你争论也是浪费时间,因为你根本帮不上忙。
当然,那为什么其他使用 iOS 设备的人也要做出同样的选择呢?
那些拥有 iOS 设备的用户可以做出完全相同的选择–购买安卓设备。如果我不想让苹果成为我的监护人,这就是我的选择。
我不明白为什么人们觉得有必要强迫苹果公司采取特定的策略,因为他们并不是垄断者。他们不是城里唯一的游戏,你不需要 iPhone。每个拥有 iPhone 的人都是自己选择的。
人们之所以不喜欢 “如果你想要选择,就选择能给你选择的平台 “这一观点,也许是因为安卓就是一堆垃圾。
即使是在这里,人们也不关心在自己拥有的硬件上运行任何代码的权利,这实在是太可悲了。
你错了,你实际上并不拥有它。
这是不正确的 – 如果您直接付款,您确实拥有您的手机。苹果公司不能拿走你的手机。
至于软件,苹果公司拥有 iOS 系统,并将其授权给您的设备使用。
苹果,这家市值上万亿美元的公司,不需要你为他们糟糕的商业行为辩护。
> 我不明白,既然苹果公司不是垄断企业,为什么人们还要强迫他们采取特定的策略。
根据你的论点,他们___是___垄断。即数字农奴制。因为很显然,安卓属于另一个领域。
>每一个拥有 iPhone 的人都是自己选择的。
我并不想要 iPhone。我是被逼无奈才买的,因为苹果公司不允许在他们的平台上使用任何网络浏览器,除了他们的网络浏览器。因此,如果没有真正的 iPhone 作为开发平台,我就无法为 iPhone 用户提供可用的网站。这绝对是苹果公司强加给全世界的一种滥用、反竞争和低劣的人为限制。我真的宁愿告诉我的用户安装 Chrome 或 Firefox 并使用它们,而不是被迫使用 Safari。这对开发者不利,对他们的客户也不利,不管他们是否知道。
他们不是垄断,而是双头垄断。这是个稍好的位置,但我不知道你如何自圆其说,把消费者的权力交给世界上最大的科技公司。
因为这是一组权衡,而不是严格意义上的更好/更坏?
苹果公司完全有能力生产出一款能运行你自己的软件的手机,而且只需极少的权衡取舍,只是他们不想这么做,因为他们的目的不是为用户赋权,而是创造一类依赖性消费者。
混淆视听似乎是让你的开发者账户被暂停的好办法。我怀疑苹果所做的远不止是对磁盘上的二进制文件进行基本的静态分析。
很高兴他们选择了配置选项。
要看情况。实际 “违反 “的规则并不是应用程序不能包含 “itms-services “字符串。而是
也就是说,应用程序不能试图触发另一个 App Store 应用程序的安装。问题中的应用程序并没有这样做,只是基本的检查对于它应该检查的规则来说是不称职的,而且审查员也没有在此之后进行任何手动检查,以确定是否是假阳性。因此,如果你真的不想安装其他应用程序,混淆字符串应该会让你的应用程序和以前一样不违规……只是不会触发糟糕的检查。
当然,在此之后,苹果就可以任意妄为了。
他们在二进制文件中不透明地拒绝包含 “itms-services “字符串的应用程序,而你还在为他们更复杂的分析点赞?笑死我了
你是在假设这就是他们正在做的一切,也是他们将要做的一切,但这两种假设都没有任何证据支持。
苹果公司说的是哪个测试出了问题,而不是说其他测试没有运行。
更多信息请参阅上述文章,特别是链接 [1] 的讨论。
> 对魔法字符串进行一些轻度混淆似乎可以避免这个问题。
这是一个简单的字符串匹配导致的故障。
[1] https://discuss.python.org/t/handling-incompatibilities-with…
很有道理,不过我其实只是想说,他们在做一些简单的事情,并不意味着他们不会(或者更重要的是,不会)做一些复杂的事情。在 LWN 文章的讨论中提到,苹果不喜欢混淆,这大概意味着他们可以检测到某些形式的混淆。
换一种说法:如果这是我的应用程序,而这个字符串对我来说并不重要,我不会希望它被混淆,我会希望它被移除。
如果他们做得更多,为什么应用程序会被拒绝?
我们可以认为,在进行更高级的检查之前,简单的字符串搜索是他们进行的基本检查之一。
多年来,我所看到的有关 MAS/iOS AS 被拒的每一个故事都表明,他们的检查根本就不先进。
为什么我们可以这么认为?
因为实施起来更省力?
为什么苹果公司不能在沙盒级别添加 “itms-services “作为禁止的 URL 方案?我不明白为什么应用程序沙盒不能阻止(而且还没有阻止)某些协议。
哎呀,如果我的应用程序中有一个恶意网页框架试图调用 “itms-services “呢?
我不知道 url 处理程序有什么大不了的,但我无法想象它会导致远程代码执行或其他实际的恶意行为。
在这一点上,苹果似乎使用的是简单的子串匹配,因此如果有任何漏洞载体,恶意软件作者可以使用 “itms “+”-services “或更复杂的 ROT13 来规避检查。
这也正是为什么……App Store 的审核程序声称这是一个问题,这似乎没有任何意义。
想象一下,你的应用在 myapp.com/terms 上嵌入了一个 WebView。这是你的服务条款,你会在每个人注册时向他们展示。每个人都点击了 “确定”。
上架 App Store 后,出于某种原因,您修改了 WebView,使其包含 “itms-services”。你刚刚完全绕过了 App Store 的审核,并将 URL 处理程序带入了你的应用程序。沙盒本应阻止你,但审查流程显然没有考虑到这种可能性,并在你发布之前强制执行。为什么会这样?
我的观点是,如果苹果不想允许使用该处理程序,那么如果他们希望禁令真正有效,那么扫描该处理程序似乎是错误的。
审核过程中,苹果会给你一个明确的方向,告诉你什么是可以接受的。
有很多方法可以绕过他们的限制。但这样做会让你被禁用。
我还没听说苹果打算在审核过程中给出明确的指示。
他们拒绝告诉他被拒绝的原因,很难说是 “明确的指导”。
> 该应用程序安装或启动了可执行代码。具体来说,该应用程序使用 itms-services URL 方案安装应用程序。
对我来说,这似乎是一个非常明确的方向:
https://github.com/python/cpython/issues/120522
不过,这个应用程序实际上并没有做这样的事情。
措辞可以更好一些。
但众所周知,苹果搜索二进制文件中的字符串已有十多年历史。他们从未进行过运行时执行检查,而这种检查会发现你确实在进行这样的 HTTP 调用。
我的基准线与现代编译器和自动测试的基准线类似。比如
为了获得 “为您提供明确指导 “的荣誉,我希望他们提供并建议修复方法。一般来说,这可能是 “如果这是一个假阳性,请单击以请求人工审核员进行豁免”,但理想的情况是首先监测此类问题(相同拒绝的突然增加)并修复损坏的检查。
相反,苹果公司似乎忽略了第一行的信息,而这些信息很可能已经从他们的内部工具中获得,而且不仅没有提出修复建议,反而使适当的修复变得如此难以获得,以至于修改语言本身比在他们的审核框架中进行检查更容易。
> 但众所周知,苹果搜索二进制文件中的字符串已有十多年历史。他们从来没有进行过运行时执行检查,从而发现你实际上是在进行这样的 HTTP 调用。
诚然,如果有人对苹果公司的检查方式有所了解,并从其他受挫用户那里了解到这一过程,那么他很可能会推断出苹果公司的测试存在漏洞,从而最终从第二行推断出第一行。这并不是苹果公司给出了一个明确的方向,而是开发人员设法绕过了一个难以捉摸的系统。
如果出现以下情况,就可以进行这样的检查
1.苹果公司收到您的源代码副本以进行源代码分析
2.苹果实际上支持将运行 Python 代码作为编写 iOS 应用程序的一个选项,并为 Python 编写了源代码分析工具,用于报告合规性问题
这些都不是事实。
我并不建议使用任何特定语言的功能,比如告诉你它在哪个函数中–只需提供文件名、位置和匹配字符串。这是 Apple 已经掌握的信息,即使对编译后的/对象代码也很有用。
摘自链接的 Github 问题:
> 在多次被告知 “我们无法为您提供更多信息 “之后,我终于提交了一份拒绝申诉,结果苹果终于告诉我,parse.py 及其 .pyc 是违规文件。
它的作用与明确的方向完全相反。它是一个任意的黑盒子
该 URL 很可能在苹果框架内用于各种目的,因此即使应用程序本身不知道该 URL,应用程序进程也有可能打开该 URL。
Python 只需对方案进行 rot13 并对加密方案进行散列。
在原帖中提到了混淆是否是一种可接受的变通办法,但后来发现苹果公司真的不喜欢混淆技术。目前的解决方法是使用编译器标记,将有问题的代码排除在 iOS 编译之外。
但我还是要问,如果苹果不喜欢使用这种协议的应用程序,为什么沙盒不进行干预呢?
沙盒应用程序可以使用 itms-services:// 链接,只是不允许在 App Store 中使用。使用内部部署的 iOS 企业应用程序可以使用它进行安装和更新,部署在 App Store 以外的沙盒 Mac 应用程序也可以使用它。
不过,《App 审核指南》禁止 App Store 应用程序安装其他应用程序,因此在审核过程中会对该方案进行扫描。
可以通过授予企业应用程序打开该方案的权限,而不授予普通 App Store 应用程序来解决这个问题。依靠字符串扫描根本不安全。
欢迎使用苹果备受赞誉的安全模式。
更严重的是,我相信他们也会阻止该 URI 方案的权限。这很可能是某种深层防御方法的一部分。就像他们在执行程序中搜索私有符号的名称一样,即使链接器直接拒绝提供这些名称。我非常讨厌这种普遍存在的无用安全层,它们几乎什么也没增加。但是,既然几乎什么都没有,那就不是什么都没有,没有人可以删除任何一层。就像蟑螂纸一样,我把它们叫做 “蟑螂安全”。如今,几乎所有东西都充斥着这些东西。
这有点道理,但我又有了一个新问题:为什么苹果公司不针对内部和 App Store 采用不同的证书方案(如果还没有的话)?在这种情况下,iOS 沙盒应该足够智能,而且可能已经根据应用程序是通过 App Store 还是通过私有部署来划分允许的功能。
> 为什么苹果公司不针对内部和 App Store 采用不同的证书方案(如果还没有的话)?
企业分发允许您将应用程序部署到企业管理的设备上,而无需经过 App Store 审查。限制主要是在业务协议中,即你可以向哪些人(如员工和承包商)提供企业分发,以及你的应用程序可以做什么。这样做的理由是,企业与员工/承包商有关系,最终要为他们通过 MDM 在员工设备上的滥用/伤害行为负责。
几年前,Facebook 和谷歌就是在这种情况下被暂时禁止企业账户的,因为它们都将企业账户作为市场分析项目的一部分–它们提供在消费者设备上安装 VPN 软件的服务,以监控网络和第三方应用程序的使用情况。根据企业开发者账户协议,即使是员工也不允许进行此类监控。
> 目前的解决方法是使用编译器标记,将有问题的代码排除在 iOS 版本之外。
这听起来是正确的解决方法,因为它最不可能让你的开发者账户被禁用。
为什么基础 Python 中会有 “itms-services URL scheme”?为什么 Python 开箱就有与 iTunes 交互的代码?
很显然,这是另一种黑客行为,目的是防止服务器端对此类 URL 进行错误解析,而不会发生实际交互 [1]。
[1] https://github.com/python/cpython/issues/104139
这是一个该死的测试用例,用来检测 URL 方案中的连字符?改成 asdf-zxcv就行了。或者从最终用户的 python 安装中删除测试用例。我们这是在干什么?
之所以出现违规字符串,是因为 Python 的 urllib 有一个硬编码的使用主机名组件或 “netloc “的方案列表。该列表包含 RFC 中的已知方案。其他任何内容,包括专有的第三方方案,都应该使用启发式。
该列表称为 uses_netloc,用于帮助解析 https、ftp 等域的 user@host:port 部分。正是这个方案列表包含了被禁止的字符串 itms-services,用于苹果公司专有的 iTunes 软件。
唯一需要这样做的代码是 urlunsplit 和 urljoin。如果您解析的 URL 有 netloc,那么该列表甚至都不重要–如果您有 netloc,那么您就会被认为是 uses_netloc。
比起按照某些公司的消极要求,有选择性地从源代码中包含或排除不良字符串,这种方法似乎要明智得多。
为什么 urllib 要使用这种 URL 方案?如果 Python 库硬编码了有关苹果专有内容的知识,那么苹果可能会对此提出异议也就不足为奇了。
我认为,添加这一内容是因为 `itms-services://?` URL 格式是非标准的,破坏了 `urllib.parse` 中的现有逻辑: https://github.com/python/cpython/pull/104312
根据 RFC 3986,我认为这是一个有效的 URL。
权限由主机、空白名称和空白路径(path-abempty)组成。
问题是很多库都没有区分明确声明为空白的字段和未声明的字段(例如 nil 与””)。看起来他们并没有修改 python 的 URL 库来识别这种区别,而是创建了一个异常列表来硬编码输出行为。
可以说,客户端软件应该足够强大,能够处理两种形式的 URL(例如,itms-service URL 很可能只是 URI,但最初的开发者认为所有 URI 都应该有两个正斜杠)。我可以明确地说,对于 “scheme://”调用,接收方的这种稳健性是非常罕见的,因为如果他们对 URI 有足够的理解,就不会多出两个他们永远不会使用的斜杠。
在 PR 链接到的问题上的一条评论引用了 https://url.spec.whatwg.org/#url-serializing,作为 itms-services 通常不会有”//”,因此需要异常的理由。然而,该标准说的是 “非空”,而不是 “非空¹”,所以听起来好像 python 的 URL 库在这里把空主机与空主机同等对待是错误的。
¹此外,我还检查了一下,该标准确实将空主机 (https://url.spec.whatwg.org/#empty-host) 定义为与空主机不同的概念。
这篇文章非常清楚,它之所以有这个字符串,是因为这是 Apple 推荐的启动新应用程序的方法,而 MacOS 上的 Python 也是这么做的。它是标准库的一部分。
不只是苹果公司会这样搞鬼。
试试用 PyInstaller 编译 Python 应用程序,同时开启 Windows Defender 实时扫描(默认设置)。如果没有 Defender 的阻止,你甚至无法编译二进制文件。
同样,试试在开启 Windows Defender 的情况下运行 PyInstaller 生成的二进制文件。Defender 会说这是恶意软件,并不会运行它。
两个主要的操作系统平台都不遗余力地阻止你发布和运行 Python 应用程序,这有点像乌托邦。
不仅仅是 Python 应用程序。没有昂贵证书的小开发者也会遇到这种情况。我曾用 MSVC 编译过一个 C 语言程序,它只不过是一个 “Hello, World”,而 Defender 却称它为 Win32/Wacatac 木马。
微软要求的代码签名证书贵得离谱。这是一个由证书颁发者组成的卡特尔。这简直就是抢劫。我们需要类似于 Let’s Encrypt 的代码签名证书。
SignPath 为开放源码软件项目提供免费证书:
https://signpath.org/about/
我们(sqlitebrowser.org)最近开始使用它们来签署我们的 Windows 版本。
卫士称任何东西为 Wacatac。
具有讽刺意味的是,我见过大量真正的恶意软件,它们甚至不会发出丝毫警告。
即使合法的恶意软件被标记为 “Wacatac”,也一定会有一部分用户在谷歌上搜索这个名字,看到多年来(如果不是几十年的话)微软错误地将大量合法软件标记为该病毒,然后在他们的机器上将真正的恶意软件列入白名单,认为微软肯定又搞砸了。我对 MS 这么多年来一直没有解决这个问题并不感到惊讶,只是感到失望。
这就是恶意软件的传播方式。大多数从有问题的地方获取的应用程序都有说明,说要禁用杀毒软件。我明白….,但我不想玩这么糟糕的游戏。
我在工作时用围棋做了一个 for 循环给同事看,结果二进制被标记为恶意软件。
这通常是他们的机器学习病毒扫描仪造成的。出于某种原因,只要是你自己编译的程序,基本上都会被认定为病毒。我想,如果把所有东西都称为病毒,就不会漏掉病毒了。
在游戏开发社区,我们看到有人将特洛伊木马提交到游戏竞赛中。
这与主题无关。
不,是相关的。在没有沙盒的情况下运行未签名的 exes 实际上是有风险的,游戏卡顿就是出现这种情况的一种特殊情况。
可以吗?
好的)
> 不只是 Python 应用程序。没有昂贵证书的小开发者的任何应用程序都是如此。
情况确实如此,我的经验也是如此。
当涉及到小型开发者构建和共享任何东西时,我们生活在一个黑暗的时代,尤其是当你构建的东西是免费的时候。
我停止了更新我的开源 Mac 应用程序,因为我无法证明跨越苹果设置的人为障碍的成本是合理的,这些障碍会确保用户无法运行他们想要使用的应用程序。我还有其他的爱好,在这些爱好中,花钱能给我带来实实在在的商品和利益,而不是为了制造最终能让苹果公司受益的东西而每年随意交税。
我们的开源应用程序也是这种情况。我们使用苹果的唯一原因是,我们的一位用户非常喜欢这款应用,他们负责办理证书。
仔细想想,这真是莫大的讽刺。
超级有趣的是,一个不是你的人可以负责向苹果公司证明你真的是你,这样苹果公司就可以向所有其他用户宣称,他们已经验证了你真的是你,因为他们让你证明了这一点。
这个世界真是太棒了。)
我认为,如果你不想支付开发费用或通过任何障碍,Homebrew 是发布开源 Mac 应用程序的最佳解决方案,前提是你的用户有足够的技术能力使用它。
另一种选择是不对二进制文件签名,并向用户解释他们可以通过右键单击并从菜单中选择 “打开 “来运行它们。
不幸的是,让用户安装 Homebrew 对我来说是一个难以逾越的障碍。尽管 Homebrew 现在有 .pkg 安装程序,但如果用户必须打开终端才能安装任何东西,那就不可能成功。用户通常连终端是什么都不知道。
> 另一种选择是不为二进制文件签名,并向用户解释他们可以通过右键单击并从菜单中选择 “打开 “来运行它们。
我现在就是这么做的,但不幸的是,这仍然是个问题。非 “超级用户 “不会记住 “右键单击”->”打开 “的仪式,因为他们只会双击其他东西。
而且,Gatekeeper 显示的警告也会让用户以为自己的应用程序甚至电脑被破解或黑客攻击了。
你为什么不……每年支付 100 美元来签署你的应用程序?
> 我不再更新我的开源 Mac 应用程序了,因为我无法解释为什么要花钱跨越苹果设置的人为障碍,以确保用户无法运行他们想要使用的应用程序。我还有其他的爱好,在这些爱好中,花钱能给我带来实实在在的商品和利益,而不是为了制造最终能让苹果公司受益的东西而每年缴纳任意的税款。
> 停止更新我的开源 Mac 应用程序,因为我无法证明跨越苹果设置的人为障碍的成本是合理的,这些障碍确保用户无法运行他们想使用的应用程序。
哈,这正是我在 8 年前停止使用 OS X 并在我的旧 Mac book air 上全面使用 Linux 的原因。
这不是我的经验,但也许我做的事情与众不同。我发布了一个电子应用程序。我使用 electron-builder 将其构建为安装程序。我不确定是否设置了任何配置。它被设置为安装在用户文件夹中,而不是系统级别。我的理解是这是允许的,而且可以正常工作。
对 Windows Defender 来说,PyInstaller 二进制文件看起来确实像恶意软件。如果它不这样做,它就会很快成为恶意软件的标准传播方式。不幸的是,每有一个人试图在 Windows PC 上编译或运行来自网络的有效 python 程序,就会有 1000 个恶意软件/木马实例试图感染他们。
理想情况下,代码签名/验证的成本会更低
https://www.reddit.com/r/learnpython/comments/e99bhe/comment…
> 两个主要的操作系统平台都不遗余力地阻止您发布和运行 Python 应用程序
这不仅仅是 Python 应用程序的问题。要通过 Windows SmartScreen 的签名程序,您需要购买证书,或者深度集成 Windows 开发的黄金路径。如果偏离微软认可的路径,你的所有用户都会收到一个可怕的警告。这样做的部分原因是出于安全考虑,但也有主要操作系统推行””开发方式的苦涩滋味。
这足以成为不使用 Windows 或 Macos 的理由。说这些程序是恶意的,完全是谎言。他们没有证明这一点。他们最多只能说程序不受信任或未经验证。但称其为恶意程序就是不实之词,因此属于失信行为。
几个月前,我在 Windows 上构建了 PyInstaller 二进制文件,Windows Defender 完全没有发现问题。
是的,它大部分时间都能工作,但不是经常工作。我用 Pyinstaller 开发过一个跨平台的 PyQt 专有应用程序,用了好几年。签名帮了大忙,但发布过程中还是要把二进制文件提交给一个网站,该网站会用大多数已知的杀毒软件进行检查,以确保我们不会为大多数 Windows 用户发布一个哑弹。有趣的是,有时重建后问题就解决了。
Windows 不是开发人员的平台。它是一个面向普通用户的平台。这还不明显吗?
如果你想要一个工程操作系统,那就用 GNU/Linux。
在使用 WINE(据说有一些拦截器,我和其他几个人都试过)和 PyInstaller 运行无 Windows 构建系统之前,跨平台应用程序将要求开发者在 Windows 本身编译其 Windows 移植。
Windows 是用户所在的地方。不将其作为目标是一个错误的财务决策。
过去 10 年中,我们通过 WINE / Ubuntu 发布了基于 py2exe 的 Win32/Win64 软件,没有任何问题 – 我们没有签署 (https://www.vintech.bg)
感谢您提供的信息,我一直在犹豫是否要引入更多特定平台的工具,因此我坚持使用 PyInstaller。我会看看 py2exe 能否满足我的需求。
让跨平台见鬼去吧。为 Windows 开发会延续有害的生态系统。这跟卖弹药给西内洛亚贩毒集团没什么区别。
有点不同。
是的,当你没有工作时,这是个很容易遵循的建议
我希望有一天我会没有工作!
什么意思?
我的工作是开发跨平台软件,但我们是在 Linux 上开发的。软件可以在 Windows 上运行,但在 Windows 上构建软件是一种折磨,所以我们几乎所有的开发机器都是 Linux 的。
我遇到过很多 Mac 用户,他们无法浏览 Mac 上的文件系统,这让我很不舒服。
我工作的这家价值数十亿美元的公司不明白这一点。我被迫在虚拟 Windows 机器上完成所有开发工作。他们有自己的理由,其中很多都是合理的,但还是很麻烦
你的个性是从 /g/ 下载的?
我觉得这很有趣
> Alex Gaynor 建议项目尝试一种 Keith-Magee 没有提出的方法,这种方法的灵感来自 Gaynor 在密码学库方面的经验。该项目经常收到投诉,称加密库拒绝解析技术上无效但被广泛使用的证书。他说,我们的政策是接受解决这些问题的拉取请求,””前提是这些请求要小,要本地化,而且一般不会太糟糕”。但他补充说,接受这些补丁的前提条件是,有人向第三方(这里指苹果公司)投诉,并获得某种承诺,表示他们会对此采取一些措施。他建议,这种变通办法应该有时间限制,以便给用户一个体面的体验,””同时也不能让大公司简单地将其怪异的问题外部化到开放源码软件项目中””。
用户希望开放源码软件绕过商业软件中的错误,因为开放源码软件的维护者更容易被欺负,而且他们知道向大公司报告错误会直接进入黑洞。
鉴于苹果公司的错误报告系统是个黑洞,这句话似乎是无稽之谈。Pythonistas 的大话一如既往,与现实毫无关联。
我们能在数字平台上实现三权分立吗?
卖手机的也能决定手机上的内容,这实在是太糟糕了。
你是想买没有操作系统的主流手机吗?
我选择苹果作为我手机上应用程序的监护人。有一种平台是由用户来决定手机上的应用,那就是安卓。
虽然我很高兴你可以选择成为数字农奴–为使用土地(设备)向领主付费,但我更愿意选择不成为数字农奴。
这样,你可以选择成为数字农奴,而像我这样的人则可以选择退出。
–
这里的 “农奴 “不是贬义词,而是形容词。苹果公司的行为就像一个封建领主。甚至还声称要保护土地和仲裁纠纷。
为什么你表现得好像安卓系统不存在一样?你可以选择退出 “数字农奴制”。
安卓系统有什么不同?
在某些情况下,人们可以安装去谷歌化版的安卓系统,并通过其他应用商店或直接安装他们想要的任何应用(.apk)。
对于 99.9% 的人来说,安卓和 iOS 在自由度方面几乎是一样的,因为他们只需从 play 商店安装应用程序,并在制造商提供的(且已膨胀的)安卓安装程序上使用谷歌服务。
尽管如此,对于那些关心手机的人来说,能够控制自己的手机并运行 AOSP(一种真正的自由和开放源码软件发行版)、只运行自由和开放源码软件应用程序或安装任何自己想要的应用程序,这在 Android 和 iOS 上是无与伦比的。
你的思路错得离谱,跟你争论也是浪费时间,因为你根本帮不上忙。
当然,那为什么其他使用 iOS 设备的人也要做出同样的选择呢?
那些拥有 iOS 设备的用户可以做出完全相同的选择–购买安卓设备。如果我不想让苹果成为我的监护人,这就是我的选择。
我不明白为什么人们觉得有必要强迫苹果公司采取特定的策略,因为他们并不是垄断者。他们不是城里唯一的游戏,你不需要 iPhone。每个拥有 iPhone 的人都是自己选择的。
人们之所以不喜欢 “如果你想要选择,就选择能给你选择的平台 “这一观点,也许是因为安卓就是一堆垃圾。
即使是在这里,人们也不关心在自己拥有的硬件上运行任何代码的权利,这实在是太可悲了。
你错了,你实际上并不拥有它。
这是不正确的 – 如果您直接付款,您确实拥有您的手机。苹果公司不能拿走你的手机。
至于软件,苹果公司拥有 iOS 系统,并将其授权给您的设备使用。
苹果,这家市值上万亿美元的公司,不需要你为他们糟糕的商业行为辩护。
> 我不明白,既然苹果公司不是垄断企业,为什么人们还要强迫他们采取特定的策略。
根据你的论点,他们___是___垄断。即数字农奴制。因为很显然,安卓属于另一个领域。
>每一个拥有 iPhone 的人都是自己选择的。
我并不想要 iPhone。我是被逼无奈才买的,因为苹果公司不允许在他们的平台上使用任何网络浏览器,除了他们的网络浏览器。因此,如果没有真正的 iPhone 作为开发平台,我就无法为 iPhone 用户提供可用的网站。这绝对是苹果公司强加给全世界的一种滥用、反竞争和低劣的人为限制。我真的宁愿告诉我的用户安装 Chrome 或 Firefox 并使用它们,而不是被迫使用 Safari。这对开发者不利,对他们的客户也不利,不管他们是否知道。
他们不是垄断,而是双头垄断。这是个稍好的位置,但我不知道你如何自圆其说,把消费者的权力交给世界上最大的科技公司。
因为这是一组权衡,而不是严格意义上的更好/更坏?
苹果公司完全有能力生产出一款能运行你自己的软件的手机,而且只需极少的权衡取舍,只是他们不想这么做,因为他们的目的不是为用户赋权,而是创造一类依赖性消费者。
混淆视听似乎是让你的开发者账户被暂停的好办法。我怀疑苹果所做的远不止是对磁盘上的二进制文件进行基本的静态分析。
很高兴他们选择了配置选项。
要看情况。实际 “违反 “的规则并不是应用程序不能包含 “itms-services “字符串。而是
也就是说,应用程序不能试图触发另一个 App Store 应用程序的安装。问题中的应用程序并没有这样做,只是基本的检查对于它应该检查的规则来说是不称职的,而且审查员也没有在此之后进行任何手动检查,以确定是否是假阳性。因此,如果你真的不想安装其他应用程序,混淆字符串应该会让你的应用程序和以前一样不违规……只是不会触发糟糕的检查。
当然,在此之后,苹果就可以任意妄为了。
他们在二进制文件中不透明地拒绝包含 “itms-services “字符串的应用程序,而你还在为他们更复杂的分析点赞?笑死我了
你是在假设这就是他们正在做的一切,也是他们将要做的一切,但这两种假设都没有任何证据支持。
苹果公司说的是哪个测试出了问题,而不是说其他测试没有运行。
更多信息请参阅上述文章,特别是链接 [1] 的讨论。
> 对魔法字符串进行一些轻度混淆似乎可以避免这个问题。
这是一个简单的字符串匹配导致的故障。
[1] https://discuss.python.org/t/handling-incompatibilities-with…
很有道理,不过我其实只是想说,他们在做一些简单的事情,并不意味着他们不会(或者更重要的是,不会)做一些复杂的事情。在 LWN 文章的讨论中提到,苹果不喜欢混淆,这大概意味着他们可以检测到某些形式的混淆。
换一种说法:如果这是我的应用程序,而这个字符串对我来说并不重要,我不会希望它被混淆,我会希望它被移除。
如果他们做得更多,为什么应用程序会被拒绝?
我们可以认为,在进行更高级的检查之前,简单的字符串搜索是他们进行的基本检查之一。
多年来,我所看到的有关 MAS/iOS AS 被拒的每一个故事都表明,他们的检查根本就不先进。
为什么我们可以这么认为?
因为实施起来更省力?
为什么苹果公司不能在沙盒级别添加 “itms-services “作为禁止的 URL 方案?我不明白为什么应用程序沙盒不能阻止(而且还没有阻止)某些协议。
哎呀,如果我的应用程序中有一个恶意网页框架试图调用 “itms-services “呢?
我不知道 url 处理程序有什么大不了的,但我无法想象它会导致远程代码执行或其他实际的恶意行为。
在这一点上,苹果似乎使用的是简单的子串匹配,因此如果有任何漏洞载体,恶意软件作者可以使用 “itms “+”-services “或更复杂的 ROT13 来规避检查。
这也正是为什么……App Store 的审核程序声称这是一个问题,这似乎没有任何意义。
想象一下,你的应用在 myapp.com/terms 上嵌入了一个 WebView。这是你的服务条款,你会在每个人注册时向他们展示。每个人都点击了 “确定”。
上架 App Store 后,出于某种原因,您修改了 WebView,使其包含 “itms-services”。你刚刚完全绕过了 App Store 的审核,并将 URL 处理程序带入了你的应用程序。沙盒本应阻止你,但审查流程显然没有考虑到这种可能性,并在你发布之前强制执行。为什么会这样?
我的观点是,如果苹果不想允许使用该处理程序,那么如果他们希望禁令真正有效,那么扫描该处理程序似乎是错误的。
审核过程中,苹果会给你一个明确的方向,告诉你什么是可以接受的。
有很多方法可以绕过他们的限制。但这样做会让你被禁用。
我还没听说苹果打算在审核过程中给出明确的指示。
他们拒绝告诉他被拒绝的原因,很难说是 “明确的指导”。
> 该应用程序安装或启动了可执行代码。具体来说,该应用程序使用 itms-services URL 方案安装应用程序。
对我来说,这似乎是一个非常明确的方向:
https://github.com/python/cpython/issues/120522
不过,这个应用程序实际上并没有做这样的事情。
措辞可以更好一些。
但众所周知,苹果搜索二进制文件中的字符串已有十多年历史。他们从未进行过运行时执行检查,而这种检查会发现你确实在进行这样的 HTTP 调用。
我的基准线与现代编译器和自动测试的基准线类似。比如
为了获得 “为您提供明确指导 “的荣誉,我希望他们提供并建议修复方法。一般来说,这可能是 “如果这是一个假阳性,请单击以请求人工审核员进行豁免”,但理想的情况是首先监测此类问题(相同拒绝的突然增加)并修复损坏的检查。
相反,苹果公司似乎忽略了第一行的信息,而这些信息很可能已经从他们的内部工具中获得,而且不仅没有提出修复建议,反而使适当的修复变得如此难以获得,以至于修改语言本身比在他们的审核框架中进行检查更容易。
> 但众所周知,苹果搜索二进制文件中的字符串已有十多年历史。他们从来没有进行过运行时执行检查,从而发现你实际上是在进行这样的 HTTP 调用。
诚然,如果有人对苹果公司的检查方式有所了解,并从其他受挫用户那里了解到这一过程,那么他很可能会推断出苹果公司的测试存在漏洞,从而最终从第二行推断出第一行。这并不是苹果公司给出了一个明确的方向,而是开发人员设法绕过了一个难以捉摸的系统。
如果出现以下情况,就可以进行这样的检查
1.苹果公司收到您的源代码副本以进行源代码分析
2.苹果实际上支持将运行 Python 代码作为编写 iOS 应用程序的一个选项,并为 Python 编写了源代码分析工具,用于报告合规性问题
这些都不是事实。
我并不建议使用任何特定语言的功能,比如告诉你它在哪个函数中–只需提供文件名、位置和匹配字符串。这是 Apple 已经掌握的信息,即使对编译后的/对象代码也很有用。
摘自链接的 Github 问题:
> 在多次被告知 “我们无法为您提供更多信息 “之后,我终于提交了一份拒绝申诉,结果苹果终于告诉我,parse.py 及其 .pyc 是违规文件。
它的作用与明确的方向完全相反。它是一个任意的黑盒子
该 URL 很可能在苹果框架内用于各种目的,因此即使应用程序本身不知道该 URL,应用程序进程也有可能打开该 URL。
Python 只需对方案进行 rot13 并对加密方案进行散列。
在原帖中提到了混淆是否是一种可接受的变通办法,但后来发现苹果公司真的不喜欢混淆技术。目前的解决方法是使用编译器标记,将有问题的代码排除在 iOS 编译之外。
但我还是要问,如果苹果不喜欢使用这种协议的应用程序,为什么沙盒不进行干预呢?
沙盒应用程序可以使用 itms-services:// 链接,只是不允许在 App Store 中使用。使用内部部署的 iOS 企业应用程序可以使用它进行安装和更新,部署在 App Store 以外的沙盒 Mac 应用程序也可以使用它。
不过,《App 审核指南》禁止 App Store 应用程序安装其他应用程序,因此在审核过程中会对该方案进行扫描。
可以通过授予企业应用程序打开该方案的权限,而不授予普通 App Store 应用程序来解决这个问题。依靠字符串扫描根本不安全。
欢迎使用苹果备受赞誉的安全模式。
更严重的是,我相信他们也会阻止该 URI 方案的权限。这很可能是某种深层防御方法的一部分。就像他们在执行程序中搜索私有符号的名称一样,即使链接器直接拒绝提供这些名称。我非常讨厌这种普遍存在的无用安全层,它们几乎什么也没增加。但是,既然几乎什么都没有,那就不是什么都没有,没有人可以删除任何一层。就像蟑螂纸一样,我把它们叫做 “蟑螂安全”。如今,几乎所有东西都充斥着这些东西。
这有点道理,但我又有了一个新问题:为什么苹果公司不针对内部和 App Store 采用不同的证书方案(如果还没有的话)?在这种情况下,iOS 沙盒应该足够智能,而且可能已经根据应用程序是通过 App Store 还是通过私有部署来划分允许的功能。
> 为什么苹果公司不针对内部和 App Store 采用不同的证书方案(如果还没有的话)?
企业分发允许您将应用程序部署到企业管理的设备上,而无需经过 App Store 审查。限制主要是在业务协议中,即你可以向哪些人(如员工和承包商)提供企业分发,以及你的应用程序可以做什么。这样做的理由是,企业与员工/承包商有关系,最终要为他们通过 MDM 在员工设备上的滥用/伤害行为负责。
几年前,Facebook 和谷歌就是在这种情况下被暂时禁止企业账户的,因为它们都将企业账户作为市场分析项目的一部分–它们提供在消费者设备上安装 VPN 软件的服务,以监控网络和第三方应用程序的使用情况。根据企业开发者账户协议,即使是员工也不允许进行此类监控。
> 目前的解决方法是使用编译器标记,将有问题的代码排除在 iOS 版本之外。
这听起来是正确的解决方法,因为它最不可能让你的开发者账户被禁用。
为什么基础 Python 中会有 “itms-services URL scheme”?为什么 Python 开箱就有与 iTunes 交互的代码?
很显然,这是另一种黑客行为,目的是防止服务器端对此类 URL 进行错误解析,而不会发生实际交互 [1]。
[1] https://github.com/python/cpython/issues/104139
这是一个该死的测试用例,用来检测 URL 方案中的连字符?改成 asdf-zxcv就行了。或者从最终用户的 python 安装中删除测试用例。我们这是在干什么?
之所以出现违规字符串,是因为 Python 的 urllib 有一个硬编码的使用主机名组件或 “netloc “的方案列表。该列表包含 RFC 中的已知方案。其他任何内容,包括专有的第三方方案,都应该使用启发式。
该列表称为 uses_netloc,用于帮助解析 https、ftp 等域的 user@host:port 部分。正是这个方案列表包含了被禁止的字符串 itms-services,用于苹果公司专有的 iTunes 软件。
唯一需要这样做的代码是 urlunsplit 和 urljoin。如果您解析的 URL 有 netloc,那么该列表甚至都不重要–如果您有 netloc,那么您就会被认为是 uses_netloc。
比起按照某些公司的消极要求,有选择性地从源代码中包含或排除不良字符串,这种方法似乎要明智得多。
为什么 urllib 要使用这种 URL 方案?如果 Python 库硬编码了有关苹果专有内容的知识,那么苹果可能会对此提出异议也就不足为奇了。
我认为,添加这一内容是因为 `itms-services://?` URL 格式是非标准的,破坏了 `urllib.parse` 中的现有逻辑: https://github.com/python/cpython/pull/104312
根据 RFC 3986,我认为这是一个有效的 URL。
权限由主机、空白名称和空白路径(path-abempty)组成。
问题是很多库都没有区分明确声明为空白的字段和未声明的字段(例如 nil 与””)。看起来他们并没有修改 python 的 URL 库来识别这种区别,而是创建了一个异常列表来硬编码输出行为。
可以说,客户端软件应该足够强大,能够处理两种形式的 URL(例如,itms-service URL 很可能只是 URI,但最初的开发者认为所有 URI 都应该有两个正斜杠)。我可以明确地说,对于 “scheme://”调用,接收方的这种稳健性是非常罕见的,因为如果他们对 URI 有足够的理解,就不会多出两个他们永远不会使用的斜杠。
在 PR 链接到的问题上的一条评论引用了 https://url.spec.whatwg.org/#url-serializing,作为 itms-services 通常不会有”//”,因此需要异常的理由。然而,该标准说的是 “非空”,而不是 “非空¹”,所以听起来好像 python 的 URL 库在这里把空主机与空主机同等对待是错误的。
¹此外,我还检查了一下,该标准确实将空主机 (https://url.spec.whatwg.org/#empty-host) 定义为与空主机不同的概念。
这篇文章非常清楚,它之所以有这个字符串,是因为这是 Apple 推荐的启动新应用程序的方法,而 MacOS 上的 Python 也是这么做的。它是标准库的一部分。