verifast-nightly-bin
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:32
source=("https://github.com${_rel_nightly_bin}" "https://raw.githubusercontent.com/verifast/verifast/nightly/LICENSE.md")
llm_review
An AI model (anthropic/claude-4.6-sonnet-20260217) reviewed this and agrees it is MEDIUM (confidence 72%): This PKGBUILD downloads a prebuilt binary tarball from GitHub releases (official upstream repo: github.com/verifast/verifast) and installs executables (verifast, vfide) into /usr/bin. The source URL is constructed dynamically at parse time by curling GitHub's releases page, meaning the exact binary fetched is determined at build time rather than being pinned. The sha256sum for the binary is 'SKIP', so there is no integrity verification. While the source is the official upstream GitHub repository (not a personal/unofficial host), the combination of a dynamically resolved nightly asset URL plus SKIP checksum means there is no way to verify the binary's integrity — a compromised GitHub release asset or a MITM could substitute a malicious binary. This is a genuine supply-chain concern: executed binaries with no checksum verification. The LICENSE is fetched from the nightly branch with a pinned hash, which is fine. The risk is real but not clearly malicious — this is a nightly build pattern that trades reproducibility for currency, which is medium severity.
PKGBUILD
1 offending line(s) highlighted# Maintainer: Merlijn Verstraete <toxicmushroom + aur A_ melijn · com>
pkgname=verifast-nightly-bin
_pkgname=verifast
pkgdesc="Research prototype tool for modular formal verification of C and Java programs"
arch=("any")
url="https://github.com/verifast/verifast"
# 25.02
_version=$(curl -sI https://github.com/verifast/verifast/releases/latest | tr -d '\r' | sed -En 's/^location: https:\/\/github\.com\/verifast\/verifast\/releases\/tag\/(.*)/\1/p')
# /verifast/verifast/releases/download/nightly/verifast-24.08.30-147-g6a791d31-linux.tar.gz
_rel_nightly_bin=$(curl -s https://github.com/verifast/verifast/releases/expanded_assets/nightly | grep -oh -E "/verifast/verifast/releases/download/nightly/.*-linux.tar.gz")
# verifast-24.08.30-147-g6a791d31
_untarred_name=$(echo ${_rel_nightly_bin} | sed -En 's/^\/verifast\/verifast\/releases\/download\/nightly\/(.*)\-linux\.tar\.gz/\1/p')
# 6a791d31
_commit=$(echo ${_rel_nightly_bin} | sed -En 's/^\/verifast\/.*\-g(.*)\-linux\.tar\.gz/\1/p')
pkgver=25.02.gd74e7b10
pkgrel=1
pkgver() {
printf "%s.g%s" ${_version} ${_commit}
}
license=('MIT')
depends=(gtk2)
conflicts=(verifast-bin)
source=("https://github.com${_rel_nightly_bin}" "https://raw.githubusercontent.com/verifast/verifast/nightly/LICENSE.md")
sha256sums=("SKIP" "309c4afede6331d0b813e5f0e850d6b638370a70dd31fa2fbf5e40bc5421b49f")
prepare() {
# idk what the proper way to do this is, this feels wrong
cp ../$_pkgname.desktop $_pkgname.desktop
cp ../icon.png icon.png
}
package() {
install -d "${pkgdir}/usr/bin"
install -d "${pkgdir}/usr/share/licenses/${_pkgname}"
install -d "${pkgdir}/opt"
install -m644 "${srcdir}/LICENSE.md" "${pkgdir}/usr/share/licenses/${_pkgname}/LICENSE"
_destdir="/opt/${_pkgname}"
destdir="${pkgdir}${_destdir}"
cp -r "${srcdir}/${_untarred_name}" "${destdir}"
install -d "$pkgdir"/usr/share/applications
install -m644 "${srcdir}/icon.png" "${destdir}/icon.png"
install -m644 "${srcdir}/${_pkgname}.desktop" "${pkgdir}/usr/share/applications/${_pkgname}.desktop"
ln -s "${_destdir}/bin/verifast" "${pkgdir}/usr/bin/verifast"
ln -s "${_destdir}/bin/vfide" "${pkgdir}/usr/bin/vfide"
ln -s "${_destdir}/bin/vfide" "${pkgdir}/usr/bin/verifast-ide"
}
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 |