Repositorio de reservas defensivas de nombres en PyPI para el ecosistema Blindata.
En 2021, Alex Birsan demostró el ataque conocido como dependency confusion, que afectó a Apple, Microsoft, PayPal, Netflix, Uber, Yelp, Tesla y muchas otras organizaciones.
El vector: si una empresa usa internamente paquetes con nombres que no existen en PyPI público, un atacante puede registrar esos nombres y lograr ejecución remota de código cuando pipelines de deploy los instalan por error desde el índice público.
Este repositorio publica placeholders vacíos en PyPI bajo los nombres que Noesis SpA reserva para su producto Blindata, cerrando ese vector de forma permanente.
Un workflow independiente por paquete. Cada uno de los 9 placeholders tiene:
- Su propio archivo de workflow (
publish-<slug>.yml) - Su propio environment en GitHub (
pypi-<slug>) - Su propia confirmación textual única (
PUBLISH-<slug>) - Su propio Trusted Publisher configurado en PyPI
Esto significa:
- Si un workflow es comprometido, solo un paquete está en riesgo — los demás siguen aislados
- Cada publicación requiere confirmación manual explícita
- Sin tokens de PyPI en ningún lugar — todo vía OIDC efímero
- Auditoría independiente por paquete en los logs de GitHub Actions
| Nombre en PyPI | Slug del workflow | Razón de la reserva |
|---|---|---|
blindata-pro |
blindata-pro |
Nombre esperado del SaaS Pro; el más crítico |
blindata-cl |
blindata-cl |
Variante geográfica de la marca |
blindata_pro |
blindata-pro-underscore |
Variante con underscore (typosquatting) |
blindatapro |
blindatapro |
Variante pegada (typosquatting) |
blindata-community |
blindata-community |
Confusión con Community real |
blindata-starter |
blindata-starter |
Nombre de plan comercial |
blindata-professional |
blindata-professional |
Nombre de plan comercial |
blindata-business |
blindata-business |
Nombre de plan comercial |
blindata-enterprise |
blindata-enterprise |
Nombre de plan comercial |
Cada uno contiene un único módulo Python que, al importarse, lanza NotImplementedError con instrucciones para llegar al paquete correcto:
>>> import blindata_pro
Traceback (most recent call last):
...
NotImplementedError: Este nombre de paquete está reservado por Noesis SpA...Los placeholders:
- No tienen dependencias externas (superficie de ataque mínima)
- No exponen información sobre la arquitectura de los productos reales
- Están marcados como
Development Status :: 7 - Inactive - Usan licencia propietaria (no MIT)
-
Community (open source, gratuito):
pip install blindata
- Documentación: https://github.com/inostroza-Daniela/blindata
- SaaS oficial: https://blindata.cl
La publicación a PyPI se realiza vía Trusted Publishing (OIDC) desde GitHub Actions. No se usan tokens de PyPI en ningún momento — el token es efímero y se genera para cada ejecución del workflow.
Ver .github/workflows/ y SECURITY.md.
Si detectas que uno de estos placeholders fue comprometido, publica código no autorizado, o tienes conocimiento de una variante no cubierta, reporta a: security@blindata.cl
Noesis SpA · Santiago, Chile · blindata.cl