自由软件和检查是我们可以信赖的软件的关键

检查软件对于了解该软件实际在做什么至关重要。自由软件意味着所有用户都有机会全面检查他们所依赖的源代码。网络安全行业建立在检查软件以发现恶意软件并建立防御的基础上。恶意软件扫描器使用大量软件特征签名来扫描数十亿台设备,而发现新的攻击需要代码审计,技术分析和取证。这是最著名的软件检查领域。还有志愿者、学者和民间社会组织寻找跟踪针对性攻击,令人上瘾的黑暗模式,监视资本主义和其他不道德的做法。 F-Droid 社区也建立在检查之上,确保我们分发自由软件并标记负特征

一些开发者会描述这些功能,但会忽略关键细节。这可能只是一个简单的疏忽,也可能他们知道用户会不高兴,因此他们的目标是让这些细节远离公众视线。即使是努力保持透明并诚实地为用户服务的开发者也可能掉进坑里。我们有庞大的设施告诉开发者在他们的应用中包含了哪些库和服务,因为这将改善功能或开发过程。

  • “寻找创收机会应该轻而易举!”
  • “出色的数据收集软件使您能够最大限度地提高生产力!”
  • “应用货币化是一种帮助您从移动应用中赚钱而无需收费的方式。”

这些通常包括用户不想要的东西。这些行业实际上在说的是:收集尽可能多的个人数据,跟踪用户,用令人上瘾的黑暗模式留住他们,并吸引他们的注意力向他们展示尽可能多的广告。这些是我们正在努力揭露的事情,并且我们正在构建工具以提高效率并使更多人可以参与其中。

使用签名进行扫描

人工检查软件的最可靠方法之一是自动扫描感兴趣特征的签名并将结果展示给人工审查者。签名可以是二进制机器代码块、URL、函数名、域名或元数据位(如 API 密钥 ID)。二进制代码签名是各种恶意软件扫描程序使用的主要方法。恶意软件研究人员致力于寻找特定恶意软件独有而其他软件没有的小模式。以下是此类签名的示例,它是 Silentbanker 木马的 YARA 配置文件:

    strings:
        $a = {6A 40 68 00 30 00 00 6A 14 8D 91}
        $b = {8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9}
        $c = "UVODFRYSIHLNWPEJXQZAKCBGMT"

    condition:
        $a or $b or $c

F-Droid 还使用签名来帮助应用维护者找到负特征并阻止非自由依赖。最古老的版本是命令行工具 fdroid scanner十年前,F-Droid 的创始人 Ciaran Gultnieks 添加了一个扫描器来查找的一些“常见嫌疑人”:

    # Scan for common known non-free blobs:
    usual_suspects = ['flurryagent',
                      'paypal_mpl',
                      'libgoogleanalytics',
                      'admob-sdk-android',
                      'googleadview',
                      'googleadmobadssdk']

Exodus Privacy 建立了大量关于跟踪公司的配置文件。ETIP 是他们创建和管理跟踪器配置文件的平台。在那里输入和维护数据,然后当给定的配置文件被证明足够准确时,它们被添加到官方 Exodus 数据集中。这些配置文件包括各种签名,用于在你安装应用时自动检测安装到你设备上的 APK 文件中的跟踪器。F-Droid 长期以来一直间接使用 Exodus 配置文件。

id: d25d820d-4c97-420e-a7d7-72434c58a575
name: ABTasty
description: |
  You can use this library to access AB Tasty endpoints, which can
  generate a unique visitor ID, allocate a visitor to a test, and push
  visits and conversions events in order to help you analyze the
  outcomes of your campaigns.
documentation:
  - https://developers.abtasty.com/android-sdk.html
is_in_exodus: true
code_signature: com\.abtasty
network_signature: abtasty\.com
api_key_ids:
website: https://www.abtasty.com
maven_repository:
  - https://sdk.abtasty.com/android/
  - https://dl.bintray.com/abtasty/flagship-android
  - https://dl.bintray.com/abtasty/Android-sdk
group_id: com.abtasty
artifact_id: librarybyapi
gradle: com.abtasty:librarybyapi:1.1.0

@IzzySoft 一直维护一个包含“几乎自由”的应用的 F-Droid 存储库。它包括它自己的签名,用于检测 f-droid.org 中可能不允许的负特征,它还包括用于检测更一般的负特征(如跟踪)的另一道防线。

anti_features:
- NonFreeDep
- Tracking
code_signatures:
- com\.heapanalytics
description: |-
  automatically captures every web, mobile, and cloud interaction:
  clicks, submits, transactions, emails, and more. Retroactively
  analyze your data without writing code.
license: Proprietary

Plexus 是 Techlore 社区的一个项目,用于确定哪些应用可在 “de-Googled” 设备上运行,以及哪些应用可与 Google Play Services 的 microG 自由软件替代品一起使用。他们将人类运行的测试结果收集成机器可读的格式。尽管它依赖于人类测试人员,而不是像这里提到的大多数其他项目那样依赖于自动模式匹配,但生成的数据具有相似的结构,并且可以以相同的方式在生成报告时使用,例如在 issuebot 中。

Application: The New York Times
Package: com.nytimes.android
Version: 0.0.0
DG_Rating: X
MG_Rating: 4
DG_Notes: X
MG_Notes: Can't login with Google

Mobil Sicher 也审查应用,它重点关注德国。他们有一个令人印象深刻的系统来对应用进行动态分析,以准确找到他们在互联网上使用的服务。有了这些数据,他们不仅可以标记跟踪器,还可以标记应用是否将个人数据发送到第三方服务,如广告公司、云服务等。

我们的合作伙伴也使用签名,让我们通力合作!

当我们与各种组织讨论他们的签名集合并将其中一些应用到 f-droid.org 应用集合时,我们发现有很多共同的结构。但是每个系统的设置方式都与其他系统不同:Python 代码、Django 管理面板、电子邮件提交等。如果其他贡献者想要加入并做出贡献,他们必须了解每个项目的格式。这可能很耗时,并且没有可遵循的标准化格式。然后 Exodus Privacy 的 @pnu 建议将他们的编辑系统重写为 git 存储库中的文件。这是明确表明一个人类可编辑数据文件的 git 存储库将适用于所有这些数据集的火花。

基于这个想法,我们推出了 F-Droid SUSS(可疑或不受欢迎的软件签名)。它是 F-Droid 的签名集合,用于检测 Android 应用中的负特征。 SUSS 是第一个实施此想法的实际项目,fdroid scanner 工具将使用它。SUSS 基于 YAML 文件,每个配置一个文件。YAML 基本上是可以人工编辑的结构化数据(甚至所有有效的 JSON 都是有效的 YAML)。YAML 也被广泛理解,因为它用于 F-Droid 自己的元数据 .yml 格式、GitLab CI、GitHub Actions 和 FUNDING.yml 等等。此外,它在各种编辑器中都得到了很好的支持,包括语法高亮。

这是朝着与其他与 F-Droid 共享目标的组织更好地整合的一步。标准化可以减少共享和协作中摩擦,因为具有通用工具、通用数据格式和自动互操作性。这种基础架构应该足够灵活,让这些数据集的维护者可以按照他们认为合适的方式创建和维护配置文件。标准化工具不应该强迫人们进入适得其反的模式。该项目审查了来自 Exodus/ETIP、IzzySoft、MobilSicher、F-Droid 和 TechLore Plexus 的数据集。每个都有不同且特定的工具和工作流程。但数据的大致形式与项目中的常见模式相匹配。

这种标准化有一个很好的先例:YARA。它是一种恶意软件签名工具,由一家公司启动,现在已被数十家公司使用。 YARA 的这一方面直接适用于此处讨论的公共利益签名的集合。一旦标准流行起来,它不仅增加了数据的普遍性,使其更易于使用。这还可以吸引更多的用户和贡献者。 YARA 是围绕桌面恶意软件设计的,不幸的是在 Android 上效果不好。部分原因是他们使 YARA 成为在 YARA 工具中实现的自定义格式。这种设置确实使 YARA 规则简单易读,但也有很大的缺点。 YARA 是用 Python 实现的,因此在其他语言中使用它意味着从头开始重新实现它。 Android APK 始终是 ZIP,与桌面软件二进制文件不同,后者通常是未压缩的文件。YARA 工具开发者决定他们不希望包含在 ZIP、XML 等上运行扫描的代码。这使 YARA 难以用作 Android 扫描仪。

共享签名和配置文件看起来是什么样的?

为了展示这在实践中是什么样,我们可以从上面的 fdroid scanner 中举一个例子。当前扫描器中的 flurryagent 签名用于扫描 Gradle 文件中的依赖声明,这些文件是构建 Android 应用的标准配置,以及标准 JAR 库文件。 Gradle 坐标 com.fasterxml.jackson.core:jackson-core:2.11.1 不会被标记,但这模式也会错过 Gradle 行 com.flurry.android:analytics:10.0.0@aar。但是,如果应用中包含 JAR,则会对其进行扫描,并且该 JAR 中的 com/flurry/android/FlurryAgent 会生成匹配项。但它只是输出命中的文件,没有关于什么或原因的上下文。作为 SUSS 的一部分,现在每个条目都在其自己的 YAML 文件中获得一个完整的配置文件,其中每个扫描签名都被明确声明。然后,当存在匹配项时,该元数据可以提供更多上下文。

name: Flurry
website: http://www.flurry.com
code_signatures:
  - com.flurry.
network_signatures:
  - flurry\.com
api_key_ids:
  - flurry\.com
  - com\.flurry\.admob\.MY_AD_UNIT_ID
gradle_signatures:
  - com\.flurry\.android
license: NonFree
anti_features:
  - Ads
  - NonFree
  - Tracking

在 SUSS 中,我们现在可以使用具有 Exodus Privacy 签名的灵活性的方式来表示 fdroid scanner 签名。这增加了额外的扫描,包括域名和用于声明的名称 API 密钥fdroid scanner 有一个额外的允许列表,以防某些签名产生误报。已删除允许列表以支持纯正则表达式。允许列表使 F-Droid 实现更加复杂,并将我们的签名配置文件与 fdroidserver 工具绑定在一起。我们查看的其他数据集都只使用简单的条目,主要使用正则表达式,因此探索是否可以涵盖所有需要的扫描案例非常重要。如果它成功了,那么标准化的道路就很清楚了。是的,正则表达式很复杂,可能很痛苦,但它们也被广泛使用、实施、记录和理解。

仅使用正则表达式的一大优点是 SUSS 有一个超级快速、简单的测试套件。这是使用它的一种方法:

  • 找到相关的 Gradle 坐标并将它们添加到 tests/test_suss.py 中的匹配和例外列表中
  • 使测试每秒运行一次(彩色输出!):
    watch --color -n1 pytest-3 --color=yes
  • 编辑正则表达式,例如,在 suss/com.mapbox.yml

由于这仅使用正则表达式,因此此测试套件不需要任何 fdroidserver 代码。这一切在 Javascript、Ruby、Rust、Java、Kotlin 等中使用也很简单,因为配置文件是 YAML 并且签名是正则表达式。

使用签名

fdroid/rfpfdroiddata 中运行的 issuebot 现在使用来自 Exodus Privacy ETIP、fdroid scanner 和 Plexus 的签名。现在可以很容易地在 issuebot 模块中使用 ETIP 签名,以便对如何扫描事物进行实验。以下是 issuebot 基于这些签名标记事物的一些代码片段。

gradle-dependencies-1
这显然是一个非自由依赖,这个应用的所有构建都需要它。

gradle-dependencies
这是一个双重打击:用于跟踪的非自由库!

source-scan-0
这是一个匹配,但是 “test” flavor 是否相关?

source-scan-1
这有一个很好的匹配,但是库包含在 “play” flavor 中,而那个 flavor 显然不适用于 f-droid.org。

issuebot 报告有很多部分,基于已完成的扫描。当一个部分有一些被标记的条目时,该部分将默认打开。因此,这些部分在第一次阅读时会很明显,但在查看后总是可以隐藏。

现在有用于在二进制 APK 中查找域名和 URL 的有效方法。网络签名用于检查匹配项。现在还有其他方法可以提取数据然后运行签名匹配。有一个新的 Gradle Dependencies 模块,它从 gradle/verification-metadata.xml(如果存在或可生成)或 ./gradlew androidDependencies(如果所有其他方法都失败)获取完整的依赖项列表.然后它应用代码签名来标记 Gradle 坐标。现在有多种重叠的方法可以从源代码和二进制 APK 中抓取所使用的库。如果我们可以确定有一种方法可以可靠地找到所有依赖项,那么这些可以合并。

未来的工作

该项目对现有的 issuebot 设置进行了显着改进,并建立了跨项目集成的结构。我们希望这种数据布局和工作流程可以作为其他相关工作的模板。现在它已启动并投入使用,我们欢迎就哪些有效,哪些无效提供反馈。并且总是欢迎为改进任何部分做出贡献。 F-Droid SUSS 现在是一个非常简单的开始贡献的起点,任何可以编辑基本 YAML 并提交合并请求的人现在都可以帮助 F-Droid 改进我们的检查过程。以下是这个项目中的一些易于实现的任务:

  • 使用多个签名集合的一个缺点是更难找到编辑和管理配置文件的位置。一些好的用户体验设计会很有帮助。例如,当有匹配时,UI 可以显示直接链接以编辑配置文件,以便 fdroiddata 维护者轻松微调配置文件,即使它们在 Exodus Privacy 或其他地方维护。

  • 我们已经将 MobilSicher 和 IzzySoft 数据转换为 SUSS 格式的原型。一旦 SUSS 成为一种稳定格式,我们就可以轻松地将这些数据集转换为这种格式。

  • 一些 issuebot 报告仍然可能很长。以 @IzzySoft 的模块的报告为例可以很好地说明如何处理这个问题:直接显示标记的东西,然后其余的进入一个链接的报告,该报告存储在仅按需加载的产物中。

这项工作由 NLnet 在 Tracking the TrackersGuardian ProjectThe Search for Ethical Apps 项目下资助