koishipro-bin
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:18
source=("https://cdn02.moecube.com:444/koishipro/archive/KoishiPro-master-linux-zh-CN.tar.gz")
llm_review
An AI model (anthropic/claude-4.6-sonnet-20260217) reviewed this and agrees it is MEDIUM (confidence 72%): This PKGBUILD downloads and installs a prebuilt binary tarball (containing executables: 'bot' and 'ygopro') from cdn02.moecube.com:444, which is a CDN operated by Moecube (a Chinese gaming community), not the official upstream project host (koishi.pro). The tarball is extracted directly into /opt and wrapper scripts are created to execute the binaries. A sha256 checksum is present, which mitigates substitution attacks somewhat, but the source is a mutable URL (no version pinning beyond 'master') pointing to a non-official CDN. The pkgver is 'Desire' (a codename) and the source URL contains 'master', meaning the tarball content could change while the checksum remains stale if the maintainer doesn't update it. The core concern is that prebuilt binaries from a third-party CDN (not the project's own release infrastructure) are being installed and executed — this is a genuine supply-chain risk pattern. However, there is no evidence of active malice, obfuscation, or exfiltration; it appears to be a legitimate but non-ideal packaging of a YGOPro derivative game.
PKGBUILD
1 offending line(s) highlighted# Maintainer: taotieren <admin@taotieren.com>
pkgname=koishipro-bin
pkgver=Desire
pkgrel=1
pkgdesc="KoishiPro 是一个 YGOPro 的衍生项目。KoishiPro 比 YGOPro 具有更多的扩展功能和游戏体验。"
arch=('any')
url="https://koishi.pro/"
license=('GPL2')
provides=(${pkgname})
conflicts=(${pkgname} ${pkgname%-bin} ${pkgname}-git ygopro ygopro-bin)
#replaces=(${pkgname})
depends=('mono')
makedepends=('libarchive')
backup=(opt/${pkgname%-bin}/system.conf)
options=('!strip')
#install=${pkgname}.install
source=("https://cdn02.moecube.com:444/koishipro/archive/KoishiPro-master-linux-zh-CN.tar.gz")
sha256sums=('3334bf21d0a981ee4eceb94c8cf9a8385db09ac649ca2a06cf9c62cedd482976')
noextract=(KoishiPro-master-linux-zh-CN.tar.gz)
package() {
install -dm0755 "${pkgdir}/opt/${pkgname%-bin}" \
"${pkgdir}/usr/share/pixmaps/" \
"${pkgdir}/usr/share/applications/" \
"${pkgdir}/usr/share/licenses/${pkgname%-bin}/"
_pkg=ygopro
bsdtar xf "${srcdir}/KoishiPro-master-linux-zh-CN.tar.gz" -C "${pkgdir}/opt/${pkgname%-bin}"
install -Dm0755 /dev/stdin "${pkgdir}/usr/bin/${pkgname%-bin}" << EOF
#!/bin/sh
/opt/${pkgname%-bin}/bot "\$@"
EOF
install -Dm0755 /dev/stdin "${pkgdir}/usr/bin/${_pkg}" << EOF
#!/bin/sh
/opt/${pkgname%-bin}/${_pkg} "\$@"
EOF
install -Dm0644 /dev/stdin "${pkgdir}/opt/${pkgname%-bin}/${pkgname%-bin}.desktop" << EOF
[Desktop Entry]
Name=KoishiPro
Name[en_US]=KoishiPro
Categories=Game
Exec=${pkgname%-bin} %U
Terminal=false
Type=Application
Icon=${pkgname%-bin}.png
Encoding=UTF-8
Hidden=false
StartupNotify=false
Comment=KoishiPro
Comment[zh_CN]=KoishiPro
EOF
install -Dm0644 /dev/stdin "${pkgdir}/opt/${pkgname%-bin}/${_pkg}.desktop" << EOF
[Desktop Entry]
Name=YGOPro
Name[en_US]=YGOPro
Categories=Game
Exec=${_pkg} %U
Terminal=false
Type=Application
Icon=${_pkg}.png
Encoding=UTF-8
Hidden=false
StartupNotify=false
Comment=YGOPro
Comment[zh_CN]=YGOPro
EOF
ln -sf "/opt/${pkgname%-bin}/${pkgname%-bin}.desktop" "${pkgdir}/usr/share/applications/${pkgname%-bin}.desktop"
ln -sf "/opt/${pkgname%-bin}/${_pkg}.desktop" "${pkgdir}/usr/share/applications/${_pkg}.desktop"
ln -sf "/opt/${pkgname%-bin}/${pkgname%-bin}.png" "${pkgdir}/usr/share/pixmaps/${pkgname%-bin}.png"
ln -sf "/opt/${pkgname%-bin}/${_pkg}.png" "${pkgdir}/usr/share/pixmaps/${_pkg}.png"
ln -sf "/opt/${pkgname%-bin}/LICENSE" "${pkgdir}/usr/share/licenses/${pkgname%-bin}/LICENSE"
}
Scan history
| Scanned at (UTC) | Severity | Rules |
|---|---|---|
| 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 |