activtools
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:18
source=("http://activsoftware.co.uk/linux/repos/driver/ubuntu/pool/non-oss/a/${pkgname}/${pkgname}_$pkgver-0~Ubuntu~1804_amd64.deb")
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 Debian binary package (.deb) containing executables and shared libraries from activsoftware.co.uk, which is not the official Promethean support domain (prometheanworld.com). The official URL is listed in the 'url' field but the actual source is fetched from a third-party host. This is a genuine supply-chain concern: if activsoftware.co.uk is compromised, spoofed, or simply an unofficial mirror, the binaries installed (activmgr, activcalibrate, etc.) could be malicious. The package also installs world-writable directories (0777) at /var/Promethean and /etc/promethean/calibration, which is a local privilege escalation concern but not a packaging supply-chain issue per se. The md5sum provides only weak integrity assurance. The binary patching with patchelf is legitimate packaging practice. Overall this is a real medium-severity supply-chain risk due to executed binaries sourced from a non-official host.
PKGBUILD
1 offending line(s) highlighted# Maintainer: Malstrond <malstrond@gmail.com>
# Contributor: Jose Riha <jose1711@gmail.com>
# Contributor: Bazon <bazonbloch@arcor.de>
pkgname=activtools
pkgver=5.18.19
pkgrel=2
pkgdesc="Tools for Promethean hardware: activmanager, activcalibrate, activremote, activmonitor."
arch=('x86_64')
url="https://support.prometheanworld.com/product/activdriver"
license=('unknown')
#libQt5WebView.so?
depends=('nss' 'pcre' qt5-{base,imageformats,x11extras,location,declarative,webchannel,webengine,websockets})
makedepends=('binutils' 'patchelf')
optdepends=('activinspire: Prometheans presentation software'
'activdriver: Driver for Promethean hardware'
'qt5-wayland')
source=("http://activsoftware.co.uk/linux/repos/driver/ubuntu/pool/non-oss/a/${pkgname}/${pkgname}_$pkgver-0~Ubuntu~1804_amd64.deb")
md5sums=('460a49108127cd9c532d3b9ccc2a23d1')
prepare() {
bsdtar -xf data.tar.xz
}
build() {
mv usr/local/* usr
#Drop Qt5 symbol version
patchelf --remove-rpath usr/bin/activmgr $(nm -D usr/bin/activmgr|grep @Qt_5|sed 's/@Qt_5.*//;s/^\s*U/--clear-symbol-version/'|tr '\n' ' ')
#todo: drop insecure RPATH (use namcap)
rm -r usr/bin/{imageformats,platforms,xcbglintegrations,qtwebengine*,QtWebEngineProcess,icudtl.dat} usr/share/promethean/lib
ln -sf /usr/lib/libactivsystem.so usr/lib/libactivsystem.so.2.4
ln -sf /usr/lib/libactivsystem.so usr/lib/libactivsystem.so.2.4.0
ln -sf /usr/lib/libclassflowclient.so usr/lib/libclassflowclient.so.1.0
ln -sf /usr/lib/libclassflowclient.so usr/lib/libclassflowclient.so.1.0.0
# activmgr works only when started after the ActivBoard is attached, so no autostart.
# Delete the following line if you want an autostart of activmgr.
rm -r etc/xdg
}
package() {
mv usr "$pkgdir"/usr
mv etc "$pkgdir"/etc
# These tools attempt to create a lockfile in /var/Promethean, the path is hardcoded.
# Since they are started by the user, this directory needs to be world-writable, even if that's a bad idea.
install -dm0777 "$pkgdir"/var/Promethean
# activcalibrate attemps to store calibration information in /etc/promethean/calibration, the path is hardcoded.
# Since it is started by the user, this directory needs to be world-writable, even if that's a bad idea.
install -dm0777 "$pkgdir"/etc/promethean/calibration
echo "Promethean software has a bug that often causes it to hang when attempting to close it using the GUI."
echo "This means you need to manually kill activcalibrate.sh after you finished calibration."
echo "Use ALT+F4, your desktop environments method, killall, or start it using the timeout command."
}
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 |