savestate

maintainer mambuco · 1 votes · scanned 2026-08-03 00:08:14.047287
MEDIUM
View on AUR ↗
Why flagged The PKGBUILD uses PyInstaller to bundle a Python application into a single binary, which is a legitimate packaging approach. However, there are genuine supply-chain concerns: (1) The .spec file is pulled from the HEAD of the main branch (not pinned to the tagged release), meaning it can change at any time without the sha256sum catching it — though it does have a checksum, that checksum will become stale if the branch HEAD changes. (2) pip install -r requirements.txt inside a venv installs PyPI packages whose versions are not pinned in the PKGBUILD itself; the requirements.patch modifies requirements.txt but we cannot see what it does. If requirements.txt lacks pinned versions, arbitrary PyPI package versions could be installed at build time and bundled into the final binary. (3) The final installed artifact is a PyInstaller-bundled binary (dist/SaveState) that contains all bundled Python dependencies — users get an opaque binary rather than inspectable Python code. These are real supply-chain concerns (unpinned transitive dependencies from PyPI bundled into an executed binary, plus a floating branch reference for the spec file), consistent with a MEDIUM rating. There is no evidence of active malice or obfuscation.

Triggered rules

MEDIUM pip install of an external package pip_install_external

`pip install <package>` fetches an unpinned package from PyPI at build time, outside source=() and makepkg's checksums.

  • PKGBUILD:61 pip install -r requirements.txt
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 uses PyInstaller to bundle a Python application into a single binary, which is a legitimate packaging approach. However, there are genuine supply-chain concerns: (1) The .spec file is pulled from the HEAD of the main branch (not pinned to the tagged release), meaning it can change at any time without the sha256sum catching it — though it does have a checksum, that checksum will become stale if the branch HEAD changes. (2) pip install -r requirements.txt inside a venv installs PyPI packages whose versions are not pinned in the PKGBUILD itself; the requirements.patch modifies requirements.txt but we cannot see what it does. If requirements.txt lacks pinned versions, arbitrary PyPI package versions could be installed at build time and bundled into the final binary. (3) The final installed artifact is a PyInstaller-bundled binary (dist/SaveState) that contains all bundled Python dependencies — users get an opaque binary rather than inspectable Python code. These are real supply-chain concerns (unpinned transitive dependencies from PyPI bundled into an executed binary, plus a floating branch reference for the spec file), consistent with a MEDIUM rating. There is no evidence of active malice or obfuscation.

PKGBUILD

1 offending line(s) highlighted
1# Maintainer: Mambuco <gabriele.giambrone@icloud.com>
2pkgname=savestate
3pkgver=2.4B
4pkgrel=1
5epoch=
6pkgdesc="A versatile game save backup manager, featuring Steam detection, Minecraft support, drag & drop, desktop shortcuts and emulator compatible."
7arch=('x86_64')
8url="https://github.com/Matteo842/SaveState"
9license=('GPL-3.0-only')
10groups=()
11depends=('glibc' 'zlib')
12makedepends=('gendesk' 'python>=3.3' 'tk' 'pyside6' 'python-requests' 'python-psutil')
13checkdepends=()
14optdepends=()
15provides=(savestate)
16conflicts=(savestate)
17replaces=()
18backup=()
19options=()
20install=
21changelog=
22source=(
23 "$pkgname-$pkgver.tar.gz::https://github.com/Matteo842/SaveState/archive/refs/tags/v$pkgver.tar.gz"
24 "SaveState.png::https://github.com/Matteo842/SaveState/blob/v$pkgver/icon.png?raw=true"
25 "SaveState-OneFile-Linux.spec::https://github.com/Matteo842/SaveState/raw/refs/heads/main/SaveState-OneFile-Linux.spec"
26 "requirements.patch"
27)
28noextract=()
29sha256sums=(
30 '6af640adf6ce0fc326f29be23a0212072d698c23003baf35a01e18c67c5c7b22'
31 '7f7b294aa10ef51f23dbccd814e2ce507269be889e444f2bf2b1fb5c50dcb15e'
32 'ac19894ca894e119940a48ec62f51f25c8c8623e433f60d52fee8863a0c4fd61'
33 '30e31c8e0e980dbf7726e09e555f1aba339326daf67cc544f230084adf4cea76'
34)
35validpgpkeys=()
36_name="SaveState"
37_categories=('Game;Utility')
38_exec="/usr/bin/SaveState"
39
40prepare() {
41 cd "$srcdir"
42
43 # Generate .desktop file
44 echo "Generating .desktop file..."
45 gendesk --pkgname="$pkgname" --pkgdesc="$pkgdesc" \
46 --categories=$_categories \
47 --name=$_name \
48 --genericname=$_name \
49 --exec=$_exec \
50 --icon=$_name \
51 -f
52
53 cd "$_name-$pkgver"
54
55 patch -p1 -i ../requirements.patch
56
57 python -m venv ./venv
58
59 source ./venv/bin/activate
60
61 pip install -r requirements.txt
62}
63
64build() {
65 cd "$srcdir/$_name-$pkgver"
66
67 source ./venv/bin/activate
68
69 # TODO: Remove on next release
70 cp ../SaveState-OneFile-Linux.spec .
71
72 pyinstaller --clean SaveState-OneFile-Linux.spec
73}
74
75package() {
76 cd "$srcdir"
77
78 install -Dm0755 -t "$pkgdir/usr/share/applications/" "savestate.desktop"
79 install -Dm0755 -t "$pkgdir/usr/share/icons/" "$_name.png"
80
81 install -Dm0755 -t "$pkgdir/usr/bin" "$_name-$pkgver/dist/SaveState"
82}
83

Scan history

Scanned at (UTC)SeverityRules
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

Report a package

Reports go to the AURWatch maintainer (one person) and are read by hand. No login required.

0 / 4000
Your suggestion