Skip to content

hotfix/cve-as-a-service #275

@marcialwushu

Description

@marcialwushu

hotfix/cve-as-a-service

  1. Título criativo e provocativo

(como se fosse o nome de uma branch que ninguém ousa apagar)

merge/linux-6.x⚠️: quando o kernel vira backlog do SRE


  1. Introdução leve, irônica ou autozoada

(traga o leitor pra dentro como se estivesse contando uma história no Slack)

Sabe aquela segunda-feira em que você abre o Slack, respira fundo e pensa “hoje eu foco nas minhas tasks”? Então, o Linux Kernel ouviu, riu e respondeu com uma chuva de CVEs que parece release notes de app bancário em fim de sprint: “corrigimos pequenos bugs e… escalada de privilégios”. A sensação é de acordar num data center onde o pcie_failed_link_retrain() é o Ctrl+Z da placa-mãe, o amd_pmf_remove() faz double free como quem dá double click, e a pilha de drivers de Wi-Fi te olha com a mesma confiança de um regex sem timeout.


  1. Apresentação da(s) notícia(s)

(para quem já perdeu produção às 3h da manhã)

Resumo do apocalipse em lotes:

PCI: o CVE-2025-39784 acerta o pcie_failed_link_retrain(). Quando a renegociação do link falha, o kernel tenta voltar à velocidade anterior mas… lê bits indevidos antes de mascarar. É tipo “rollback” que consulta a tabela errada. Corrigido upstream.

AMD PMF (platform/x86/amd): CVE-2025-38421, clássico double free ao descarregar o módulo se a inicialização falhou. É o equivalente de demitir a mesma pessoa duas vezes no mesmo e-mail. Corrigido upstream também.

Wi-Fi / ieee80211/carl9170: CVE-2025-38420 — NULL deref por cutucar dispositivo cujo firmware falhou. “Se tá morto, não pinga”. Patch aplicado.

remoteproc: CVE-2025-38419 (e parentes) — vazamentos por má faxina ao lidar com rproc_handle_resources()/rproc_attach(). Lindo para lateral movement quando há caminho até esses subsistemas em SoCs; péssimo para uptime.

Intel ICE (rede): CVE-2025-38417 — leak no caminho de reset do eswitch. Pense numa piscina de memórias vazando no porão do data plane. Corrigido.

virtio-net + AF_XDP: CVE-2025-38413 — checagem de comprimento em xsk_pool_get_rx_frame_size() falhava e podia estourar buffer. Só alegria para quem ama pacotinhos velozes. Patch publicado.

fd housekeeping: CVE-2025-38409 — put_unused_fd() em caminho de erro do DRM/MSM vazava. Porque nada diz “sexta-feira” como file descriptors órfãos.

irq_sim: CVE-2025-38408 — inicialização incompleta (kzalloc vs kmalloc); ponteiros com “lixo cósmico” levam a acessos inválidos. Corrigido para usar kzalloc().

Squashfs: CVE-2025-38415 — leitura fora dos limites durante mount em cenários estressados (obrigado, syzkaller). Patchado.

Outros pingos do inferno: dell-wmi-sysman NULL deref (CVE-2025-38412), loop infinito em netfs::ki_complete (CVE-2025-38411), leak no msm::drm_sched_entity_push_job (CVE-2025-38410). Em parte surgiram primeiro em agregadores (VulDB/feeds) e foram sendo varridos pelos vendors. Moral da história: mantenha um olho no NVD e outro no changelog do kernel.

Bônus meta-bug: alguns feeds descreviam a CVE-2025-38416 como try_module_get → priv-esc. Já os advisories oficiais apontam para NFC NCI UART com correção no caminho de disc_data. Ou seja, às vezes o feed chega antes da errata… ou chega torto. Verifique a fonte antes de estourar janela de manutenção.


  1. Opinião pessoal

(agora é hora da filosofia de terminal)

Nada disso é “o fim do Linux”. É só a vida real do maior monorepo do planeta, escrito em C, abraçado por bilhões de hardwares, com drivers que nasceram em 2009 e voltam do git blame como aquele commit meia-noite “fix attempt (pls work)”. O kernel é a sua aplicação legada perfeita: performático, amado, e sempre com um TODO: escondido num #ifdef.

O padrão aqui não é “0-days hollywoodianos com worm GIF animado”, e sim uma coleção de falhas de borda — resource leaks, checagens de tamanho, ordens de chamada, estados de erro mal tratados. O tipo de coisa que o seu linter finge ver, o code review acha chato, e o syzkaller descobre com um palito de dente. É também o retrato do nosso ofício: complexidade não perdoa. Mais threads + mais caminhos de erro + mais “só um hotpathzinho” = mais CVE-driven development.

Se você é SRE/DevSec/Infra, leia esta leva como um post-mortem preventivo:

Ataque local ≠ irrelevante. Em 2025, cadeia de ataque é Lego: macro → userland foothold → LPE → contêiner → kernel; “só local” é o degrau favorito do atacante paciente.

É LTS que fala, né? Muita correção já foi para stable (5.15/6.1/6.6/6.12/6.15/6.16). O risco é você estar num -rc ou num vendor kernel que atrasou backport. Verifique sua distro/AMI, especialmente em node groups de Kubernetes onde “imutável” virou “imutável até sexta”.

Live patching salva janelas: kpatch/kGraft/Ksplice não resolvem tudo, mas compram tempo. E tempo é a moeda dos incidentes.

Observabilidade não compila bug de memória. eBPF é lindo, mas double free não vira “evento bonito no Kibana”. Garanta crash dump, panic_on_oops, e uma história para rotação de nós (cordon/drain) sem teatro.

Política de módulos: reduzir superfície de ataque ainda paga. Menos drivers carregados, menos “surpresas”. Try before you modprobe.

Esteiras de kernel: trate kernel como aplicativo crítico. Watch do NVD/Red Hat/Ubuntu, SLO de atualização, runbooks por família (PCI, net, wifi, drm). E marque no calendário “a cada CVE novo, um teste de boot com systemd.unit=rescue.target para os valentes”.

Metáfora dev para amarrar: isto tudo escalou mais rápido que microserviço sem observabilidade e caiu com a elegância de pod com imagePullPolicy: Never. A diferença é que, quando o kernel tropeça, o resto do castelo despenca junto.


  1. Fechamento reflexivo ou provocador

(“isso daria um pull request filosófico...”)

Talvez o kernel seja nosso memento mori técnico: lembra que todo free() precisa de um NULL, que todo “rollback simples” precisa mascarar bits, que drivers envelhecem como TODOs. E lembra também que segurança não é sprint — é daemon. Ele roda em segundo plano, consome memória, irrita às vezes, mas sem ele nada sobe.

No fim, a pergunta não é “tem CVE no kernel?” — é “qual a nossa cadência para domesticar o caos?”. Porque enquanto a gente discute story points, o syzkaller não dorme, e a entropia… faz git push --force.


Leituras oficiais para quem precisa sair da poesia e ir pro patch window:
CVE-2025-39784 (PCI retrain), CVE-2025-38421 (AMD PMF double free), CVE-2025-38420 (wifi/carl9170 NULL deref), CVE-2025-38419 (remoteproc leaks), CVE-2025-38417 (ICE leak), CVE-2025-38413 (virtio-net/AF_XDP len check), CVE-2025-38409 (put_unused_fd), CVE-2025-38408 (irq_sim init). E atenção às descrições divergentes da CVE-2025-38416 entre feeds e vendor.

“Tudo certo, nada resolvido.” — DevComputariaHub, vendo dmesg rolar como poesia slam.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions