mrupdater
The package downloads a prebuilt AppImage (executable binary) from an AWS S3 bucket (s3.us-east-1.amazonaws.com/updates.modretro.com) that is operated by ModRetro, the upstream vendor. The AppImage is then executed during the build phase (chmod +x + run with --appimage-extract) and installed as /usr/bin/mrupdater. A sha256 checksum is present, which mitigates substitution attacks at the point of download, but the host is an S3 bucket rather than a canonical VCS release (e.g. GitHub Releases), meaning the object could be silently replaced by whoever controls the bucket without a tag/release audit trail. The license is listed as 'unknown', and the binary is closed-source with no source build. This is a real supply-chain concern (prebuilt closed-source binary from a cloud storage bucket, executed at install time) but there is no evidence of active malice, making MEDIUM the appropriate rating.
Triggered rules
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:11
'mrupdater.zip::https://s3.us-east-1.amazonaws.com/updates.modretro.com/apps/MRUpdater-linux-x86_64.zip'
llm_review
An AI model (anthropic/claude-4.6-sonnet-20260217) reviewed this and agrees it is MEDIUM (confidence 72%): The package downloads a prebuilt AppImage (executable binary) from an AWS S3 bucket (s3.us-east-1.amazonaws.com/updates.modretro.com) that is operated by ModRetro, the upstream vendor. The AppImage is then executed during the build phase (chmod +x + run with --appimage-extract) and installed as /usr/bin/mrupdater. A sha256 checksum is present, which mitigates substitution attacks at the point of download, but the host is an S3 bucket rather than a canonical VCS release (e.g. GitHub Releases), meaning the object could be silently replaced by whoever controls the bucket without a tag/release audit trail. The license is listed as 'unknown', and the binary is closed-source with no source build. This is a real supply-chain concern (prebuilt closed-source binary from a cloud storage bucket, executed at install time) but there is no evidence of active malice, making MEDIUM the appropriate rating.
PKGBUILD
1 offending line(s) highlighted# Maintainer: Leonie Ain <me@koyu.space>
pkgname=mrupdater
pkgver=1.7.0
pkgrel=2
pkgdesc="ModRetro's official tool for updating your Chromatic firmware"
arch=('x86_64')
url="https://modretro.com"
license=('unknown')
depends=('fuse2' 'zlib')
source=(
'mrupdater.zip::https://s3.us-east-1.amazonaws.com/updates.modretro.com/apps/MRUpdater-linux-x86_64.zip'
'mrupdater.desktop'
'99-modretro.rules'
)
sha256sums=('4eaffc24ad54a63ab983ae03278f3cc011c41356f17cb63cc1c6e1d6cc193551'
'd9f9ed521e6b1fa7a1ed29706ecd9c82e0fab325d569e0b23bc602da2723c20c'
'850c99f36f919d337070a22d8d0b711f85d140d0e7e744cc9545d52d8a51de32')
options=('!strip')
package() {
cd "$srcdir"
# Find the AppImage file
appimage=$(find . -name "*.AppImage" -type f | head -n 1)
if [ -z "$appimage" ]; then
error "No AppImage found in the archive"
return 1
fi
# Extract icon from AppImage
chmod +x "$appimage"
"$appimage" --appimage-extract >/dev/null 2>&1 || true
# Find and install icon
if [ -d "squashfs-root" ]; then
# Look for icon files
icon=$(find squashfs-root -name "*.png" -o -name "*.svg" | grep -i icon | head -n 1)
if [ -n "$icon" ]; then
iconext="${icon##*.}"
install -Dm644 "$icon" "$pkgdir/usr/share/pixmaps/mrupdater.$iconext"
fi
fi
# Install the AppImage
install -Dm755 "$appimage" "$pkgdir/usr/bin/mrupdater"
# Install desktop entry from srcdir
install -Dm644 "$srcdir/mrupdater.desktop" "$pkgdir/usr/share/applications/mrupdater.desktop"
# Install udev rules
install -Dm644 "$srcdir/99-modretro.rules" "$pkgdir/etc/udev/rules.d/99-modretro.rules"
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 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 |