ripcord-arch-libs
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:33
"https://cancel.fm/dl/${_file}"{,.asc}
llm_review
An AI model (anthropic/claude-4.6-sonnet-20260217) reviewed this and agrees it is MEDIUM (confidence 72%): The PKGBUILD downloads a prebuilt proprietary AppImage binary from cancel.fm (the official Ripcord vendor site) and executes it to extract its contents. cancel.fm is the legitimate upstream host for Ripcord, so this is not an unofficial or personal host — it is the vendor's own distribution channel. The download is verified with a PGP signature against a pinned key (validpgpkeys) and a sha256sum, which provides reasonable integrity assurance. However, the core concern remains: this is a closed-source, prebuilt binary from a proprietary vendor that gets extracted and installed as executable code, with no ability to audit what it does. Additionally, a compiled shared library (hook.so) built from a third-party GitHub repo (geniiii/ripcord-audio-hook) is injected via LD_PRELOAD into the application at runtime, which is a meaningful supply-chain vector — any compromise of that repo would result in arbitrary code execution in the context of the Ripcord process. The combination of an unauditable proprietary binary plus an LD_PRELOAD hook from a separate personal GitHub repo keeps this at medium rather than clean, though neither element is clearly malicious.
PKGBUILD
1 offending line(s) highlighted# Maintainer: txtsd <aur.archlinux@ihavea.quest>
# Contributor: nissen22 <bernhardnorneslotsberg at gmail dot com>
pkgname=ripcord-arch-libs
pkgver=0.4.29
pkgrel=5
pkgdesc='Qt-based Discord and Slack client. Modified to run on system libraries for Wayland support.'
arch=(x86_64)
url='https://cancel.fm/ripcord/'
license=('LicenseRef-ripcord')
depends=(
# libsodium
funchook
gcc-libs
glibc
libgl
libx11
libxss
opus
qt5-base
qt5-imageformats
qt5-multimedia
qt5-svg
qt5-websockets
zlib
)
makedepends=(git)
provides=(ripcord)
conflicts=(ripcord)
options=(!strip)
_file="Ripcord-${pkgver}-x86_64.AppImage"
source=(
"https://cancel.fm/dl/${_file}"{,.asc}
'git+https://github.com/geniiii/ripcord-audio-hook#branch=linux'
LICENSE
)
sha256sums=('e320cb3c4043b0f296b4bc1da664b29776f95c2c0b02bdbf115b4d46b1669899'
'SKIP'
'SKIP'
'd7b2d483acceaebebfa068223efd8fb5e0f5d66f642fa234484ca50974c9fa2c')
validpgpkeys=('ABBAD1CB484F53024CF5868B69332F9203F21F5C')
prepare() {
chmod +x "${_file}"
"./${_file}" --appimage-extract &> /dev/null
}
build() {
cd ripcord-audio-hook
gcc -shared -fPIC -o hook.so hook.c -ldl -lfunchook
}
package() {
# Directories
install -Dm755 squashfs-root/lib/libsodium.so.18 -t "${pkgdir}/usr/lib/ripcord/lib"
rm -rf squashfs-root/lib
rm -rf squashfs-root/plugins
install -dm755 "${pkgdir}/usr/bin/"
install -dm755 "${pkgdir}/usr/lib/ripcord/"
install -dm755 "${pkgdir}/usr/share/applications/"
install -dm755 "${pkgdir}/usr/share/icons/"
install -dm755 "${pkgdir}/usr/share/licenses/${pkgname}"
# Icon
install -Dm644 squashfs-root/Ripcord_Icon.png "${pkgdir}/usr/share/icons/"
# .desktop file
sed -i 's/Exec=Ripcord/Exec=env\ LD_PRELOAD=\/usr\/lib\/ripcord\/hook\.so QT_QPA_PLATFORM_PLUGIN_PATH=\/usr\/lib\/qt\/plugins\ ripcord/g' squashfs-root/Ripcord.desktop
install -Dm644 squashfs-root/Ripcord.desktop -t "${pkgdir}"/usr/share/applications
# License
install -Dm644 LICENSE -t "${pkgdir}/usr/share/licenses/${pkgname}"
# Application
chmod 755 -R squashfs-root
mv squashfs-root/* "${pkgdir}/usr/lib/ripcord/"
ln -s /usr/lib/ripcord/lib/libsodium.so.18 "${pkgdir}/usr/lib/libsodium.so.18"
ln -s /usr/lib/ripcord/Ripcord "${pkgdir}/usr/bin/ripcord"
# Hook
install -Dm755 ripcord-audio-hook/hook.so -t "${pkgdir}/usr/lib/ripcord/"
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-08-03 00:08:14 | MEDIUM | 2 |
| 2026-08-02 00:16:08 | MEDIUM | 2 |
| 2026-08-01 00:11:18 | MEDIUM | 2 |
| 2026-07-31 00:14:10 | MEDIUM | 2 |
| 2026-07-30 00:17:23 | MEDIUM | 2 |
| 2026-07-29 00:25:53 | MEDIUM | 2 |
| 2026-07-28 00:07:28 | MEDIUM | 2 |
| 2026-07-27 00:24:32 | MEDIUM | 2 |
| 2026-07-26 00:07:32 | MEDIUM | 2 |
| 2026-07-25 00:13:44 | MEDIUM | 2 |
| 2026-07-24 00:02:28 | MEDIUM | 2 |
| 2026-07-23 00:14:47 | MEDIUM | 2 |
| 2026-07-22 00:29:32 | MEDIUM | 2 |
| 2026-07-21 00:24:15 | MEDIUM | 2 |
| 2026-07-20 00:19:49 | MEDIUM | 2 |
| 2026-07-19 00:17:08 | MEDIUM | 2 |
| 2026-07-18 00:14:48 | MEDIUM | 2 |
| 2026-07-17 00:06:16 | MEDIUM | 2 |
| 2026-07-16 00:05:41 | MEDIUM | 2 |
| 2026-07-15 00:09:25 | MEDIUM | 2 |