¿Cargar de forma segura un archivo pickle?

4

En nuestra aplicación de Python, estamos usando pickle.load para cargar un archivo llamado perceptron.pkl . Un análisis estático de HP Fortify genera una gran vulnerabilidad, "Evaluación de código dinámico - Deserialización de salmuera insegura", en la misma línea.

¿Cómo puedo remediar esto? ¿Hay alguna manera de que podamos cargar un pepinillo de manera segura?

    
pregunta Pro 18.04.2018 - 10:14
fuente

3 respuestas

9

El manual de Python incluye una advertencia sobre el módulo pickle:

  

Advertencia El módulo pickle no es seguro contra datos erróneos o creados de manera malintencionada. Nunca descomprima los datos recibidos de una fuente no confiable o no autenticada.

Esta advertencia debe tomarse muy en serio. Si elimina los datos no confiables, un atacante podrá ejecutar código arbitrario en su sistema. Eso es malo. Muy mal.

Sin embargo, la parte clave de la cita aquí es "fuente no confiable o no autenticada". Si solo está cargando un archivo estático en el que confía que ningún actor malintencionado tendría control, la eliminación es segura. Por ejemplo, si almacena el archivo junto con su código fuente y con las mismas restricciones de acceso, un atacante podría modificar el código fuente como el archivo pickle. Por lo tanto, la eliminación no tiene que ser un riesgo de seguridad.

¿Qué pasa si no puedes confiar en el archivo? Tienes dos opciones:

  1. Cambie a un formato que no sea vulnerable a la ejecución del código, como JSON.
  2. Cree un unpickler restringido utilizando el método find_class (consulte el manual ) .

Mi conjetura es que el # 2 probablemente sería más rápido de implementar, ya que requiere menos cambios en tu código. Pero también es una estrategia arriesgada, ya que sospecho que es muy fácil cometer un pequeño error que lo expone a una vulnerabilidad. Si desea minimizar el riesgo, me gustaría ir con el # 1.

    
respondido por el Anders 18.04.2018 - 11:01
fuente
3
  

¿Hay alguna manera de que podamos cargar un pepinillo de manera segura?

Usted ha solicitado de cualquier manera , pero en parte depende no solo del camino, sino del encurtido en cuestión y de a qué se refiere con "seguridad".

A menos que te refieras a algo como "razonablemente seguro, dado que siempre sabré la procedencia de la salmuera", la respuesta es probablemente "no".

Sin embargo, aquí hay algunas preguntas para las que la respuesta es "sí":

  • ¿Puedo cargar un pickle de forma segura si estoy 100% seguro de que lo escribí y no se ha modificado en tránsito?
  • ¿Puedo cargar un pickle de forma segura si la fuente es confiable y he comprobado que el archivo desde el que estoy cargando el pickle es de esa fuente?
  • ¿Puedo lograr de manera segura lo mismo que cargar una salmuera usando la lógica de des / serialización completamente segura en la gran mayoría de los casos?

Entonces, la primera pregunta que debe hacerse es: ¿la tercera de estas preguntas se aplica a usted? ¿Puede serializar y deserializar de una manera diferente?

Si no, ¿se aplica alguno de los dos primeros?

Si no, hay un proyecto sobre el que acabo de aprender en PyCon llamado "Pikara", que apunta a "hacer que los objetos no sean tan seguros como siempre lo serán". Aparentemente se llama así por un plato polaco en escabeche; Sugerí que "kimchi" podría ser igualmente apropiado. :-)

Si un método alternativo de serialización no es ideal para su implementación, podría considerar revisarlo: enlace

Otra persona que respondió también publicó un método alternativo de descifrado, pero no puedo responder por ello (aunque hoy lo he visto bien y al menos es interesante: lo comprobaré cuando los documentos tengan la mayoría de edad).

Si esta respuesta no le ha dado un 100% de confianza en el camino a seguir, permítame hacerle un seguimiento: ¿qué está en realidad tratando de encontrar aquí?

    
respondido por el jMyles 20.05.2018 - 22:18
fuente
0

Solo el deseleccionador predeterminado es inseguro. Puede escribir un unpickler modificado que sea seguro, o usar uno que alguien más ya haya escrito, como picklemagic: enlace

    
respondido por el user176454 23.04.2018 - 18:20
fuente

Lea otras preguntas en las etiquetas