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.
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
- Products.CMFEditions: falta de declarações de segurança nas classes de modificadores do CMFEditions (crítica)
- Products.CMFPlone: declarações allow_module amplas demais expõem nomes importados ao código restrito (crítica)
- Products.MimetypesRegistry: fuga da sandbox do Python restrito via allow_module (crítica)
- plone.batching: fuga da sandbox do Python restrito via allow_module (crítica)
- plone.restapi: código restrito pode contornar permissões via json.dump/json.load (média)
Os números CVE já foram pedidos e serão adicionados aos alertas assim que forem atribuídos.
Como corrigir
Há duas opções:
- Plone 6.0, 6.1 e 6.2: atualize os pacotes para as versões listadas abaixo. Esta é a forma recomendada.
- 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.1Plone 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.8Plone 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.8Se 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].

