keycombiner
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:12
source=("${_appimage}::https://keycombiner.com/download/KeyCombiner-${pkgver}.AppImage")
llm_review
An AI model (anthropic/claude-4.6-sonnet-20260217) reviewed this and agrees it is MEDIUM (confidence 72%): This PKGBUILD downloads and executes a prebuilt AppImage binary directly from keycombiner.com (the project's own website). The domain appears to be the official vendor site matching the package URL, and a sha256sum is provided for integrity checking. However, the core concern remains: this is a closed-source, prebuilt binary (not compiled from source) that gets extracted and executed on the user's system. The AppImage is run during prepare() with --appimage-extract, and then installed and symlinked into /usr/bin for persistent execution. While the source domain matches the official project site and this is a common AUR pattern for AppImage packaging, it still represents a supply-chain risk: if keycombiner.com were compromised or the binary swapped, users would execute arbitrary code. This is a genuine medium-severity concern — not a false positive — because it involves executed binary code from a non-standard (non-GitHub/GitLab/official distro) host with no additional verification beyond a single sha256sum. It is not high because there is no evidence of malice, obfuscation, or domain substitution.
PKGBUILD
1 offending line(s) highlighted# Maintainer: HIDE-r <lkangn.collin@gmail.com>
pkgname=keycombiner
pkgver=0.8.0
pkgrel=2
pkgdesc="An app to organize, learn, and practice keyboard shortcuts!"
arch=("x86_64")
url="https://keycombiner.com"
license=('custom')
options=(!strip)
depends=('fuse2')
_appimage="${pkgname}-${pkgver}.AppImage"
source=("${_appimage}::https://keycombiner.com/download/KeyCombiner-${pkgver}.AppImage")
noextract=("${_appimage}")
sha256sums=("377348e207c5614d600ca0ca2da588fd78206ea52cd7d115d7ca0086b179bbff")
prepare() {
chmod +x "${_appimage}"
./"${_appimage}" --appimage-extract
}
build() {
# Fix permissions; .AppImage permissions are 700 for all directories
chmod -R a-x+rX squashfs-root/usr
}
package() {
# AppImage
install -Dm755 "${srcdir}/${_appimage}" "${pkgdir}/opt/${pkgname}/${pkgname}.AppImage"
# Desktop file
install -Dm644 "${srcdir}/squashfs-root/${pkgname}.desktop"\
"${pkgdir}/usr/share/applications/${pkgname}.desktop"
# Icon
install -dm755 "${pkgdir}/usr/share/"
cp -a "${srcdir}/squashfs-root/usr/share/icons" "${pkgdir}/usr/share/"
# Symlink executable
install -dm755 "${pkgdir}/usr/bin"
ln -s "/opt/${pkgname}/${pkgname}.AppImage" "${pkgdir}/usr/bin/${pkgname}"
}
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 |