pular para o conteúdo
voltar ao mapa
técnica
etapa: ship
3 min de leitura

A08 Software or Data Integrity Failures

Se o programa aceita atualizações, plugins, objetos serializados ou saída de pipeline sem provar de onde vieram, quem puder alterá-los pode executar código como você.

Sigstore cosignSLSA provenanceSubresource Integrity (SRI)ysoserial (to understand the risk, on your own lab)Semgrepin-toto

O que é

As falhas de integridade acontecem quando código ou dados são aceitos sem verificação: atualizações automáticas sem assinatura, scripts carregados de uma CDN sem checagem de integridade, desserialização de bytes não confiáveis e pipelines de CI/CD em que uma única etapa comprometida pode alterar o que é entregue.

O :2025 mantém esta categoria como A08. Ela é próxima do A03 (cadeia de suprimentos), mas foca na etapa de verificação: você consegue provar que o que executa é o que deveria executar?

Como o ataque funciona

  • : a aplicação reconstrói objetos a partir de bytes fornecidos pelo atacante (serialização Java, pickle do Python, YAML inseguro), e o stream provoca execução de código.
  • Atualização ou plugin adulterado: um download por um canal sem assinatura é substituído em trânsito ou no mirror.
  • Script de terceiros sem verificação: uma CDN comprometida serve JavaScript modificado a todos os visitantes.
  • Estado controlado pelo cliente: um cookie ou campo oculto que carrega um papel, preço ou objeto é editado e aceito.

Código vulnerável

Desserializar bytes não confiáveis com pickle, confiar em um cookie editável pelo usuário e carregar um script sem atributo de integridade.

session.pypython
import pickle, base64

def load_prefs(cookie):
    return pickle.loads(base64.b64decode(cookie))   # bytes controlados pelo atacante executam código
cart.jsjavascript
const cart = JSON.parse(Buffer.from(req.cookies.cart, "base64").toString());
total = cart.total;          // o cliente escreveu este número
index.htmlhtml
<script src="https://cdn.example.com/lib/chart.min.js"></script>

A correção

Use formatos somente de dados (JSON) com validação de schema, nunca serialização nativa de objetos para entrada não confiável. Se o estado precisar passar pelo cliente, assine-o (HMAC ou um token assinado) e verifique antes de usar, ou melhor, mantenha-o no servidor. Fixe scripts de terceiros com e verifique as assinaturas de tudo o que instala ou atualiza.

session.pypython
import hmac, hashlib, json, base64

SECRET = load_secret("PREFS_HMAC_KEY")

def dump_prefs(prefs: dict) -> str:
    body = base64.urlsafe_b64encode(json.dumps(prefs).encode())
    mac = hmac.new(SECRET, body, hashlib.sha256).hexdigest().encode()
    return (body + b"." + mac).decode()

def load_prefs(cookie: str) -> dict:
    body, _, mac = cookie.encode().partition(b".")
    expected = hmac.new(SECRET, body, hashlib.sha256).hexdigest().encode()
    if not hmac.compare_digest(mac, expected):
        raise ValueError("tampered")
    return json.loads(base64.urlsafe_b64decode(body))      # apenas dados, validados depois
cart.jsjavascript
// o estado vive no servidor; o cookie só carrega um id opaco
const cart = await carts.get(req.session.cartId);
const total = cart.items.reduce((s, i) => s + catalog.price(i.sku) * i.qty, 0);
index.htmlhtml
<script src="https://cdn.example.com/lib/chart-4.4.1.min.js"
        integrity="sha384-<hash of the exact file>"
        crossorigin="anonymous"></script>
verifique antes de executarbash
# o artefato deve estar assinado pela identidade de pipeline esperada
cosign verify-blob --certificate-identity 'https://github.com/example/app/.github/workflows/release.yml@refs/heads/main' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  --signature app.tgz.sig --certificate app.tgz.pem app.tgz

Prove a correção

Alimente o código exatamente com o que um atacante faria: um cookie modificado, um payload de um gadget de desserialização e um arquivo de script alterado. O resultado correto é a rejeição, sem nenhum código executado.

test_integrity.py (pytest)python
def test_tampered_cookie_is_rejected():
    cookie = dump_prefs({"theme": "dark"})
    body, mac = cookie.split(".")
    forged = base64.urlsafe_b64encode(b'{"theme":"dark","role":"admin"}').decode() + "." + mac
    with pytest.raises(ValueError):
        load_prefs(forged)

def test_pickle_payload_is_not_executed(tmp_path):
    marker = tmp_path / "pwned"
    class Evil:
        def __reduce__(self):
            return (open, (str(marker), "w"))
    payload = base64.b64encode(pickle.dumps(Evil())).decode()
    with pytest.raises(Exception):
        load_prefs(payload)
    assert not marker.exists()
sri-check.shbash
# todo <script> e <link rel=stylesheet> externo deve ter um atributo integrity
! grep -RInE '<script[^>]+src="https?://' dist/ | grep -v 'integrity='

Checklist

  • Nunca desserialize dados não confiáveis com um formato capaz de instanciar objetos; prefira JSON com validação de schema.
  • Assine tudo o que precisa atravessar uma (cookies, arquivos de atualização, mensagens) e verifique antes de usar.
  • Use Subresource Integrity para scripts e estilos de terceiros, ou hospede-os você mesmo.
  • Assine artefatos de build e imagens de contêiner; verifique a assinatura no momento do deploy.
  • Proteja o pipeline: mudanças revisadas, permissões de build e deploy separadas, nenhum código sem revisão nas etapas de release.
  • Prefira estado no servidor para preços, papéis e permissões.
OWASP Top 10A lista de referência mais famosa de riscos de segurança em aplicações web (A01 acesso quebrado, A02 falhas criptográficas, A03 injeção...), revisada a cada alguns anos pela comunidade OWASP. É um mapa educacional de categorias de risco — não um checklist de ferramenta nem uma certificação.ver no glossário →Desserialização inseguraReconstruir objetos a partir de bytes não confiáveis usando um formato que pode instanciar tipos arbitrários (serialização Java, pickle). Os bytes podem provocar execução de código.ver no glossário →Subresource IntegritySRIUm hash em uma tag script ou link que faz o navegador recusar o arquivo se ele não corresponder, de modo que uma CDN comprometida não consiga alterar sua página.ver no glossário →Fronteira de confiançatrust boundaryLinha onde muda o nível de confiança dos dados ou de quem os envia (internet para VPC, serviço para banco, usuário para admin). Tudo que a cruza deve ser autenticado, autorizado e validado.ver no glossário →

conexões no mapa

atualizado em 14/10/2026 · fontes para aprofundar · reportar erro

em outros domínios

Estude antes

teste o que entendeu

Carregando perguntas…