diamond-dragon
Triggered rules
llm_review
The static rules flagged this MEDIUM, but an AI model (anthropic/claude-4.6-sonnet-20260217) reviewed the full PKGBUILD and judged it LOW (confidence 72%): The PKGBUILD downloads PK3 mod files (ZIP-based game data archives, not native executables) from Google Drive using hardcoded file IDs. These files are installed as data assets under /usr/share/doom/ and are only ever loaded by GZDoom at runtime as game content — they are not executed directly by the OS or the package build process. The prepare() step only extracts CREDIT.txt from the archive; no code is compiled or executed from the downloaded content. The real concern is the absence of checksums (files are not in source=() and have no sha256sums), meaning a tampered Google Drive file would not be detected. However, since the files are pure game data (PK3/ZIP containing ZScript, sprites, sounds, maps) rather than native binaries or shared libraries, the impact of a tampered file is limited to GZDoom's scripting sandbox rather than arbitrary OS-level code execution. Google Drive with stable file IDs is a common distribution method for Doom mods. The lack of integrity verification is sloppy and a genuine (if modest) supply-chain concern, but the threat model is significantly lower than an unverified native binary, warranting low rather than medium severity.
1 higher static finding superseded - not the current verdict (shown for transparency)
external_download_not_in_source
curl/wget fetches a URL on a non-allowlisted host that is not part of source=(), so it is not checksum-verified by makepkg.
-
PKGBUILD:35
local page=$(curl -fsSL "https://drive.google.com/uc?export=download&id=${id}")
PKGBUILD
1 offending line(s) highlighted# Maintainer: Yakov Till <yakov.till@gmail.com>
pkgname=diamond-dragon
pkgver=20250707
pkgrel=3
pkgdesc="Catgirl cyberpunk action GZDoom gameplay mod"
arch=('any')
url="https://www.doomworld.com/forum/topic/153613-diamond-dragon-catgirl-cyberpunk-action-updated-7725/"
license=('custom')
depends=()
optdepends=('gzdoom: GZDoom source port'
'uzdoom-bin: UZDoom fork of GZDoom')
makedepends=('curl')
# Google Drive file IDs
_gdrive_main="1WgEfXcawz38fKKag1ADZdf-OCocWFmDb" # DiamondDragon.pk3
_gdrive_augzen="1zGOJmaAjPBOVCDwFXxHe3sQJzJWBtE16" # AugZen Addon.pk3
_gdrive_hacx="1FLWE-HtaNX1cZv7JT_nhwArJMBeOMvar" # Hacx2.0 Addon.pk3
_gdrive_neonover="1bGV0IZgL57eW8bgaAotXArKKn_ETf6LU" # NeonOver Addon.pk3
latestver() {
local _page
_page=$(curl -fsSL \
-A "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" \
"$url")
python3 -c 'import re, sys
m = re.search(r"Updated ([0-9]{1,2})/([0-9]{1,2})/([0-9]{2})", sys.stdin.read())
if not m:
raise SystemExit(1)
month, day, year = map(int, m.groups())
print(f"20{year:02d}{month:02d}{day:02d}")' <<< "$_page"
}
_gdrive_fetch() {
local id=$1 output=$2
local page=$(curl -fsSL "https://drive.google.com/uc?export=download&id=${id}")
if echo "$page" | grep -q 'download-form'; then
local uuid=$(echo "$page" | grep -oP 'name="uuid" value="\K[^"]+')
[[ -z "$uuid" ]] && { echo "Failed to extract uuid for $output"; return 1; }
curl -fL --progress-bar -o "$output" \
"https://drive.usercontent.google.com/download?id=${id}&export=download&confirm=t&uuid=${uuid}"
else
echo "$page" > "$output"
fi
}
prepare() {
_gdrive_fetch "$_gdrive_main" "DiamondDragon.pk3"
_gdrive_fetch "$_gdrive_augzen" "AugZen-Addon.pk3"
_gdrive_fetch "$_gdrive_hacx" "Hacx2.0-Addon.pk3"
_gdrive_fetch "$_gdrive_neonover" "NeonOver-Addon.pk3"
# Extract credits as license
bsdtar -xf "DiamondDragon.pk3" CREDIT.txt
}
package() {
install -Dm644 DiamondDragon.pk3 "$pkgdir/usr/share/doom/diamond-dragon/DiamondDragon.pk3"
install -Dm644 AugZen-Addon.pk3 "$pkgdir/usr/share/doom/diamond-dragon/addons/AugZen-Addon.pk3"
install -Dm644 Hacx2.0-Addon.pk3 "$pkgdir/usr/share/doom/diamond-dragon/addons/Hacx2.0-Addon.pk3"
install -Dm644 NeonOver-Addon.pk3 "$pkgdir/usr/share/doom/diamond-dragon/addons/NeonOver-Addon.pk3"
install -Dm644 CREDIT.txt "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-08-03 00:08:14 | LOW | 2 |
| 2026-08-02 00:16:08 | LOW | 2 |
| 2026-08-01 00:11:18 | LOW | 2 |
| 2026-07-31 00:14:10 | LOW | 2 |
| 2026-07-30 00:17:23 | LOW | 2 |
| 2026-07-29 00:25:53 | LOW | 2 |
| 2026-07-28 00:07:28 | LOW | 2 |
| 2026-07-27 00:24:32 | LOW | 2 |
| 2026-07-26 00:07:32 | LOW | 2 |
| 2026-07-25 00:13:44 | LOW | 2 |
| 2026-07-24 00:02:28 | LOW | 2 |
| 2026-07-23 00:14:47 | LOW | 2 |
| 2026-07-22 00:29:32 | LOW | 2 |
| 2026-07-21 00:24:15 | LOW | 2 |
| 2026-07-20 00:19:49 | LOW | 2 |
| 2026-07-19 00:17:08 | LOW | 2 |
| 2026-07-18 00:14:48 | LOW | 2 |
| 2026-07-17 00:06:16 | LOW | 2 |
| 2026-07-16 00:05:41 | LOW | 2 |
| 2026-07-15 00:09:25 | LOW | 2 |