boxplayer-bin
The PKGBUILD runs 'npm install' on external packages (aria2-lib, @motrix/nat-api) during prepare(), which are not declared in source[] or dependencies, posing a supply-chain risk if those packages are compromised.
Triggered rules
npm_install_external
Runs `npm/yarn/pnpm install <package>` for a package not in source=(), pulling unpinned, unreviewed code at build time. Severity downgraded: the package declares/looks like a Node.js consumer, where build-time installs are expected.
-
PKGBUILD:64
npm install aria2-lib @motrix/nat-api --save
llm_review
An AI model (qwen/qwen3-235b-a22b-2507) reviewed this and agrees it is MEDIUM (confidence 95%): The PKGBUILD runs 'npm install' on external packages (aria2-lib, @motrix/nat-api) during prepare(), which are not declared in source[] or dependencies, posing a supply-chain risk if those packages are compromised.
PKGBUILD
1 offending line(s) highlighted# Maintainer: zxp19821005 <zxp19821005 at 163 dot com>
pkgname=boxplayer-bin
_pkgname=BoxPlayer
pkgver=5.0.37
_electronversion=40
pkgrel=1
pkgdesc="Unified cloud drive management, smart media library, media servers, and high-speed downloads.多网盘文件管理、媒体库、媒体服务器、AI Agent、音乐播放器和电子书阅读器,放在同一个跨平台桌面App里."
arch=(
'aarch64'
'x86_64'
)
url="https://www.xbyvideohub.com/"
_ghurl="https://github.com/gaozhangmin/boxplayer"
license=('GPL-3.0-only')
conflicts=("${pkgname%-bin}")
provides=("${pkgname%-bin}=${pkgver}")
depends=(
"electron${_electronversion}"
'nodejs'
)
makedepends=(
'asar'
'npm'
)
options=(
'!emptydirs'
)
source=("${pkgname%-bin}.sh")
source_aarch64=("${pkgname%-bin}-${pkgver}-aarch64.AppImage::${_ghurl}/releases/download/v${pkgver}/${pkgname%-bin}-${pkgver}-linux-arm64.AppImage")
source_x86_64=("${pkgname%-bin}-${pkgver}-x86_64.AppImage::${_ghurl}/releases/download/v${pkgver}/${pkgname%-bin}-${pkgver}-linux-x86_64.AppImage")
sha256sums=('dfcd6603d29c7b8d88e019b517a2e5c1a7b5ab905a0961a8b81adfa508b258b8')
sha256sums_aarch64=('953b7b6b88064e3c37b0e8a4d83bf740a650171ad3c6161d80622b0012933803')
sha256sums_x86_64=('4aa72616e1fc7ae3a743c2f667e4cd21b203c021d078493306c9b40fb7c4a5f3')
_get_app_dir() {
find "${srcdir}" -type f -name "resources.pak" ! -path "*/node_modules/*" -printf '%h\n' 2>/dev/null \
| while read -r d; do [[ -d "${d}/resources" ]] && { echo "$d"; return 0; }; done
}
_check_electron_version() {
local _v=$(strings "$(find "$(_get_app_dir)" -maxdepth 1 -type f \
-executable -printf '%s %p\n' | sort -nr | head -1 | cut -d' ' -f2-)" \
| grep -oP 'Electron/\K[0-9]+' | head -1)
[[ -z "$_v" ]] && { echo -e "\033[1;33mNote: Could not check version.\033[0m"; return; }
(( _v == _electronversion )) && c=32 || c=31
echo -e "Electron version: \033[1;${c}m$_v$([[ $c -eq 31 ]] && echo " (expected $_electronversion)")\033[0m"
}
prepare() {
sed -i -e "
s/@electronversion@/${_electronversion}/g
s/@appname@/${pkgname%-bin}/g
" "${srcdir}/${pkgname%-bin}.sh"
if [ ! -x "${srcdir}/${pkgname%-bin}-${pkgver}-${CARCH}.AppImage" ];then
chmod +x "${srcdir}/${pkgname%-bin}-${pkgver}-${CARCH}.AppImage"
fi
if [ -d "${srcdir}/squashfs-root" ];then
rm -rf "${srcdir}/squashfs-root"
fi
"${srcdir}/${pkgname%-bin}-${pkgver}-${CARCH}.AppImage" --appimage-extract > /dev/null
_check_electron_version
sed -i "s/AppRun --no-sandbox/${pkgname%-bin}/g" "$(_get_app_dir)/${pkgname%-bin}.desktop"
asar e "$(_get_app_dir)/resources/app.asar" "${srcdir}/app.asar.unpacked"
cd "${srcdir}/app.asar.unpacked"
sed -i '/"packageManager"/d' package.json
npm config set allow-remote all
npm install aria2-lib @motrix/nat-api --save
cd - > /dev/null
find "${srcdir}/app.asar.unpacked/dist" -type f \
-exec sed -i -e "
s/process.resourcesPath/\'\/usr\/lib\/${pkgname%-bin}\'/g
s/process.execPath/\'\/usr\/lib\/${pkgname%-bin}\'/g\
" {} +
asar p "${srcdir}/app.asar.unpacked" "$(_get_app_dir)/resources/app.asar"
find "$(_get_app_dir)/resources" -type d -perm 700 -exec chmod 755 {} +
find "$(_get_app_dir)/resources" -type f -name "*.so.*" -perm 777 -exec chmod 644 {} +
}
package() {
install -Dm755 "${srcdir}/${pkgname%-bin}.sh" "${pkgdir}/usr/bin/${pkgname%-bin}"
install -Dm755 -d "${pkgdir}/usr/lib/${pkgname%-bin}"
cp -a "$(_get_app_dir)/resources/." "${pkgdir}/usr/lib/${pkgname%-bin}/"
find "${srcdir}" -type f \( -name "*.png" -o -name "*.svg" \) -path "*share/icons/*" | while read -r _i; do
_extension="${_i##*.}"
_icon_path="${_i#*share/icons/}"
_target_dir="/usr/share/icons/$(dirname "${_icon_path}")"
install -Dm644 "${_i}" "${pkgdir}${_target_dir}/${pkgname%-bin}.${_extension}"
done
install -Dm644 "$(_get_app_dir)/${pkgname%-bin}.desktop" -t "${pkgdir}/usr/share/applications"
}
Changes since previous scan
--- PKGBUILD @ 2026-10-20 00:10+++ PKGBUILD @ 2026-11-01 00:21@@ -1,7 +1,7 @@ # Maintainer: zxp19821005 <zxp19821005 at 163 dot com> pkgname=boxplayer-bin _pkgname=BoxPlayer-pkgver=5.0.36+pkgver=5.0.37 _electronversion=40 pkgrel=1 pkgdesc="Unified cloud drive management, smart media library, media servers, and high-speed downloads.多网盘文件管理、媒体库、媒体服务器、AI Agent、音乐播放器和电子书阅读器,放在同一个跨平台桌面App里."@@ -28,11 +28,12 @@ source=("${pkgname%-bin}.sh") source_aarch64=("${pkgname%-bin}-${pkgver}-aarch64.AppImage::${_ghurl}/releases/download/v${pkgver}/${pkgname%-bin}-${pkgver}-linux-arm64.AppImage") source_x86_64=("${pkgname%-bin}-${pkgver}-x86_64.AppImage::${_ghurl}/releases/download/v${pkgver}/${pkgname%-bin}-${pkgver}-linux-x86_64.AppImage")-sha256sums=('cebedc3391cbab6d43f37fbf3a87ddaad16597cb5ea487a4d55b1f478d810082')-sha256sums_aarch64=('4bce0ccb4c733c0fab69404731111965ac2e1fdcd017d4b0d321d9fbe6d9f0b7')-sha256sums_x86_64=('e0aacd812b9e652bdf55b2935756b1f496788beb6d6d3f43f3177da31ffcad79')+sha256sums=('dfcd6603d29c7b8d88e019b517a2e5c1a7b5ab905a0961a8b81adfa508b258b8')+sha256sums_aarch64=('953b7b6b88064e3c37b0e8a4d83bf740a650171ad3c6161d80622b0012933803')+sha256sums_x86_64=('4aa72616e1fc7ae3a743c2f667e4cd21b203c021d078493306c9b40fb7c4a5f3') _get_app_dir() {- find "${srcdir}" -type f -name "resources.pak" ! -path "*/node_modules/*" -print 2>/dev/null | while read f; do [ -d "${f%/*}/resources" ] && echo "${f%/*}" && break; done+ find "${srcdir}" -type f -name "resources.pak" ! -path "*/node_modules/*" -printf '%h\n' 2>/dev/null \+ | while read -r d; do [[ -d "${d}/resources" ]] && { echo "$d"; return 0; }; done } _check_electron_version() { local _v=$(strings "$(find "$(_get_app_dir)" -maxdepth 1 -type f \@@ -46,7 +47,6 @@ sed -i -e " s/@electronversion@/${_electronversion}/g s/@appname@/${pkgname%-bin}/g- s/@runname@/app.asar/g " "${srcdir}/${pkgname%-bin}.sh" if [ ! -x "${srcdir}/${pkgname%-bin}-${pkgver}-${CARCH}.AppImage" ];then chmod +x "${srcdir}/${pkgname%-bin}-${pkgver}-${CARCH}.AppImage"@@ -56,9 +56,8 @@ fi "${srcdir}/${pkgname%-bin}-${pkgver}-${CARCH}.AppImage" --appimage-extract > /dev/null _check_electron_version- local _app_dir="$(_get_app_dir)"- sed -i "s/AppRun --no-sandbox/${pkgname%-bin}/g" "${_app_dir}/${pkgname%-bin}.desktop"- asar e "${_app_dir}/resources/app.asar" "${srcdir}/app.asar.unpacked"+ sed -i "s/AppRun --no-sandbox/${pkgname%-bin}/g" "$(_get_app_dir)/${pkgname%-bin}.desktop"+ asar e "$(_get_app_dir)/resources/app.asar" "${srcdir}/app.asar.unpacked" cd "${srcdir}/app.asar.unpacked" sed -i '/"packageManager"/d' package.json npm config set allow-remote all@@ -69,21 +68,20 @@ s/process.resourcesPath/\'\/usr\/lib\/${pkgname%-bin}\'/g s/process.execPath/\'\/usr\/lib\/${pkgname%-bin}\'/g\ " {} +- asar p "${srcdir}/app.asar.unpacked" "${_app_dir}/resources/app.asar"- find "${_app_dir}/resources" -type d -perm 700 -exec chmod 755 {} +- find "${_app_dir}/resources" -type f -name "*.so.*" -perm 777 -exec chmod 644 {} ++ asar p "${srcdir}/app.asar.unpacked" "$(_get_app_dir)/resources/app.asar"+ find "$(_get_app_dir)/resources" -type d -perm 700 -exec chmod 755 {} ++ find "$(_get_app_dir)/resources" -type f -name "*.so.*" -perm 777 -exec chmod 644 {} + } package() { install -Dm755 "${srcdir}/${pkgname%-bin}.sh" "${pkgdir}/usr/bin/${pkgname%-bin}" install -Dm755 -d "${pkgdir}/usr/lib/${pkgname%-bin}"- local _app_dir="$(_get_app_dir)"- cp -a "${_app_dir}/resources/." "${pkgdir}/usr/lib/${pkgname%-bin}/"+ cp -a "$(_get_app_dir)/resources/." "${pkgdir}/usr/lib/${pkgname%-bin}/" find "${srcdir}" -type f \( -name "*.png" -o -name "*.svg" \) -path "*share/icons/*" | while read -r _i; do _extension="${_i##*.}" _icon_path="${_i#*share/icons/}" _target_dir="/usr/share/icons/$(dirname "${_icon_path}")" install -Dm644 "${_i}" "${pkgdir}${_target_dir}/${pkgname%-bin}.${_extension}" done- install -Dm644 "${_app_dir}/${pkgname%-bin}.desktop" -t "${pkgdir}/usr/share/applications"+ install -Dm644 "$(_get_app_dir)/${pkgname%-bin}.desktop" -t "${pkgdir}/usr/share/applications" } Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-11-01 00:21:48 | Medium | 2 |
| 2026-10-31 00:07:41 | Medium | 2 |
| 2026-10-30 00:29:30 | Medium | 2 |
| 2026-10-29 00:13:55 | Medium | 2 |
| 2026-10-28 00:06:54 | Medium | 2 |
| 2026-10-27 00:23:28 | Medium | 2 |
| 2026-10-26 00:12:40 | Medium | 2 |
| 2026-10-25 00:20:48 | Medium | 2 |
| 2026-10-24 00:14:55 | Medium | 2 |
| 2026-10-23 00:02:19 | Medium | 2 |
| 2026-10-22 00:13:10 | Medium | 2 |
| 2026-10-21 00:12:50 | Medium | 2 |
| 2026-10-20 03:27:25 | Medium | 2 |
| 2026-10-20 00:10:31 | Medium | 2 |
| 2026-10-19 00:03:55 | Medium | 2 |
| 2026-10-18 00:06:55 | Medium | 2 |
| 2026-10-17 00:21:55 | Medium | 2 |
| 2026-10-16 00:12:47 | Medium | 2 |
| 2026-10-15 00:28:05 | Medium | 2 |
| 2026-10-14 00:06:47 | Medium | 2 |