ferronweb
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:40
source=("https://dl.ferron.sh/${pkgver}/ferron-${pkgver}-${_arch}-unknown-linux-gnu${abi}.zip")
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 binary from dl.ferron.sh, which is the project's own download subdomain (matching the upstream URL ferron.sh). This is a common pattern for projects distributing official release binaries. However, it is still a prebuilt binary from a non-GitHub/non-PyPI/non-official-distro host, and there is no way to verify the build provenance or reproducibility. The sha256sums are hardcoded per-architecture, which provides integrity checking but not authenticity. The binary is installed as an executable web server running as a dedicated system user with CAP_NET_BIND_SERVICE. The risk is real but not clearly malicious: if dl.ferron.sh were compromised or if the project itself were malicious, arbitrary code would execute on the system. This fits the medium category: executed binary from a non-standard (though plausibly official) host with no GPG signature verification.
PKGBUILD
1 offending line(s) highlightedpkgname=ferronweb
pkgver=2.6.0
pkgrel=1
pkgdesc="Ferron web server"
arch=('x86_64' 'i686' 'armv7h' 'aarch64' 'riscv64')
url="https://ferron.sh"
license=('custom')
depends=('libcap' 'unzip')
backup=('etc/ferron.kdl')
install=ferron.install
_sha256sums_x86_64='f5f37850e289e6831a0f7ba3043c37b1026ea6027b0b8640017452fa351887a7'
_sha256sums_i686='d69a389fc5821f148b838dd2fdf016b864c5c238c52ea65f800a2f6ce8bbf9a4'
_sha256sums_armv7='fde1f27fca0e75a8525c27489b73a41b1dd4425bda8f1287a6d48df950ddb64e'
_sha256sums_aarch64='efff2bf7358c99578d7acb969a0ae68e2b817250e81a9fd89e78fdfde3b71f82'
_sha256sums_riscv64='bc322aadb79b67c8b3a3ea0e10515aac6c5976c4e842b7451b9f5df2d96ea6e4'
case "$CARCH" in
x86_64)
_arch="x86_64"
_checksum="$_sha256sums_x86_64"
;;
i386 | i486 | i586 | i686)
_arch="i686"
_checksum="$_sha256sums_i686"
;;
armv7h)
_arch="armv7"
_checksum="$_sha256sums_armv7"
abi="eabihf"
;;
aarch64)
_arch="aarch64"
_checksum="$_sha256sums_aarch64"
;;
riscv64)
_arch="riscv64gc"
_checksum="$_sha256sums_riscv64"
;;
*) error "Unsupported architecture: $CARCH"; exit 1 ;;
esac
source=("https://dl.ferron.sh/${pkgver}/ferron-${pkgver}-${_arch}-unknown-linux-gnu${abi}.zip")
sha256sums=("$_checksum")
provides=('ferron')
conflicts=('ferron')
prepare() {
cd "$srcdir"
unzip -qo "ferron-$pkgver-${_arch}-unknown-linux-gnu${abi}.zip"
}
package() {
case "$CARCH" in
x86_64) _arch="x86_64" ;;
i686) _arch="i686" ;;
armv7h) _arch="armv7" ;;
aarch64) _arch="aarch64" ;;
riscv64) _arch="riscv64gc" ;;
*) error "Unsupported architecture: $CARCH"; exit 1 ;;
esac
cd "$srcdir"
install -dm755 "$pkgdir/var/log/ferron"
install -dm755 "$pkgdir/var/www/ferron"
install -dm755 "$pkgdir/usr/bin"
install -dm755 "$pkgdir/etc"
install -dm755 "$pkgdir/usr/lib/systemd/system"
cp -r wwwroot/* "$pkgdir/var/www/ferron/"
install -Dm755 ferron "$pkgdir/usr/bin/ferron"
for binary in ferron-*; do
if [[ -f "$binary" && "$binary" != *.zip ]]; then
install -Dm755 "$binary" "$pkgdir/usr/bin/$binary"
fi
done
cat > "$pkgdir/etc/ferron.kdl" << 'EOF'
// Global-only configuration
* {
default_http_port 80
default_https_port #null
auto_tls #false
protocols h1 h2
log "/var/log/ferron/access.log"
error_log "/var/log/ferron/error.log"
}
// Global configuration
* {
root "/var/www/ferron"
}
EOF
cat > "$pkgdir/usr/lib/systemd/system/ferron.service" << 'EOF'
[Unit]
Description=Ferron web server
After=network.target
[Service]
Type=simple
User=ferron
ExecStart=/usr/sbin/ferron -c /etc/ferron.kdl
ExecReload=kill -HUP $MAINPID
Restart=on-failure
AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target
EOF
install -Dm644 /dev/null "$pkgdir/usr/lib/tmpfiles.d/ferron.conf"
cat > "$pkgdir/usr/lib/tmpfiles.d/ferron.conf" << 'EOF'
d /var/log/ferron 0755 ferron ferron -
EOF
install -Dm644 /dev/null "$pkgdir/usr/lib/sysusers.d/ferron.conf"
cat > "$pkgdir/usr/lib/sysusers.d/ferron.conf" << 'EOF'
u ferron - "Ferron web server" /nonexistent /usr/sbin/nologin
EOF
}
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 |