boson-git

LOW
maintainer zxp19821005 0 votes scanned 2026-09-17 00:27:14.276658
View on AUR
Why flagged

The /dev/tcp usage is in a timeout command for connectivity checking to registry.npmjs.org, part of a legitimate mirror auto-selection routine; it does not execute remote code or exfiltrate data.

Triggered rules

Low AI review downgraded a static finding llm_review

The static rules flagged this MEDIUM, but an AI model (qwen/qwen3-235b-a22b-2507) reviewed the full PKGBUILD and judged it LOW (confidence 95%): The /dev/tcp usage is in a timeout command for connectivity checking to registry.npmjs.org, part of a legitimate mirror auto-selection routine; it does not execute remote code or exfiltrate data.

1 higher static finding superseded - not the current verdict (shown for transparency)
Medium bash /dev/tcp network channel bash_network_backdoor

Uses bash's /dev/tcp or /dev/udp pseudo-device to open a raw network connection — essentially never legitimate in a PKGBUILD and a common reverse-shell / remote-fetch primitive.

  • PKGBUILD:71 if ! timeout 3 bash -c 'exec 3<>/dev/tcp/registry.npmjs.org/443' 2>/dev/null; then

PKGBUILD

1 offending line(s) highlighted
1# Maintainer: zxp19821005 <zxp19821005 at 163 dot com>
2pkgname=boson-git
3pkgver=0.7.0.r0.g6462fa7
4_electronversion=41
5_nodeversion=24
6pkgrel=1
7pkgdesc="SDSS observer graphical interface."
8arch=('any')
9url="https://albireox.github.io/boson/"
10_ghurl="https://github.com/albireox/boson"
11license=('BSD-3-Clause')
12conflicts=("${pkgname%-git}")
13provides=("${pkgname%-git}=${pkgver%.r*}")
14depends=(
15 "electron${_electronversion}"
16)
17makedepends=(
18 'npm'
19 'yarn'
20 'git'
21 'nvm'
22 'gendesk'
23 'curl'
24 'jq'
25 'zip'
26)
27source=(
28 "${pkgname//-/.}::git+${_ghurl}.git"
29 "${pkgname%-git}.sh"
30)
31sha256sums=('SKIP'
32 'a774c2f54fbbeeaac3cefc0f7250796d30c86d27f0fd40b7eaf9c0fdb021623d')
33pkgver() {
34 cd "${srcdir}/${pkgname//-/.}"
35 set -o pipefail
36 git describe --long --tags --abbrev=7 | sed 's/\([^-]*-g\)/r\1/;s/-/./g;s/v//g' ||
37 printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short=7 HEAD)"
38}
39_ensure_local_nvm() {
40 local NVM_DIR="${srcdir}/.nvm"
41 source /usr/share/nvm/init-nvm.sh || [[ $? != 1 ]]
42 nvm install "${_nodeversion}"
43 nvm use "${_nodeversion}"
44}
45_get_app_dir() {
46 find "${srcdir}" -type f -name "resources.pak" -exec dirname {} + | head -n 1
47}
48_set_build_env() {
49 export ELECTRON_DIST="/usr/lib/electron${_electronversion}"
50 export ELECTRON_SKIP_BINARY_DOWNLOAD=1
51 export NODE_OPTIONS="--max-old-space-size=4096"
52 export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/v//g')"
53 export HOME="${srcdir}/.electron-gyp"
54 export npm_config_platform=linux
55 export npm_config_arch="${CARCH}"
56 mkdir -p "${srcdir}/.electron-gyp"
57 export NODE_ENV=production
58 export YARN_CACHE_FOLDER="${srcdir}/.yarn/cache"
59 export YARN_NODE_LINKER=node-modules
60 local mirror_mode="${USE_CHINA_MIRROR:-auto}"
61 case "${mirror_mode}" in
62 1)
63 echo "==> USE_CHINA_MIRROR=1: Enforce npmmirror" >&2
64 _apply_china_mirror
65 ;;
66 0)
67 echo "==> USE_CHINA_MIRROR=0: Enforce upstream registry" >&2
68 ;;
69 auto)
70 echo "==> Auto checking registry.npmjs.org connectivity..." >&2
71 if ! timeout 3 bash -c 'exec 3<>/dev/tcp/registry.npmjs.org/443' 2>/dev/null; then
72 echo "==> Cannot connect upstream npm, switching to npmmirror" >&2
73 _apply_china_mirror
74 else
75 echo "==> Upstream npm reachable, keep original registry" >&2
76 fi
77 ;;
78 *)
79 echo "==> Invalid USE_CHINA_MIRROR value, fallback to upstream" >&2
80 ;;
81 esac
82}
83_apply_china_mirror() {
84 export YARN_NPM_REGISTRY_SERVER="https://registry.npmmirror.com"
85 export ELECTRON_MIRROR="https://registry.npmmirror.com/-/binary/electron/"
86 export ELECTRON_BUILDER_BINARIES_MIRROR="https://registry.npmmirror.com/-/binary/electron-builder-binaries/"
87 export NODEJS_ORG_MIRROR="https://npmmirror.com/mirrors/node"
88}
89_use_new_yarn() {
90 _yarnver=`grep "yarn@" package.json | awk '{print $2}' | sed "s/\"//g;s/yarn@//g;s/,//g"`
91 corepack enable
92 corepack prepare yarn@"${_yarnver}" --activate
93}
94_use_local_electron_for_forge() {
95 local _v="${SYSTEM_ELECTRON_VERSION}"
96 local _zd="${srcdir}/electron-zips"
97 case "${CARCH}" in
98 aarch64) _arch=arm64 ;;
99 x86_64) _arch=x64 ;;
100 esac
101 local _zf="${_zd}/electron-v${_v}-linux-${_arch}.zip"
102 install -Dm755 -d "${_zd}"
103 ( cd "${ELECTRON_DIST}" && zip -r -q -0 "${_zf}" . )
104 sed -i "/packagerConfig:[[:space:]]*{/a\\ electronZipDir: '${_zd}'," forge.config.*
105}
106_get_electron_version() {
107 _elec_ver=$(find "${srcdir}" -maxdepth 5 -name "package.json" ! -path "*/node_modules/*" \
108 -exec grep -l '"electron"' {} + | xargs -I{} jq -r '(.devDependencies.electron // .dependencies.electron) // empty' {} 2>/dev/null | head -1)
109 [[ -z "${_elec_ver}" ]] && return 1
110 echo -e "The electron version is: \033[1;31m${_elec_ver%%.*}\033[0m"
111}
112prepare() {
113 cd "${srcdir}/${pkgname//-/.}"
114 _get_electron_version
115 sed -i -e "
116 s/@electronversion@/${_electronversion}/g
117 s/@appname@/${pkgname%-git}/g
118 s/@runname@/app.asar/g
119 s/@cfgdirname@/${pkgname%-git}/g
120 " -i "${srcdir}/${pkgname%-git}.sh"
121 gendesk -q -f -n \
122 --pkgname="${pkgname%-git}" \
123 --pkgdesc="${pkgdesc}" \
124 --categories="Development" \
125 --name="${pkgname%-git}" \
126 --exec="${pkgname%-git} %U"
127 _set_build_env
128 _ensure_local_nvm
129 sed -i "s/\"electron\": \"[^\"]*\"/\"electron\": \"${SYSTEM_ELECTRON_VERSION}\"/g" package.json
130 _use_new_yarn
131 NODE_ENV=development yarn install
132 _use_local_electron_for_forge
133}
134build() {
135 cd "${srcdir}/${pkgname//-/.}"
136 _set_build_env
137 _ensure_local_nvm
138 NODE_ENV=production yarn run package
139}
140package() {
141 install -Dm755 "${srcdir}/${pkgname%-git}.sh" "${pkgdir}/usr/bin/${pkgname%-git}"
142 install -Dm755 -d "${pkgdir}/usr/lib/${pkgname%-git}"
143 local _app_dir=$(_get_app_dir)
144 cp -a "${_app_dir}/resources/"* "${pkgdir}/usr/lib/${pkgname%-git}/"
145 install -Dm644 "${srcdir}/${pkgname//-/.}/public/icon.png" "${pkgdir}/usr/share/pixmaps/${pkgname%-git}.png"
146 install -Dm644 "${srcdir}/${pkgname//-/.}/${pkgname%-git}.desktop" -t "${pkgdir}/usr/share/applications"
147 install -Dm644 "${srcdir}/${pkgname//-/.}/package.json" "${pkgdir}/usr/share/licenses/${pkgname}"
148}
149

Changes since previous scan

--- PKGBUILD @ 2026-09-10 00:22
+++ PKGBUILD @ 2026-09-17 00:27
@@ -1,10 +1,10 @@
# Maintainer: zxp19821005 <zxp19821005 at 163 dot com>
pkgname=boson-git
-pkgver=0.6.1.r0.g4b4a6a2
+pkgver=0.7.0.r0.g6462fa7
_electronversion=41
_nodeversion=24
pkgrel=1
-pkgdesc="SDSS observer graphical interface.(Use system-wide electron)"
+pkgdesc="SDSS observer graphical interface."
arch=('any')
url="https://albireox.github.io/boson/"
_ghurl="https://github.com/albireox/boson"
@@ -22,6 +22,7 @@
'gendesk'
'curl'
'jq'
+ 'zip'
)
source=(
"${pkgname//-/.}::git+${_ghurl}.git"
@@ -45,24 +46,62 @@
find "${srcdir}" -type f -name "resources.pak" -exec dirname {} + | head -n 1
}
_set_build_env() {
- export ELECTRON_SKIP_BINARY_DOWNLOAD=1
- export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/v//g')"
- export HOME="${srcdir}/.electron-gyp"
- export electronDist="/usr/lib/electron${_electronversion}"
- mkdir -p "${srcdir}/.electron-gyp"
- if [[ "$(curl -s ipinfo.io/country)" == *"CN"* ]]; then
- {
- export ELECTRON_MIRROR="https://registry.npmmirror.com/-/binary/electron/"
- export ELECTRON_BUILDER_BINARIES_MIRROR="https://registry.npmmirror.com/-/binary/electron-builder-binaries/"
- export NODEJS_ORG_MIRROR="https://npmmirror.com/mirrors/node"
- export YARN_CACHE_FOLDER="${srcdir}/.yarn/cache"
- export YARN_GLOBAL_FOLDER="${srcdir}/.yarn/global"
- export YARN_NETWORK_CONCURRENCY=32
- sed -i '/^npmRegistryServer:/d' .yarnrc.yml
- echo 'npmRegistryServer: "https://registry.npmmirror.com"' >> .yarnrc.yml
- }
- find ./ -type f -name "yarn.lock" -exec sed -i "s/registry.yarnpkg.com/registry.npmmirror.com/g" {} +
- fi
+ export ELECTRON_DIST="/usr/lib/electron${_electronversion}"
+ export ELECTRON_SKIP_BINARY_DOWNLOAD=1
+ export NODE_OPTIONS="--max-old-space-size=4096"
+ export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/v//g')"
+ export HOME="${srcdir}/.electron-gyp"
+ export npm_config_platform=linux
+ export npm_config_arch="${CARCH}"
+ mkdir -p "${srcdir}/.electron-gyp"
+ export NODE_ENV=production
+ export YARN_CACHE_FOLDER="${srcdir}/.yarn/cache"
+ export YARN_NODE_LINKER=node-modules
+ local mirror_mode="${USE_CHINA_MIRROR:-auto}"
+ case "${mirror_mode}" in
+ 1)
+ echo "==> USE_CHINA_MIRROR=1: Enforce npmmirror" >&2
+ _apply_china_mirror
+ ;;
+ 0)
+ echo "==> USE_CHINA_MIRROR=0: Enforce upstream registry" >&2
+ ;;
+ auto)
+ echo "==> Auto checking registry.npmjs.org connectivity..." >&2
+ if ! timeout 3 bash -c 'exec 3<>/dev/tcp/registry.npmjs.org/443' 2>/dev/null; then
+ echo "==> Cannot connect upstream npm, switching to npmmirror" >&2
+ _apply_china_mirror
+ else
+ echo "==> Upstream npm reachable, keep original registry" >&2
+ fi
+ ;;
+ *)
+ echo "==> Invalid USE_CHINA_MIRROR value, fallback to upstream" >&2
+ ;;
+ esac
+}
+_apply_china_mirror() {
+ export YARN_NPM_REGISTRY_SERVER="https://registry.npmmirror.com"
+ export ELECTRON_MIRROR="https://registry.npmmirror.com/-/binary/electron/"
+ export ELECTRON_BUILDER_BINARIES_MIRROR="https://registry.npmmirror.com/-/binary/electron-builder-binaries/"
+ export NODEJS_ORG_MIRROR="https://npmmirror.com/mirrors/node"
+}
+_use_new_yarn() {
+ _yarnver=`grep "yarn@" package.json | awk '{print $2}' | sed "s/\"//g;s/yarn@//g;s/,//g"`
+ corepack enable
+ corepack prepare yarn@"${_yarnver}" --activate
+}
+_use_local_electron_for_forge() {
+ local _v="${SYSTEM_ELECTRON_VERSION}"
+ local _zd="${srcdir}/electron-zips"
+ case "${CARCH}" in
+ aarch64) _arch=arm64 ;;
+ x86_64) _arch=x64 ;;
+ esac
+ local _zf="${_zd}/electron-v${_v}-linux-${_arch}.zip"
+ install -Dm755 -d "${_zd}"
+ ( cd "${ELECTRON_DIST}" && zip -r -q -0 "${_zf}" . )
+ sed -i "/packagerConfig:[[:space:]]*{/a\\ electronZipDir: '${_zd}'," forge.config.*
}
_get_electron_version() {
_elec_ver=$(find "${srcdir}" -maxdepth 5 -name "package.json" ! -path "*/node_modules/*" \
@@ -88,25 +127,21 @@
_set_build_env
_ensure_local_nvm
sed -i "s/\"electron\": \"[^\"]*\"/\"electron\": \"${SYSTEM_ELECTRON_VERSION}\"/g" package.json
- _yarnver=`grep "yarn@" package.json | awk '{print $2}' | sed "s/\"//g;s/yarn@//g;s/,//g"`
- corepack enable yarn
- echo y | yarn version "${_yarnver}"
+ _use_new_yarn
NODE_ENV=development yarn install
- NODE_ENV=development yarn add -D @electron-forge/plugin-local-electron
+ _use_local_electron_for_forge
}
build() {
cd "${srcdir}/${pkgname//-/.}"
_set_build_env
_ensure_local_nvm
- sed -i -e "/^[[:space:]]*packagerConfig:[[:space:]]*{/a\\
- electronDist: \"${electronDist}\"," forge.config.*
NODE_ENV=production yarn run package
}
package() {
install -Dm755 "${srcdir}/${pkgname%-git}.sh" "${pkgdir}/usr/bin/${pkgname%-git}"
install -Dm755 -d "${pkgdir}/usr/lib/${pkgname%-git}"
local _app_dir=$(_get_app_dir)
- cp -a "${_app_dir}/resources/". "${pkgdir}/usr/lib/${pkgname%-git}/"
+ cp -a "${_app_dir}/resources/"* "${pkgdir}/usr/lib/${pkgname%-git}/"
install -Dm644 "${srcdir}/${pkgname//-/.}/public/icon.png" "${pkgdir}/usr/share/pixmaps/${pkgname%-git}.png"
install -Dm644 "${srcdir}/${pkgname//-/.}/${pkgname%-git}.desktop" -t "${pkgdir}/usr/share/applications"
install -Dm644 "${srcdir}/${pkgname//-/.}/package.json" "${pkgdir}/usr/share/licenses/${pkgname}"

Scan history

Scanned at (UTC)SeverityRules
2026-09-17 00:27:14 Low 2
2026-09-16 00:03:17 Low 2
2026-09-15 00:25:31 Low 2
2026-09-14 00:27:57 Low 2
2026-09-13 00:19:54 Low 2
2026-09-12 00:25:17 Low 2
2026-09-11 00:19:22 Low 2
2026-09-10 15:20:39 Medium 1
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

Report a package

Reports go to the AURWatch maintainer (one person) and are read by hand. No login required.

0 / 4000
Your suggestion