⚠️ Ceci est un site de traduction non officiel, sans lien avec ImageMagick Studio LLC. Pour des informations officielles, consultez la page originale (https://imagemagick.org/security-policy/).

Politique de sécurité

Politique de sécurité • Exemple de politique de sécurité • Politique de synchronisation du cache de pixels • Politique de sécurité sans configuration • Autres considérations de sécurité

Il est fortement recommandé d'établir une politique de sécurité adaptée à votre environnement local avant d'utiliser ImageMagick. Le modèle de sécurité d'ImageMagick est « tout est autorisé sauf interdiction explicite », et la dernière politique correspondante l'emporte. Soyez prudent lorsque vous ajoutez de nouvelles règles : toute politique ultérieure peut remplacer les deny ou allow précédents. Placez les règles deny générales en premier, suivies des exceptions spécifiques, et revoyez l'ordre afin d'éviter une autorisation accidentelle.

ImageMagick est intentionnellement ouvert par défaut, et ce choix de conception reflète son usage principal dans des environnements contrôlés tels que les conteneurs Docker ou d'autres déploiements en bac à sable.

ImageMagick est un outil qui vous permet de manipuler des images. Bien qu'il offre une gamme de fonctionnalités et de capacités, il existe souvent un compromis entre sécurité et commodité. Pour garantir une sécurité optimale, vous pouvez restreindre ImageMagick à la lecture ou à l'écriture uniquement de formats d'image web-safe comme GIF, JPEG et PNG. Vous pouvez aussi personnaliser la politique de sécurité pour répondre aux besoins de votre environnement local ou aux politiques de votre organisation. Cette politique peut inclure des détails tels que les limites d'utilisation de la mémoire, les chemins autorisés en lecture et en écriture, les limites sur le nombre d'images dans une séquence, la durée d'exécution maximale d'un flux de travail, l'espace disque autorisé pour les pixels d'image, une phrase secrète pour les connexions distantes, ainsi que les codeurs autorisés ou refusés. En personnalisant la politique de sécurité, vous pouvez contribuer à sécuriser votre environnement et faire en sorte qu'ImageMagick soit un membre responsable de votre système local, par exemple en évitant une surcharge due à des images de grande taille.

Il est important de fixer des limites à l'utilisation des ressources d'ImageMagick afin de prévenir des situations potentiellement nuisibles. Par exemple, si vous téléchargez accidentellement depuis Internet une image conçue pour générer une très grande image (par ex. 20000 par 20000 pixels), ImageMagick peut tenter d'allouer les ressources nécessaires (telles que la mémoire et l'espace disque) et votre système peut refuser la requête ou provoquer la sortie du programme. Sinon, votre ordinateur peut devenir temporairement lent ou ne plus répondre, ou ImageMagick peut être contraint d'abandonner. Pour éviter de telles situations, vous pouvez définir des limites dans le fichier de configuration policy.xml.

Gardez à l'esprit que ce qui est considéré comme raisonnable pour un environnement peut ne pas convenir à un autre. Par exemple, vous pouvez avoir ImageMagick en bac à sable dans un environnement sécurisé, tandis qu'une autre personne l'utilise pour traiter des images sur un site web accessible au public. Ou bien ImageMagick peut s'exécuter sur un hôte disposant de beaucoup de mémoire, tandis qu'une autre instance s'exécute sur un appareil aux ressources limitées. Dans le cas de l'hôte à grande mémoire, il peut être judicieux d'autoriser le traitement de grandes images, mais pas sur l'appareil aux ressources limitées. Si vous utilisez ImageMagick sur un site web public, vous pouvez vouloir renforcer la sécurité en désactivant certains codeurs tels que MVG ou HTTPS.

Pour vous aider à démarrer, depuis la version 7.1.1-16, ImageMagick fournit des politiques de sécurité que vous pouvez sélectionner lors de l'installation d'ImageMagick. Choisissez parmi :

open
La politique par défaut des installations d'ImageMagick est la politique de sécurité open. Cette politique est conçue pour une utilisation dans des contextes sécurisés comme ceux protégés par des pare-feu ou au sein de conteneurs Docker. Dans ce cadre, ImageMagick bénéficie d'un large accès aux ressources et aux fonctionnalités. Cette politique offre des options pratiques et adaptables pour la manipulation d'images. Il est toutefois important de noter qu'elle peut présenter des vulnérabilités de sécurité dans des conditions moins encadrées. Les organisations doivent donc évaluer minutieusement la pertinence de la politique open selon leur cas d'usage particulier et leurs exigences de sécurité.
limited
L'objectif principal de la politique de sécurité limited est de trouver un juste milieu entre commodité et sécurité. Cette politique implique la désactivation de fonctionnalités potentiellement dangereuses, comme certains codeurs tels que SVG ou HTTP. De plus, elle établit plusieurs contraintes sur l'utilisation des ressources telles que la mémoire, le stockage et la durée de traitement, toutes ajustables. Cette politique se révèle avantageuse dans les situations où il faut atténuer la menace potentielle liée au traitement d'images possiblement malveillantes ou exigeantes, tout en conservant les capacités essentielles pour les formats d'image courants.
secure
Cette politique de sécurité stricte privilégie la mise en œuvre de contrôles rigoureux et d'une utilisation restreinte des ressources afin d'établir un environnement profondément sécurisé lors de l'emploi d'ImageMagick. Elle désactive des fonctionnalités potentiellement dangereuses, y compris certains codeurs comme SVG ou HTTP. Cette politique favorise l'adaptation des mesures de sécurité afin de s'harmoniser avec les exigences de l'environnement local et les directives de l'organisation. Ce protocole englobe des détails explicites tels que les limitations sur la consommation de mémoire, les chemins autorisés en lecture et en écriture, les bornes sur les séquences d'images, la durée maximale autorisée des flux de travail, l'allocation d'espace disque destiné aux données d'image, et même une phrase secrète non divulguée pour les connexions distantes. En adoptant cette politique robuste, les entités peuvent rehausser leur posture de sécurité globale et atténuer les vulnérabilités potentielles.
websafe
Ce protocole de sécurité conçu pour un usage web-safe se concentre sur les situations où ImageMagick est utilisé dans des contextes accessibles au public, comme les sites web. Il désactive la capacité de lire ou d'écrire tout format d'image autre que les formats web-safe comme GIF, JPEG et PNG. De plus, cette politique interdit l'exécution de filtres d'image et les lectures indirectes, contrecarrant ainsi d'éventuelles failles de sécurité. En appliquant ces limitations, la politique web-safe renforce la protection des systèmes accessibles au public, réduisant le risque d'exploiter les capacités d'ImageMagick pour de potentielles attaques.

Sous Linux, sélectionnez la politique avec l'option --with-security-policy={open, limited, secure, websafe} du script configure. Sous Windows, le choix est proposé lorsque vous exécutez l'application configure.

Nous vous encourageons à revoir chaque règle de votre fichier de configuration policy.xml. Ajustez les paramètres selon les exigences de votre organisation. Vous pouvez modifier les formats d'image autorisés, définir des chemins spécifiques et restreindre certaines opérations en fonction de vos besoins de sécurité. N'oubliez pas que personnaliser la politique de sécurité est un équilibre délicat entre fonctionnalité et sécurité. Des politiques trop restrictives peuvent entraver des tâches légitimes de traitement d'images, tandis que des politiques trop permissives peuvent introduire des vulnérabilités.

Exemple de politique de sécurité

Voici un exemple de politique de sécurité :

<?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>

Pour empêcher qu'une session ne consomme toute la mémoire disponible lors du traitement simultané de plusieurs sessions, les grandes images sont mises en cache sur le disque avec cette politique. Si une image dépasse la limite de disque du cache de pixels, le programme se termine. De plus, une limite de temps a été définie pour empêcher toute tâche de traitement de s'exécuter trop longtemps. Si une image a une largeur ou une hauteur supérieure à 8192 pixels, ou si une séquence d'images compte plus de 32 images, le traitement s'arrête et une exception est levée.

Depuis ImageMagick 7.0.1-8, vous pouvez empêcher l'utilisation d'un délégué externe quelconque ou de tous les délégués externes (en réglant le motif sur « * »). Avant ces versions, vous pouvez utiliser le domaine coder, régler rights sur none et le motif glob sur HTTPS pour empêcher l'utilisation de délégués externes. De plus, les utilisateurs sont empêchés d'exécuter des filtres d'image et d'effectuer des lectures indirectes. Si vous souhaitez, par exemple, lire du texte depuis un fichier (par ex. caption:@myCaption.txt), vous devrez désactiver cette politique de path.

Les motifs glob de politique, avant ImageMagick 7.1.1-16, sont sensibles à la casse. Pour obtenir le comportement attendu, les codeurs et modules doivent être en majuscules (par ex. « EPS » et non « eps ») ou utiliser un motif insensible à la casse tel que [Pp][Nn][Gg].

Voici ce à quoi vous pouvez vous attendre lorsque vous restreignez le codeur HTTPS, par exemple :

$ 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'

Depuis la version 7.0.4-7 d'ImageMagick, vous pouvez commodément refuser l'accès à tous les délégués et codeurs externes, à l'exception d'un petit sous-ensemble de types d'image web-safe éprouvés. Par exemple,

<policy domain="delegate" rights="none" pattern="*" />
<policy domain="module" rights="none" pattern="*" />
<policy domain="module" rights="read | write" pattern="{GIF,JPEG,PNG,WEBP}" />

La politique module active ou désactive un module complet à la fois en lecture et en écriture. Pour seulement lire ou écrire un format d'image, utilisez plutôt la politique coder. Par exemple, nous désactivons la lecture de quelques formats liés à PostScript, mais vous pouvez toujours les écrire :

<policy domain="coder" rights="write" pattern="{PDF,PS,PS2,PS3,XPS}" />

Depuis ImageMagick 7.0.7-0, vous pouvez allouer le cache de pixels et certains tampons internes par mappage mémoire anonyme plutôt que depuis le tas. En conséquence, les pixels sont initialisés à zéro, ce qui entraîne une légère pénalité de performance. Vous pouvez aussi brouiller le contenu de certains tampons mémoire (nécessite la version 7.1.0-38) et fichiers temporaires avant qu'ils ne soient libérés ou supprimés. La valeur shred correspond au nombre de fois où le contenu est remplacé par des données aléatoires. Par exemple,

<policy domain="system" name="memory-map" value="anonymous"/>
<policy domain="cache" name="memory-map" value="anonymous"/>
<policy domain="system" name="shred" value="1"/>

Pour des raisons de performance, la première passe est rapide en répétant la séquence aléatoire autant que nécessaire pour écraser le contenu du tampon ou du fichier. Les passes suivantes sont d'un ordre de grandeur plus lentes, mais génèrent des octets aléatoires cryptographiquement forts sur toute la longueur du tampon ou du fichier.

Certains algorithmes de traitement d'images (par ex. la transformée en ondelettes) peuvent consommer une quantité substantielle de mémoire pour s'achever. ImageMagick maintient un pool de mémoire distinct pour ces grandes demandes de ressources et, depuis 7.0.6-1, vous permet de définir une limite de requête maximale. Si la limite est dépassée, l'allocation est mappée en mémoire sur le disque à la place. Ici, nous limitons la requête mémoire maximale par politique :

<policy domain="system" name="max-memory-request" value="256MiB"/>

Depuis la version 7.0.4-23 d'ImageMagick, vous pouvez limiter le nombre maximal d'images dans une séquence. Par exemple, pour limiter une séquence d'images à au plus 64 images, utilisez :

<policy domain="resource" name="list-length" value="64"/>

Notez que les valeurs numériques dans les politiques sont en virgule flottante avec un préfixe SI facultatif (par ex. 10MiB).

Pour plus de détails sur les limites de ressources et le fichier de configuration de politique, consultez Resources et Architecture.

Depuis ImageMagick 7.0.6-0, vous pouvez définir par programmation la politique de sécurité d'ImageMagick avec SetMagickSecurityPolicy() (MagickCore) ou MagickSetSecurityPolicy() (MagickWand).

Depuis la version 7.0.8-11 d'ImageMagick, vous pouvez définir une politique de sécurité de module. Par exemple, pour empêcher l'interprétation de PostScript ou de PDF, utilisez :

<policy domain="module" rights="none" pattern="{ps,pdf,xps}/>

Depuis la version 7.0-10-52 d'ImageMagick, vous pouvez définir une politique de police. Spécifiez un chemin vers une police Unicode qu'ImageMagick utilise par défaut chaque fois que l'utilisateur ne précise pas de préférence de police :

<policy domain="system" name="font" value="/usr/share/fonts/arial-unicode.ttf"/>

Notez que, dans les motifs glob de chemins de fichiers, utilisez le caractère barre oblique inverse (\) pour échapper les caractères qui seraient autrement interprétés comme des caractères spéciaux. Par exemple :

<policy domain="path" rights="none" pattern="c:\\\\*"/>

Vous pouvez vérifier que vos modifications de politique sont en vigueur avec cette commande :

$ 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

Remarquez que la politique de secret partagé n'est pas listée en raison de la propriété stealth.

Doyensec fournit un outil d'évaluation de politique qui peut vous aider à concevoir et auditer votre politique de sécurité. L'outil se trouve à l'adresse imagemagick-secevaluator.doyensec.com.

Politique de synchronisation du cache de pixels

Lors de l'écriture des pixels d'image sur le disque, ImageMagick préalloue d'abord le fichier disque, ce qui est plus rapide que de remplir entièrement le fichier de zéros. Pour améliorer encore les performances, le fichier est mappé en mémoire sur le disque. Cela peut entraîner une amélioration des performances jusqu'à 5 fois, mais il est possible que le fichier disque manque d'espace libre à mesure qu'il se remplit, amenant le système d'exploitation (OS) à lever un signal SIGBUS qui empêche ImageMagick de continuer. Pour empêcher qu'un signal SIGBUS ne se produise, utilisez cette politique de sécurité :

<policy domain="cache" name="synchronize" value="True"/>

Réglez sur True pour garantir que toutes les données d'image sont entièrement vidées et synchronisées sur le disque. Il y a une pénalité de performance, mais les avantages incluent la garantie d'un fichier image valide en cas de panne du système et un signalement précoce s'il n'y a pas assez d'espace disque pour le cache de pixels d'image.

Politique de sécurité sans configuration

Une compilation sans configuration d'ImageMagick n'autorise pas les fichiers de configuration externes. Pour définir votre politique de sécurité, vous devez à la place modifier le module source MagickCore/policy-private.h, ajouter vos énoncés de politique, puis compiler la distribution d'ImageMagick. Voici un exemple de politique de sécurité sans configuration :

static const char
  *ZeroConfigurationPolicy = \
"<policymap> \
  <policy domain=\"module\" rights=\"none\" pattern=\"MVG\"/> \
</policymap>";

Autres considérations de sécurité

Si vous repérez une vulnérabilité dans ImageMagick, déterminez d'abord si la vulnérabilité peut être atténuée par la politique de sécurité. ImageMagick est, par défaut, ouvert. Utilisez la politique de sécurité pour ajouter des contraintes répondant aux exigences de votre gouvernance de sécurité locale. Si vous êtes convaincu que la politique de sécurité ne traite pas la vulnérabilité, publiez-la comme avis de sécurité. La plupart des vulnérabilités sont examinées et résolues dans les 48 heures.

Il existe plusieurs façons de rendre ImageMagick plus sûr :

  1. Utiliser des formats d'image web-safe : limiter ImageMagick à la lecture ou à l'écriture uniquement de formats d'image web-safe comme GIF, JPEG et PNG peut contribuer à renforcer la sécurité.
  2. Personnaliser la politique de sécurité : vous pouvez personnaliser la politique de sécurité pour répondre aux besoins de votre environnement local ou aux politiques de votre organisation. Cette politique peut couvrir des aspects tels que l'utilisation de la mémoire, les chemins autorisés en lecture et en écriture, le nombre d'images autorisées dans une séquence, la durée maximale d'exécution d'un flux de travail, l'espace disque autorisé pour les pixels d'image, une phrase secrète pour les connexions distantes, ainsi que les codeurs autorisés ou refusés.
  3. Fixer des limites sur l'utilisation des ressources : vous pouvez fixer des limites sur des ressources telles que l'utilisation de la mémoire, l'espace disque et la durée d'exécution des flux de travail afin de prévenir des situations potentiellement nuisibles.
  4. Utiliser le bac à sable : le bac à sable est une technique de sécurité qui vous permet d'exécuter un programme dans un environnement restreint afin de l'empêcher d'accéder à des informations sensibles ou de modifier le système.
  5. Désactiver les codeurs potentiellement dangereux : si vous utilisez ImageMagick sur un site web public, vous pouvez vouloir renforcer la sécurité en désactivant certains codeurs tels que MVG ou HTTPS.
  6. Empêcher l'exécution de filtres d'image et les lectures indirectes : vous pouvez empêcher les utilisateurs d'exécuter des filtres d'image et d'effectuer des lectures indirectes pour renforcer la sécurité.
  7. Utiliser une version actuelle d'ImageMagick : il est important d'utiliser une version actuelle d'ImageMagick afin de bénéficier des derniers correctifs et mises à jour de sécurité.