- Após o copy.fail, foram divulgadas vulnerabilidades adicionais no kernel Linux
- No momento, este é considerado um período em que um ataque à cadeia de suprimentos do NPM pode causar grandes danos
- Há a recomendação de tratar como exceção os patches do kernel Linux fornecidos pela distribuição
- Fora isso, é melhor suspender a instalação de novos softwares por cerca de uma semana
- Há uma observação de que, desde a publicação, os fatos ou a situação podem ter mudado, e que qualquer ponto que pareça incorreto ou pouco claro deve ser comunicado antes de se chegar a uma conclusão
1 comentários
Comentários do Hacker News
Isso sempre foi um pesadelo inevitável. O número de pacotes cresceu demais e, com isso, a superfície de ataque da cadeia de suprimentos ficou tão grande que era só questão de tempo até isso estourar para todo mundo
Mas era conveniente demais. Quem tentava alertar ou reduzir o risco era ignorado por pessoas que nunca experimentaram fazer de outro jeito, e
"import antigravity"era fácil demais para abrir mãoParece que agora entramos na fase de “pagar o preço”
Quase tudo era compilado a partir do código-fonte, incluindo compiladores e kernel, e os servidores/infra de build não tinham acesso nenhum à internet; também havia um processo para incorporar mudanças. As CVEs relacionadas eram revisadas conforme eram divulgadas para decidir se se aplicavam a nós e como mitigar ou tratar cada caso
Na empresa para a qual fui depois, os builds tinham acesso à internet e fazíamos upgrade assim que saía uma nova versão. As pessoas consideravam isso uma boa prática porque trazia as correções de bugs mais recentes, e a revisão de CVEs ficava com a equipe de segurança
Depois, em uma startup, havia uma mistura de várias práticas. Tinha coisas muito boas, mas também uma grande dívida de CVE. Por exemplo, aplicavam secure boot e disco criptografado nos servidores, e tinham uma noção bem razoável de segurança nas comunicações entre componentes
Todo mundo acha que está fazendo certo. É quase impossível convencer o pessoal do “faz upgrade sempre” de que existe o risco de introduzir novos problemas. A indústria precisa de um conjunto melhor de práticas, e eu pessoalmente acho melhor a forma como a primeira empresa gerenciava dependências. No geral, as práticas de segurança eram bem sólidas e o produto era realmente seguro
Todo software útil acabaria passando por fuzzing, testes baseados em propriedades e verificação formal, e todo mundo que procura vulnerabilidades teria de voltar à estaca zero
Claro, isso pressupõe que a gente sobreviva ao intervalo em que os países despejam o que restou de seus recursos contra seus piores inimigos. Ou então talvez a gente acabe se batendo com ossos de animais
No nível do sistema operacional, um programa em execução receberia tokens de capacidade do shell ou do lugar de onde foi executado, e toda system call precisaria receber uma capacidade como primeiro argumento. Então
"open path /foo"virariaopen(cap, "/foo"). Essa capacidade poderia representar qualquer coisa: um sistema de arquivos falso, um ramo do sistema de arquivos real, um sistema de arquivos em rede etc., e o programa não precisaria saber em que sandbox está vivendoNo nível de biblioteca/linguagem, ao importar bibliotecas de terceiros como módulos npm, seria preciso passar capacidades no momento do import ou em cada ponto de chamada. Essa biblioteca não deveria ter acesso de leitura/escrita a todos os bytes do espaço de endereçamento do meu programa, nem poder agir como se fosse eu no meu computador. A pergunta central é: qual é o raio de explosão desse código? Quando a biblioteca que eu uso é maliciosa ou vulnerável, precisamos de um padrão razoável para limitar o estrago. Uma chamada
lib::add(1, 2)não deveria levar ao comprometimento persistente do meu computador inteiroO seL4 já oferece capacidades em nível de sistema operacional, rápidas e eficientes, há muito tempo, e funciona bem. Em muitos casos é mais rápido que Linux e é muito útil para sandboxing transparente, drivers em espaço de usuário, comunicação entre processos e melhorias de segurança. Também dá para executar Linux como um processo sobre seL4. Eu queria um sistema operacional que tivesse todos os recursos de um desktop Linux, mas funcionasse como seL4
Infelizmente, não parece existir uma linguagem de programação com capacidades no nível de linguagem do jeito que eu quero. Rust chega perto, mas seria preciso um jeito de impedir que crates de terceiros chamem qualquer código unsafe, incluindo unsafe trazido por dependências não confiáveis. Também seria preciso corrigir bugs antigos de soundness do Rust e ter uma biblioteca padrão baseada em capacidades. Coisas globais como
open()/listen()deveriam desaparecer, restando apenas formas equivalentes aopenat()e às outras partes correspondentes do sistema operacionalSe os LLMs continuarem melhorando, em alguns anos, se ninguém fizer isso antes, pretendo mandar um LLM construir tudo isso. A segurança dos sistemas operacionais desktop modernos é uma piada
Precisamos de uma cultura de higiene para código, e isso não é tão diferente das normas que a maioria das culturas desenvolveu para comida. É uma combinação de heurísticas meio toscas, mas essa sensação de “eca” salva bilhões de pessoas
Agora estou reduzindo a exposição a dependências mais do que nunca, especialmente para coisas que dá para implementar com algumas centenas de linhas. Isso é literalmente uma mudança de paradigma
A ideia de “esperar uma semana para instalar software” não funciona. Há apenas alguns meses, uma vulnerabilidade em larga escala atingiu a web, e foi um ataque com atraso temporal que ficou dormente por mais de um mês antes de ser executado
Se todo mundo começar a esperar uma semana, os atacantes vão esperar duas. Cibercriminosos não precisam explorar imediatamente; só precisam conseguir explorar em algum momento. Muitos tipos de vulnerabilidade, como typosquatting, também não mudam com essa abordagem
Isso porque é bem provável que ainda não existam patches para essas vulnerabilidades e, mesmo que existam, há grande chance de aparecerem logo outras ainda piores
Mas, se não houver nenhum atraso, você pode ser atingido por um exploit que ainda ninguém viu
Além disso, a descoberta desses comprometimentos não dependeu em nada de eles terem sido explorados de fato. Por isso não entendo a frase “se todo mundo esperar uma semana, os atacantes vão esperar duas”
Como alternativa, você pode migrar para um sistema operacional como FreeBSD, que não adota uma postura YOLO com segurança
Correções de segurança não são simplesmente jogadas no kernel do FreeBSD sem coordenação. Elas passam pela equipe de segurança do FreeBSD e, poucos minutos depois de o patch entrar na árvore src, atualizações binárias são distribuídas pelo FreeBSD Update e pelo pkgbase do 15.0-RELEASE
Em termos de tempo, são alguns segundos até aparecer no Slack uma mensagem de “patch enviado”, de 10 a 30 segundos para o upload do patch, e até 1 minuto para a sincronização dos mirrors
Para ser justo, meu relatório era sobre algo que não era componente central e também não era fácil de explorar, mas Debian, OpenBSD, SUSE e Gentoo corrigiram tudo em menos de uma semana https://www.maxchernoff.ca/p/luatex-vulnerabilities#timeline
Dito isso, não estou querendo julgar um sistema operacional inteiro pelo tratamento de um único relatório menor. Até porque, em tudo mais que vi, o FreeBSD parece levar relatórios de segurança bastante a sério. Só que a mesma lógica pode ser aplicada a bugs do kernel Linux. Esse tipo de má gestão de patch também é bem raro no Linux
Tende a priorizar usabilidade acima de segurança. Um exemplo famoso está aqui: https://vez.mrsk.me/freebsd-defaults
Sou grato a quem contribui para o projeto, mas, enquanto houver defaults ruins assim, não consigo recomendar a migração com a consciência tranquila
Se você quer FreeBSD com segurança, o caminho é usar o HardenedBSD do Shawn Webb
Até especialistas em segurança precisam aceitar, a esta altura, que o nosso mundo está sobre um equilíbrio extremamente frágil. Acho que as pessoas subestimam muito isso
Não só o mundo de TI, mas o mundo inteiro é construído sobre inúmeros equilíbrios muito frágeis. Sempre vai haver exploits de segurança. Não só em software, mas também no mundo físico. Teve até gente entrando escondida em conferência de segurança, e era só um youtuber. Tudo bem que não era um evento de altíssima segurança, mas foi o exemplo que me veio à cabeça. No fundo, na maioria dos casos, é muito fácil contornar segurança
O que quero dizer é que, em essência, o nosso mundo funciona porque pelo menos a maioria das pessoas escolhe não abusar dessas brechas. A sociedade humana sempre funcionou assim, e provavelmente continuará assim
Pelo que sei, um youtuber chamado Max Fosh conseguiu entrar repetidas vezes na International Security Expo. No Reino Unido, em https://www.youtube.com/watch?v=qM3imMiERdU, e nos EUA, em https://www.youtube.com/watch?v=NmgLwxK8TvA, ele usou os pseudônimos “Rob Banks” e “Nick Everything”, respectivamente
Já estudei um pouco de cultura de segurança, e quase tudo acaba virando uma escala deslizante com segurança de um lado e conveniência/acessibilidade do outro. Quanto mais seguro, menos acessível; e o contrário também vale
Já existe uma solução razoável para ataques de cadeia de suprimentos em gerenciadores de dependência como npm, PyPI e Cargo: configurar para instalar apenas versões de pacotes com alguns dias de idade
Todos os grandes ataques recentes foram detectados e revertidos em menos de um dia, então isso teria evitado tudo com segurança. Esse comportamento deveria ser o padrão. Deixe os beta testers voluntários e as empresas de scanner de segurança usarem as versões mais novas por um dia antes. A ideia está aqui: https://cooldowns.dev/
É um gerenciador de artefatos. Ele deixa você buscar apenas o que foi aprovado. Dá para atualizar rápido quando for necessário e, quando precisar, usar de forma consistente versões estáveis e verificadas. Exige um pouco de configuração adicional, mas é algo fácil de fazer
Já cheguei a criar e usar uma ferramenta meio improvisada com propósito parecido, e este é um bom projeto
Claro que, fora do ambiente corporativo, isso naturalmente funciona bem menos
Depois que são descobertas, vem uma explosão imediata de exploits, e atualizações atrasadas dão mais tempo para atacantes animados
Outro modelo é o CPAN do Perl, que distribui apenas arquivos-fonte
Quem adotou integração contínua e builds conteinerizados há relativamente pouco tempo deveria verificar se o sistema não está puxando
latestde vários pacotes em cada buildNós criamos um contêiner-base com todas as dependências externas incluídas e só o atualizamos explicitamente quando decidimos que chegou a hora
Assim, talvez a gente fique um pouco atrás da ponta de lança, mas assume muito menos o risco de uma vulnerabilidade de cadeia de suprimentos aleatória ser distribuída instantaneamente para o mundo inteiro
É um texto opinativo ativamente prejudicial. É difícil entender a lógica
Basta 45 segundos para verificar há quanto tempo as vulnerabilidades copyfail e dirtyfrag existem na prática. Isso já é mais tempo do que leva para ler o texto. Dirtyfrag pode afetar sistemas que remontam a 2017
O problema não é software “novo”. E software realmente antigo tende a estar pior, porque já houve muito mais tempo para encontrar problemas
Um dia alguém vai reconstruir a pilha inteira, do sistema operacional ao aplicativo, com upgrades de proof-carrying code
A única forma de executar código confiável é com co-design e co-construção de prova e código
Isso não vale só para software; na verdade vale para quase tudo
Não lembro onde li isso, mas no fim acaba se resumindo à diferença entre necessidade e desejo
Já usei essa regra ao decidir entre comprar carro novo ou usado, aspirador premium ou básico. O mesmo vale para trazer algum aparelho brilhante novo, algo novo para a stack tecnológica ou escolher uma stack nova
Queria ajuda para entender o que é copyfail e como isso se conecta a pacotes NPM
Pelo que entendi, copyfail parece ser um bug de kernel que permitiria a um pacote npm malicioso obter privilégios de root em um servidor Linux
Então este seria o momento perfeito para atacantes mirarem pacotes NPM, já que ainda existem servidores sem patch
O motivo de o conselho não ser simplesmente “atualize o kernel” é que novos problemas relacionados ainda continuam sendo descobertos?
Se um pacote NPM popular for comprometido e incluir o exploit copy.fail, muitos sistemas ficariam vulneráveis a escalada de privilégios para root