Maven Central ist weniger frei als es aussieht

F-Droid ist stets bestrebt FOSS-Android-Apps auszuliefern. Die Herstellung freier Software für Android aus dem Quelltext geht mit einer Reihe verschiedener Anforderungen an GNU/Linux-Distros wie Debian einher. Android-Apps werden kreuz-kompiliert: sie werden nicht auf demselben OS hergestellt, auf dem sie laufen. Zusätzlich liefert Android nur einen Barebone an eigenen Bibliotheken. Wie im Java-System wird von Apps erwartet, sich Bibliothek-Binärdateien aus Maven-Repos zu holen und sie in der App einzubauen. Um sicherzustellen, dass die App nur mit FOSS-Abhängigkeiten hergestellt wird, entwickeln wir ein Scan-System in fdroidserver, um Quellcode in Abhängigkeiten zu begrenzen und problematische Abhängigkeiten herauszufinden.

F-Droid verbietet unbekannte Maven-Repos und vertraut seit 2015 nur wenigen gut bekanntenMaven-Repos. Seither wurden nur einige weitere Repos hinzugefügt. Momentan enthält die Liste 8 Maven-Repos, denen wir trauen:

  • Maven Central - Google Maven Repo - JCenter - OSS Sonatype - OSS JFrog - JitPack.io - Clojars - CommonsWare - Gradle plugin repo

2020 wurden im Quellcode eingebettete JAR- und AAR-Dateien verboten und diese Repos, denen vertraut wurde, wurden zum letzten Schwachpunkt. Wir verlassen uns auf sie, um nur FOSS-Bibliotheken zu stellen. Allerdings kann keine garantieren, so zu handeln, und sie sind eine wichtige Ursache geworden, unfreie Bibliotheken in APKs einzuschmuggeln.

Das Maven Central Repo ist „die größte Sammlung von Java- und anderen Open-Source-Komponenten“ und eine Standardquelle von Bibliotheken für Maven und Gradle „Anbieter von Open-Source-Komponenten seit 2002“. Die überwiegende Mehrheit der in Android-Apps verwendeten Bibliotheken, abseits der google-eigenen, werden aus Maven Central bezogen. Es ist eines der gängigsten und bekanntesten Maven-Repos. Maven Central hat strenge Anforderungen, dass der Quellcode und die Kontrollsysteminformationen zur Quelle bereitgestellt werden sollen und die Lizenz deklariert werden soll. Es fordert auch, dass die Gruppen-ID mit der Domain des Eigentümers übereinstimmen soll und die Dateien signiert werden sollen. Außerdem unterstützt Maven Central auf erstklassige Weise Reproducible Builds, was eine große Hilfe ist, sicherzustellen, dass Apps zu 100% freie Software sind.

Alles klingt zu gut, um wahr zu sein. Unglücklicherweise ist es auch so. Obwohl sie erklären, dass Maven Central ein “OSS Repository Hosting” ist, verlangen sie nicht, dass die dort gehosteten Bibliotheken FOSS sind. Gelegentlich finden wir, dass eine nicht-freie Bibliothek von Maven Central bezogen wurde und müssen viele davon betroffene Versionen veröffentlichter Apps sperren.

Sind diese auf Maven Central gehosteten Open-Source-Bibliotheken vertrauenswürdig? Nein, nicht wirklich. Einige Bibliotheken werden mit einer FOSS-Lizenz gekennzeichnet, aber die Quell-JAR-Dateien sind leer. Was läuft falsch, wenn sie das Hochladen einer Pseudo-JAR-Datei des Quellcodes zur Umgehung der Anforderungen sogar fördern, was ihre Anforderungen komplett bedeutungslos macht. Die deklarierte Lizenzinformation kann einfach falsch sein und die Kontrollsyteminformation für die Quelle verweist auf einen Zufallslink oder ein Repo nur mit binären JARs. Ein weiterer gängiger Fall ist, dass die Bibliothek selbst “Open Source” ist, aber von anderen proprietären Bibliotheken abhängt.

Auch andere als vertrauenswürdig angesehene Maven-Repos beinhalten Probleme. Die von Google hosten, natürlich, viele proprietäre Bibliotheken und die Open-Source-Bibliotheken können von diesen proprietären abhängen. Die Repos OSS Sonatype und JCenter werden mit Maven Central synchronisiert und enthalten einige Extra-Bibliotheken. JitPack.io hostet was immer auf GitHub hergestellt wird, ohne Überprüfung der Lizenz oder ob es irgendeine Binärdatei im Repo gibt, von Abhängigkeiten ganz zu schweigen. Clojars und Gradle plugin repo besitzen ebenfalls keine Lizenzanforderungen. Die Java-Pakete von Debian und das CommonsWare-Repo sind ziemlich gut aber kaum genutzt.

Angesichts unserer begrenzten Kapazitäten und der Lage mag dies ein endloser Kampf werden. Aber wir erhalten mehr Waffen. Dank unseres Binär-Scanners haben wir viele Bibliotheken gefunden, die von nicht-freien Abhängigkeiten in diesen Maven-Repos abhängen, die meisten davon aus Maven Central. In Zukunft können wir die Liste der Abhängigkeiten durchsuchen, um sie vor dem Build zu finden. Dies wird jedoch nicht dabei helfen, Bibliotheken mit nicht-freier Lizenz herauszufinden. Diese nicht-freien Bibliotheken auf unserer Sperrliste werden meistens durch Zufall und Erfahrung gefunden. Wir arbeiten gerade daran, für die Zukunft verlässlichere Methoden zu entwickeln.