Compreender a cobertura de avaliação pela modernização do GitHub Copilot

Este artigo descreve o que a funcionalidade de avaliação de aplicações da modernização do GitHub Copilot pode detetar. A avaliação abrange duas capacidades principais:

  • Deteção de problemas em três domínios críticos para a sua jornada de modernização:

    • Prontidão para a cloud: Identifica 16 categorias de preocupações, incluindo utilização do sistema de ficheiros, gestão de credenciais, serviços de mensagens, ligações à base de dados, lacunas de containerização, gestão de sessões, padrões de comunicação remota e mais.
    • Atualização do Java: Sinaliza versões desatualizadas do Java, frameworks de suporte ao fim do OSS (Spring Boot, Spring Cloud, Jakarta EE), centenas de APIs removidas ou obsoletas, e ferramentas de compilação legadas como o Ant.
    • Security: Detete problemas de segurança de duas formas complementares: conclusões guiadas pela ISO/IEC 5055 CWE no seu código-fonte (vulnerabilidades de injeção, credenciais codificadas fixamente e chaves criptográficas, problemas de sincronização, problemas no ciclo de vida dos recursos e outros CWEs de alto impacto) e vulnerabilidades CVE nas suas dependências diretas e transitivas de terceiros, proveniente da base de dados GitHub Security Advisories.
  • Compreensão da aplicação: para bases de código legadas, a avaliação revela dependências e tecnologias em uso, para que tenhas uma visão clara do que a tua aplicação depende antes de começares a migrar.

As secções seguintes descrevem em detalhe a cobertura das questões para cada domínio.

Domínio: prontidão para a nuvem

Domain Categoria Resumo da deteção Por que é importante
cloud-readiness credential-migration Deteta credenciais AWS codificadas fixamente (aws_access_key_id, aws_secret_access_key), utilização do AWS Secrets Manager e bibliotecas de gestão de segredos embutidas como o Spring Cloud Vault. Segurança: Credenciais codificadas e lojas secretas específicas de fornecedores são altamente vulneráveis. As aplicações cloud-native requerem segurança centralizada baseada em identidade para evitar o roubo de credenciais.
cloud-readiness region-configuration Identifica identificadores de região AWS codificados fixamente (aws.region, AWS_REGION) em ficheiros de código ou de configuração. Portabilidade: A codificação geográfica fixa liga a aplicação à infraestrutura física de um fornecedor específico, dificultando a implementação global e a resiliência.
cloud-readiness storage-migration Detecta o uso do AWS S3 SDK (buckets, objetos, URLs pré-assinados), S3 TransferManager e bibliotecas de cliente do Google Cloud Storage. Fiabilidade e Alinhamento: Estas dependências prendem-no ao armazenamento de objetos de um fornecedor e não funcionam com os serviços nativos de armazenamento da plataforma alvo.
cloud-readiness messaging-service-migration Sinaliza dependências e cadeias de ligação para Amazon SQS/SNS, Kafka, RabbitMQ (AMQP), ActiveMQ (Artemis), IBM MQ, TIBCO EMS, Solace PubSub+, Amazon Kinesis, Apache Pulsar e Google Cloud Pub/Sub. Escalabilidade e Fiabilidade: Os brokers de mensagens legados dependem frequentemente de endpoints fixos e persistência baseada em disco, o que dificulta a escalabilidade horizontal e a elevada disponibilidade em ambientes cloud.
cloud-readiness database-migration Deteta strings de ligação, drivers e definições de timeout para MongoDB, MySQL, PostgreSQL, MSSQL, Cassandra, MariaDB, Oracle, Db2, Sybase ASE, Firebird, SQLite, Google Firestore e Google Cloud Spanner. Fiabilidade: Bases de dados autogeridas ou não nativas não possuem escalabilidade automatizada na cloud. Timeouts embutidos e intervalos fixos para novas tentativas podem causar bloqueios e "tempestades de tentativas de nova execução" durante interrupções parciais.
cloud-readiness file-system-management Identifica a utilização de caminhos relativos ou absolutos, caminhos iniciais (/home/), esquemas file:// e chamadas padrão Java IO/NIO ou Apache Commons IO para acesso local ao armazenamento. Ausência de estado: Os recipientes de nuvem são efémeros. A escrita num sistema de ficheiros local leva à perda de dados ao reiniciar a instância ou operações de escalabilidade; os dados persistentes devem ser externalizados.
cloud-readiness local-credential Sinaliza ficheiros Java KeyStore (.jks), chamadas de método (KeyStore.load) e palavras-passe em texto claro (password, pwd) em ficheiros de propriedades ou XML. Risco de Segurança: Material sensível armazenado em texto claro ou ficheiros locais pode ser facilmente comprometido se indivíduos não autorizados acedirem ao ambiente da aplicação ou aos ficheiros de configuração.
cloud-readiness configuration-management Deteta System.getenv, System.getProperty, ficheiros externos .properties/.xml/.ini e o acesso ao Registo do Windows para as definições da aplicação. Externalização: O armazenamento específico do sistema operativo ou ficheiros locais não são geríveis em larga escala e não podem ser atualizados dinamicamente sem alterações de código em todas as instâncias.
cloud-readiness session-management Identifica o armazenamento de dados em HttpSession objetos e o uso da etiqueta "distributable" em descritores web. Escalabilidade: As sessões HTTP padrão não são adequadas para escalonamento na nuvem; O estado deve ser externalizado para uma cache distribuída para evitar a perda de dados durante as mudanças de tráfego entre instâncias.
cloud-readiness remote-communication Deteta protocolos fortemente acoplados (CORBA, RMI, JCA), protocolos HTTP/FTP não seguros, API Java Mail, uso direto de canais Socket/NIO e URLs codificados fixamente. Compatibilidade e Segurança na Cloud: Interações fortemente acopladas dificultam a escalabilidade. Protocolos não seguros e URLs codificados são vulneráveis e frágeis em ambientes de rede de cloud dinâmicos.
cloud-readiness jakarta-migration Deteta o uso de APIs específicas de Jacarta/Java EE para NoSQL, JPA, Data, WebSockets e JAX-RS, bem como artefactos específicos de servidor provenientes do JBoss EAP, WebLogic ou WebSphere. Suportabilidade: Migrar para um runtime cloud-native requer alinhar-se com os namespaces modernos de Jacarta e remover dependências proprietárias de servidores de aplicações para garantir portabilidade.
cloud-readiness containerization Sinaliza a ausência de um Dockerfile ou instruções problemáticas no Dockerfile como apt-get upgrade, sintaxe minúscula e problemas de espaçamento de sintaxe. Fiabilidade: A padronização nas construções de contentores é necessária para implementações estáveis e reprodutíveis e para garantir que as imagens se comportam de forma previsível em diferentes ambientes.
cloud-readiness scheduled-job-migration Identifica manipuladores AWS Lambda, funções do Google Cloud, dependências do Quartz Scheduler e fluxos de trabalho de processamento do Spring Batch. Alinhamento de Computação em Nuvem: Tarefas agendadas e funções sem servidor devem ser refatoradas para utilizar os modelos de computação event-driven e sem servidor da nuvem alvo, reduzindo a sobrecarga da infraestrutura.
cloud-readiness apm-migration Identifica agentes e bibliotecas APM embutidos para New Relic, Elastic APM e Dynatrace. Observabilidade: Estas ferramentas requerem integração específica com plataforma cloud para capturar corretamente dados de telemetria, latência e saúde num ambiente gerido.
cloud-readiness auth-migration Detecta padrões de autenticação SAML/OpenSAML, OAuth 2.0, OpenID, Spring Security, LDAP e autenticação legada de formulários web. Identidade Moderna: Formulários web legados e autenticação LDAP carecem da flexibilidade e das funcionalidades de segurança (MFA, SSO) dos modernos fornecedores de identidade na nuvem baseados em declarações.
cloud-readiness os-compatibility Identifica dependências de projetos em bibliotecas Dynamic-Link específicas do Windows (ficheiros.dll). Portabilidade: As DLLs são específicas do sistema operativo e não funcionam em ambientes padrão de contentores baseados em Linux. Precisa de as substituir por bibliotecas partilhadas multiplataforma.

Domínio: java-upgrade

Domain Categoria Resumo da deteção Por que é importante
java-upgrade java-version-upgrade Identifica a utilização de versões Java não-LTS (9, 10, 12-16, 19, 20) e versões legadas (1.x a 8 e 11). Segurança e Suporte: Versões mais antigas e não LTS contêm vulnerabilidades conhecidas e carecem de atualizações de manutenção a longo prazo, deixando a infraestrutura exposta a ataques.
java-upgrade framework-upgrade Detete versões do Spring Boot, Spring Cloud, Spring Framework e Jakarta EE que atingiram o fim do suporte OSS. Suportabilidade: Frameworks desatualizados deixam de receber correções de segurança, tornando a aplicação um risco de segurança e incompatível com as ferramentas modernas nativas da cloud.
java-upgrade deprecated-apis Cataloga centenas de APIs removidas ou obsoletas, incluindo sun.misc.BASE64, Thread.stop, SecurityManager métodos e hooks proprietários do JBoss, Seam 2, WebLogic e WebSphere. Estabilidade e Portabilidade: Usar APIs removidas causa crashes em tempo de execução nas JVMs modernas. Ganchos proprietários de fornecedores (como as integrações internas de WebLogic/JBoss) impedem que a aplicação seja portátil em ambientes de execução padrão.
java-upgrade build-tool Identifica sistemas de compilação legados como Ant (build.xml) ou configurações específicas de projetos Eclipse (naturezas WTP/JEM). Automação: As ferramentas legadas carecem das convenções padrão e da gestão de dependências necessárias para uma integração eficiente em pipelines modernos de CI/CD.

Domínio: Segurança (guiado ISO 5055)

O domínio da segurança abrange dois tipos de questões complementares:

  • Conclusões do CWE no seu código-fonte, guiadas pela ISO/IEC 5055.
  • Constatações de CVE nas suas dependências de terceiros, incluindo dependências transitivas.

Cobertura CWE (orientada pela ISO/IEC 5055)

ISO/IEC 5055 é uma norma ISO para medir a estrutura interna de um produto de software com base em quatro fatores críticos para o negócio: Segurança, Fiabilidade, Eficiência de Desempenho e Manutenibilidade. Estes fatores determinam quão fiável, fiável e resiliente é um sistema de software. Em essência, a ISO 5055 destina-se a "encontrar e prevenir os 8% de falhas que causam 90% de problemas de produção". A ISO 5055 identifica os CWEs mais críticos e impactantes sob cada característica de qualidade: Fiabilidade, Desempenho e Eficiência, Segurança e Manutenibilidade. Para a modernização do GitHub Copilot, verifica-se contra os CWEs selecionados relacionados com segurança definidos na ISO 5055, como revela a tabela seguinte.

CWE_ID Título Descrição
CWE-22 Limitação Indevida de um Nome de Caminho a uma Directoria Restrita ('Traversal de Caminho') O produto utiliza entrada externa para construir um nome de caminho destinado a identificar um ficheiro ou diretório dentro de um diretório principal restrito. No entanto, não neutraliza corretamente elementos especiais que podem fazer com que o nome do caminho se resolva fora do diretório restrito.
CWE-23 Percorrido de Caminho Relativo O produto usa entrada externa para construir um nome de caminho dentro de um diretório restrito, mas falha em neutralizar sequências como .., que podem ser resolvidas fora desse diretório.
CWE-36 Percorrida Absoluta do Caminho O produto utiliza entrada externa para construir um nome de caminho dentro de um diretório restrito, mas falha em neutralizar sequências absolutas de caminhos como /abs/path, que podem ser resolvidas fora desse diretório.
CWE-77 Neutralização Inadequada de Elementos Especiais usados num Comando ('Injeção de Comando') O produto constrói um comando usando input influenciado externamente, mas não neutraliza elementos especiais que poderiam modificar o comando pretendido enviado para um componente a jusante.
CWE-78 Neutralização Incorreta de Elementos Especiais usados num Comando do Sistema Operativo ('Injeção de Comandos do SO') O produto constrói um comando do SO usando input influenciado externamente, mas falha em neutralizar elementos especiais que poderiam modificar o comando pretendido do SO enviado para um componente a jusante.
CWE-88 Neutralização incorreta dos delimitadores de argumentos num comando ('injeção de argumento') O produto constrói uma cadeia de comandos para um componente separado, mas não delimita corretamente argumentos, opções ou switches dentro dessa cadeia.
CWE-79 Neutralização Inadequada da Entrada Durante a Geração de Páginas Web ('Cross-site Scripting') O produto falha em neutralizar a entrada controlável pelo utilizador antes de a colocar na saída usada como página web servida a outros utilizadores.
CWE-89 Neutralização Incorreta de Elementos Especiais usados num Comando SQL ('SQL Injection') O produto constrói um comando SQL usando entrada influenciada externamente, mas não neutraliza elementos que poderiam modificar o comando, permitindo que as entradas sejam interpretadas como sintaxe SQL em vez de dados comuns.
CWE-564 SQL Injection: Hibernate Usar o Hibernate para executar instruções SQL dinâmicas construídas com entrada controlada pelo utilizador pode permitir que um atacante modifique o significado da instrução ou execute comandos SQL arbitrários.
CWE-90 Neutralização Incorreta de Elementos Especiais usados numa Consulta LDAP ('Injeção LDAP') O produto constrói uma consulta LDAP usando input influenciado externamente, mas falha em neutralizar elementos que poderiam modificar a consulta pretendida enviada para um componente a jusante.
CWE-91 Injeção XML (também conhecida como Blind XPath Injection) O produto não neutraliza corretamente elementos especiais usados em XML, permitindo que os atacantes modifiquem a sintaxe, o conteúdo ou os comandos antes do processamento.
CWE-99 Controlo inadequado dos identificadores de recursos ('injeção de recursos') O produto recebe input mas não o restringe corretamente antes de o usar como identificador para um recurso fora da esfera de controlo pretendida.
CWE-130 Tratamento incorreto da inconsistência dos parâmetros de comprimento O produto analisa uma mensagem ou estrutura formatada, mas lida incorretamente com um campo de comprimento que é inconsistente com o comprimento real dos dados associados.
CWE-259 Utilização de Palavra-passe Codificada Fixa O produto contém uma palavra-passe codificada diretamente usada para a sua própria autenticação de entrada ou comunicação de saída com componentes externos.
CWE-321 Utilização de Chave Criptográfica Codificada Fixamente O produto utiliza uma chave criptográfica codificada fixamente e inalterável.
CWE-434 Upload Irrestrito de Ficheiro com Tipo Perigoso O produto permite o carregamento de tipos de ficheiros perigosos que são automaticamente processados no seu ambiente.
CWE-456 Falta de Inicialização de uma Variável O produto não inicializa variáveis críticas, fazendo com que o ambiente de execução utilize valores inesperados.
CWE-457 Utilização da variável não inicializada O código utiliza uma variável que não está inicializada, levando a resultados imprevisíveis ou não intencionais.
CWE-477 Utilização de Função Obsoleta O código utiliza funções obsoletas ou depreciadas, sugerindo que não é gerido ativamente.
CWE-502 Desserialização de Dados Não Confiáveis O produto desserializa dados não confiáveis sem garantir suficientemente que os dados resultantes são válidos.
CWE-543 Utilização do Padrão Singleton sem Sincronização num Contexto Multifios O produto utiliza o padrão singleton para criar um recurso num ambiente multithread sem sincronização adequada.
CWE-567 Acesso Não Sincronizado a Dados Partilhados num Contexto Multithread O produto falha em sincronizar devidamente os dados partilhados, como variáveis estáticas, entre threads, levando a comportamentos indefinidos.
CWE-570 A Expressão é Sempre Falsa O produto contém uma expressão que é sempre avaliada como falsa.
CWE-571 A expressão é sempre verdadeira O produto contém uma expressão que é sempre avaliada como verdadeira.
CWE-606 Entrada não verificada para condição do ciclo O produto não verifica corretamente as entradas usadas para condições de repetição, podendo levar a uma negação de serviço devido a repetições excessivas.
CWE-643 Neutralização Incorreta de Dados em Expressões XPath ('Injeção XPath') O produto utiliza entrada externa para construir dinamicamente uma expressão XPath para uma base de dados XML, mas não consegue neutralizar essa entrada.
CWE-652 Neutralização Incorreta de Dados dentro das Expressões XQuery ('Injeção XQuery') O produto utiliza entrada externa para construir dinamicamente uma expressão XQuery, mas não consegue neutralizar corretamente essa entrada.
CWE-662 Sincronização Incorreta O produto permite que múltiplas threads ou sistemas acedam a um recurso partilhado sem a devida sincronização, podendo causar problemas de acesso simultâneo.
CWE-665 Inicialização incorreta O produto não inicializa nem inicializa incorretamente um recurso, podendo deixá-lo num estado inesperado quando acedido.
CWE-667 Bloqueio Incorreto O produto não adquire ou liberta corretamente um bloqueio num recurso, levando a alterações de estado inesperadas.
CWE-672 Operação num recurso após expiração ou libertação O produto acede ou opera num recurso após este expirar, ter sido lançado ou revogado.
CWE-681 Conversão Incorreta entre Tipos Numéricos Os dados podem ser omitidos ou convertidos em valores inesperados durante a conversão de tipos, o que pode ser perigoso se usados em contextos sensíveis.
CWE-682 Cálculo incorreto O produto realiza um cálculo que gera resultados incorretos que são posteriormente usados em decisões críticas para a segurança ou na gestão de recursos.
CWE-732 Atribuição de Permissão Incorreta para Recursos Críticos As permissões para um recurso crítico de segurança são especificadas de forma a permitir que atores não intencionais o leiam ou modifiquem.
CWE-772 Falha na liberação de recurso após o término da sua vida útil O produto não liberta um recurso depois de a sua vida útil efetiva terminar e já não ser necessário.
CWE-775 Falta de Libertação do Descritor ou Identificador do Ficheiro após o seu Tempo de Vida Útil Efetivo O produto não liberta um descritor de ficheiro ou handle depois de estes já não serem necessários.
CWE-778 Registo insuficiente de logs O produto não regista um evento crítico de segurança ou omite detalhes importantes durante o registo.
CWE-783 Erro de Lógica de Precedência de Operador Uma expressão usa lógica incorreta causada pela precedência do operador.
CWE-789 Alocação de Memória com Valor de Tamanho Excessivo O produto aloca memória com base num valor de tamanho grande e não confiável, sem garantir que está dentro dos limites esperados.
CWE-798 Utilização de Credenciais Codificadas Fixas O produto contém credenciais codificadas de forma rígida, como uma palavra-passe ou chave criptográfica.
CWE-820 Sincronização em falta O produto utiliza um recurso partilhado em simultâneo sem tentar sincronizar o acesso.
CWE-821 Sincronização Incorreta O produto utiliza um recurso partilhado em simultâneo, mas não sincroniza corretamente o acesso.
CWE-835 Loop com Condição de Saída Inacessível ('Loop Infinito') O produto contém uma iteração ou ciclo com uma condição de saída que não pode ser alcançada.
CWE-611 Restrição Imprópria da Referência de Entidade Externa XML O produto processa documentos XML contendo entidades com URIs que se resolvem fora da esfera de controlo pretendida.
CWE-1057 Operações de Acesso a Dados Fora do Componente Esperado do Gestor de Dados O produto realiza operações de acesso a dados que contornam um componente dedicado e central de gestão de dados exigido pelo design.

Cobertura CVE (dependências de terceiros)

A modernização do GitHub Copilot analisa as dependências Java diretas e transitivas do seu projeto em busca de vulnerabilidades conhecidas publicadas na base de dados GitHub Security Advisories. A varredura transitiva está ativada por defeito – as vulnerabilidades em dependências indiretas (por exemplo, uma CVE em netty incluída pelo seu cliente HTTP) são apresentadas juntamente com as CVEs nas bibliotecas de que depende diretamente.

Cada conclusão de CVE inclui o identificador de CVE publicado, a coordenada de dependência afetada, o intervalo de versões vulneráveis, a versão fixa (quando disponível) e a gravidade do aviso. Pode configurar a severidade mínima do CVE para que apareça - critical, high, medium, ou low - através da configuração de avaliação. O padrão é high, pelo que, por defeito, apenas os CVEs high e critical aparecem no relatório.

Passos seguintes