Uma vulnerabilidade crítica no Ruby on Rails poderia permitir que um invasor não autenticado gravasse arquivos arbitrários em um servidor ao enviar um arquivo especialmente preparado, caso o aplicativo processe uploads com o ImageMagick. O Rails divulgou o problema em um comunicado de segurança e lançou correções nas versões 8.1.4.1 e 8.0.5.2.
A falha afeta o Active Storage, o componente de upload de arquivos do Rails. Os aplicativos estão em risco quando usam o ImageMagick para processar uploads, aceitam arquivos de usuários não confiáveis e têm uma política de segurança do ImageMagick que não bloqueia os codificadores relevantes. O Rails observa que as políticas fornecidas pelo Debian e pelo Ubuntu não os bloqueiam.
O risco pode ir além da gravação de arquivos. Aplicativos que usam o serviço Disk do Active Storage armazenam arquivos enviados no servidor, e um invasor também pode conseguir ler arquivos acessíveis ao aplicativo. Entre eles podem estar o secret_key_base do Rails e credenciais de outros sistemas, o que poderia permitir comprometimentos adicionais, incluindo execução remota de código ou acesso a sistemas conectados.
O Rails atribui à vulnerabilidade a nota 9,8 de 10 na escala CVSS. Ela é identificada como GHSA-f3w6-w445-fwh9 e não tem identificador CVE. O problema foi relatado por meio do HackerOne por RyotaK, pesquisador da GMO Flatt Security. O Rails informou que recebeu o relato de uma cadeia de ataque, mas alertou que podem existir outros métodos; o comunicado não afirma se a falha foi explorada.
O caminho vulnerável é acionado quando o Active Storage analisa um upload anexado. Não é necessário gerar uma variante ou pré-visualização, e o aplicativo não precisa chamar o método analyze. De acordo com o commit da correção, um SVG enviado poderia chegar ao codificador MSL do ImageMagick, capaz de ler e gravar arquivos indicados em seu script. O Active Storage não restringia quais codificadores do ImageMagick podiam processar um upload, deixando a política do ImageMagick no servidor como único controle.
Todas as versões do Active Storage anteriores à 8.0.5.2 são afetadas, assim como as versões 8.1 anteriores à 8.1.4.1. O Rails informa que as séries de versões anteriores à 8.0 não têm suporte e não receberão versões corrigidas. A configuração relevante é config.active_storage.variant_processor: :mini_magick usa o ImageMagick, enquanto o padrão depende da configuração load_defaults do aplicativo. Essa configuração também determina qual biblioteca analisa os uploads.
As mesmas versões corrigem uma vulnerabilidade separada do Active Storage, GHSA-v924-7rp8-4mxh, avaliada em 8,8 na escala CVSS. Nesse problema, os uploads eram enviados ao ImageMagick e ao FFmpeg usando nomes de arquivo temporários que mantinham suas extensões, o que poderia permitir que um invasor influenciasse o decodificador usado para processar um arquivo. O Rails informa que as duas versões corrigem 21 problemas de segurança no total.
O Rails recomenda fortemente a atualização. Aplicativos que usam :mini_magick também precisam do mini_magick 5.1 ou posterior; caso contrário, pode ocorrer um erro durante a inicialização. As versões incluem uma política do ImageMagick que bloqueia o MSL, determinados codificadores que podem acessar outros arquivos ou referências, codificadores apoiados pelo Ghostscript e o delegado gs, além da indireção @filename.
Os administradores devem confirmar que o aplicativo carrega a nova política e verificar se uma configuração personalizada do MiniMagick impede que ela entre em vigor. A política complementa, mas não substitui, a política do ImageMagick no servidor; portanto, uma regra existente que permita um codificador pode se sobrepor ao novo bloqueio. A política incluída não protege aplicativos que usam o GraphicsMagick.
Se não for possível atualizar, o Rails recomenda aplicar as regras de política fornecidas à política de sistema do ImageMagick, bloqueando no mínimo o MSL, os codificadores do Ghostscript e o delegado gs. Para aplicativos que usam o serviço Disk, o Rails também aconselha alterar o secret_key_base e todos os outros segredos legíveis pelo aplicativo, incluindo credenciais, senhas de armazenamento e de banco de dados, e tokens de terceiros. O comunicado não fornece um método para determinar se um aplicativo já foi alvo de um ataque.
Fontes: The Hacker News.