ajclassic-grapefruit

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

The PKGBUILD downloads a prebuilt Windows NSIS installer archive (aj-classic-1.5.7-ia32.nsis.7z) from classic-download.animaljam.com, extracts an app.asar from it, and installs it as the game runtime. While classic-download.animaljam.com appears to be the official Animal Jam Classic distribution host (WildWorks/AJHQ), it is not a standard Linux package mirror and the package is a Windows binary being repurposed on Linux. The app.asar (an Electron application archive containing executable JavaScript) is extracted and installed directly to /usr/lib, then executed via a launcher script. The sha256 checksum provides integrity verification against the specific downloaded file, but the source is a personal GitHub repo (raw.githubusercontent.com/themirrazz) pulling a Windows game binary and wrapping it with custom Node.js shims including a 'rmsandbox' module that unconditionally exports 'true' — suggesting it bypasses some sandbox check in the original application. The combination of: (1) a prebuilt binary .asar from a CDN, (2) custom shim modules injected into node_modules to override sandbox/path behavior, and (3) execution of Windows game code via Electron on Linux constitutes a real supply-chain concern. The checksums mitigate substitution risk but do not address the trustworthiness of the upstream CDN content or the sandbox-bypass shim. This is a legitimate medium-severity concern.

Triggered rules

Medium source=() URL on a non-standard host 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:17 "ajclassic.7z::https://classic-download.animaljam.com/win/aj-classic-1.5.7-ia32.nsis.7z"
  • PKGBUILD:18 "gameicon.png::https://cdn2.steamgriddb.com/icon_thumb/69daeea8d60db98c428f11dc980effdc.png"
Medium AI review 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 NSIS installer archive (aj-classic-1.5.7-ia32.nsis.7z) from classic-download.animaljam.com, extracts an app.asar from it, and installs it as the game runtime. While classic-download.animaljam.com appears to be the official Animal Jam Classic distribution host (WildWorks/AJHQ), it is not a standard Linux package mirror and the package is a Windows binary being repurposed on Linux. The app.asar (an Electron application archive containing executable JavaScript) is extracted and installed directly to /usr/lib, then executed via a launcher script. The sha256 checksum provides integrity verification against the specific downloaded file, but the source is a personal GitHub repo (raw.githubusercontent.com/themirrazz) pulling a Windows game binary and wrapping it with custom Node.js shims including a 'rmsandbox' module that unconditionally exports 'true' — suggesting it bypasses some sandbox check in the original application. The combination of: (1) a prebuilt binary .asar from a CDN, (2) custom shim modules injected into node_modules to override sandbox/path behavior, and (3) execution of Windows game code via Electron on Linux constitutes a real supply-chain concern. The checksums mitigate substitution risk but do not address the trustworthiness of the upstream CDN content or the sandbox-bypass shim. This is a legitimate medium-severity concern.

PKGBUILD

2 offending line(s) highlighted
1# Maintainer: themirrazz <themirrazzxyz@outlook.com>
2pkgname=ajclassic-grapefruit
3pkgdesc="Lightweight launcher and runtime for AJ Classic"
4pkgver=1.0.1
5url="https://github.com/themirrazz/grapefruit"
6pkgrel=11
7arch=("x86_64")
8provides=("ajclassic-bin")
9conflicts=("ajclassic-bin"
10 "ajceverywhere-bin")
11license=('custom')
12options=('!strip' '!debug')
13source=("index.js::https://raw.githubusercontent.com/themirrazz/grapefruit/refs/heads/main/index.js"
14 "package.json::https://raw.githubusercontent.com/themirrazz/grapefruit/refs/heads/main/package.json"
15 "launcher.sh::https://raw.githubusercontent.com/themirrazz/grapefruit/refs/heads/main/aur/launcher-2.0.sh"
16 "ajclassic-grapefruit.desktop::https://raw.githubusercontent.com/themirrazz/grapefruit/refs/heads/main/aur/grapefruit.desktop"
17 "ajclassic.7z::https://classic-download.animaljam.com/win/aj-classic-1.5.7-ia32.nsis.7z"
18 "gameicon.png::https://cdn2.steamgriddb.com/icon_thumb/69daeea8d60db98c428f11dc980effdc.png"
19 )
20sha256sums=("102600833526e785ab9b3e81191ea0cfb212ae7bc49adb51230cec936278635d"
21 "4654808108b59a68a8855e1d7d50ae000904e62e08d56989517b347544a0a8f6"
22 "74fcedaf5eb785d0dff579424594a86ea6ff623582096e43b6b15ba9ecc75349"
23 "adca639c6f961e66e65525c8803b490338386f734829974c06be6a4cd6e7a138"
24 "c8eb7129c449cec60e8b17252c228cc96eebbf7bc307601061ea72a17248e286"
25 "cee0e7c2a101fe220635ba99c3b993abcac6305d789dbcb1d2476abb0aa85287")
26
27prepare() {
28 mkdir ajclassic-grapefruit
29 mv index.js ajclassic-grapefruit/index.js
30 mv package.json ajclassic-grapefruit/package.json
31 7z e ajclassic.7z resources/app.asar
32 mv app.asar ajclassic-grapefruit/game.asar
33 echo -n "1.5.7" > ajclassic-grapefruit/game-version.lock
34 mkdir bins
35 cp launcher.sh bins/aj-classic
36 cp launcher.sh bins/ajclassic-grapefruit
37 mkdir -p ajclassic-grapefruit/node_modules/rmsandbox
38 mkdir -p ajclassic-grapefruit/node_modules/libdir
39 echo -n "module.exports = true;" > ajclassic-grapefruit/node_modules/rmsandbox/index.js
40 echo -n '{"name":"rmsandbox","version":"1.0.0","description":"","keywords":[],"main":"index.js","type":"commonjs"}' > ajclassic-grapefruit/node_modules/rmsandbox/package.json
41 echo -n 'const path=require("path");module.exports={gameAsar:"/usr/lib/ajclassic-grapefruit/game.asar",gameLock:"/usr/lib/ajclassic-grapefruit/game-version.lock",pepperFlash:"/lib/PepperFlash/libpepflashplayer.so",libinstall:"/usr/lib/ajclassic-grapefruit/libinstall.js",everyUpdater:"/usr/lib/ajclassic-grapefruit/everyUpdater.js",electronUpdater:"/usr/lib/ajclassic-grapefruit/game.asar/node_modules/electron-updater",gameConfig:"/usr/lib/ajclassic-grapefruit/game.asar/config.js",gameEntry:"/usr/lib/ajclassic-grapefruit/game.asar/index.js"};' > ajclassic-grapefruit/node_modules/libdir/libdir.js
42 echo -n '{"name":"libdir","version":"1.0.0","type":"commonjs","main":"libdir.js"}' > ajclassic-grapefruit/node_modules/libdir/package.json
43}
44
45package() {
46 cd bins
47 install -Dm755 -t "$pkgdir/usr/bin" aj-classic
48 install -Dm755 -t "$pkgdir/usr/bin" ajclassic-grapefruit
49 cd ..
50 install -Dm755 -t "$pkgdir/usr/share/applications" ajclassic-grapefruit.desktop
51 mkdir -p "$pkgdir/usr/lib"
52 cd ajclassic-grapefruit
53 install -Dm755 -t "$pkgdir/usr/lib/ajclassic-grapefruit" index.js package.json game.asar game-version.lock
54 cd node_modules/libdir
55 install -Dm755 -t "$pkgdir/usr/lib/ajclassic-grapefruit/node_modules/libdir" libdir.js package.json
56 cd ../rmsandbox
57 install -Dm755 -t "$pkgdir/usr/lib/ajclassic-grapefruit/node_modules/rmsandbox" index.js package.json
58 cd ../../..
59 cp gameicon.png $pkgdir/usr/lib/ajclassic-grapefruit/gameicon.png
60}
61

Scan history

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