zalo-for-linux-git

MEDIUM
maintainer nanoka 1 votes scanned 2026-09-10 05:22:27.145474
View on AUR
Why flagged

The build runs `npx prebuild-install` to fetch a prebuilt native binary for sqlite3 at build time from an external registry, and also downloads a Zalo DMG via a custom script (`download-dmg.js`) from an unverified source; combined with a SKIP'd checksum on the git source and the package being a low-vote unofficial port, there is a meaningful supply-chain risk from unverifiable prebuilt artifacts, though no overtly malicious payload is visible.

Triggered rules

Medium npx/bunx/deno executes a remote package remote_code_tool

`npx`/`bunx`/`pnpm dlx`/`deno run <url>` downloads AND runs a remote package at build time — the moral equivalent of piping a download into a shell. Severity downgraded: Node.js consumer context.

  • PKGBUILD:100 (cd node_modules/sqlite3 && npx prebuild-install -r napi)
Low Few votes, recently uploaded zero_votes_recent

Uploaded within the last 14 days with 2 or fewer community votes — little peer review so far.

Medium AI review llm_review

An AI model (anthropic/claude-sonnet-4.6) reviewed this and agrees it is MEDIUM (confidence 65%): The build runs `npx prebuild-install` to fetch a prebuilt native binary for sqlite3 at build time from an external registry, and also downloads a Zalo DMG via a custom script (`download-dmg.js`) from an unverified source; combined with a SKIP'd checksum on the git source and the package being a low-vote unofficial port, there is a meaningful supply-chain risk from unverifiable prebuilt artifacts, though no overtly malicious payload is visible.

PKGBUILD

1 offending line(s) highlighted
1# Maintainer: Nguyen Hoang Ky <nhktmdzhg at gmail dot com>
2pkgname=zalo-for-linux-git
3pkgdesc="Zalo for Linux — unofficial port with ZaDark, running on system Electron 22"
4arch=('x86_64')
5url="https://github.com/doandat943/zalo-for-linux"
6license=('MIT')
7pkgver=26.8.20+26.2.1.r99.87b0696
8pkgrel=1
9provides=('zalo')
10conflicts=('zalo' 'zalo-for-linux-bin')
11
12depends=(
13 'electron22-bin'
14 'glibc'
15 'sqlite'
16 'zlib'
17 'xz'
18 'openssl'
19 'hicolor-icon-theme'
20)
21
22makedepends=(
23 'git' 'nodejs' 'npm' 'python' 'make'
24 'gcc' '7zip' 'rust' 'wget' # wget: used by upstream scripts/download-dmg.js
25 # zcall-bridge: build the Wine call engine, same as upstream ZaDark AppImage
26 'mingw-w64-gcc' # pipebridge.exe
27 'lib32-gcc-libs' 'lib32-glibc' 'lib32-libx11' 'lib32-libxcb' 'lib32-libxext'
28)
29
30optdepends=(
31 'wl-clipboard: paste images from clipboard on Wayland'
32 'xclip: paste images from clipboard on X11'
33 'deepin-screen-recorder: Screenshot without/with Zalo window button'
34 'spectacle: Screenshot without/with Zalo window button'
35 'flameshot: Screenshot without/with Zalo window button'
36 'gnome-screenshot: Screenshot without/with Zalo window button'
37 'xfce4-screenshooter: Screenshot without/with Zalo window button'
38 'mate-screenshot: Screenshot without/with Zalo window button'
39 'scrot: Screenshot without/with Zalo window button'
40 'wine: Voice/Video call engine support (or download portable wine in-app)'
41 'v4l-utils: control camera formats (fix inverted/green camera)'
42 'v4l2loopback-dkms: loopback camera support'
43 'xorg-server-xvfb: headless X server for Wayland screen-sharing bridge'
44 'python-dbus: required by the Wayland screen-sharing bridge (zcall-bridge/screenbridge.py)'
45 'xdotool: window resizing for screen bridge display'
46 'gst-plugins-base: 64-bit GStreamer plugins (ximagesink) for screen bridge'
47 'gst-plugins-bad: 64-bit GStreamer plugins (pipewiresrc) for screen bridge'
48 'python-gobject: required by the Wayland screen-sharing bridge (zcall-bridge/screenbridge.py)'
49 'lib32-glibc: 32-bit runtime for the Wayland screen-share shim (zcall-bridge/streamproxy.so, pulled in by wine)'
50 'lib32-libx11: 32-bit X11 for the Wayland screen-share shim (pulled in by wine)'
51 'lib32-libxcb: 32-bit XCB for the Wayland screen-share shim (pulled in by wine)'
52)
53
54options=(!strip !debug)
55
56source=(
57 "$pkgname::git+https://github.com/doandat943/zalo-for-linux.git"
58 "integrate-zadark.js"
59 "zalo.sh"
60 "zalo.desktop"
61)
62sha256sums=(
63 'SKIP'
64 'd88b81e287f303e0824b37a9778f92c223ff946b31c81c699e9fde3fe436b762'
65 '277f7b54fc65deb7d524537ac73a110c23aab771aabff092d19c114abd305c91'
66 '9c692898a06c7d311e1cd2cbe53a4b0a0e5b46a42c69c8320318dce12d48bb47'
67)
68
69pkgver() {
70 local _src="$srcdir/$pkgname"
71 if [[ ! -d $_src/.git ]]; then
72 echo 'git source not extracted yet; run makepkg -o first' >&2
73 return 1
74 fi
75 cd "$_src"
76 git submodule update --init --recursive plugins/zadark >&2
77 local _zadark
78 _zadark=$(sed -n 's/.*"version": *"\([^"]*\)".*/\1/p' plugins/zadark/package.json | head -1)
79 local _zalo
80 _zalo=$(git describe --tags --abbrev=0)
81 printf '%s+%s.r%s.%s' "$_zalo" "$_zadark" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
82}
83
84prepare() {
85 cd "$srcdir/$pkgname"
86 git submodule update --init --recursive
87}
88
89build() {
90 cd "$srcdir/$pkgname"
91
92 # Zalo version = repo's latest tag, same number as the DMG on zadn.vn
93 export ZALO_VERSION="$(git describe --tags --abbrev=0)"
94 export ZADARK_VERSION="$(node -p "require('./plugins/zadark/package.json').version")"
95
96 # npm >= 12 blocks git deps (crx in zadark's lockfile) — allow-git=all
97 # scripts skipped, so fetch sqlite3's N-API v6 prebuilt manually
98 export npm_config_allow_git="all"
99 npm ci --ignore-scripts --no-audit --no-fund
100 (cd node_modules/sqlite3 && npx prebuild-install -r napi)
101
102 node scripts/download-dmg.js
103 node scripts/prepare-zadark.js
104 node scripts/prepare-app.js
105 node scripts/setup-zcall-bridge.js
106 node "$srcdir/integrate-zadark.js"
107}
108
109package() {
110 cd "$srcdir/$pkgname"
111 local _lib="$pkgdir/usr/lib/zalo"
112
113 install -d "$_lib" "$_lib/plugins"
114 # Strip Mach-O/PE natives from the DMG: Linux bindings always sit under a
115 # path containing "linux"; keep qt-call-and-cap (the Wine call engine).
116 find app/native/nativelibs -type f \( -name '*.node' -o -name '*.dylib' \
117 -o -name '*.exe' -o -name '*.dll' \) ! -path '*linux*' -delete
118 find app/native/nativelibs -type d -empty -delete
119 cp -a main.js package.json app zcall-bridge "$_lib/"
120 for _plugin in zalux screenshot launcher-badge userscripts zcall-bridge; do
121 cp -a "plugins/$_plugin" "$_lib/plugins/"
122 done
123 # Ship the zadark submodule without its dev node_modules.
124 cp -a plugins/zadark "$_lib/plugins/"
125 # ps-list's vendored Windows exes are unused on Linux (reads /proc).
126 find "$_lib/plugins/zadark" -type f \( -name '*.exe' -o -name '*.dylib' \
127 -o -name '*.dll' \) -delete
128 rm -rf "$_lib/plugins/zadark/node_modules"
129
130 install -Dm755 "$srcdir/zalo.sh" "$pkgdir/usr/bin/zalo"
131 install -Dm644 "$srcdir/zalo.desktop" "$pkgdir/usr/share/applications/zalo.desktop"
132 install -Dm644 app/pc-dist/favicon-512x512.png \
133 "$pkgdir/usr/share/icons/hicolor/512x512/apps/zalo.png"
134 install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
135}
136

Scan history

Scanned at (UTC)SeverityRules
2026-09-10 05:22:27 Medium 3
2026-09-10 05:20:15 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