rubrika
Triggered rules
pip_install_external
`pip install <package>` fetches an unpinned package from PyPI at build time, outside source=() and makepkg's checksums.
-
PKGBUILD:59
pip install pyhanko --target="${VENDOR_DIR}" --quiet
llm_review
An AI model (anthropic/claude-4.6-sonnet-20260217) reviewed this and agrees it is MEDIUM (confidence 82%): The wrapper script installed at /usr/bin/rubrika contains a runtime `pip install pyhanko --target=...` call that fetches and executes code from PyPI at first run. While pyhanko is listed as a proper AUR dependency ('python-pyhanko'), the wrapper bypasses that dependency entirely and falls back to pip if the import fails. This means: (1) the pip install is not integrity-checked (no hash pinning), (2) it installs into a user-writable directory (~/.local/share/rubrika/vendor) which is prepended to PYTHONPATH, allowing a compromised or typosquatted PyPI package to execute arbitrary code, and (3) the version installed by pip may differ from what the AUR package declares. The redundancy with the declared AUR dependency is confusing and the fallback path is the real concern — it is a genuine supply-chain risk (unverified code execution from an external package index at runtime), not merely sloppy packaging. This matches the MEDIUM classification.
PKGBUILD
1 offending line(s) highlighted# rubrika — Firma digital de PDFs con DNIe
# https://github.com/vrieraj/rubrika
pkgname=rubrika
pkgver=1.0.1
pkgrel=1
pkgdesc="Firma digital de PDFs con DNIe o certificado .p12 — interfaz nativa KDE"
arch=('any')
url='https://github.com/vrieraj/rubrika'
license=('GPL3')
depends=(
# ── Sistema ──────────────────────────────────────────────────────────────
'opensc' # librería PKCS#11 para DNIe (/usr/lib/opensc-pkcs11.so)
'ccid' # driver para lectores de tarjeta USB
'pcsclite' # demonio PC/SC para comunicación con el lector
# ── Certificados (nuestro paquete) ────────────────────────────────────────
'rubrika-certificates'
# ── Python — repos oficiales ──────────────────────────────────────────────
'python'
'python-pymupdf' # renderizado de páginas PDF como imágenes
'python-python-pkcs11' # interfaz PKCS#11 para el DNIe
'python-pillow' # procesado de imagen para la rúbrica
'pyside6' # interfaz gráfica nativa Qt/KDE
'python-asn1crypto' # extracción del nombre del certificado X.509
'python-numpy' # conversión de pixels en la rúbrica
# ── Python — AUR ──────────────────────────────────────────────────────────
'python-pyhanko' # motor de firma PDF/PAdES
# python-pyhanko-certvalidator se instala como dependencia de python-pyhanko
)
optdepends=(
'breeze: tema Breeze nativo de KDE'
'xdg-utils: abrir el PDF firmado desde la aplicación'
)
install=rubrika.install
source=(
"rubrika-${pkgver}.tar.gz::https://github.com/vrieraj/rubrika/archive/refs/tags/v${pkgver}.tar.gz"
)
sha256sums=('b9638d2f39806a9926bf7f1bf8ed0d46ed8aa8b7ad8ce2ac6f47280db97e88dc')
package() {
cd "rubrika-${pkgver}"
# ── Archivos principales ──────────────────────────────────────────────────
install -Dm644 main.py "${pkgdir}/usr/share/rubrika/main.py"
install -Dm644 utils.py "${pkgdir}/usr/share/rubrika/utils.py"
# ── Wrapper ejecutable ────────────────────────────────────────────────────
install -Dm755 /dev/stdin "${pkgdir}/usr/bin/rubrika" << 'EOF'
#!/bin/bash
VENDOR_DIR="${HOME}/.local/share/rubrika/vendor"
mkdir -p "${VENDOR_DIR}"
export PYTHONPATH="${VENDOR_DIR}:${PYTHONPATH}"
if ! python -c "import pyhanko" 2>/dev/null; then
echo "Instalando pyhanko en ${VENDOR_DIR}..."
pip install pyhanko --target="${VENDOR_DIR}" --quiet
fi
exec python /usr/share/rubrika/main.py "$@"
EOF
# ── Entrada en el menú de aplicaciones ───────────────────────────────────
install -Dm644 rubrika.desktop \
"${pkgdir}/usr/share/applications/rubrika.desktop"
# ── Icono ─────────────────────────────────────────────────────────────────
install -Dm644 rubrika.svg \
"${pkgdir}/usr/share/icons/hicolor/scalable/apps/rubrika.svg"
# ── Documentación ─────────────────────────────────────────────────────────
install -Dm644 README.md \
"${pkgdir}/usr/share/doc/rubrika/README.md"
install -Dm644 LICENSE \
"${pkgdir}/usr/share/licenses/rubrika/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 |