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
Política de seguridad de ImageMagick
Establezca 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).
La seguridad siempre implica equilibrar la protección frente a posibles vulnerabilidades con la necesidad práctica de sacar adelante el trabajo. En ImageMagick, la política de seguridad es el mecanismo que le permite ajustar ese equilibrio. Actúa como punto de control entre un bloqueo estricto y la comodidad operativa, y le permite decidir qué funciones, codificadores y operaciones están permitidos en su entorno.
Una política bien diseñada puede:
- Limitar o deshabilitar los codificadores y las operaciones de alto riesgo.
- Restringir el uso de recursos para prevenir abusos.
- Definir exactamente qué tipos de entrada puede procesar ImageMagick.
- Adaptar el sistema a su modelo de amenazas en lugar de imponer una configuración única para todos.
Esta flexibilidad es intencionada. ImageMagick se distribuye en un estado abierto para que pueda integrarse en entornos controlados, contenedores, canalizaciones (pipelines) o servidores aislados, donde los administradores pueden después endurecer la política para ajustarla a sus necesidades. Cuanta más entrada no confiable espere manejar, más restrictiva debería ser su política.
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.
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.
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>
]>
<!--
Creating a security policy that fits your specific local environment
before making use of ImageMagick is highly advised. You can find guidance on
setting up this policy at https://imagemagick.org/security-policy/,
and it's important to verify your policy using the validation tool located
at https://imagemagick-secevaluator.doyensec.com/. We also strongly
recommend that all users validate their security assumptions by testing their
configurations after making any policy changes. This helps ensure that the
intended restrictions are functioning as expected in their specific
deployment environment.
Web-safe ImageMagick security policy:
This security protocol designed for web-safe usage focuses on situations
where ImageMagick is applied in publicly accessible contexts, like websites.
It deactivates the capability to read from or write to any image formats
other than web-safe formats like GIF, JPEG, and PNG. Additionally, this
policy prohibits the execution of image filters and indirect reads, thereby
thwarting potential security breaches. By implementing these limitations,
the web-safe policy fortifies the safeguarding of systems accessible to
the public, reducing the risk of exploiting ImageMagick's capabilities
for potential attacks.
-->
<policymap>
<!-- Set maximum parallel threads. -->
<policy domain="resource" name="thread" value="2"/>
<!-- Set maximum time in seconds or mnemonics, e.g. "2 minutes". When this
limit is exceeded, an exception is thrown and processing stops. -->
<policy domain="resource" name="time" value="60"/>
<!-- Set maximum number of open pixel cache files. When this limit is
exceeded, any subsequent pixels cached to disk are closed and reopened
on demand. -->
<policy domain="resource" name="file" value="768"/>
<!-- Set maximum amount of memory in bytes to allocate for the pixel cache
from the heap. When this limit is exceeded, the image pixels are cached
to memory-mapped disk. -->
<policy domain="resource" name="memory" value="256MiB"/>
<!-- Set maximum amount of memory map in bytes to allocate for the pixel
cache. When this limit is exceeded, the image pixels are cached to
disk. -->
<policy domain="resource" name="map" value="512MiB"/>
<!-- Set the maximum width * height of an image that can reside in the pixel
cache memory. Images that exceed the area limit are cached to disk. -->
<policy domain="resource" name="area" value="16KP"/>
<!-- Set maximum amount of disk space in bytes permitted for use by the pixel
cache. When this limit is exceeded, the pixel cache is not be created
and an exception is thrown. -->
<policy domain="resource" name="disk" value="1GiB"/>
<!-- Set the maximum length of an image sequence. When this limit is
exceeded, an exception is thrown. -->
<policy domain="resource" name="list-length" value="16"/>
<!-- Set the maximum width of an image. When this limit is exceeded, an
exception is thrown. -->
<policy domain="resource" name="width" value="4KP"/>
<!-- Set the maximum height of an image. When this limit is exceeded, an
exception is thrown. -->
<policy domain="resource" name="height" value="4KP"/>
<!-- Periodically yield the CPU for at least the time specified in
milliseconds. -->
<policy domain="resource" name="throttle" value="2"/>
<!-- Dynamically yield the CPU relative to the system load average. -->
<policy domain="resource" name="dynamic-throttle" value="false"/>
<!-- Do not create temporary files in the default shared directories, instead
specify a private area to store only ImageMagick temporary files. -->
<!-- <policy domain="resource" name="temporary-path" value="/magick/tmp"/> -->
<!-- Force memory initialization by memory mapping select memory
allocations. -->
<policy domain="cache" name="memory-map" value="anonymous"/>
<!-- Ensure all image data is fully flushed and synchronized to disk. -->
<policy domain="cache" name="synchronize" value="true"/>
<!-- Replace passphrase for secure distributed processing -->
<!-- <policy domain="cache" name="shared-secret" value="secret-passphrase" stealth="true"/> -->
<!-- Do not permit any external delegates to execute. -->
<policy domain="delegate" rights="none" pattern="*"/>
<!-- Do not permit any image filters to load. -->
<policy domain="filter" rights="none" pattern="*"/>
<!-- Don't read/write from/to stdin/stdout. -->
<policy domain="path" rights="none" pattern="-"/>
<policy domain="path" rights="none" pattern="[Ff][Dd]:*"/>
<!-- Sensitive paths are not permitted. -->
<policy domain="path" rights="none" pattern="/etc/*"/>
<!-- Relative paths are not permitted. -->
<policy domain="path" rights="none" pattern="*../*"/>
<!-- Indirect reading is not permitted. -->
<policy domain="path" rights="none" pattern="@*"/>
<!-- Deny all image modules and specifically exempt reading or writing
web-safe image formats. -->
<policy domain="module" rights="none" pattern="*" />
<policy domain="module" rights="read | write" pattern="{GIF,JPEG,PNG,WEBP}" />
<!-- This policy sets the number of times to replace content of certain
memory buffers and temporary files before they are freed or deleted. -->
<policy domain="system" name="shred" value="1"/>
<!-- Enable the initialization of buffers with zeros, resulting in a minor
performance penalty but with improved security. -->
<policy domain="system" name="memory-map" value="anonymous"/>
<!-- Set the maximum amount of memory in bytes that is permitted for
allocation requests. -->
<policy domain="system" name="max-memory-request" value="256MiB"/>
<!-- If the basename of path is a symbolic link, the open fails -->
<policy domain="system" name="symlink" rights="none" pattern="follow"/>
<!-- Blocks all SVG entity‑substitution attempts by denying the
svg:substitute-entities define -->
<policy domain="system" name="svg" rights="none" pattern="substitute-entities"/>
</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 module. 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 font. 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 shared-secret no aparece en la lista debido a la propiedad stealth.
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.
- Revise delegates.xml y deshabilite mediante la política los que no sean adecuados para su entorno. Para los que se mantengan, use
configure --with-frozenpaths=yes[N. del T.: el original escribe--with--frozenpaths] para garantizar que cada programa delegado use una ruta absoluta, por ejemplo/usr/bin/gsen lugar degs, de modo que la resolución de delegados sea determinista y no dependa de la variablePATHdel entorno. - 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.