Correção de segurança do Plone 20261110: execução remota de código

Uma cadeia de falhas permite que um visitante anônimo execute código no servidor. Atualize agora: o Plone 6.2.3 e o Plone 6.1.6 já estão disponíveis com todas as correções, e um hotfix protege as versões de 4.3 a 6.2.

plone-banner.png

Em nome do Plone/Zope Security Team, foram lançadas hoje as correções para uma vulnerabilidade de execução remota de código no Plone, anunciada na semana passada (veja o pré-anúncio).

Todas as versões do Plone com suporte são afetadas: 6.0, 6.1 e 6.2. As versões mais antigas também, pelo menos desde o Plone 4.3.

Atualize agora. Os detalhes são públicos a partir de hoje, e com as ferramentas de inteligência artificial atuais pode não demorar para alguém transformá-los num exploit funcional.

Já estão disponíveis o Plone 6.2.3 e o Plone 6.1.6, com todas as correções. Não são versões só de segurança: trazem também correções de bugs.

Qual é o problema?

É uma cadeia de falhas que, juntas, permitem que um visitante anônimo execute código no servidor:

  • Products.CMFEditions: os modificadores condicionais do portal_modifier não tinham declarações de segurança. Um visitante anônimo podia alterar a condição TALES de um modificador e depois executá-la. Essa condição também é avaliada quando um editor salva um conteúdo versionado, então, sozinha, essa falha já permite que um atacante execute código com os privilégios desse editor.
  • Products.CMFPlone, Products.MimetypesRegistry e plone.batching abriam módulos inteiros ao código restrito com allow_module. Isso também expunha tudo o que esses módulos importam e permitia que o código restrito (expressões TALES, Python Scripts) escapasse da sandbox e chegasse a módulos como o os.
  • plone.restapi abria ao código restrito o módulo json da biblioteca padrão. Algumas de suas funções podiam ser usadas para chamar métodos protegidos de qualquer objeto, sem a permissão necessária.

A falha foi relatada por Mokrane ABDELMALEK, pelo programa de divulgação de vulnerabilidades (VDP) da Universidade de Gante. O time agradece também a Andreas Jung, que contribuiu com ideias sobre o que deveria ser corrigido.

Alertas de segurança

Os números CVE já foram pedidos e serão adicionados aos alertas assim que forem atribuídos.

Como corrigir

Há duas opções:

  1. Plone 6.0, 6.1 e 6.2: atualize os pacotes para as versões listadas abaixo. Esta é a forma recomendada.
  2. Qualquer versão do Plone, da 4.3 à 6.2: instale o pacote de hotfix Products.PloneHotfix20261110. Com versões antigas do setuptools, do buildout ou do pip, talvez seja preciso escrever o nome como products-plonehotfix20261110.

Depois, reinicie todas as instâncias do Zope.

A medida de contorno do pré-anúncio, bloquear no servidor web todas as URLs que contêm portal_modifier, continua sendo uma boa ideia. Você pode mantê-la depois de atualizar.

Versões dos pacotes

As versões abaixo estão na notação do Buildout. Num arquivo de constraints do pip, use dois sinais de igual, por exemplo Products.CMFPlone==6.2.3.

Plone 6.2:

Products.CMFPlone = 6.2.3
Products.CMFEditions = 5.0.2
Products.MimetypesRegistry = 4.0.2
plone.batching = 3.0.3
plone.restapi = 10.2.1

Plone 6.1:

Products.CMFPlone = 6.1.6
Products.CMFEditions = 4.0.7
Products.MimetypesRegistry = 3.0.2
plone.batching = 2.0.8
plone.restapi = 9.15.8

Plone 6.0:

Products.CMFPlone = 6.0.16
Products.CMFEditions = 4.0.7
Products.MimetypesRegistry = 3.0.2
plone.batching = 2.0.8
plone.restapi = 9.15.8

Se você não usa o plone.restapi, pode deixá-lo de fora.

Hotfix

O hotfix Products.PloneHotfix20261110 funciona no Plone 4.3, 5.0, 5.1, 5.2, 6.0, 6.1 e 6.2, com Python 2.7 e Python 3. As instruções de instalação estão na página dele no PyPI.

Com as versões corrigidas de todos os pacotes acima, o hotfix não é necessário, mas também não faz mal.

O Plone 5.2 e as versões anteriores estão sem suporte de segurança há vários anos. Por causa da gravidade, o time abriu uma exceção para esta correção. Se você ainda usa uma dessas versões, seu site provavelmente tem outras vulnerabilidades conhecidas, e o melhor é migrar logo para o Plone 6.

Verifique se o seu site foi atacado

Uma condição de modificador alterada continua no banco de dados, mesmo depois de instalar a correção. Por isso, faça a verificação, principalmente se você não bloqueou o portal_modifier antes de hoje:

  • Com o Products.CMFEditions atualizado: entre como Manager e acesse @@check-modifier-conditions na raiz do site Plone, por exemplo https://example.org/@@check-modifier-conditions. A página compara as condições do portal_modifier com os valores padrão e permite reverter as que foram alteradas.
  • Com o hotfix: ao iniciar, o hotfix confere as condições de todos os sites Plone. Se alguma for diferente do padrão, ele registra no log um aviso com POSSIBLE ATTACK: MODIFIED VERSIONING CONDITIONS FOUND. Caso contrário, registra No changed modifier conditions found.

Uma diferença não significa necessariamente que o site foi atacado. Os valores padrão mudaram um pouco ao longo do tempo, então o seu site pode ter um padrão antigo; ou um add-on ou um administrador pode ter alterado a condição por um bom motivo. Mas, se você não reconhece a condição, trate o servidor como comprometido.

Possíveis incompatibilidades

Agora o código restrito só pode importar desses módulos os nomes de que o próprio Plone precisa. Se os seus Python Scripts ou templates importam outros nomes de Products.CMFPlone, Products.CMFPlone.utils, Products.CMFPlone.browser.navtree, OFS.ObjectManager, Products.MimetypesRegistry.common ou plone.batching, eles passam a receber um erro Unauthorized. Com o plone.restapi atualizado, o mesmo vale para qualquer coisa do módulo json. O hotfix ainda permite json.dumps e json.loads.

Para resolver, declare os nomes de que você precisa no seu próprio add-on, por exemplo:

from AccessControl import ModuleSecurityInfo

ModuleSecurityInfo("json").declarePublic("dumps", "loads")

Nunca use allow_module para isso.

Dúvidas

Se tiver problemas na instalação ou notar regressões, responda à discussão no fórum da comunidade.

Para perguntas que envolvam informações sensíveis, ou se encontrar outros problemas de segurança, escreva para o Plone/Zope Security Team em [email protected].