postybirb

LOW
maintainer zxp19821005 1 votes scanned 2026-11-01 00:21:48.120785
View on AUR
Why flagged

The PKGBUILD builds PostyBirb from its official GitHub source tarball (mvdicarlo/postybirb). The flagged patterns are: (1) `npm install -g "@yarnpkg/cli-dist@${_yarnver}"` at line 92 installs a yarn version read from the project's own package.json packageManager field — this is a standard corepack-style pattern for installing the exact yarn version declared by the upstream project, not an attacker-controlled package name; (2) `yarn add --dev node-addon-api` at line 132 installs a well-known, official npm package (node-addon-api by Node.js contributors) needed for native addon builds. Both patterns are common in Electron app AUR PKGBUILDs by this maintainer. The source is fetched from the official GitHub release tag with a declared sha256sum. No obfuscation, no exfiltration, no attacker-controlled hosts, no encoded payloads. The build uses system electron and standard npm/yarn registries (configurable via NPM_CONFIG_REGISTRY). This is a legitimate, if complex, Electron app build pattern and the HIGH flag is a false positive.

Triggered rules

Low AI review downgraded a static finding llm_review

The static rules flagged this HIGH, but an AI model (anthropic/claude-sonnet-4.6) reviewed the full PKGBUILD and judged it LOW (confidence 82%): The PKGBUILD builds PostyBirb from its official GitHub source tarball (mvdicarlo/postybirb). The flagged patterns are: (1) `npm install -g "@yarnpkg/cli-dist@${_yarnver}"` at line 92 installs a yarn version read from the project's own package.json packageManager field — this is a standard corepack-style pattern for installing the exact yarn version declared by the upstream project, not an attacker-controlled package name; (2) `yarn add --dev node-addon-api` at line 132 installs a well-known, official npm package (node-addon-api by Node.js contributors) needed for native addon builds. Both patterns are common in Electron app AUR PKGBUILDs by this maintainer. The source is fetched from the official GitHub release tag with a declared sha256sum. No obfuscation, no exfiltration, no attacker-controlled hosts, no encoded payloads. The build uses system electron and standard npm/yarn registries (configurable via NPM_CONFIG_REGISTRY). This is a legitimate, if complex, Electron app build pattern and the HIGH flag is a false positive.

  • PKGBUILD:92 npm install -g "@yarnpkg/cli-dist@${_yarnver}" --prefix "${_yarnhome}" --registry "${npm_config_registry}"
1 higher static finding superseded - not the current verdict (shown for transparency)
High npm/yarn/pnpm install of an undeclared external package npm_install_external

Runs `npm/yarn/pnpm install <package>` for a package not in source=(), pulling unpinned, unreviewed code at build time.

  • PKGBUILD:132 yarn add --dev node-addon-api

PKGBUILD

2 offending line(s) highlighted
1# Maintainer: zxp19821005 <zxp19821005 at 163 dot com>
2# Contributor: Jacqueline Fisher <jcfisher@reality-overwritten.net>
3pkgname=postybirb
4_pkgname=PostyBirb
5pkgver=4.1.2
6_electronversion=42
7_nodeversion=24
8pkgrel=1
9pkgdesc="An application that helps artists post art and other multimedia to multiple websites more quickly."
10arch=('any')
11url="https://www.postybirb.com/"
12_ghurl="https://github.com/mvdicarlo/postybirb"
13license=('BSD-3-Clause')
14provides=("${pkgname}")
15conflicts=(
16 "${pkgname}"
17 "${pkgname}-plus"
18)
19depends=(
20 "electron${_electronversion}"
21)
22makedepends=(
23 'nvm'
24 'gendesk'
25 'git'
26 'jq'
27)
28source=(
29 "${pkgname}-${pkgver}.tar.gz::${_ghurl}/archive/refs/tags/v${pkgver}.tar.gz"
30 "${pkgname}.sh"
31)
32sha256sums=('d453e2c96697fe7d2e11e362ed3a70e79b9079273f5da1d2e82b530e05512201'
33 'dfcd6603d29c7b8d88e019b517a2e5c1a7b5ab905a0961a8b81adfa508b258b8')
34_get_project_dir() {
35 local d
36 while IFS= read -r d; do
37 find "$d" -name "package.json" ! -path "*/node_modules/*" 2>/dev/null | grep -q . && { echo "$d"; return; }
38 done < <(find "${srcdir}" -maxdepth 1 -mindepth 1 -type d ! -name '.*')
39}
40_ensure_local_nvm() {
41 local NVM_DIR="${srcdir}/.nvm"
42 source /usr/share/nvm/init-nvm.sh || [[ $? != 1 ]]
43 nvm install "${_nodeversion}"
44 nvm use "${_nodeversion}"
45}
46_get_app_dir() {
47 find "${srcdir}" -type f -name "resources.pak" ! -path "*/node_modules/*" -printf '%h\n' 2>/dev/null \
48 | while read -r d; do [[ -d "${d}/resources" ]] && { echo "$d"; return 0; }; done
49}
50_get_electron_version() {
51 _elec_ver=$(find "$(_get_project_dir)" -name "package.json" ! -path "*/node_modules/*" -print \
52 | xargs -I{} jq -r '(.devDependencies.electron // .dependencies.electron) // empty' {} 2>/dev/null \
53 | grep -oE '[0-9]+' | head -1)
54 [[ -z "${_elec_ver}" ]] && return 1
55 (( _elec_ver == _electronversion )) && c=32 || c=31
56 echo -e "Electron version: \033[1;${c}m${_elec_ver}$([[ $c -eq 31 ]] && echo " (expected ${_electronversion})")\033[0m"
57}
58_set_build_env() {
59 export ELECTRON_DIST="/usr/lib/electron${_electronversion}"
60 export ELECTRON_OVERRIDE_DIST_PATH="${ELECTRON_DIST}"
61 export ELECTRON_SKIP_BINARY_DOWNLOAD=1
62 export ELECTRON_BUILDER_OFFLINE=true
63 export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/^v//')"
64 export HOME="${srcdir}/.home"
65 export XDG_CACHE_HOME="${HOME}/.cache"
66 export XDG_CONFIG_HOME="${HOME}/.config"
67 export XDG_DATA_HOME="${HOME}/.local/share"
68 export YARN_CACHE_FOLDER="${HOME}/.yarn/cache"
69 export YARN_NETWORK_CONCURRENCY=32
70 export COREPACK_NPM_REGISTRY="${COREPACK_NPM_REGISTRY:-${NPM_CONFIG_REGISTRY:-https://registry.npmjs.org}}"
71 export COREPACK_HOME="${HOME}/.corepack"
72 export npm_config_registry="${NPM_CONFIG_REGISTRY:-https://registry.npmjs.org}"
73 local _yarnver _yarnmajor=0
74 _yarnver="$(node -p "require('./package.json').packageManager?.split('@')[1]?.split('-')[0] || ''" 2>/dev/null)"
75 _yarnmajor="${_yarnver%%.*}"
76 _yarnmajor="${_yarnmajor:-0}"
77 if [[ "${_yarnmajor}" -ge 2 ]] 2>/dev/null || [[ -f .yarnrc.yml ]]; then
78 export XDG_STATE_HOME="${HOME}/.local/state"
79 export YARN_ENABLE_GLOBAL_CACHE=false
80 export YARN_ENABLE_MIRROR=false
81 export YARN_GLOBAL_FOLDER="${HOME}/.yarn/berry"
82 export YARN_NODE_LINKER=node-modules
83 export YARN_NM_MODE=hardlinks-local
84 export YARN_ENABLE_TELEMETRY=false
85 export YARN_ENABLE_SCRIPTS=true
86 export YARN_HTTP_TIMEOUT=600000
87 export YARN_HTTP_RETRY=5
88 export YARN_NPM_REGISTRY_SERVER="${YARN_NPM_REGISTRY_SERVER:-${NPM_CONFIG_REGISTRY:-https://registry.yarnpkg.com}}"
89 local _yarnhome="${HOME}/.yarn/install"
90 mkdir -p "${HOME}" "${YARN_CACHE_FOLDER}" "${YARN_GLOBAL_FOLDER}" "${COREPACK_HOME}" "${_yarnhome}"
91 if [[ -n "${_yarnver}" ]]; then
92 npm install -g "@yarnpkg/cli-dist@${_yarnver}" --prefix "${_yarnhome}" --registry "${npm_config_registry}"
93 export PATH="${_yarnhome}/bin:${PATH}"
94 fi
95 else
96 export YARN_GLOBAL_FOLDER="${HOME}/.yarn/global"
97 export YARN_LINK_FOLDER="${HOME}/.yarn/link"
98 export YARN_TEMP_FOLDER="${HOME}/.yarn/tmp"
99 export YARN_NETWORK_TIMEOUT=600000
100 export YARN_CHILD_CONCURRENCY="$(nproc)"
101 export YARN_FROZEN_LOCKFILE=true
102 export YARN_IGNORE_ENGINES=true
103 export YARN_PRODUCTION=false
104 mkdir -p "${HOME}" "${YARN_CACHE_FOLDER}" "${YARN_GLOBAL_FOLDER}" "${YARN_LINK_FOLDER}" "${YARN_TEMP_FOLDER}" "${COREPACK_HOME}"
105 fi
106 local _reg="${NPM_CONFIG_REGISTRY:-https://registry.yarnpkg.com}"
107 _reg="${_reg%/}"
108 if [[ -f .yarnrc ]]; then
109 sed -i "s|^registry .*|registry \"${_reg}\"|" .yarnrc
110 fi
111 if [[ -f yarn.lock ]] && grep -q 'resolved "https://registry.yarnpkg.com' yarn.lock; then
112 sed -i "s|https://registry.yarnpkg.com/|${_reg}/|g" yarn.lock
113 fi
114}
115prepare() {
116 cd "$(_get_project_dir)"
117 _get_electron_version
118 sed -i -e "
119 s/@electronversion@/${_electronversion}/g
120 s/@appname@/${pkgname}/g
121 " "${srcdir}/${pkgname}.sh"
122 gendesk -q -f -n \
123 --pkgname="${pkgname}" \
124 --pkgdesc="${pkgdesc}" \
125 --categories="Utility" \
126 --name="${_pkgname}" \
127 --exec="${pkgname} %U"
128 _ensure_local_nvm
129 _set_build_env
130 jq --arg ver "${SYSTEM_ELECTRON_VERSION}" '.devDependencies.electron = $ver' package.json > package.json.tmp && mv package.json.tmp package.json
131 export NODE_ENV=development
132 yarn add --dev node-addon-api
133 yarn install
134}
135build() {
136 cd "$(_get_project_dir)"
137 _ensure_local_nvm
138 _set_build_env
139 export NODE_ENV=production
140 yarn run build:prod
141 yarn electron-builder --linux dir -c.electronDist="${ELECTRON_DIST}" --config electron-builder.yml
142 rm -rf "$(_get_app_dir)/resources/default_app.asar"
143}
144package() {
145 install -Dm755 "${srcdir}/${pkgname}.sh" "${pkgdir}/usr/bin/${pkgname}"
146 install -Dm755 -d "${pkgdir}/usr/lib/${pkgname}"
147 cp -a "$(_get_app_dir)/resources/." "${pkgdir}/usr/lib/${pkgname}/"
148 install -Dm644 "$(_get_project_dir)/packaging-resources/icon.png" "${pkgdir}/usr/share/pixmaps/${pkgname}.png"
149 install -Dm644 "$(_get_project_dir)/${pkgname}.desktop" -t "${pkgdir}/usr/share/applications"
150 install -Dm644 "$(_get_project_dir)/LICENSE" -t "${pkgdir}/usr/share/licenses/${pkgname}"
151}

Scan history

Scanned at (UTC)SeverityRules
2026-11-01 00:21:48 Low 2
2026-10-31 00:07:41 Low 2
2026-10-30 00:29:30 Low 2
2026-10-29 00:13:55 Low 2
2026-10-28 00:06:54 Low 2
2026-10-27 00:23:28 Low 2
2026-10-26 23:46:04 High 1
2026-10-26 00:12:40 Low 2
2026-10-25 00:20:48 Low 2
2026-10-24 00:14:55 Low 2
2026-10-23 00:02:19 Low 2
2026-10-22 00:13:10 Low 2
2026-10-21 00:12:50 Low 2
2026-10-20 00:10:31 Low 2
2026-10-19 00:03:55 Low 2
2026-10-18 00:06:55 Low 2
2026-10-17 00:21:55 Low 2
2026-10-16 00:12:47 Low 2
2026-10-15 00:28:05 Low 2
2026-10-14 07:21:16 Low 2

Report a package

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

0 / 4000
Your suggestion