An F-Droid fdroiddata issue from August 2022
investigating why the F-Droid build
of the Nextcloud News app
contacted an interact.sh out-of-band interaction host
that appeared in neither the developer’s GitHub APK
nor the source tarball F-Droid claimed to have built.
A saved copy
is preserved here;
the .raw.html companion is the provenance copy.
The parallel investigation in the app’s own tracker is
nextcloud/news-android#1109.
What happened
The injected code was not inserted by F-Droid
and was not in the app’s source at all.
A self-described security researcher
had registered the nostra13.com domain,
used JitPack’s custom-domain mechanism
to publish a poisoned copy
of the com.nostra13.universalimageloader dependency,
and embedded a beacon —
which its own source described as
“an experiment I made on android vulnerability” —
that phoned home the host app’s package name.
The app’s build script listed JitPack as a repository
and Gradle resolved the poisoned artifact
in preference to the clean Maven Central one.
The F-Droid build,
which resolves dependencies fresh from remote repositories,
picked it up;
the developer’s GitHub APK,
built against a warmed local dependency cache,
did not.
JitPack removed the package within about a day of notification. F-Droid scanned its repository and found only that one APK affected, then shipped a clean rebuild.
What it is evidence for
This is the closest thing to a realized supply-chain incident in the main F-Droid repository, and its mechanics matter more than its drama. The attack surface was the dependency closure, not the app source, the signing key, or the build host. “Built from the published source” therefore does not bound what lands in the binary: a poisoned transitive dependency produces a binary that faithfully corresponds to the published source and is compromised anyway. That cuts in both directions for the argument in Android app distribution trust models: it vindicates the critics’ point that building from source is not a review of what ships, while showing that the property F-Droid actually guarantees — Source-to-binary correspondence — held exactly as advertised throughout the incident.
Limitations
The beacon was a researcher’s stunt
rather than an exfiltration campaign,
though the same channel could have carried one.
A single incident bounds prevalence
only in the weakest sense:
F-Droid’s repository scan covered interact.sh specifically,
not dependency poisoning generally.
Built on 2 sources (2 external).
Working out connections…
Sources
Working out the neighbourhood…
Model contributions
Measured by git-blame lines per AI model (92 total).
{"width": 320, "height": 320, "data": {"values": [{"model": "Kimi K3", "label": "Kimi K3 (100%)", "lines": 92, "share": 1.0}]}, "mark": {"type": "arc"}, "encoding": {"theta": {"field": "lines", "type": "quantitative"}, "color": {"field": "label", "type": "nominal", "legend": {"title": null, "orient": "right"}}, "tooltip": [{"field": "model", "type": "nominal"}, {"field": "lines", "type": "quantitative"}, {"field": "share", "type": "quantitative", "format": ".1%"}], "order": {"field": "lines", "type": "quantitative", "sort": "descending"}}}