ultralightwebcursor-git
The package installs a setuid binary via KAuth helper and performs user-specific configuration changes using sudo, which constitutes a privileged self-installation pattern that could be abused for persistence or privilege escalation.
Triggered rules
privileged_install
The package grants elevated privileges or installs an update path outside pacman: a /etc/sudoers.d rule (often passwordless), a setuid/setgid binary, or a self-update script/service that can fetch and run future code with no checksum verification. The initial install may be verified, but the ongoing privilege + update surface is a real supply-chain / privilege-escalation risk.
-
PKGBUILD:102
chmod 4755 "${pkgdir}/usr/lib/kf6/kauth/ultralightwebcursor_helper"
llm_review
An AI model (qwen/qwen3-235b-a22b-2507) reviewed this and agrees it is MEDIUM (confidence 95%): The package installs a setuid binary via KAuth helper and performs user-specific configuration changes using sudo, which constitutes a privileged self-installation pattern that could be abused for persistence or privilege escalation.
PKGBUILD
1 offending line(s) highlightedpkgname=ultralightwebcursor-git
_pkgname=Animated_UltralightWeb_Cursor
pkgver=1.0.1
pkgrel=1
pkgdesc="HTML/CSS/JS-based global animated cursor framework integrated with KDE 6 System Settings and KWin Effects"
arch=('x86_64')
url="https://github.com/LuYishan-4/Animated_UltralightWeb_Cursor"
license=('MIT')
depends=(
'qt6-base'
'qt6-declarative'
'kcmutils'
'kcoreaddons'
'kconfig'
'kconfigwidgets'
'ki18n'
'kauth'
'kwin'
)
makedepends=('git' 'cmake' 'extra-cmake-modules' 'p7zip')
provides=("ultralightwebcursor" "kcm-ultralightwebcursor")
conflicts=("ultralightwebcursor" "kcm-ultralightwebcursor")
install=ultralightwebcursor.install
source=("git+https://github.com/LuYishan-4/Animated_UltralightWeb_Cursor")
sha256sums=('SKIP')
pkgver() {
cd "${srcdir}/${_pkgname}"
(set -o pipefail; git describe --long --tags --abbrev=7 2>/dev/null | sed 's/\([^-]*-\)g/r\1/;s/-/./g' ||
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short=7 HEAD)")
}
prepare() {
cd "${srcdir}/${_pkgname}"
# 1. Handle Ultralight SDK archive decompression with strict directory enforcement
echo "==> Verifying Ultralight SDK directory alignment..."
local sdk_target="sdk/ultralight-free-sdk-1.4.0-linux-x64"
if [ ! -f "${sdk_target}/include/AppCore/App.h" ]; then
echo "==> Target SDK headers not found. Re-extracting cleanly..."
rm -rf "${sdk_target}"
cd sdk
7z x ultralight-free-sdk-1.4.0-linux-x64.7z
cd ..
if [ -d "sdk/include" ] && [ -f "sdk/include/AppCore/App.h" ]; then
echo "==> SDK extracted flatly into sdk/. Re-structuring into target directory layout..."
mkdir -p "${sdk_target}"
mv sdk/bin sdk/include sdk/layers "${sdk_target}/" 2>/dev/null || true
fi
if [ -d "${sdk_target}/ultralight-free-sdk-1.4.0-linux-x64" ]; then
echo "==> Squashing nested double SDK directories..."
mv "${sdk_target}/ultralight-free-sdk-1.4.0-linux-x64" sdk/tmp_sdk
rm -rf "${sdk_target}"
mv sdk/tmp_sdk "${sdk_target}"
fi
fi
if [ ! -f "${sdk_target}/include/AppCore/App.h" ]; then
echo "==> ERROR: SDK extraction layout is still invalid."
exit 1
fi
echo "==> Generating compliant policy placeholder in source tree..."
cat <<EOF > GUI/org.ultralightwebcursor.policy
<?xml version="1.0" encoding="utf-8"?>
<policyconfig>
</policyconfig>
EOF
}
build() {
cd "${srcdir}/${_pkgname}"
mkdir -p build/GUI
touch build/GUI/org.ultralightwebcursor.policy
cmake -B build -S . \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DBUILD_TESTING=OFF \
-Wno-dev
touch build/GUI/org.ultralightwebcursor.policy
cmake --build build
}
package() {
cd "${srcdir}/${_pkgname}"
DESTDIR="${pkgdir}" cmake --install build
# KAuth Security Compliance:
if [ -f "${pkgdir}/usr/lib/kf6/kauth/ultralightwebcursor_helper" ]; then
chown root:root "${pkgdir}/usr/lib/kf6/kauth/ultralightwebcursor_helper"
chmod 4755 "${pkgdir}/usr/lib/kf6/kauth/ultralightwebcursor_helper"
fi
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-09-17 00:27:14 | Medium | 2 |
| 2026-09-16 00:03:17 | Medium | 2 |
| 2026-09-15 00:25:31 | Medium | 2 |
| 2026-09-14 00:27:57 | Medium | 2 |
| 2026-09-13 00:19:54 | Medium | 2 |
| 2026-09-12 00:25:17 | Medium | 2 |
| 2026-09-11 00:19:22 | Medium | 2 |
| 2026-09-10 00:22:44 | Medium | 2 |
| 2026-09-09 00:04:09 | Medium | 2 |
| 2026-09-08 00:18:08 | Medium | 2 |
| 2026-09-07 00:30:15 | Medium | 2 |
| 2026-09-06 00:17:06 | Medium | 2 |
| 2026-09-05 00:16:27 | Medium | 2 |
| 2026-09-04 00:03:13 | Medium | 2 |
| 2026-09-03 00:15:47 | Medium | 2 |
| 2026-09-02 00:02:31 | Medium | 2 |
| 2026-09-01 00:11:19 | Medium | 2 |
| 2026-08-31 00:19:57 | Medium | 2 |
| 2026-08-30 00:04:14 | Medium | 2 |
| 2026-08-29 00:29:17 | Medium | 2 |