xctu
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:15
source_i686=("http://ftp1.digi.com/support/utilities/40002880_AJ.run")
llm_review
An AI model (anthropic/claude-4.6-sonnet-20260217) reviewed this and agrees it is MEDIUM (confidence 72%): The PKGBUILD downloads prebuilt .run installer binaries from ftp1.digi.com (Digi International's official FTP server) and executes them during prepare(). ftp1.digi.com is the legitimate vendor distribution host for Digi International (makers of XBee modules), so this is not an unofficial or personal host — it is the actual upstream vendor. However, the binaries are downloaded over plain HTTP (not HTTPS), meaning there is no transport-layer integrity protection, and the checksums are MD5 (weak but present). The executed .run installer is a prebuilt binary blob whose contents cannot be audited from the PKGBUILD alone. This pattern — executing a vendor-supplied binary installer to extract files — is common for proprietary software in the AUR (similar to many other packages like teamviewer, zoom, etc.) and is not inherently malicious. The risk is real but typical for this class of package: if the vendor host were compromised or the HTTP connection MITMed, arbitrary code would execute. This is a genuine medium-severity supply-chain concern (executed binary from a vendor host over plain HTTP with weak checksums) but not a high-severity attack.
PKGBUILD
1 offending line(s) highlighted# Maintainer: Michael Wigham <michael@wigham.net>
# Contributor: Nils Van Zuijlen <nils.van-zuijlen@mailo.com>, Manoel Brunnen <manoel.brunnen@gmail.com>
pkgname=xctu
pkgver=6.5.13
pkgrel=1
pkgdesc="Next Generation Configuration Platform for XBee/RF Solutions."
arch=('i686' 'x86_64')
url="http://www.digi.com/products/xbee-rf-solutions/xctu-software/xctu"
license=('custom')
depends=('gtk2' 'java-runtime' 'libxtst' 'alsa-lib' 'gconf' 'nss' 'libglvnd' 'libnet' 'libxt')
options=('!strip')
noextract=()
source_i686=("http://ftp1.digi.com/support/utilities/40002880_AJ.run")
md5sums_i686=('e28c71e26accdcb4d36395e26ba19835')
source_x86_64=("http://ftp1.digi.com/support/utilities/40002881_AJ.run")
md5sums_x86_64=('229ab2d443eded6184ecaef50ff99913')
source=(
'launcher.sh'
'xctu.desktop'
'fix.patch'
)
md5sums=(
'672a983dc8d23e4f6a496158d4852b99'
'6612313eaebab9350989f75ca8d5d2ab'
'92698e7e64cfcfbc8aae271ff904def6'
)
prepare() {
if [[ $CARCH == 'i686' ]]; then
_setup_file=40002880_AJ.run
else
_setup_file=40002881_AJ.run
fi
chmod u+x $_setup_file
# Do not allow the installer to create a desktop file directly
# this will be handled by the package() with our own desktop entry file
mkdir -p $srcdir/Desktop
HOME=$srcdir
./$_setup_file --installdir $srcdir --mode unattended --unattendedmodeui none
mv $srcdir/XCTU-NG $srcdir/$pkgname
echo $pkgver > $srcdir/$pkgname/version.txt
patch -p1 -N < $srcdir/fix.patch
}
package() {
install -d $pkgdir/opt
cp -a $srcdir/$pkgname $pkgdir/opt/$pkgname
install -Dm644 $srcdir/$pkgname/doc/License_Agreements.txt $pkgdir/usr/share/licenses/$pkgname/LICENSE
# Launcher
install -Dm755 $srcdir/launcher.sh $pkgdir/usr/bin/$pkgname
# CLI
ln -s /opt/xctu/XCTUcmd $pkgdir/usr/bin/XCTUcmd
# Desktop file
install -Dm644 $srcdir/$pkgname/icon.xpm $pkgdir/usr/share/icons/hicolor/256x256/apps/xctu.xpm
install -Dm755 $srcdir/xctu.desktop $pkgdir/usr/share/applications/xctu.desktop
install -Dm755 $srcdir/xctu.desktop $pkgdir/opt/$pkgname/XCTU.desktop
}
# vim:set ft=sh:
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 |