¿Por qué es peligroso pickle.loads() con datos de los usuarios?
Opciones
- Es muy lento con objetos grandes en memoria
- Hacer unpickling puede ejecutar código arbitrario en tu servidor (Opción correcta)
- Pierde en silencio la precisión numérica de los valores
- Solo funciona en Python 2 y no en Python 3
Respuesta
Hacer unpickling puede ejecutar código arbitrario (remote code execution)
Por qué
Pickle puede reconstruir cualquier objeto Python, y lo hace ejecutando instrucciones guardadas en los datos. Un pickle malicioso puede decirle a Python que ejecute cualquier comando en tu servidor.
Eso es remote code execution (RCE), el peor tipo de vulnerabilidad.
Para datos no confiables usa JSON más validación de esquema. El mismo riesgo existe con yaml.load sin SafeLoader.
Recuerda
Nunca hagas unpickling de datos no confiables.