Política de seguridad
Política de seguridad • Ejemplo de política de seguridad • Política de sincronización de la caché de píxeles • Política de seguridad sin configuración • Otras consideraciones de seguridad
Se recomienda encarecidamente establecer una política de seguridad adecuada para su entorno local antes de utilizar ImageMagick. El modelo de seguridad de ImageMagick es «todo permitido salvo que se deniegue», y prevalece la última política coincidente. Tenga cuidado al añadir nuevas reglas: cualquier política posterior puede anular las denegaciones o autorizaciones anteriores. Coloque primero las reglas de denegación amplias, seguidas de las excepciones específicas, y revise el orden para evitar autorizaciones accidentales.
ImageMagick es intencionalmente abierto de forma predeterminada, y esa decisión de diseño refleja su uso principal en entornos controlados, como contenedores Docker u otras implementaciones aisladas (sandboxed).
ImageMagick es una herramienta que le permite manipular imágenes. Si bien ofrece una variedad de funciones y capacidades, a menudo existe un compromiso entre seguridad y comodidad. Para garantizar una seguridad óptima, puede restringir ImageMagick a leer o escribir únicamente formatos de imagen seguros para la web, como GIF, JPEG y PNG. Como alternativa, puede personalizar la política de seguridad para ajustarla a las necesidades de su entorno local o a las políticas de su organización. Esta política puede incluir detalles como límites de uso de memoria, rutas permitidas para lectura y escritura, límites en el número de imágenes de una secuencia, tiempo máximo de ejecución del flujo de trabajo, espacio en disco permitido para los píxeles de la imagen, una frase de contraseña secreta para conexiones remotas y qué codificadores (coders) están permitidos o denegados. Al personalizar la política de seguridad, puede ayudar a proteger su entorno y asegurarse de que ImageMagick sea un miembro responsable de su sistema local, por ejemplo, evitando la sobrecarga con imágenes de gran tamaño.
Es importante establecer límites en el uso de recursos de ImageMagick para prevenir situaciones potencialmente dañinas. Por ejemplo, si descarga accidentalmente de internet una imagen diseñada para generar una imagen muy grande (p. ej., 20000 por 20000 píxeles), ImageMagick puede intentar asignar los recursos necesarios (como memoria y espacio en disco) y su sistema puede denegar la solicitud o provocar que el programa finalice. Como alternativa, su equipo puede volverse temporalmente lento o no responder, o ImageMagick puede verse obligado a abortar. Para evitar tales situaciones, puede establecer límites en el archivo de configuración policy.xml.
Tenga en cuenta que lo que se considera razonable para un entorno puede no ser adecuado para otro. Por ejemplo, usted puede tener ImageMagick aislado en un entorno seguro, mientras que otra persona puede usarlo para procesar imágenes en un sitio web de acceso público. O bien, ImageMagick puede estar ejecutándose en un host con mucha memoria, mientras que otra instancia se ejecuta en un dispositivo con recursos limitados. En el caso del host con mucha memoria, puede tener sentido permitir el procesamiento de imágenes grandes, pero no en el dispositivo con recursos limitados. Si utiliza ImageMagick en un sitio web público, puede que desee aumentar la seguridad deshabilitando ciertos codificadores como MVG o HTTPS.
Para ayudarle a empezar, a partir de la versión 7.1.1-16, ImageMagick proporciona políticas de seguridad que puede seleccionar al instalar ImageMagick. Elija entre:
- open
- La política predeterminada para las instalaciones de ImageMagick es la política de seguridad open. Esta política está diseñada para su uso en entornos seguros, como los protegidos por cortafuegos o dentro de contenedores Docker. Dentro de este marco, ImageMagick disfruta de un amplio acceso a recursos y funcionalidades. Esta política ofrece opciones cómodas y flexibles para la manipulación de imágenes. Sin embargo, es importante señalar que podría presentar vulnerabilidades de seguridad en condiciones menos reguladas. Por ello, las organizaciones deben evaluar minuciosamente la idoneidad de la política open según su caso de uso particular y sus requisitos de seguridad.
- limited
- El objetivo principal de la política de seguridad limited es encontrar un punto intermedio entre comodidad y seguridad. Esta política implica la desactivación de funcionalidades potencialmente peligrosas, como ciertos codificadores tales como SVG o HTTP. Además, establece varias restricciones sobre el uso de recursos como memoria, almacenamiento y duración del procesamiento, todas ellas ajustables. Esta política resulta ventajosa en situaciones donde se necesita mitigar la amenaza potencial de manejar imágenes posiblemente maliciosas o exigentes, conservando al mismo tiempo las capacidades esenciales para los formatos de imagen más comunes.
- secure
- Esta estricta política de seguridad prioriza la implementación de controles rigurosos y un uso restringido de recursos para establecer un entorno profundamente seguro al emplear ImageMagick. Desactiva funcionalidades potencialmente peligrosas, incluidos codificadores específicos como SVG o HTTP. La política fomenta la adaptación de las medidas de seguridad para armonizar con los requisitos del entorno local y las directrices de la organización. Este protocolo abarca detalles explícitos como limitaciones en el consumo de memoria, rutas autorizadas para lectura y escritura, límites en las secuencias de imágenes, la duración máxima permitida de los flujos de trabajo, la asignación de espacio en disco destinado a los datos de imagen e incluso una frase de contraseña no divulgada para conexiones remotas. Al adoptar esta política robusta, las entidades pueden elevar su postura general de seguridad y mitigar posibles vulnerabilidades.
- websafe
- Este protocolo de seguridad diseñado para un uso seguro en la web se centra en situaciones donde ImageMagick se aplica en contextos de acceso público, como sitios web. Desactiva la capacidad de leer o escribir cualquier formato de imagen distinto de los formatos seguros para la web, como GIF, JPEG y PNG. Además, esta política prohíbe la ejecución de filtros de imagen y las lecturas indirectas, frustrando así posibles brechas de seguridad. Al implementar estas limitaciones, la política websafe refuerza la protección de los sistemas de acceso público, reduciendo el riesgo de que se exploten las capacidades de ImageMagick para posibles ataques.
En Linux, seleccione la política con la opción del script de configuración --with-security-policy={open, limited, secure, websafe}. En Windows, la elección se presenta al ejecutar la aplicación de configuración.
Le recomendamos revisar cada regla de su archivo de configuración policy.xml. Ajuste los parámetros según los requisitos de su organización. Puede modificar los formatos de imagen permitidos, establecer rutas específicas y restringir ciertas operaciones según sus necesidades de seguridad. Recuerde que personalizar la política de seguridad es un delicado equilibrio entre funcionalidad y seguridad. Las políticas excesivamente restrictivas podrían dificultar tareas legítimas de procesamiento de imágenes, mientras que las políticas excesivamente permisivas pueden introducir vulnerabilidades.
Ejemplo de política de seguridad
A continuación se muestra un ejemplo de política de seguridad:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policymap [
<!ELEMENT policymap (policy)*>
<!ATTLIST policymap xmlns CDATA #FIXED "">
<!ELEMENT policy EMPTY>
<!ATTLIST policy xmlns CDATA #FIXED "">
<!ATTLIST policy domain NMTOKEN #REQUIRED>
<!ATTLIST policy name NMTOKEN #IMPLIED>
<!ATTLIST policy pattern CDATA #IMPLIED>
<!ATTLIST policy rights NMTOKEN #IMPLIED>
<!ATTLIST policy stealth NMTOKEN #IMPLIED>
<!ATTLIST policy value CDATA #IMPLIED>
]>
<policymap>
<!-- Set maximum parallel threads. -->
<policy domain="resource" name="thread" value="2"/>
<policy domain="resource" name="time" value="60"/>
<policy domain="resource" name="file" value="768"/>
<policy domain="resource" name="memory" value="256MiB"/>
<policy domain="resource" name="map" value="512MiB"/>
<policy domain="resource" name="area" value="16KP"/>
<policy domain="resource" name="disk" value="1GiB"/>
<policy domain="resource" name="list-length" value="16"/>
<policy domain="resource" name="width" value="4KP"/>
<policy domain="resource" name="height" value="4KP"/>
<policy domain="resource" name="throttle" value="2"/>
<policy domain="resource" name="dynamic-throttle" value="false"/>
<policy domain="cache" name="memory-map" value="anonymous"/>
<policy domain="cache" name="synchronize" value="true"/>
<policy domain="delegate" rights="none" pattern="*"/>
<policy domain="filter" rights="none" pattern="*"/>
<policy domain="path" rights="none" pattern="-"/>
<policy domain="path" rights="none" pattern="fd:*"/>
<policy domain="path" rights="none" pattern="/etc/*"/>
<policy domain="path" rights="none" pattern="*../*"/>
<policy domain="path" rights="none" pattern="@*"/>
<policy domain="module" rights="none" pattern="*" />
<policy domain="module" rights="read | write" pattern="{GIF,JPEG,PNG,WEBP}" />
<policy domain="system" name="shred" value="1"/>
<policy domain="system" name="memory-map" value="anonymous"/>
<policy domain="system" name="max-memory-request" value="256MiB"/>
<policy domain="system" name="symlink" rights="none" pattern="follow"/>
</policymap>
Para evitar que una sesión consuma toda la memoria disponible al procesar varias sesiones al mismo tiempo, esta política almacena en caché en disco las imágenes grandes. Si una imagen supera el límite de disco de la caché de píxeles, el programa finalizará. Además, se ha establecido un límite de tiempo para evitar que cualquier tarea de procesamiento se ejecute durante demasiado tiempo. Si una imagen tiene un ancho o alto superior a 8192 píxeles, o si una secuencia de imágenes tiene más de 32 fotogramas, el procesamiento se detendrá y se lanzará una excepción.
A partir de ImageMagick 7.0.1-8, puede impedir el uso de cualquier delegado externo o de todos los delegados externos (estableciendo el patrón en "*"). Antes de estas versiones, puede usar el dominio coder y establecer rights en none y el patrón glob en HTTPS para impedir el uso de delegados externos. Además, se impide que los usuarios ejecuten filtros de imagen y realicen lecturas indirectas. Si, por ejemplo, desea leer texto desde un archivo (p. ej., caption:@myCaption.txt), tendrá que deshabilitar esta política de path.
Los patrones glob de las políticas, antes de ImageMagick 7.1.1-16, distinguen entre mayúsculas y minúsculas. Para obtener el comportamiento esperado, los codificadores y módulos deben estar en mayúsculas (p. ej., "EPS" y no "eps") o usar un patrón que no distinga entre mayúsculas y minúsculas como [Pp][Nn][Gg].
Esto es lo que puede esperar al restringir el codificador HTTPS, por ejemplo:
$ magick ../static/img/wizard.png wizard.jpg
convert: attempt to perform an operation not allowed by the security policy `HTTPS'
convert: no images defined `wizard.jpg'
A partir de la versión 7.0.4-7 de ImageMagick, puede denegar cómodamente el acceso a todos los delegados y codificadores externos, salvo a un pequeño subconjunto de tipos de imagen seguros para la web ya comprobados. Por ejemplo,
<policy domain="delegate" rights="none" pattern="*" />
<policy domain="module" rights="none" pattern="*" />
<policy domain="module" rights="read | write" pattern="{GIF,JPEG,PNG,WEBP}" />
La política module habilita o deshabilita un módulo completo tanto para lectura como para escritura. Para leer o escribir solo un formato de imagen, use en su lugar la política coder. Por ejemplo, deshabilitamos la lectura de unos pocos formatos relacionados con PostScript, aunque todavía puede escribirlos:
<policy domain="coder" rights="write" pattern="{PDF,PS,PS2,PS3,XPS}" />
A partir de ImageMagick 7.0.7-0, puede asignar la caché de píxeles y algunos búferes internos mediante mapeo de memoria anónimo en lugar de hacerlo desde el montón (heap). Como consecuencia, los píxeles se inicializan a cero, lo que produce una leve penalización de rendimiento. También puede revolver el contenido de ciertos búferes de memoria (requiere la versión 7.1.0-38) y archivos temporales antes de que se liberen o eliminen. El valor shred es el número de veces que se reemplaza el contenido con datos aleatorios. Por ejemplo,
<policy domain="system" name="memory-map" value="anonymous"/>
<policy domain="cache" name="memory-map" value="anonymous"/>
<policy domain="system" name="shred" value="1"/>
Por razones de rendimiento, la primera pasada es rápida, repitiendo la secuencia aleatoria según sea necesario para sobrescribir el contenido del búfer o del archivo. Las pasadas posteriores son un orden de magnitud más lentas, pero generan bytes aleatorios criptográficamente fuertes para toda la longitud del búfer o del archivo.
Algunos algoritmos de procesamiento de imágenes (p. ej., la transformada wavelet) pueden consumir una cantidad considerable de memoria para completarse. ImageMagick mantiene un grupo de memoria independiente para estas grandes solicitudes de recursos y, a partir de 7.0.6-1, le permite establecer un límite máximo de solicitud. Si se supera el límite, la asignación se mapea en disco en su lugar. Aquí limitamos la solicitud máxima de memoria mediante la política:
<policy domain="system" name="max-memory-request" value="256MiB"/>
A partir de la versión 7.0.4-23 de ImageMagick, puede limitar el número máximo de imágenes de una secuencia. Por ejemplo, para limitar una secuencia de imágenes a un máximo de 64 fotogramas, use:
<policy domain="resource" name="list-length" value="64"/>
Tenga en cuenta que los valores numéricos de las políticas son de punto flotante con un prefijo SI opcional (p. ej., 10MiB).
Para obtener más detalles sobre los límites de recursos y el archivo de configuración de políticas, lea Resources y Architecture.
A partir de ImageMagick 7.0.6-0, puede establecer programáticamente la política de seguridad de ImageMagick con SetMagickSecurityPolicy() (MagickCore) o MagickSetSecurityPolicy() (MagickWand).
A partir de la versión 7.0.8-11 de ImageMagick, puede establecer una política de seguridad de módulo. Por ejemplo, para impedir la interpretación de PostScript o PDF, use:
<policy domain="module" rights="none" pattern="{ps,pdf,xps}/>
A partir de la versión 7.0-10-52 de ImageMagick, puede establecer una política de fuentes. Especifique una ruta a una fuente Unicode que ImageMagick use de forma predeterminada siempre que el usuario no especifique una preferencia de fuente:
<policy domain="system" name="font" value="/usr/share/fonts/arial-unicode.ttf"/>
Tenga en cuenta que, en los patrones glob de rutas de archivo, debe usar el carácter de barra invertida (\) para escapar caracteres que de otro modo se interpretarían como caracteres especiales. Por ejemplo:
<policy domain="path" rights="none" pattern="c:\\\\*"/>
Puede verificar que los cambios de su política están en vigor con este comando:
$ magick identify -list policy
Path: ImageMagick-7/policy.xml
Policy: Cache
name: memory-map
value: anonymous
Policy: Cache
name: synchronize
value: true
Policy: Resource
name: list-length
value: 32
Policy: Resource
name: time
value: 120
Policy: Resource
name: thread
value: 2
Policy: Resource
name: file
value: 768
Policy: Resource
name: disk
value: 1GiB
Policy: Resource
name: map
value: 512MiB
Policy: Resource
name: memory
value: 256MiB
Policy: Resource
name: area
value: 16KP
Policy: Resource
name: height
value: 8KP
Policy: Resource
name: width
value: 8KP
Policy: Resource
name: temporary-path
value: /opt/tmp
Policy: Module
rights: Write
pattern: {HTTP,HTTPS,MVG,PS,PDF}
Policy: Filter
rights: None
pattern: *
Policy: Path
rights: None
pattern: @*
Policy: System
name: font
value: ImageMagick-7/arial-unicode.ttf
Path: [built-in]
Policy: Undefined
rights: None
Observe que la política del secreto compartido no aparece en la lista debido a la propiedad stealth.
Doyensec ofrece una herramienta de evaluación de políticas que puede ayudarle a diseñar y auditar su política de seguridad. La herramienta se encuentra en imagemagick-secevaluator.doyensec.com.
Política de sincronización de la caché de píxeles
Al escribir los píxeles de una imagen en disco, ImageMagick primero preasigna el archivo en disco, lo cual es más rápido que rellenar completamente el archivo con ceros. Para mejorar aún más el rendimiento, el archivo se mapea en memoria sobre el disco. Esto puede resultar en un aumento del rendimiento de hasta 5 veces, pero existe la posibilidad de que el archivo en disco se quede sin espacio libre a medida que se llena, lo que provoca que el sistema operativo (SO) lance una señal SIGBUS que impide a ImageMagick continuar. Para evitar que se produzca una señal SIGBUS, use esta política de seguridad:
<policy domain="cache" name="synchronize" value="True"/>
Establézcalo en True para garantizar que todos los datos de la imagen se vuelquen y sincronicen completamente en disco. Hay una penalización de rendimiento, pero entre sus ventajas se incluyen garantizar un archivo de imagen válido en caso de fallo del sistema y la notificación temprana si no hay suficiente espacio en disco para la caché de píxeles de la imagen.
Política de seguridad sin configuración
Una compilación de ImageMagick sin configuración no permite archivos de configuración externos. Para definir su política de seguridad, debe editar en su lugar el módulo fuente MagickCore/policy-private.h, añadir sus declaraciones de política y luego compilar la distribución de ImageMagick. A continuación se muestra un ejemplo de política de seguridad sin configuración:
static const char
*ZeroConfigurationPolicy = \
"<policymap> \
<policy domain=\"module\" rights=\"none\" pattern=\"MVG\"/> \
</policymap>";
Otras consideraciones de seguridad
Si detecta una vulnerabilidad en ImageMagick, determine primero si dicha vulnerabilidad puede mitigarse mediante la política de seguridad. ImageMagick, de forma predeterminada, es abierto. Use la política de seguridad para añadir restricciones que cumplan los requisitos de su gobernanza de seguridad local. Si está convencido de que la política de seguridad no aborda la vulnerabilidad, publique la vulnerabilidad como un aviso de seguridad. La mayoría de las vulnerabilidades se revisan y resuelven en un plazo de 48 horas.
Hay varias formas de mantener ImageMagick más seguro:
- Use formatos de imagen seguros para la web: Limitar ImageMagick a leer o escribir únicamente formatos de imagen seguros para la web, como GIF, JPEG y PNG, puede ayudar a aumentar la seguridad.
- Personalice la política de seguridad: Puede personalizar la política de seguridad para ajustarla a las necesidades de su entorno local o a las políticas de su organización. Esta política puede cubrir aspectos como el uso de memoria, las rutas permitidas para lectura y escritura, el número de imágenes permitidas en una secuencia, el tiempo máximo que puede ejecutarse un flujo de trabajo, la cantidad de espacio en disco permitido para los píxeles de la imagen, una frase de contraseña secreta para conexiones remotas y qué codificadores están permitidos o denegados.
- Establezca límites en el uso de recursos: Puede establecer límites en recursos como el uso de memoria, el espacio en disco y el tiempo de ejecución del flujo de trabajo para prevenir situaciones potencialmente dañinas.
- Use el aislamiento (sandboxing): El aislamiento es una técnica de seguridad que le permite ejecutar un programa en un entorno restringido para impedir que acceda a información sensible o realice cambios en el sistema.
- Deshabilite codificadores potencialmente peligrosos: Si utiliza ImageMagick en un sitio web público, puede que desee aumentar la seguridad deshabilitando ciertos codificadores como MVG o HTTPS.
- Impida la ejecución de filtros de imagen y las lecturas indirectas: Puede impedir que los usuarios ejecuten filtros de imagen y realicen lecturas indirectas para aumentar la seguridad.
- Use una versión actual de ImageMagick: Es importante usar una versión actual de ImageMagick para aprovechar las últimas correcciones y actualizaciones de seguridad.