Vulnerabilidad Hardcoded Credentials

Qué es la vulnerabilidad Hardcoded Credentials, cómo puede comprometer una aplicación y cómo evitarla usando variables de entorno y gestores de secretos.
security
OWASP
Python
Published

July 19, 2022

Hardcoded Credentials es un tipo de vulnerabilidad que ocurre cuando una aplicación tiene credenciales (contraseñas, llaves, secretos) expuestas en el código fuente.

¿Qué queremos decir con credenciales expuestas?

Básicamente dicha vulnerabilidad se produce cuando un desarrollador expone claves secretas a personas no autorizadas como hackers o terceros.

Esto puede suceder si:

  • Se han dejado codificadas claves en el código fuente.
  • Se han guardado claves en carpetas accesibles públicamente en el servidor.
  • Se han agregado claves en registros o mensajes de error.

Ejemplo

Supongamos que tenemos el siguiente código, donde codificamos una función que encripta un mensaje antes de enviarlo por la red.

(Se necesita instalar el paquete cryptography: pip install cryptography)

from cryptography.fernet import Fernet

def encrypt_message(message):
    encrypt_key = b'AcG35D4M8iIETaYCj0iVNSwdfOC4og-cZhQQmq6ftWc='

    fernet = Fernet(encrypt_key)
    message_encrypted = fernet.encrypt(message.encode())
    return message_encrypted

print(encrypt_message("datos sensibles"))
# output: b'gAAAAABi1vB8cGhlhZV2R_4_oaVFcNLjVrhBKSOH...'

Si subimos este código a un repositorio remoto y un desarrollador malintencionado logra acceder al código fuente, va a poder desencriptar los mensajes porque la clave se encuentra visible.

¿Qué podemos hacer para evitar exponer claves?

  • Guardar las claves en variables de entorno del sistema.
  • Usar un servicio de almacenamiento seguro de claves tipo AWS Secrets Manager.

Volviendo a nuestro ejemplo, podríamos modificarlo de la siguiente forma:

import os

def encrypt_message(message):
    encrypt_key = os.environ['ENCRYPT_KEY']
    ...

De esta forma, si nuestro código fuente cae en manos equivocadas no van a poder acceder a nuestra clave a menos que puedan acceder a la instancia donde se está ejecutando el programa.

Referencias