claude-desktop-native
Triggered rules
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:59
npx asar extract app.asar app.asar.contents -
PKGBUILD:82
npx asar pack app.asar.contents app.asar
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:13
source=("Claude-Setup-x64-${pkgver}-${pkgrel}.exe::https://storage.googleapis.com/osprey-downloads-c02f6a0d-347c-492b-a752-3e0651722e97/nest-win-x64/Claude-Setup-x64.exe"
llm_review
An AI model (anthropic/claude-4.6-sonnet-20260217) reviewed this and agrees it is MEDIUM (confidence 72%): The PKGBUILD downloads the official Claude Desktop Windows installer from Anthropic's Google Cloud Storage bucket (osprey-downloads-c02f6a0d-347c-492b-a752-3e0651722e97 is Anthropic's official distribution bucket), which has a proper sha256 checksum. The git source (patchy-cnb) is SKIP'd but is a known open-source project for Linux Claude compatibility. The two `npx asar` calls use the locally installed `asar` npm package (not fetching remote code at runtime beyond what npm install already fetched), so they are not truly 'remote execution'. The main concern is the SKIP'd checksum on the git source and the fact that a Rust-compiled native .node binary from patchy-cnb replaces claude-native-binding.node — this compiled binary runs inside the Electron app with full user privileges and its integrity is not pinned. This is a genuine medium-severity supply-chain concern: an unverified compiled native module replaces a core binding in a proprietary app. However, there is no obfuscation, no exfiltration, and the overall pattern matches known legitimate Linux Claude Desktop packaging efforts. The severity remains medium due to the unpinned compiled native module substitution.
PKGBUILD
3 offending line(s) highlighted# Maintainer: AstroSteveO <stevengmjr at gmail dot com>
pkgname=claude-desktop-native
pkgver=0.14.10
pkgrel=2
pkgdesc="Unofficial Claude Desktop for Linux"
arch=('x86_64')
url="https://github.com/jkoelker/claude-desktop-native"
license=('MIT' 'Apache')
depends=('electron')
makedepends=('p7zip' 'npm' 'nodejs' 'rust' 'cargo' 'imagemagick' 'icoutils' 'tar')
optdepends=('docker: for running MCP servers')
source=("Claude-Setup-x64-${pkgver}-${pkgrel}.exe::https://storage.googleapis.com/osprey-downloads-c02f6a0d-347c-492b-a752-3e0651722e97/nest-win-x64/Claude-Setup-x64.exe"
"patchy-cnb::git+https://github.com/k3d3/claude-desktop-linux-flake.git")
sha256sums=('4a7fe5bcc95f29dedbfeeb45bc2c6b916343253ba0e0e392038968f5857c6aa9'
'SKIP')
prepare() {
cd "${srcdir}"
# Extract installer exe and nupkg
7z x -y "Claude-Setup-x64-${pkgver}-${pkgrel}.exe"
7z x -y "AnthropicClaude-${pkgver}-full.nupkg"
# Verify version matches what's in the nuspec file
if [ -f "AnthropicClaude.nuspec" ]; then
NUSPEC_VERSION=$(grep -oP '<version>\K[^<]+' "AnthropicClaude.nuspec")
if [ "$NUSPEC_VERSION" != "$pkgver" ]; then
echo "WARNING: PKGBUILD version ($pkgver) does not match nuspec version ($NUSPEC_VERSION)"
echo "Please update pkgver in PKGBUILD to: $NUSPEC_VERSION"
fi
fi
# Extract icons from claude.exe
wrestool -x -t 14 lib/net45/claude.exe -o claude.ico
icotool -x claude.ico
mkdir -p icons/hicolor
for size in 16 24 32 48 64 256; do
mkdir -p "icons/hicolor/${size}x${size}/apps"
install -Dm 644 claude_*"${size}x${size}x32.png" \
"icons/hicolor/${size}x${size}/apps/claude.png"
done
}
build() {
# Build patchy-cnb (assuming patchy-cnb folder exists at same level as PKGBUILD)
cd "${srcdir}/patchy-cnb/patchy-cnb"
npm install
npm run build
cd "${srcdir}"
# Process app.asar files
mkdir -p electron-app
cp "lib/net45/resources/app.asar" electron-app/
cp -r "lib/net45/resources/app.asar.unpacked" electron-app/
cd electron-app
npx asar extract app.asar app.asar.contents
# Fix resource paths - handle different variable names for app object
sed -i 's|return[[:space:]]\+[a-zA-Z_][a-zA-Z0-9_]*\.app\.isPackaged[[:space:]]*?[^:]*:[[:space:]]*[a-zA-Z_][a-zA-Z0-9_]*\.resolve([^,]*,[[:space:]]*"\.\.","\.\.","resources")|return "/usr/lib/'"${pkgname}"'/resources"|g' app.asar.contents/.vite/build/index*.js
# Fix i18n resource paths specifically
sed -i 's|return[[:space:]]\+[a-zA-Z_][a-zA-Z0-9_]*\.app\.isPackaged[[:space:]]*?[^:]*:[[:space:]]*[a-zA-Z_][a-zA-Z0-9_]*\.resolve([^,]*,[[:space:]]*"\.\.","\.\.","resources","i18n")|return "/usr/lib/'"${pkgname}"'/resources"|g' app.asar.contents/.vite/build/index*.js
# fix negation operator to show menubar
sed -i -E 's/if\(!([a-zA-Z]+)[[:space:]]*&&[[:space:]]*([a-zA-Z]+)\)/if(\1 \&\& \2)/g' app.asar.contents/.vite/renderer/main_window/assets/MainWindowPage-*.js
# Replace native bindings with patchy-cnb
pwd
local PATCHY_CNB_NODE=$(find ../patchy-cnb/patchy-cnb -name "patchy-cnb.*.node")
cp "${PATCHY_CNB_NODE}" app.asar.contents/node_modules/claude-native/claude-native-binding.node
cp "${PATCHY_CNB_NODE}" app.asar.unpacked/node_modules/claude-native/claude-native-binding.node
# Add Tray icons to app resources
mkdir -p app.asar.contents/resources
cp ../lib/net45/resources/Tray* app.asar.contents/resources/
# Copy i18n json files
mkdir -p app.asar.contents/resources/i18n
cp ../lib/net45/resources/*.json app.asar.contents/resources/i18n/
# Repackage app.asar
npx asar pack app.asar.contents app.asar
}
package() {
cd "${srcdir}"
# Install app files
install -d "${pkgdir}/usr/lib/${pkgname}"
cp -r electron-app/app.asar "${pkgdir}/usr/lib/${pkgname}/"
cp -r electron-app/app.asar.unpacked "${pkgdir}/usr/lib/${pkgname}/"
# Install resources directory with tray icons
install -d "${pkgdir}/usr/lib/${pkgname}/resources"
cp electron-app/app.asar.contents/resources/Tray* "${pkgdir}/usr/lib/${pkgname}/resources/"
# Copy language JSON files to resources directory
cp lib/net45/resources/*.json "${pkgdir}/usr/lib/${pkgname}/resources/"
# Install icons
install -d "${pkgdir}/usr/share/icons"
cp -r icons/* "${pkgdir}/usr/share/icons/"
# Create desktop file
install -Dm644 /dev/stdin "${pkgdir}/usr/share/applications/${pkgname}.desktop" <<EOF
[Desktop Entry]
Name=Claude
GenericName=Claude Desktop
Exec=${pkgname} %u
Icon=claude
Type=Application
Terminal=false
Categories=Office;Utility;
MimeType=x-scheme-handler/claude;
StartupWMClass=Claude
EOF
# Create launcher script
install -Dm755 /dev/stdin "${pkgdir}/usr/bin/${pkgname}" <<EOF
#!/bin/sh
exec electron /usr/lib/${pkgname}/app.asar --gtk-version=3 "\$@"
EOF
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-08-03 00:08:14 | MEDIUM | 3 |
| 2026-08-02 00:16:08 | MEDIUM | 3 |
| 2026-08-01 00:11:18 | MEDIUM | 3 |
| 2026-07-31 00:14:10 | MEDIUM | 3 |
| 2026-07-30 00:17:23 | MEDIUM | 3 |
| 2026-07-29 00:25:53 | MEDIUM | 3 |
| 2026-07-28 00:07:28 | MEDIUM | 3 |
| 2026-07-27 00:24:32 | MEDIUM | 3 |
| 2026-07-26 00:07:32 | MEDIUM | 3 |
| 2026-07-25 00:13:44 | MEDIUM | 3 |
| 2026-07-24 00:02:28 | MEDIUM | 3 |
| 2026-07-23 00:14:47 | MEDIUM | 3 |
| 2026-07-22 00:29:32 | MEDIUM | 3 |
| 2026-07-21 00:24:15 | MEDIUM | 3 |
| 2026-07-20 00:19:49 | MEDIUM | 3 |
| 2026-07-19 00:17:08 | MEDIUM | 3 |
| 2026-07-18 00:14:48 | MEDIUM | 3 |
| 2026-07-17 00:06:16 | MEDIUM | 3 |
| 2026-07-16 00:05:41 | MEDIUM | 3 |
| 2026-07-15 00:09:25 | MEDIUM | 3 |