⚠️ Este é um site de tradução não oficial, sem relação com a ImageMagick Studio LLC. Para informações oficiais, consulte a página original (https://imagemagick.org/security-policy/).

Política de Segurança

Política de Segurança • Exemplo de Política de Segurança • Política de Sincronização do Cache de Pixels • Política de Segurança de Configuração Zero • Outras Considerações de Segurança

Recomenda-se fortemente estabelecer uma política de segurança adequada ao seu ambiente local antes de utilizar o ImageMagick. O modelo de segurança do ImageMagick é "tudo permitido a menos que seja negado", e a última política correspondente prevalece. Tenha cuidado ao adicionar novas regras: qualquer política posterior pode sobrescrever negações ou permissões anteriores. Coloque as regras amplas de negação primeiro, seguidas pelas exceções específicas, e revise a ordem para evitar autorizações acidentais.

O ImageMagick é intencionalmente aberto por padrão, e essa escolha de projeto reflete seu uso principal em ambientes controlados, como contêineres Docker ou outras implantações em sandbox.

O ImageMagick é uma ferramenta que permite manipular imagens. Embora ofereça uma variedade de recursos e capacidades, frequentemente há um equilíbrio entre segurança e conveniência. Para garantir a segurança ideal, você pode restringir o ImageMagick a ler ou gravar apenas formatos de imagem seguros para a web, como GIF, JPEG e PNG. Como alternativa, você pode personalizar a política de segurança para atender às necessidades do seu ambiente local ou às políticas organizacionais. Essa política pode incluir detalhes como limites de uso de memória, caminhos permitidos para leitura e gravação, limites no número de imagens em uma sequência, tempo máximo de execução do fluxo de trabalho, espaço em disco permitido para pixels de imagem, uma frase secreta para conexões remotas e quais coders são permitidos ou negados. Ao personalizar a política de segurança, você pode ajudar a proteger seu ambiente e garantir que o ImageMagick seja um membro responsável do seu sistema local, por exemplo, evitando sobrecargas com imagens grandes.

É importante definir limites no uso de recursos do ImageMagick para evitar situações potencialmente prejudiciais. Por exemplo, se você baixar acidentalmente uma imagem da internet que foi elaborada para gerar uma imagem muito grande (por exemplo, 20000 por 20000 pixels), o ImageMagick pode tentar alocar os recursos necessários (como memória e espaço em disco) e seu sistema pode negar a solicitação ou fazer com que o programa seja encerrado. Como alternativa, seu computador pode ficar temporariamente lento ou sem resposta, ou o ImageMagick pode ser forçado a abortar. Para evitar tais situações, você pode definir limites no arquivo de configuração policy.xml.

Tenha em mente que o que é considerado razoável para um ambiente pode não ser adequado para outro. Por exemplo, você pode ter o ImageMagick em sandbox em um ambiente seguro, enquanto outra pessoa pode usá-lo para processar imagens em um site de acesso público. Ou o ImageMagick pode estar sendo executado em um host com muita memória, enquanto outra instância está sendo executada em um dispositivo com recursos limitados. No caso do host com muita memória, pode fazer sentido permitir o processamento de imagens grandes, mas não no dispositivo com recursos limitados. Se você estiver usando o ImageMagick em um site público, talvez queira aumentar a segurança desativando determinados coders, como MVG ou HTTPS.

Para ajudá-lo a começar, a partir da versão 7.1.1-16, o ImageMagick fornece políticas de segurança que você pode selecionar ao instalar o ImageMagick. Escolha entre:

open
A política padrão para instalações do ImageMagick é a política de segurança open. Essa política foi projetada para uso em ambientes seguros, como aqueles protegidos por firewalls ou dentro de contêineres Docker. Nesse contexto, o ImageMagick desfruta de amplo acesso a recursos e funcionalidades. Essa política oferece opções convenientes e adaptáveis para manipulação de imagens. No entanto, é importante observar que ela pode apresentar vulnerabilidades de segurança em condições menos reguladas. Assim, as organizações devem avaliar minuciosamente a adequação da política open de acordo com seu caso de uso específico e seus pré-requisitos de segurança.
limited
O principal objetivo da política de segurança limited é encontrar um meio-termo entre conveniência e segurança. Essa política envolve a desativação de funcionalidades potencialmente perigosas, como coders específicos como SVG ou HTTP. Além disso, ela estabelece várias restrições sobre a utilização de recursos como memória, armazenamento e tempo de processamento, todos ajustáveis. Essa política se mostra vantajosa em situações em que há necessidade de mitigar a ameaça potencial de manipular imagens possivelmente maliciosas ou exigentes, mantendo ao mesmo tempo as capacidades essenciais para os formatos de imagem mais comuns. secure
Essa política de segurança rigorosa prioriza a implementação de controles rígidos e o uso restrito de recursos para estabelecer um ambiente profundamente seguro ao empregar o ImageMagick. Ela desativa funcionalidades possivelmente perigosas, incluindo coders específicos como SVG ou HTTP. A política promove a adaptação das medidas de segurança para harmonizar com os requisitos do ambiente local e as diretrizes da organização. Esse protocolo abrange detalhes explícitos como limitações no consumo de memória, caminhos autorizados para leitura e gravação, limites em sequências de imagens, a duração máxima permitida dos fluxos de trabalho, alocação de espaço em disco destinado a dados de imagem e até mesmo uma frase secreta não divulgada para conexões remotas. Ao adotar essa política robusta, as entidades podem elevar sua postura geral de segurança e mitigar vulnerabilidades potenciais. websafe
Este protocolo de segurança projetado para uso seguro na web concentra-se em situações em que o ImageMagick é aplicado em contextos de acesso público, como sites. Ele desativa a capacidade de ler ou gravar quaisquer formatos de imagem que não sejam formatos seguros para a web, como GIF, JPEG e PNG. Além disso, essa política proíbe a execução de filtros de imagem e leituras indiretas, impedindo assim possíveis violações de segurança. Ao implementar essas limitações, a política websafe reforça a proteção de sistemas acessíveis ao público, reduzindo o risco de exploração das capacidades do ImageMagick para possíveis ataques.

No Linux, selecione a política com a opção --with-security-policy={open, limited, secure, websafe} do script configure. No Windows, a escolha é apresentada quando você executa o aplicativo de configuração.

Recomendamos que você revise cada regra no seu arquivo de configuração policy.xml. Ajuste os parâmetros de acordo com os requisitos da sua organização. Você pode modificar os formatos de imagem permitidos, definir caminhos específicos e restringir determinadas operações com base nas suas necessidades de segurança. Lembre-se de que personalizar a política de segurança é um equilíbrio delicado entre funcionalidade e segurança. Políticas excessivamente restritivas podem dificultar tarefas legítimas de processamento de imagens, enquanto políticas excessivamente permissivas podem introduzir vulnerabilidades.

Exemplo de Política de Segurança

Aqui está um exemplo de política de segurança:

<?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 neumonics, 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. -->
  <!--  -->
  <!-- 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 -->
  <!--  -->
  <!-- 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="fd:*"/>
  <!-- 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"/>
</policymap>

Para evitar que uma sessão consuma toda a memória disponível ao processar várias sessões ao mesmo tempo, as imagens grandes são armazenadas em cache no disco com esta política. Se uma imagem exceder o limite de disco do cache de pixels, o programa será encerrado. Além disso, um limite de tempo foi definido para evitar que tarefas de processamento sejam executadas por tempo excessivo. Se uma imagem tiver largura ou altura superior a 8192 pixels, ou se uma sequência de imagens tiver mais de 32 quadros, o processamento será interrompido e uma exceção será lançada.

A partir do ImageMagick 7.0.1-8, você pode impedir o uso de qualquer delegate externo ou de todos os delegates externos (definindo o padrão como "*"). Antes dessas versões, você pode usar o domínio coder e definir rights como none e o padrão glob como HTTPS para impedir o uso de delegates externos. Além disso, os usuários ficam impedidos de executar quaisquer filtros de imagem e de realizar leituras indiretas. Se você quiser, por exemplo, ler texto de um arquivo (por exemplo, caption:@myCaption.txt), será necessário desativar essa política de path.

Os padrões glob de política, antes do ImageMagick 7.1.1-16, fazem distinção entre maiúsculas e minúsculas. Para obter o comportamento esperado, os coders e módulos devem estar em maiúsculas (por exemplo, "EPS" e não "eps") ou usar um padrão que não diferencie maiúsculas de minúsculas, como [Pp][Nn][Gg].

Veja o que você pode esperar ao restringir o coder HTTPS, por exemplo:

$ 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 da versão 7.0.4-7 do ImageMagick, você pode negar convenientemente o acesso a todos os delegates e coders externos, exceto a um pequeno subconjunto de tipos de imagem comprovadamente seguros para a web. Por exemplo,

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

A política module habilita ou desabilita um módulo completo tanto para leitura quanto para gravação. Para apenas ler ou gravar um formato de imagem, use a política coder em vez disso. Por exemplo, desabilitamos a leitura de apenas alguns formatos relacionados ao Postscript, porém você ainda pode gravá-los:

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

A partir do ImageMagick 7.0.7-0, você pode alocar o cache de pixels e alguns buffers internos com mapeamento de memória anônimo, em vez de alocá-los a partir do heap. Como consequência, os pixels são inicializados com zero, resultando em uma pequena penalidade de desempenho. Você também pode embaralhar o conteúdo de determinados buffers de memória (requer a versão 7.1.0-38) e arquivos temporários antes de serem liberados ou excluídos. O valor de shred é o número de vezes que o conteúdo será substituído por dados aleatórios. Por exemplo,

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

Por motivos de desempenho, a primeira passagem é rápida, repetindo a sequência aleatória conforme necessário para sobrescrever o conteúdo do buffer ou arquivo. As passagens subsequentes são uma ordem de magnitude mais lentas, mas geram bytes aleatórios criptograficamente fortes para o comprimento do buffer ou arquivo.

Alguns algoritmos de processamento de imagens (por exemplo, a transformada wavelet) podem consumir uma quantidade substancial de memória para serem concluídos. O ImageMagick mantém um pool de memória separado para essas grandes solicitações de recursos e, a partir do 7.0.6-1, permite que você defina um limite máximo de solicitação. Se o limite for excedido, a alocação é, em vez disso, mapeada em memória no disco. Aqui limitamos a solicitação máxima de memória por meio de uma política:

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

A partir da versão 7.0.4-23 do ImageMagick, você pode limitar o número máximo de imagens em uma sequência. Por exemplo, para limitar uma sequência de imagens a no máximo 64 quadros, use:

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

Observe que os valores numéricos nas políticas são de ponto flutuante com um prefixo SI opcional (por exemplo, 10MiB).

Para detalhes adicionais sobre limites de recursos e o arquivo de configuração de política, leia Resources e Architecture.

A partir do ImageMagick 7.0.6-0, você pode definir programaticamente a política de segurança do ImageMagick com SetMagickSecurityPolicy() (MagickCore) ou MagickSetSecurityPolicy() (MagickWand).

A partir da versão 7.0.8-11 do ImageMagick, você pode definir uma política de segurança de módulo. Por exemplo, para impedir a interpretação de Postscript ou PDF, use:

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

A partir da versão 7.0-10-52 do ImageMagick, você pode definir uma política de fonte. Especifique um caminho para uma fonte Unicode que o ImageMagick usará por padrão sempre que o usuário não especificar uma preferência de fonte:

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

Observe que, em padrões glob de caminho de arquivo, use o caractere de barra invertida (\) para escapar caracteres que de outra forma seriam interpretados como caracteres especiais. Por exemplo:

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

Você pode verificar se as alterações da sua política estão em vigor com 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 a política de segredo compartilhado não é listada devido à propriedade stealth.

A Doyensec fornece uma ferramenta de avaliação de políticas que pode ajudá-lo a projetar e auditar sua política de segurança. A ferramenta está em imagemagick-secevaluator.doyensec.com.

Política de Sincronização do Cache de Pixels

Ao gravar pixels de imagem no disco, o ImageMagick primeiro pré-aloca o arquivo de disco, o que é mais rápido do que preencher totalmente o arquivo com zeros. Para melhorar ainda mais o desempenho, o arquivo é mapeado em memória no disco. Isso pode resultar em um aumento de desempenho de até 5 vezes, mas existe a possibilidade de que o arquivo de disco fique sem espaço livre à medida que é preenchido, fazendo com que o sistema operacional (SO) lance um sinal SIGBUS que impede o ImageMagick de continuar. Para evitar a ocorrência de um sinal SIGBUS, use esta política de segurança:

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

Defina como True para garantir que todos os dados da imagem sejam totalmente descarregados e sincronizados com o disco. Há uma penalidade de desempenho, porém os benefícios incluem garantir um arquivo de imagem válido em caso de falha do sistema e o relato antecipado caso não haja espaço em disco suficiente para o cache de pixels da imagem.

Política de Segurança de Configuração Zero

Uma compilação de configuração zero do ImageMagick não permite arquivos de configuração externos. Para definir sua política de segurança, você deve, em vez disso, editar o módulo de origem MagickCore/policy-private.h, adicionar suas declarações de política e, então, compilar a distribuição do ImageMagick. Aqui está um exemplo de política de segurança de configuração zero:

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

Outras Considerações de Segurança

Se você identificar uma vulnerabilidade no ImageMagick, primeiro determine se a vulnerabilidade pode ser mitigada pela política de segurança. O ImageMagick, por padrão, é aberto. Use a política de segurança para adicionar restrições que atendam aos requisitos da sua governança de segurança local. Se você tiver certeza de que a política de segurança não resolve a vulnerabilidade, publique a vulnerabilidade como um aviso de segurança. A maioria das vulnerabilidades é revisada e resolvida em até 48 horas.

Há várias maneiras de manter o ImageMagick mais seguro:

  1. Usar formatos de imagem seguros para a web: limitar o ImageMagick a ler ou gravar apenas formatos de imagem seguros para a web, como GIF, JPEG e PNG, pode ajudar a aumentar a segurança.
  2. Personalizar a política de segurança: você pode personalizar a política de segurança para atender às necessidades do seu ambiente local ou às políticas organizacionais. Essa política pode abranger aspectos como uso de memória, caminhos permitidos para leitura e gravação, o número de imagens permitidas em uma sequência, o tempo máximo que um fluxo de trabalho pode ser executado, a quantidade de espaço em disco permitida para pixels de imagem, uma frase secreta para conexões remotas e quais coders são permitidos ou negados.
  3. Definir limites no uso de recursos: você pode definir limites em recursos como uso de memória, espaço em disco e tempo de execução do fluxo de trabalho para evitar situações potencialmente prejudiciais.
  4. Usar sandboxing: o sandboxing é uma técnica de segurança que permite executar um programa em um ambiente restrito para impedi-lo de acessar informações confidenciais ou fazer alterações no sistema.
  5. Desativar coders potencialmente perigosos: se você estiver usando o ImageMagick em um site público, talvez queira aumentar a segurança desativando determinados coders, como MVG ou HTTPS.
  6. Impedir a execução de filtros de imagem e leituras indiretas: você pode impedir que os usuários executem filtros de imagem e realizem leituras indiretas para aumentar a segurança.
  7. Usar uma versão atual do ImageMagick: é importante usar uma versão atual do ImageMagick para aproveitar as correções e atualizações de segurança mais recentes.