Problema
- Anoche, mientras exploraba el contenido de la base de datos de checksums de Go, encontré un resultado interesante.
- Al ejecutar el comando
sqlite> select path, count(path) from modules group by path order by count(path) desc;, el resultado fue:
github.com/homebrew/homebrew-core|39438
github.com/Homebrew/homebrew-core|30896
github.com/concourse/concourse|25372
github.com/openshift/release|24065
github.com/cilium/cilium|22138
- Se sabe que Homebrew usa Ruby, así que su conexión con Go resultaba extraña.
- Las estadísticas de lenguaje de GitHub también lo confirmaban.
- Cloné el repositorio para buscar archivos relacionados con Go (
go.mod o archivos fuente de Go), pero no encontré nada.
Investigación
- Comenzó un nuevo día y la curiosidad exigía una respuesta.
- Si el repositorio Git no estaba relacionado con código Go, surgía la duda de cómo aparecía en la base de datos de checksums de Go.
- Descubrí que
proxy.golang.org es el proxy de módulos predeterminado y que sum.golang.org es la base de datos de checksums.
- Al leer la documentación de Go, entendí que, si una versión de un módulo aún no está registrada en el log, la base de datos de checksums intenta obtener el módulo desde el servidor de origen.
- Para verificar si un nuevo repositorio de módulos Go se agregaba a la base de datos de checksums y al proxy, probé el endpoint
lookup.
- Después de crear un nuevo módulo Go y subirlo a mi cuenta de GitHub, intenté el comando
lookup en dos formatos, pero ambos devolvieron error.
- Generé la pseudoversión correcta y volví a consultar la base de datos de checksums para verificar si el módulo había sido descargado.
- Consulté el proxy y descargué el
zip del módulo, demostrando que es posible almacenar datos arbitrarios en la infraestructura de Go.
Posibilidades de abuso
- Podría usarse para evadir restricciones de descarga en máquinas de desarrolladores y servidores de CI/CD.
- Un malware podría almacenar su payload y recuperarlo del proxy cuando lo necesite.
- Podría ser posible realizar un ataque de denegación de servicio (DoS) contra
proxy.golang.org.
- Se puede implementar fácilmente un sistema de comando y control (C2).
Conclusión
- Ahora entiendo cómo funciona el proceso de la base de datos de checksums.
- Por ahora no parece ser un problema grave en la infraestructura de Go, pero existe potencial de abuso.
- Quedan más preguntas sobre por qué hay proyectos no relacionados con Go dentro de la base de datos.
- Esta investigación me dio muchas ideas y planeo seguir explorándolas.
Opinión de GN⁺
- Vulnerabilidad de seguridad: Este artículo señala una vulnerabilidad de seguridad en la base de datos de checksums de Go, que permite almacenar datos arbitrarios. Esto podría abrir una vía para distribuir malware con facilidad.
- Necesidad de mejoras: Es necesario mejorar el control de acceso de la base de datos de checksums y de los servidores proxy para reforzar la seguridad y la integridad de la infraestructura de Go.
- Integración con otros lenguajes: Hace falta aclarar por qué proyectos no relacionados con Go están incluidos en la base de datos de checksums, y se necesitan procedimientos de verificación adicionales para evitarlo.
- Capacitación para desarrolladores: Es importante capacitar a los desarrolladores para que reconozcan estas vulnerabilidades de seguridad y comprendan las mejores prácticas para prevenirlas.
- Soluciones alternativas: Se pueden comparar bases de datos de checksums y servidores proxy de otros lenguajes que ofrecen funciones similares, y usarlos como referencia para mejorar la infraestructura de Go.
1 comentarios
Opiniones de Hacker News
Resumen de comentarios de Hacker News
Posibilidad de abuso de los servicios en línea
Problema de alojamiento de archivos en Google
Comparación con GitHub
Proyectos no escritos en Python en PyPI
Proxy de Golang y registro de checksums
sumdb.Exploración de dominios
Problema conocido
Sistema de módulos de CUE
Problema de caché web
Cache-Control: max-ageoVary: Cookie, o si demasiados ISP están pagando costos de tránsito.Problema de caché proxy