Ruby e regex dinâmica: timeout não corrige corrupção na compilação
As correções do Onigmo exigem olhar além de ReDoS e GitLab. A entrada perigosa é o próprio padrão controlado por terceiros.
Ruby 4.0.9, 3.4.12 e 3.3.13 corrigem três problemas de corrupção de memória no Onigmo associados a quatro vulnerabilidades críticas divulgadas pelo GitLab.[4] A condição relevante é compilar expressões regulares a partir de texto controlado por um atacante, não simplesmente executar padrões fixos definidos pela equipe.[4]
Essa distinção muda a triagem. Se a investigação começa e termina na busca por correspondências lentas, ela pode deixar de fora o momento em que o padrão é construído. O problema descrito exige separar segurança da compilação e custo de execução.
O que muda para quem desenvolve
As falhas ocorrem na compilação do padrão; por isso, Regexp.timeout não resolve esses bugs e limitar o tamanho da expressão não é uma defesa confiável.[4] Ruby 4.0.8 ainda não contém uma das correções, enquanto os ramos 3.2 e anteriores não receberão a atualização mencionada.[4]
Minha análise: uma funcionalidade de filtro configurável deve ser tratada como processamento de linguagem fornecida por terceiros. É diferente de receber um texto e compará-lo com uma expressão previamente revisada. A origem do padrão importa tanto quanto a origem do conteúdo pesquisado.
Como aplicar
Procure os pontos que constroem regex dinamicamente. Para cada um, registre de onde vem o padrão: usuário, arquivo de configuração, integração ou código da aplicação. Verifique também quem consegue modificar uma configuração que parecia confiável.
Um experimento seguro é escrever testes de contrato para essa fronteira, sem cargas de exploração. Um caso deve demonstrar que uma busca literal permanece literal; outro deve mostrar como o sistema trata um padrão inválido quando regex é uma função intencional. O teste não prova ausência da vulnerabilidade, mas ajuda a localizar responsabilidades e preservar comportamento durante a atualização.
Atualize o runtime pela distribuição efetivamente usada e confirme a versão dentro do processo ou imagem implantada. Para GitLab autogerenciado, confira a versão do pacote completo: a reportagem informa que as versões corrigidas do produto já incorporam o Ruby ajustado.[4] Não presuma que atualizar uma instalação Ruby separada modifica a instalação embutida no serviço.
Cuidados e limites
Naquele momento, Ruby não havia solicitado CVEs próprios e orientava acompanhar os identificadores do GitLab, o que poderia dificultar a detecção por scanners de outras aplicações Ruby.[4]
Não confunda ausência de correspondência no scanner com prova de correção. Também não declare toda utilização de regex vulnerável sem verificar a condição de compilação dinâmica. Se decidir retirar a capacidade de escrever padrões arbitrários, explicite a perda funcional e ofereça filtros mais restritos. Segurança que muda a semântica de busca sem avisar apenas desloca o problema para a operação.
Fonte
[4] Fonte: The Hacker News