flawopen.com/Teardowns/cve-2026-63277-libreoffice-calc-jdbc-classpath-rce
CVE-2026-63277: execução Java ao abrir planilha Calc
Um documento Calc preparado para isso podia usar um vínculo de dados externos para fazer o LibreOffice resolver uma classe de driver JDBC em um caminho Java não local quando alguém abria a planilha. O LibreOffice 26.2.5 e 26.8.0 passaram a aceitar apenas entradas de class path com esquema file; é necessária a interação de quem abre o documento, portanto não é uma falha de rede zero-click.[1], [2], [3]
Uma planilha pode guardar uma indicação de onde o programa deve buscar um driver de banco de dados. Antes da correção, essa indicação podia apontar para um endereço remoto, e o programa podia carregar código Java dali quando alguém abrisse o arquivo. A correção aceita somente endereços com o esquema file:. Isso restringe o caminho, mas o rótulo por si só não prova que todo destino seja fisicamente local.[1], [4], [5]
Conceitos Centrais e Termos
Vínculo de dados externos- Configuração do Calc que descreve como a planilha se conecta a uma fonte de dados externa.[1]
Driver JDBC- Software Java que permite que um aplicativo se comunique com um banco de dados.[1]
Mapeamentos de frameworks
- Referência CWE para a fraqueza descrita neste guia: CWE-829
Análise de Causa Raiz
O caminho vulnerável jvmaccess::ClassPath::translateToUrls expandia cada entrada de class path Java e a passava ao construtor de URL do Java sem restringir primeiro o esquema. O código 26.2.5.2 acrescenta a análise do URI e rejeita entradas cujo esquema não seja file antes de construir o URL Java. O aviso do fornecedor relaciona esse caminho aos vínculos de dados externos do Calc e ao carregamento de drivers JDBC. A exploração exige que alguém abra um documento preparado; as fontes citadas não comprovam alcance zero-click nem exploração ativa. A proteção verifica especificamente o esquema: não a descreva como política geral de autorização nem afirme que ela rejeita todo compartilhamento remoto de arquivos.[1], [4], [5]
CVE-2026-63277: quando um documento Calc aciona o carregamento Java
| Verificação | Condição afetada ou comportamento confirmado | Ação defensiva |
|---|---|---|
| Entrada controlada pelo documento | O vínculo de dados externo do documento pode definir o caminho de class path usado para o driver JDBC. | Trate documentos e vínculos de origem não confiável como entrada não confiável; atualize para uma versão corrigida. |
| Interação do usuário | Uma pessoa precisa abrir o documento para alcançar o caminho de carregamento descrito pelo fornecedor. | Não apresente como zero-click; avalie controles de recebimento e abertura de documentos. |
| Limite da correção | A checagem de esquema não demonstra que cada destino file: esteja no disco local nem que compartilhamentos de rede sejam recusados. | Descreva a correção como validação do esquema; não atribua a ela uma garantia mais ampla de autorização ou localidade. |
Fluxo de Ataque Passo a Paso
O class path Java é convertido em URLs
Antes da correção, translateToUrls passava uma entrada expandida ao construtor de URL do Java sem verificar se o esquema era de arquivo local.[4]
Código-Fonte: Vulnerável vs. Seguro
Estes trechos concisos vêm da implementação upstream de translateToUrls nas versões fixadas. A versão 26.2.4.2 expande a entrada e segue diretamente para criar um URL Java. A versão 26.2.5.2 insere a análise do URI e rejeita esquemas diferentes de file antes dessa criação. O diff demonstra a validação do esquema; o aviso do fornecedor confirma o caminho por documentos Calc/JDBC. É uma análise do código-fonte, não uma prova de conceito executável.[4], [5], [1]
Trecho de origem: jvmaccess/source/classpath.cxx — função translateToUrls
// LibreOffice 26.2.4.2 — jvmaccess/source/classpath.cxx (versão vulnerável)
if (!url.isEmpty()) {
css::uno::Reference< css::uri::XVndSunStarExpandUrlReference >
expUrl(
css::uri::UriReferenceFactory::create(context)->parse(url),
css::uno::UNO_QUERY);
if (expUrl.is()) {
css::uno::Reference< css::util::XMacroExpander > expander =
css::util::theMacroExpander::get(context);
try {
url = expUrl->expand( expander );
} catch (const css::lang::IllegalArgumentException & e) {
css::uno::Any anyEx = cppu::getCaughtException();
throw css::lang::WrappedTargetRuntimeException(
"com.sun.star.lang.IllegalArgumentException: "
+ e.Message,
nullptr, anyEx );
}
}
jvalue arg;
arg.l = environment->NewString(
reinterpret_cast< jchar const * >(url.getStr()),
static_cast< jsize >(url.getLength()));
if (arg.l == nullptr) {
return nullptr;
}
jobject o(environment->NewObjectA(classUrl, ctorUrl, &arg));
if (o == nullptr) {
return nullptr;
}
urls.push_back(o);
}
// LibreOffice 26.2.5.2 — jvmaccess/source/classpath.cxx (versão corrigida)
if (!url.isEmpty()) {
css::uno::Reference< css::uri::XVndSunStarExpandUrlReference >
expUrl(
css::uri::UriReferenceFactory::create(context)->parse(url),
css::uno::UNO_QUERY);
if (expUrl.is()) {
css::uno::Reference< css::util::XMacroExpander > expander =
css::util::theMacroExpander::get(context);
try {
url = expUrl->expand( expander );
} catch (const css::lang::IllegalArgumentException & e) {
css::uno::Any anyEx = cppu::getCaughtException();
throw css::lang::WrappedTargetRuntimeException(
"com.sun.star.lang.IllegalArgumentException: "
+ e.Message,
nullptr, anyEx );
}
}
css::uno::Reference< css::uri::XUriReference > uriRef(
css::uri::UriReferenceFactory::create(context)->parse(url));
if (!uriRef.is() || !uriRef->getScheme().equalsIgnoreAsciiCase("file"))
{
throw css::lang::IllegalArgumentException(
"non-local Java class path entry: " + url,
css::uno::Reference< css::uno::XInterface >(), 0);
}
jvalue arg;
arg.l = environment->NewString(
reinterpret_cast< jchar const * >(url.getStr()),
static_cast< jsize >(url.getLength()));
if (arg.l == nullptr) {
return nullptr;
}
jobject o(environment->NewObjectA(classUrl, ctorUrl, &arg));
if (o == nullptr) {
return nullptr;
}
urls.push_back(o);
}
Lista de Verificação de Segurança para Engenharia
- ✓Atualize para LibreOffice 26.2.5 ou posterior na linha 26.2, ou 26.8.0 ou posterior na linha 26.8; confirme a versão do pacote da sua distribuição e eventuais backports.[1], [2]
- ✓Inventarie fluxos que abrem documentos Calc de fontes não confiáveis e vínculos externos que dependem de drivers JDBC.
- ✓Adicione um teste de regressão que confirme que esquemas de class path diferentes de
filesão rejeitados antes da criação de URL Java e que entradas locais suportadas continuam funcionando.[5] - ✓Não trate avisos de macro como defesa para este caminho de class path Java; avalie separadamente a abertura de documentos e a configuração de Java.[1]
- ✓O aviso da Apache informa que o LibreOffice reportou o mesmo problema como
CVE-2026-63277, enquanto o Apache OpenOffice o acompanha comoCVE-2026-59265. Confirme as versões afetadas/corrigidas e a mitigação próprias do AOO; não reutilize as versões do LibreOffice.[8], [1] - ✓Não reproduza em testes o documento divulgado nem o payload Java remoto; use uma asserção controlada e não executável sobre a validação do esquema.[1]