Marimo GHSL-2026-226: TOCTOU no fluxo de teste de versão
Uma corrida de timestamp no mesmo segundo permitia que uma atualização de pull request passasse pela aprovação de teste do mantenedor e chegasse aos jobs de publicação no TestPyPI e no npm. O workflow vulnerável foi removido; não foi atribuído CVE.
Um responsável pelo laboratório aprova uma amostra, mas o laboratório confere apenas o segundo do relógio. Se alguém trocar a amostra naquele mesmo segundo, a substituta parece aprovada. O workflow do Marimo fez isso com um commit de pull request e levou o pacote resultante aos jobs de publicação.
Conceitos Centrais e Termos
TOCTOU- Time-of-check to time-of-use: um recurso muda depois da verificação de segurança e antes de ser usado.
Publicação via OIDC- Um job de CI troca um token de identidade do GitHub Actions por credenciais temporárias no registro de pacotes, sem armazenar uma senha de longa duração.
Artefato do workflow- Conjunto de arquivos transferido entre jobs do GitHub Actions. Um job posterior deve tratar como entrada não confiável artefatos de workflows não confiáveis.
GHSL-2026-226- Identificador do advisory do GitHub Security Lab para esta falha no workflow do Marimo. O advisory não atribuiu CVE.
CWE-367 / CWE-829- O advisory identifica uma corrida de verificação e uso e a execução de funcionalidade de uma esfera de controle não confiável.
Mapeamentos de frameworks
Fluxo de Ataque Passo a Paso
Um mantenedor autoriza uma versão de teste
Um mantenedor comenta em um pull request para iniciar o workflow de teste de versão do Marimo. A autorização deveria valer para o estado do pull request que foi revisado.
O head do pull request muda no mesmo segundo
O workflow compara pushed_at do repositório com created_at do comentário após converter ambos para segundos inteiros. Um push no mesmo segundo resulta em valores iguais.
A verificação vulnerável aceita a igualdade
O workflow removido rejeitava apenas valores de pushed_at estritamente maiores que o horário do comentário. A igualdade passava e o commit atualizado era registrado.
Código não confiável cria artefatos de pacote
O job fazia checkout desse commit e executava actions e scripts de build controlados pelo repositório. Os resultados eram enviados como artefatos e consumidos por jobs de publicação sem reconstrução a partir de um commit confiável.
A autoridade de publicação alcança a saída não confiável
Os jobs do TestPyPI e npm usavam permissões de publicação OIDC. O advisory descreve que o artefato podia chegar à publicação; não relata comprometimento real de um pacote.
Código-Fonte: Vulnerável vs. Seguro
O GHSL-2026-226 informa que o workflow vulnerável foi removido na PR #10765; isto não afirma que o projeto aplicou a troca de comparador mostrada. A verificação antiga usava -gt, então timestamps inteiros iguais passavam. O controle ilustrativo -ge rejeita igualdade, mas é melhor vincular a aprovação ao commit exato revisado. Separe builds não confiáveis de jobs OIDC, reconstrua a partir do SHA autorizado e valide a proveniência antes da publicação. Nenhum payload de exploração é incluído.
# Workflow marimo-bot removido: comparação em segundos inteiros
if [[ $(date -d "$pushed_at" +%s) -gt $(date -d "$COMMENT_AT" +%s) ]]; then
exit 1
fi
# O head_sha resultante era usado no checkout e os artefatos
# eram enviados a jobs separados de publicação.
# Controle ilustrativo; segundo o GHSL, o workflow vulnerável
# foi removido, não corrigido no local.
if [[ $(date -d "$pushed_at" +%s) -ge $(date -d "$COMMENT_AT" +%s) ]]; then
exit 1
fi
# Projeto mais forte: autorizar SHA imutável revisado, reconstruir
# nesse SHA em job confiável e publicar saídas verificadas.
Lista de Verificação de Segurança para Engenharia
- ✓Remova ou substitua cópias afetadas do workflow marimo bot removido e confirme que o repositório atual não habilita o caminho vulnerável de publicação.
- ✓Vincule a aprovação do mantenedor ao SHA imutável exato do pull request e falhe se o head mudar antes do checkout.
- ✓Não use timestamps de segundos inteiros como única prova de que um branch mutável é a versão aprovada.
- ✓Faça builds de pull requests não confiáveis sem credenciais de publicação; limite id-token: write a um job de publicação confiável separado.
- ✓Reconstrua os pacotes a partir do commit autorizado no fluxo confiável em vez de promover artefatos criados por código não confiável.
- ✓Verifique proveniência do artefato, revisão de origem, conteúdo do pacote e destino antes de publicar no TestPyPI ou npm.
- ✓Trate o advisory GHSL como evidência de um caminho vulnerável, não de comprometimento ou exploração real de pacote.
Fontes
- Advisory GitHub Security Lab GHSL-2026-226 — reported by Jaroslav Lobačevski
- PR #10765 do Marimo que removeu o workflow vulnerável
- GitHub Security Lab: prevenindo pwn requests
- MITRE CWE-367: condição de corrida entre verificação e uso
- MITRE CWE-829: inclusão de funcionalidade de esfera de controle não confiável
- Caso de workflow relacionado (distinto): JupyterLab CVE-2026-84973