Secretos en el Código Fuente - Cómo tu Código JS Expone tus Credenciales

Rate this content
Bookmark

Los secretos como las claves de API están constantemente filtrándose a través del código fuente. El informe Estado de la Propagación de Secretos 2021 encontró más de 6 millones de secretos en repositorios git públicos. Esta presentación revisa el nuevo informe Estado de la Propagación de Secretos 2022, aún no publicado, centrándose en cómo el código fuente de JavaScript específicamente filtra secretos.

11 min
06 Jun, 2023

Video Summary and Transcription

Esta presentación relámpago analiza el problema de la filtración de secretos en el código y cómo puede exponer las credenciales de autenticación digital. GitGuardian escaneó más de 10 millones de secretos en repositorios públicos en GitHub, siendo Python el lenguaje principal para los secretos filtrados. La exposición de secretos puede ocurrir tanto en repositorios públicos como privados, y es importante evitar codificar secretos y almacenar claves de forma segura. Las mejores prácticas para manejar claves y secretos incluyen utilizar un lugar centralizado para almacenar claves, utilizar herramientas como .env para cargar secretos e implementar bóvedas y gestores de secretos.

Available in English

1. Introducción a los Secretos en el Código

Short description:

En esta presentación relámpago, hablaré sobre los secretos dentro del código y cómo tus aplicaciones o tus aplicaciones de React pueden estar filtrando tus secretos. Los secretos son credenciales de autenticación digital que otorgan acceso a servicios y permiten la ingestión y escritura de datos. Nuestras aplicaciones son una colección de diferentes servicios, como Okta para la autenticación, Stripe para el procesamiento de tarjetas de crédito y MongoDB para la gestión de bases de datos. GitHub es una plataforma donde escaneamos código y encontramos una gran cantidad de datos, incluidos secretos, con más de mil millones de confirmaciones realizadas en repositorios públicos.

Mi nombre es Mackenzie. Soy desarrollador y defensor de la seguridad en GitGuardian. Y en esta presentación relámpago, hablaré sobre los secretos dentro del código y cómo tus aplicaciones o tus aplicaciones de React pueden estar filtrando tus secretos.

Un buen lugar para comenzar es entender qué son los secretos. Cuando hablo de secretos, me refiero a credenciales de autenticación digital. Estos suelen ser cosas como tus claves de API, tus pares de credenciales, como tus credenciales de base de datos, certificados de seguridad, cualquier cosa que otorgue acceso a servicios o permita la ingestión o escritura de datos. Realmente, estos son los tesoros más preciados de cualquier organización, porque un atacante irá tras ellos de inmediato cuando obtenga acceso a cualquier cosa, lo que le permita persistir su acceso o moverse lateralmente hacia diferentes sistemas, elevar sus privilegios y hacer todo eso sin ser detectado porque están debidamente autenticados en los servicios.

Para entender cómo usamos los secretos, demos un paso atrás y veamos cómo construimos una aplicación. Ya no construimos monolitos. Nuestras aplicaciones son más o menos una colección de diferentes servicios. Por ejemplo, podemos usar Okta para autenticar a los usuarios en nuestros sistemas. Tal vez estemos usando Stripe para procesar tarjetas de crédito. MongoDB es una base de datos administrada. Así que muy rápidamente, nuestras aplicaciones pueden convertirse en una colección de todos estos diferentes sistemas.

Una de las cosas que hacemos en GitGuardian es escanear código en diferentes lugares para tratar de identificar dónde se encuentran estos secretos. Y lo publicamos en un informe cada año llamado Estado de los Secretos para Todos. Uno de los lugares que escaneamos es github.com. Probablemente estés familiarizado con él. Muchos desarrolladores lo están. De hecho, en 2022, según GitHub, 94 millones de desarrolladores estaban usando GitHub. Y ya hemos superado los 100 millones de desarrolladores. Y el año pasado, solo el año pasado, se realizaron más de mil millones de confirmaciones en repositorios de código público. Solo repositorios de código público. Así que eso es una enorme cantidad dedata. Se crearon 84 millones de nuevos repositorios. Nuevamente, solo públicos. Así que esto es una verdadera avalancha de información. Puedes encontrar cualquier cosa y todo en GitHub en repositorios públicos, incluidos secretos. Así que hay mil millones de confirmaciones.

2. Secretos Detectados en Repositorios Públicos

Short description:

GitGuardian escaneó más de 10 millones de secretos en repositorios públicos en GitHub, incluyendo claves válidas de proveedores de servicios en la nube, sistemas de mensajería, claves de bases de datos y claves de plataformas de control de versiones. Python fue el lenguaje más común para los secretos filtrados, seguido de JavaScript. La práctica común pero insegura de codificar las credenciales en archivos principales como app.js e index.js. Los archivos de configuración para servicios específicos, como Docosaurus, también pueden exponer claves. Los hackers monitorean GitHub en busca de estas credenciales.

GitGuardian escaneó cada uno de ellos el año pasado. Los escaneamos en busca de secretos. De hecho, buscamos casi 400 tipos diferentes de secretos. ¿Y qué encontramos? Encontramos más de 10 millones de secretos detectados en repositorios públicos en GitHub. 10 millones. Esto representa un gran aumento con respecto a años anteriores. El primer año en que publicamos este informe fue en 2020, cuando encontramos 3 millones, y ahora puedes ver la progresión hasta los 10 millones.

En parte, esto se explica por la presencia de más desarrolladores en GitHub, pero también se debe a que cada año utilizamos más y más secretos. Ahora tenemos cosas como Infrastructure as Code, que es el segmento de más rápido crecimiento en GitHub. Ahora gestionamos nuestra infraestructura de forma programática, por lo que necesitamos utilizar secretos para hacerlo. Más secretos significa más secretos filtrados en GitHub. Hay una gran cantidad de información que podemos encontrar en GitHub. Buscamos secretos específicos y los validamos cuando los encontramos. Algunas de las cosas más interesantes que encontramos son, por ejemplo, que el 20% de los secretos que encontramos eran para proveedores de servicios en la nube, como Google Cloud Services o AWS. Y nuevamente, estas son credenciales válidas. Encontramos 2 millones de claves de proveedores de servicios en la nube válidas en lugares públicos de GitHub. Incluso encontramos diferentes cosas como sistemas de mensajería, claves de bases de datos e incluso claves para tu plataforma de control de versiones. Esto significa acceso a tus repositorios privados que has puesto en un repositorio público.

En cuanto a los lenguajes de programación, Python fue el lenguaje más común para los secretos filtrados, pero JavaScript es el segundo lenguaje cuando excluimos los archivos JSON y ENV, que son archivos independientes del lenguaje. Aquí nos estamos enfocando en las extensiones de archivos JavaScript. No es sorprendente que app.js o index.js sean las aplicaciones más comunes. Estos son archivos principales donde los desarrolladores han codificado sus credenciales en el código fuente. Esta es una práctica muy mala, pero no es una sorpresa en general. Sin embargo, podemos encontrar cosas interesantes a medida que revisamos estos datos. Por ejemplo, tenemos archivos de configuración para servicios específicos. Docosaurus es una especie de marco preconfigurado para construir sitios web. Viene con un archivo de configuración. Simplemente puedes reemplazar el texto de ejemplo y poner tus propias claves aquí, y hacer commit de esto en GitHub. Y ahora has expuesto tus claves. ¿Es esto realmente un riesgo de seguridad? ¿Los hackers realmente monitorean GitHub en busca de estas credenciales? La respuesta es sí.

3. Exposición de Secretos en Repositorios

Short description:

Los secretos pueden filtrarse tanto en repositorios públicos como privados. El Grupo Lapsus ha publicado públicamente el código fuente de importantes empresas, demostrando que el código privado no es seguro. El código fuente se encuentra en diversas plataformas, incluyendo las máquinas de los desarrolladores, copias de seguridad, wikis, sistemas de mensajería y repositorios Git. Incluso si no tienes repositorios de código abierto, los secretos nunca deben estar en tu código. Para evitar la exposición, evita codificar los secretos y almacena las claves en el backend en lugar de manejarlas directamente en el frontend.

Muy frecuentemente. Un ejemplo que tuvimos el año pasado fue con Toyota, donde un contratista que trabajaba para Toyota filtró accidentalmente claves públicas, hizo accidentalmente un repositorio privado público, lo que filtró claves a una base de datos que la aplicación móvil de Toyota estaba utilizando, una aplicación móvil llamada T-Connect. Estas son claves que dieron acceso a toda la información de los usuarios que estaban utilizando T-Connect y que estaban expuestas en un repositorio público. Este es solo un ejemplo, pero hay muchos, muchos más ejemplos donde claves reales pertenecientes a organizaciones y con consecuencias reales se han filtrado en lugares públicos.

Pero no solo debes preocuparte por los repositorios públicos. También debes preocuparte por tus repositorios privados. El código fuente que es privado siempre encuentra su camino hacia lugares públicos de forma accidental, o como yo lo llamo, de forma involuntariamente de código abierto. El Grupo Lapsus, por ejemplo, el año pasado publicó públicamente el código fuente de NVIDIA, Samsung, Microsoft y muchos, muchos más. Puedes preguntarte, ¿cómo obtuvieron acceso al código fuente privado? Bueno, hay muchas formas diferentes. El código fuente es un activo muy permeable, lo que significa que se encuentra en todas partes. Está en las máquinas de tus desarrolladores, se hace una copia de seguridad, está en wikis, se comparte a través de sistemas de mensajería y, por supuesto, está en tus repositorios Git. Además, muchas personas tienen acceso a tus repositorios Git. Y sé a ciencia cierta que Lapsus simplemente estaba pagando a empleados para que les otorgaran acceso al código fuente privado público. Por lo tanto, no es tan difícil para un actor de amenazas motivado acceder a tu código fuente privado. Entonces, si crees que estás seguro porque no tienes repositorios de código abierto, no lo estás. Los secretos definitivamente no deben estar en tu código, independientemente de dónde se encuentren.

Entonces, ¿por qué se exponen los secretos? Hay muchas formas diferentes. Tal vez estás cometiendo cosas y estás probando claves, por lo que las has codificado en el código sin darte cuenta de que esas claves estarán en tu historial para siempre. Incluso si haces algo en una rama de desarrollo, codificas credenciales, las eliminas rápidamente más tarde porque solo las estás probando, esas credenciales seguirán estando en tu historial de Git y estarán allí para siempre. Pueden imprimirse en archivos generados automáticamente como registros de depuración. Puedes incluir archivos sensibles en tus repositorios Git, como archivos .env o archivos .pem. Nunca deben estar en tu repositorio, así que asegúrate de usar un archivo .gitignore y también puedes enviar código accidentalmente al lugar equivocado. Entonces, ¿cómo evitas que esto suceda? Bueno, nunca debes codificar los secretos, nunca debes escribir directamente el secreto en tu aplicación. Esa es la regla número uno, no importa si es privado, público o en qué tipo de rama estás trabajando o durante cuánto tiempo esté allí. Estará allí para siempre en Git. También podemos usar herramientas para evitar que se filtren. Por lo tanto, podemos utilizar herramientas que nos permitan hacer esto. Queremos almacenar las claves en el backend. Si estás construyendo una aplicación React y la estás haciendo lucir bonita, queremos asegurarnos de que accedas a tus credenciales a través del backend y que este te pase los datos que necesitas y no los manejes directamente. No hay muchos escenarios en los que realmente necesites manejar esas claves en el frontend.

4. Mejores Prácticas para Manejar Claves y Secretos

Short description:

Almacena las claves en un lugar centralizado como un archivo .env. Utiliza herramientas como .env para JavaScript para cargar secretos en variables de entorno. Utiliza bóvedas y gestores de secretos, rota las claves regularmente y restringe el acceso. Firma las claves sensibles con un hash de la aplicación. Los códigos QR en la pantalla proporcionan más información sobre la gestión de secretos.

Si estás manejando claves, asegúrate de almacenarlas en un lugar centralizado. Por ejemplo, un archivo .env. Solo asegúrate de que este archivo .env se agregue a tu archivo .gitignore para que nunca se incluya en tu repositorio Git. Puedes utilizar excelentes herramientas como .env para JavaScript, que cargarán tus secretos y memoria local desde tu archivo .env en variables de entorno, lo que significa que tu aplicación no los y no será necesario que estén en tus repositorios Git.

Si quieres ir un paso más allá, definitivamente debemos utilizar bóvedas y gestores de secretos. Necesitamos rotar nuestras claves regularmente para que, incluso si una clave se filtra, estés en un programa de rotación para que no sea válida por mucho tiempo, y necesitamos restringir el acceso de la clave. Deberíamos limitarlo solo a los servicios que esperamos, para que si un actor de amenazas lo obtiene, no pueda hacer nada con la clave.

Para cosas sensibles, debemos firmar esas claves con un hash de la aplicación que las está utilizando para asegurarnos de que todo lo que se está utilizando sea solo para fines legítimos. Así que muchas gracias. Hay un par de códigos QR en la pantalla. Uno te llevará al informe del estado de los secretos para 2023, y el otro examinará un modelo de madurez de gestión de secretos de cómo puedes manejar correctamente tus secretos de diversas formas diferentes. Gracias por escuchar. Soy McKenzie, y nos vemos la próxima vez.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Node Congress 2022Node Congress 2022
26 min
It's a Jungle Out There: What's Really Going on Inside Your Node_Modules Folder
Top Content
Do you know what’s really going on in your node_modules folder? Software supply chain attacks have exploded over the past 12 months and they’re only accelerating in 2022 and beyond. We’ll dive into examples of recent supply chain attacks and what concrete steps you can take to protect your team from this emerging threat.
You can check the slides for Feross' talk here.
JSNation 2023JSNation 2023
30 min
The State of Passwordless Auth on the Web
Can we get rid of passwords yet? They make for a poor user experience and users are notoriously bad with them. The advent of WebAuthn has brought a passwordless world closer, but where do we really stand?
In this talk we'll explore the current user experience of WebAuthn and the requirements a user has to fulfill for them to authenticate without a password. We'll also explore the fallbacks and safeguards we can use to make the password experience better and more secure. By the end of the session you'll have a vision for how authentication could look in the future and a blueprint for how to build the best auth experience today.
React Advanced Conference 2021React Advanced Conference 2021
22 min
Let Me Show You How React Applications Get Hacked in the Real-World
Top Content
Modern frontend frameworks like React are well thought-of in their application security design and that’s great. However, there is still plenty of room for developers to make mistakes and use insecure APIs, vulnerable components, or generally do the wrong thing that turns user input into a Cross-site Scripting vulnerability (XSS). Let me show you how React applications get hacked in the real-world.
JSNation 2023JSNation 2023
22 min
5 Ways You Could Have Hacked Node.js
All languages are or were vulnerable to some kind of threat. I’m part of the Node.js Security team and during the year 2022, we've performed many Security Releases and some of them were really hard to think about.
Did you know you can make money by finding critical vulnerabilities in Node.js? In this talk, I’ll show you 5 ways you can have hacked Node.js and how the Node.js team deals with vulnerabilities.
JSNation Live 2021JSNation Live 2021
9 min
Securing Node.js APIs with Decentralised Identity Tokens
Authentication and Authorization are serious problems. We often dedicate a lot of time to craft powerful APIs but overlook proper security measures. Let's solve it with Magic using a key-based identity solution built on top of DID standard, where users’ identities are self-sovereign leveraging blockchain public-private key pairs. In this talk, we’ll look at proper ways to secure our Node.js APIs with Decentralised Identity Tokens. We’ll go from learning what Decentralised Identity standards are, how the users’ identities are self-sovereign leveraging blockchain public-private key pairs, why they’re the future of API security, and to put theory into practice we will build a real-world implementation using Node.js where I’ll show common best practices.

Workshops on related topic

React Summit 2023React Summit 2023
56 min
0 to Auth in an hour with ReactJS
WorkshopFree
Passwordless authentication may seem complex, but it is simple to add it to any app using the right tool. There are multiple alternatives that are much better than passwords to identify and authenticate your users - including SSO, SAML, OAuth, Magic Links, One-Time Passwords, and Authenticator Apps.
While addressing security aspects and avoiding common pitfalls, we will enhance a full-stack JS application (Node.js backend + React frontend) to authenticate users with OAuth (social login) and One Time Passwords (email), including:- User authentication - Managing user interactions, returning session / refresh JWTs- Session management and validation - Storing the session securely for subsequent client requests, validating / refreshing sessions- Basic Authorization - extracting and validating claims from the session token JWT and handling authorization in backend flows
At the end of the workshop, we will also touch other approaches of authentication implementation with Descope - using frontend or backend SDKs.
JSNation 2022JSNation 2022
99 min
Finding, Hacking and fixing your NodeJS Vulnerabilities with Snyk
WorkshopFree
npm and security, how much do you know about your dependencies?Hack-along, live hacking of a vulnerable Node app https://github.com/snyk-labs/nodejs-goof, Vulnerabilities from both Open source and written code. Encouraged to download the application and hack along with us.Fixing the issues and an introduction to Snyk with a demo.Open questions.
DevOps.js Conf 2022DevOps.js Conf 2022
76 min
Bring Code Quality and Security to your CI/CD pipeline
WorkshopFree
In this workshop we will go through all the aspects and stages when integrating your project into Code Quality and Security Ecosystem. We will take a simple web-application as a starting point and create a CI pipeline triggering code quality monitoring for it. We will do a full development cycle starting from coding in the IDE and opening a Pull Request and I will show you how you can control the quality at those stages. At the end of the workshop you will be ready to enable such integration for your own projects.
TestJS Summit 2021TestJS Summit 2021
111 min
JS Security Testing Automation for Developers on Every Build
WorkshopFree
As a developer, you need to deliver fast, and you simply don't have the time to constantly think about security. Still, if something goes wrong it's your job to fix it, but security testing blocks your automation, creates bottlenecks and just delays releases...but it doesn't have to...

NeuraLegion's developer-first Dynamic Application Security Testing (DAST) scanner enables developers to detect, prioritise and remediate security issues EARLY, on every commit, with NO false positives/alerts, without slowing you down.

Join this workshop to learn different ways developers can access Nexploit & start scanning without leaving the terminal!

We will be going through the set up end-to-end, whilst setting up a pipeline, running security tests and looking at the results.

Table of contents:
- What developer-first DAST (Dynamic Application Security Testing) actually is and how it works
- See where and how a modern, accurate dev-first DAST fits in the CI/CD
- Integrate NeuraLegion's Nexploit scanner with GitHub Actions
- Understand how modern applications, APIs and authentication mechanisms can be tested
- Fork a repo, set up a pipeline, run security tests and look at the results
DevOps.js Conf 2022DevOps.js Conf 2022
32 min
Passwordless Auth to Servers: hands on with ASA
WorkshopFree
These days, you don't need a separate password for every website you log into. Yet thanks to tech debt and tradition, many DevOps professionals are still wrangling a host of SSH keys to access the servers where we sometimes need to be. With modern OAuth, a single login and second factor to prove your identity are enough to securely get you into every service that you're authorized to access. What if SSHing into servers was that easy? In this workshop, we'll use Okta's Advanced Server Access tool (formerly ScaleFT) to experience one way that the dream of sending SSH keys the way of the password has been realized.
- we'll discuss how ASA works and when it's the right tool for the job- we'll walk through setting up a free trial Okta account to use ASA from, and configuring the ASA gateway and server on Linux servers- we'll then SSH into our hosts with the ASA clients without needing to supply an SSH key from our laptops- we'll review the audit logs of our SSH sessions to examine what commands were run