Tá, mas e se eu contar pra vocês que nos últimos dias tá rolando uma história de intriga digna de filme de espionagem, tudo em torno de uma tentativa de invadir máquinas no mundo todo?
Vem na thread que vou te explicar. 🧵 #bolhasec
O "xz" é uma aplicação de compressão usada em várias distros linux. Ele em geral atinge taxas de compressão menores que o tradicional gzip, ao custo de usar mais memória, então ele vem sendo escolhido pra cada vez mais aplicações. Até aí tudo ótimo.
O xz, como várias ferramentas Linux, oferece suas funcionalidades tanto como uma aplicação de terminal quanto uma biblioteca que pode ser consumida por outras aplicações - nesse caso a liblzma, nomeada pelo algoritmo LZMA que o xz usa.
O problema foi descoberto ontem - com uma postagem na lista de emails "oss-security" feita pelo @AndresFreundTec, um dev do PostgreSQL. O Andres começou a perceber lentidão em sessões SSH no Debian Linux e foi investigar. O que ele não esperava era encontrar um backdoor.
@AndresFreundTec A versão 5.6.0 do xz introduziu uma mudança que é injetada, aparentemente, SÓ nos releases. O código malicioso não está no repo - ele é injetado apenas na hora de gerar o release, o que torna ele mais difícil de detectar.
@AndresFreundTec A alteração injetada consiste em uma única linha no script "configure" () que, por sua vez, altera o Makefile do projeto. A alteração no Makefile, por sua vez, descomprime e executa um dos arquivos na pasta tests do projeto.salsa.debian.org/debian/xz-util…
@AndresFreundTec Aqui vale um parêntese: Como o xz é uma aplicação de compressão, tem vários arquivos comprimidos na pasta tests pra testar vários casos de descompressão.
@AndresFreundTec Esse arquivo foi adicionado como se fosse um teste normal, mas ele continha código bash comprimido que o código adicionado no Makefile descomprime e executa.
@AndresFreundTec Tem mais alguns passos no meio pra dificultar entender o que está acontecendo, mas o efeito final é: Se o build do xz estivesse rodando em uma máquina Debian ou sendo iniciado pelo gerenciador de pacotes RPM, ele linkava uma versão modificada do código da liblzma.
@AndresFreundTec Nesse código, algumas funções relacionadas com checagens de integridade foram alteradas para modificar dinamicamente a função RSA_public_decrypt caso ela fosse chamada.
@AndresFreundTec Essa função *não existe* no código da liblzma - ao invés disso, ela é usada (a partir do OpenSSL) pelo SSH no Debian na autenticação da conexão.
@AndresFreundTec Ou seja - uma alteração é injetada de forma extremamente circuitosa para no final afetar binários do SSH que usam compressão xz no Debian, e provavelmente permitir invasão de máquinas e execução remota de código. E é esse o backdoor que o Andres encontrou.
@AndresFreundTec Vocês podem ver a notificação completa sobre o backdoor aqui: . Também recomendo se vocês tiverem o xz versão 5.6.x instalado em qualquer máquina, vocês atualizarem imediatamente.
@AndresFreundTec Bom, vou introduzir o segundo personagem da nossa história: O "Jia Tan", um contribuidor frequente do xz. Como vocês podem ver aqui, ele vinha contribuindo para o xz desde o fim de 2022. 13/20 play.clickhouse.com/play?user=play…
O Jia Tan, sob seu usuário do GitHub JiaT75, introduziu os commits com o backdoor no projeto. Mas após o backdoor ter sido descoberto, também foi descoberto que ele fez muito mais do que só isso. 14/20
Por exemplo, nosso hacker também contribuía para o projeto "xz-java" e ele adicionou o seguinte aviso (traduzido por mim):
"Se você descobrir uma vulnerabilidade de segurança neste projeto, por favor a reporte em privado. (...) Não crie um issue público".
Lendo entre as entrelinhas e agora sabendo do contexto, podemos entender como: "Me garanta tempo para ajustar meus exploits e tornar eles mais difíceis de achar".
Além disso, alguns mantenedores de distribuições Linux vieram a público dizer que essa pessoa estava em contato com eles, buscando convencê-los a atualizar tão rapidamente quanto possível para versões 5.6.x do xz pois "tinha muitas features novas incríveis".
Então é essa a situação: Temos uma pessoa que se infiltrou num projeto open-source, ganhando confiança por mais de um ano e adicionando vários arquivos binários ao projeto. Essa pessoa então usou a confiança vinda disso pra tentar acelerar a adoção do seu backdoor.
No final, terminamos com mais perguntas do que começamos: Quem é Jia Tan? Em algum momento a conta foi legítima e ela foi comprometida ou sempre foi um ator malicioso? O que mais ele pode ter escondido no xz nos mais de 12 meses que passou no projeto?
E talvez a pergunta mais importante: Quais são os interesses por trás disso?
Além disso: será que o código no backdoor realmente afeta só o SSH ou há outras funcionalidades ainda não descobertas? Eu pretendo seguir acompanhando essa história nos próximos dias.
• • •
Missing some Tweet in this thread? You can try to
force a refresh
A @rinhadebackend acabou de terminar, então em homenagem a todos os envolvidos nessa iniciativa FODA vou falar de algo que muita gente desligou pra ter menos latência (😏), e sobre por que você não deve fazer isso num sistema real.
Isso mesmo, vamos falar de garantias ACID! 🧵
Primeiramente, o que significa ACID?
ACID é uma sigla que se refere às 4 garantias que um banco de dados SQL te dá em relação a transações:
Atomicidade
Consistência
Isolamento
Durabilidade
E o que é cada uma dessas? 1/35
A garantia de *atomicidade* (que não tem nada a ver com átomos - vem de átomo no sentido de "indivisível") significa que cada transação que você faz no banco ou tem sucesso completo ou falha por inteiro. 2/35
O sistema operacional é um "cara" com quem a gente já tá tão acostumado a interagir que é fácil até esquecer que ele tá lá, rodando o código. Vamo falar um pouco sobre a história dos SOs e o que, de fato, eles fazem. 🧵
Pra começo de história, por que se chama "sistema operacional"? Esse termo é uma tradução do inglês "operating system", que também poderia ser traduzido como "sistema operante" ou "sistema operador". E esse último termo é o mais interessante. (1/21)
Uma coisa que nem todo mundo sabe é que antes dos SOs existirem, um computador era "operado" por humanos. E o que era essa "operação"? (2/21)
Uma coisa que eu falo muitas vezes e que causa alguma polêmica é que C não é uma linguagem de baixo nível. Mas por que eu insisto nisso? É porque é vital pra entender linguagens compiladas. Segue aqui no fio pra entender. 🧵
Vamos começar com um problema "filosófico": Qual é o *significado* de um programa? I.e., dado o *texto* de um programa, como podemos saber o que aquele programa vai fazer? (1/33)
Para conseguirmos ter essa resposta, precisamos que a linguagem que estamos usando nos forneça um *modelo de computação*, i.e. um algoritmo que transforma (Texto do Programa) -> (Comportamento). (2/33)
Volta e meia o pessoal que tem interesse na linguagem me pede ajuda pra achar vagas com Elixir. Essa semana foi boa em termos de vagas aparecendo na comunidade, então decidi trazer aqui caso alguém tenha interesse 👇🧵 #MyElixirStatus
Talvez você já tenha ouvido falar que "No Linux tudo é um arquivo". Mas o que exatamente é que isso significa, na prática? 🤔
A questão aí é que "arquivo" no Linux não significa exatamente o que a maioria das pessoas pensa quando pensa em "arquivo". Quer entender melhor? 👇🧵
Quando pensamos em "arquivo", a maioria das pessoas pensa em algo como um arquivo de texto, ou um vídeo, ou um PDF. O que é que todas essas coisas têm em comum? Bom, eles são todos sequências de bytes salvas em alguma forma de armazenamento durável.
Só que quando um programa chega a lidar com um arquivo, não importa muito pro programa a parte do "armazenamento durável". O sistema operacional, em geral, cuida da parte de lidar com o armazenamento, qual quer que ele seja, e o programa só vê a parte de ler e escrever bytes.
A pedidos, eu vou fazer a coisa que avisam todo dev Haskell pra nunca tentar fazer: Eu vou tentar explicar o que é uma Monad. E eu juro que não é tão complicado assim. (Imagem por @impurepics) 🧵(1/21)
Até hoje, o jeito melhor jeito de explicar Monads que eu já vi é com exemplos. E o primeiro exemplo que eu queria dar é o de Promises em JS. Promises em JS não são *exatamente* Monads, mas são o mesmo conceito geral. Já explico. (2/21)
Quando vc usa uma função que retorna uma Promise em JS, recebe um valor que representa que "em algum momento no futuro você terá um valor". Você não pode acessar esse valor diretamente porque ele pode não estar definido ainda, então como você acessa ele? Com um callback. (3/21)