syncless-bin
Triggered rules
source_untrusted_domain
One or more source=() URLs point to a host outside the trusted allowlist (github.com, gitlab.com, codeberg.org, pypi.org, …).
-
PKGBUILD:14
source=('desktop-windows-latest.exe::https://artifacts.syncless.ai/downloads/desktop-windows-latest.exe')
llm_review
An AI model (anthropic/claude-4.6-sonnet-20260217) reviewed this and agrees it is MEDIUM (confidence 72%): The PKGBUILD downloads a prebuilt Windows installer EXE from artifacts.syncless.ai (a project-specific subdomain, not a well-known official release host like GitHub releases), extracts it with 7z, unpacks the embedded Electron asar, patches the JavaScript, and installs the JS app to run under the system electron41. The core concern is that the installed code is a prebuilt binary artifact (JavaScript extracted from a proprietary Windows installer) from an unofficial/project-controlled artifact host with no reproducibility guarantee beyond a single SHA-256 checksum. The JS code itself is executed by electron41 with full desktop privileges. While the checksum provides some integrity protection at the time of packaging, the artifact host could serve different content in the future (the checksum only covers the version pinned at packaging time), and the JS bundle is opaque/minified making auditing difficult. This is a genuine medium-severity supply-chain concern: executed code from a non-standard artifact host. It is not clearly malicious, but the pattern (proprietary minified JS from a vendor-controlled artifact server, repackaged without source build) is a real risk that belongs in the medium category.
PKGBUILD
1 offending line(s) highlighted# Maintainer: asuka minato
pkgname=syncless-bin
pkgver=0.0.63
pkgrel=1
pkgdesc='Syncless desktop client, repackaged to run with system Electron'
arch=('x86_64')
url='https://syncless.ai/'
license=('custom')
depends=('electron41' tmux)
makedepends=('p7zip' 'asar')
provides=('syncless')
conflicts=('syncless')
source=('desktop-windows-latest.exe::https://artifacts.syncless.ai/downloads/desktop-windows-latest.exe')
sha256sums=('7affc26f6f30be585147a7e17ad2901ed235a571cf618d362db546b2b49a92dd')
prepare() {
rm -rf "$srcdir/exe" "$srcdir/app"
mkdir -p "$srcdir/exe" "$srcdir/app"
7z x "$srcdir/desktop-windows-latest.exe" '-o'"$srcdir/exe" '$PLUGINSDIR/app-64.7z'
7z x "$srcdir/exe/\$PLUGINSDIR/app-64.7z" '-o'"$srcdir/app"
asar extract "$srcdir/app/resources/app.asar" "$srcdir/app/resources/app"
local main_js="$srcdir/app/resources/app/dist-electron/electron/main.js"
sed -i \
-e 's/const QK=!kt\.isPackaged,/const QK=!kt.isPackaged\&\&!Kv(mn.join(kt.getAppPath(),"dist-renderer\/index.html")),/' \
-e 's/if(!kt\.isPackaged)return`\${An\.VITE_DEV_SERVER_URL}#\${YK}`/if(QK)return`${An.VITE_DEV_SERVER_URL}#${YK}`/' \
-e 's/if(!kt\.isPackaged)return`\${An\.VITE_DEV_SERVER_URL}#\${n}`/if(QK)return`${An.VITE_DEV_SERVER_URL}#${n}`/' \
"$main_js"
grep -q 'const QK=!kt.isPackaged&&!Kv(mn.join(kt.getAppPath(),"dist-renderer/index.html"))' "$main_js"
}
package() {
install -dm755 "$pkgdir/usr/lib/syncless"
cp -r --no-preserve=ownership "$srcdir/app/resources/app" "$pkgdir/usr/lib/syncless/app"
install -dm755 "$pkgdir/usr/bin"
cat > "$pkgdir/usr/bin/syncless" <<'EOF'
#!/bin/sh
exec electron41 /usr/lib/syncless/app "$@"
EOF
chmod 755 "$pkgdir/usr/bin/syncless"
install -Dm644 "$srcdir/app/resources/app/assets/icons/app-icon.png" \
"$pkgdir/usr/share/pixmaps/syncless.png"
install -Dm644 /dev/stdin "$pkgdir/usr/share/applications/syncless.desktop" <<'EOF'
[Desktop Entry]
Type=Application
Name=Syncless
Comment=Syncless desktop client
Exec=syncless %U
Icon=syncless
Terminal=false
Categories=Utility;Network;
StartupWMClass=Syncless
EOF
install -Dm644 "$srcdir/app/LICENSE.electron.txt" \
"$pkgdir/usr/share/licenses/$pkgname/LICENSE.electron.txt"
install -Dm644 "$srcdir/app/LICENSES.chromium.html" \
"$pkgdir/usr/share/licenses/$pkgname/LICENSES.chromium.html"
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-08-03 00:08:14 | MEDIUM | 2 |
| 2026-08-02 00:16:08 | MEDIUM | 2 |
| 2026-08-01 00:11:18 | MEDIUM | 2 |
| 2026-07-31 00:14:10 | MEDIUM | 2 |
| 2026-07-30 00:17:23 | MEDIUM | 2 |
| 2026-07-29 00:25:53 | MEDIUM | 2 |
| 2026-07-28 00:07:28 | MEDIUM | 2 |
| 2026-07-27 00:24:32 | MEDIUM | 2 |
| 2026-07-26 00:07:32 | MEDIUM | 2 |
| 2026-07-25 00:13:44 | MEDIUM | 2 |
| 2026-07-24 00:02:28 | MEDIUM | 2 |
| 2026-07-23 00:14:47 | MEDIUM | 2 |
| 2026-07-22 00:29:32 | MEDIUM | 2 |
| 2026-07-21 00:24:15 | MEDIUM | 2 |
| 2026-07-20 00:19:49 | MEDIUM | 2 |
| 2026-07-19 00:17:08 | MEDIUM | 2 |
| 2026-07-18 00:14:48 | MEDIUM | 2 |
| 2026-07-17 00:06:16 | MEDIUM | 2 |
| 2026-07-16 00:05:41 | MEDIUM | 2 |
| 2026-07-15 00:09:25 | MEDIUM | 2 |