owasp-threat-dragon
The npx command runs electron-builder on the locally checked-out project source, which is a standard and safe build practice; the tool is not executing arbitrary remote code.
Triggered rules
llm_review
The static rules flagged this MEDIUM, but an AI model (qwen/qwen3-235b-a22b-07-25) reviewed the full PKGBUILD and judged it LOW (confidence 95%): The npx command runs electron-builder on the locally checked-out project source, which is a standard and safe build practice; the tool is not executing arbitrary remote code.
1 higher static finding superseded - not the current verdict (shown for transparency)
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:58
npx electron-builder build --linux --dir \
PKGBUILD
1 offending line(s) highlighted# PKGBUILD
# Maintainer: Max Ulidtko <ulidtko@gmail.com>
pkgname=owasp-threat-dragon
pkgver=v1.2
pkgrel=3
pkgdesc="Electron Threat Modelling and diagramming tool by Mike Goodwin @ OWASP"
arch=('any')
url="https://threatdragon.org"
license=('Apache-2.0')
groups=()
depends=('electron5')
optdepends=('hunspell-en_US: spell checking')
makedepends=('git' 'npm' 'jq')
provides=("${pkgname%-git}")
conflicts=("${pkgname%-git}")
replaces=()
backup=()
options=()
install=
source=("${pkgname}::git+https://github.com/mike-goodwin/${pkgname}-desktop/#tag=${pkgver}"
threat-dragon
threat-dragon.desktop
relax-coverage-thresholds.patch
)
sha256sums=('SKIP'
'822d2385b2e781d105396ca2dea44990b65cbe2919b6c6afde67522be1ffcaab'
'ff6ea4a92aa33fe163e0618f89f334cbe8fee87e474baf769d2e921bc218b350'
'90e4d6d754d2cecc70cec11375e692ffd5e27cc310f269967dcb5c1df1f015e1')
pkgver() {
cd "$srcdir/${pkgname}"
git describe --tags
}
prepare() {
cd "$srcdir/${pkgname}"
patch -p1 -i "$srcdir/relax-coverage-thresholds.patch"
}
prune_absolute_paths() {
# somehow, sshpk package hardcodes absolute paths into its package.json
for module in sshpk; do
local target="node_modules/${module}/package.json"
jq 'del(.man)' "$target" >tmp.json
mv tmp.json "$target"
done
}
build() {
cd "$srcdir/${pkgname}"
npm install --no-audit --no-progress --no-fund
npm install --no-audit --no-progress --no-fund \
electron@"$(</usr/lib/electron5/version)"
prune_absolute_paths
npm run-script pretest
npm run-script build-content
npx electron-builder build --linux --dir \
--config electron-builder.json \
-c.electronDist=/usr/lib/electron5 \
-c.electronVersion="$(</usr/lib/electron5/version)"
}
check() {
cd "$srcdir/${pkgname}"
npm test
rm -rf coverage
}
package() {
install -Dm755 -t "${pkgdir}/usr/bin" "threat-dragon"
install -Dm644 -t "${pkgdir}/usr/share/applications" "threat-dragon.desktop"
install -Dm644 -t "${pkgdir}/usr/share/licenses/${pkgname}" "${pkgname}"/LICENSE.txt
cd "${pkgname}"
install -Dm644 "installers/linux-unpacked/resources/app.asar" "${pkgdir}/usr/share/${pkgname}.asar"
cd content/icons/png
for res in *x*.png; do
install -Dm644 "$res" \
"$pkgdir/usr/share/icons/hicolor/${res%.png}/apps/$pkgname.png"
done
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 2026-09-17 00:27:14 | Low | 2 |
| 2026-09-16 00:03:17 | Low | 2 |
| 2026-09-15 00:25:31 | Low | 2 |
| 2026-09-14 00:27:57 | Low | 2 |
| 2026-09-13 00:19:54 | Low | 2 |
| 2026-09-12 00:25:17 | Low | 2 |
| 2026-09-11 00:19:22 | Low | 2 |
| 2026-09-10 00:22:44 | Low | 2 |
| 2026-09-09 00:04:09 | Low | 2 |
| 2026-09-08 00:18:08 | Low | 2 |
| 2026-09-07 00:30:15 | Low | 2 |
| 2026-09-06 00:17:06 | Low | 2 |
| 2026-09-05 00:16:27 | Low | 2 |
| 2026-09-04 00:03:13 | Low | 2 |
| 2026-09-03 00:15:47 | Low | 2 |
| 2026-09-02 00:02:31 | Low | 2 |
| 2026-09-01 00:11:19 | Low | 2 |
| 2026-08-31 00:19:57 | Low | 2 |
| 2026-08-30 00:04:14 | Low | 2 |
| 2026-08-29 00:29:17 | Low | 2 |