pollis
The package downloads a prebuilt .deb from a non-standard host (cdn.pollis.com) which is not a major public forge or vendor CDN, creating a supply-chain risk if the host is compromised or the download is swapped.
Triggered rules
source_untrusted_domain
One or more source=() URLs point to a host outside the trusted allowlist (github.com, gitlab.com, codeberg.org, pypi.org, …).
-
PKGBUILD:20
source=("https://cdn.pollis.com/releases/v${pkgver}/pollis-v${pkgver}-linux.deb")
llm_review
An AI model (qwen/qwen3-235b-a22b-2507) reviewed this and agrees it is MEDIUM (confidence 95%): The package downloads a prebuilt .deb from a non-standard host (cdn.pollis.com) which is not a major public forge or vendor CDN, creating a supply-chain risk if the host is compromised or the download is swapped.
PKGBUILD
1 offending line(s) highlighted# Maintainer: Pollis <hello@pollis.com>
# Generated by scripts/publish-aur.sh — do not edit by hand; the release
# pipeline overwrites this file on every release.
pkgname=pollis
pkgver=1.12.0
pkgrel=1
pkgdesc="End-to-end encrypted messaging"
arch=('x86_64')
url="https://pollis.com"
license=('LicenseRef-proprietary')
depends=(
'webkit2gtk-4.1'
'gtk3'
'libayatana-appindicator'
'alsa-lib'
'libpulse'
'dbus'
)
source=("https://cdn.pollis.com/releases/v${pkgver}/pollis-v${pkgver}-linux.deb")
sha256sums=('60aacc18e3987454dfa770ba4524d5c969d73d4600e11ab1b932b66da787c2a7')
package() {
# The Tauri .deb already lays the app out under /usr (binary at
# /usr/bin/pollis, capture helper at /usr/bin/pollis-capture-linux,
# .desktop + icons under /usr/share) — extract it verbatim. No
# /opt symlink: that is the Electron layout and would clobber the
# real /usr/bin/pollis with a dangling link.
bsdtar -xf data.tar.* -C "${pkgdir}/"
# Tauri's .desktop template emits a bare `Exec=pollis`, which the launcher
# resolves through $PATH — so any binary named `pollis` ahead of /usr/bin
# hijacks the menu entry. That is not hypothetical for Arch specifically:
# website/install.sh picks .deb only when dpkg exists and .rpm only when
# dnf/yum exists, so on Arch it always falls through to the AppImage branch,
# which writes a launcher at ~/.local/bin/pollis and tells the user to put
# that directory on their PATH. Anyone who ran install.sh before switching to
# this package keeps launching the stale AppImage while pacman upgrades the
# real binary underneath — and it fails silently, because the AppImage still
# starts. Pin Exec to the path this package actually owns.
local desktop pinned=0
for desktop in "${pkgdir}"/usr/share/applications/*.desktop; do
[ -e "$desktop" ] || continue
sed -i -E 's|^Exec=pollis([[:space:]].*)?$|Exec=/usr/bin/pollis\1|' "$desktop"
if grep -q '^Exec=/usr/bin/pollis' "$desktop"; then
pinned=1
fi
done
# Never ship a launcher that can still be hijacked: if the .deb's layout
# changed under us, fail the build here rather than reintroduce the bug.
if [ "$pinned" -ne 1 ]; then
echo "No .desktop with an 'Exec=pollis' line under /usr/share/applications — refusing to package a hijackable launcher." >&2
return 1
fi
}
Changes since previous scan
--- PKGBUILD @ 2026-09-15 00:25+++ PKGBUILD @ 2026-09-17 00:27@@ -3,7 +3,7 @@ # pipeline overwrites this file on every release. pkgname=pollis-pkgver=1.11.3+pkgver=1.12.0 pkgrel=1 pkgdesc="End-to-end encrypted messaging" arch=('x86_64')@@ -18,7 +18,7 @@ 'dbus' ) source=("https://cdn.pollis.com/releases/v${pkgver}/pollis-v${pkgver}-linux.deb")-sha256sums=('b426ecfc82df940c7ee3de45f368534f6bcc7e3a9fc303abfb22a85d2c364788')+sha256sums=('60aacc18e3987454dfa770ba4524d5c969d73d4600e11ab1b932b66da787c2a7') package() { # The Tauri .deb already lays the app out under /usr (binary atScan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-09-17 00:27:14 | Medium | 2 |
| 2026-09-16 00:03:17 | Medium | 2 |
| 2026-09-15 01:18:20 | Medium | 2 |
| 2026-09-15 00:25:31 | Medium | 2 |
| 2026-09-14 00:27:57 | Medium | 2 |
| 2026-09-13 00:19:54 | Medium | 2 |
| 2026-09-12 00:25:17 | Medium | 2 |
| 2026-09-11 00:19:22 | Medium | 2 |
| 2026-09-10 00:22:44 | Medium | 2 |
| 2026-09-09 00:04:09 | Medium | 2 |
| 2026-09-08 00:18:08 | Medium | 2 |
| 2026-09-07 00:30:15 | Medium | 2 |
| 2026-09-06 00:17:06 | Medium | 2 |
| 2026-09-05 00:16:27 | Medium | 2 |
| 2026-09-04 07:57:01 | Medium | 2 |
| 2026-09-04 01:55:41 | Medium | 2 |
| 2026-09-04 00:03:13 | Medium | 2 |
| 2026-09-03 23:55:21 | Medium | 2 |
| 2026-09-03 17:54:21 | Medium | 2 |
| 2026-09-03 00:15:47 | Medium | 2 |