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ê.
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.
import pickle, base64
def load_prefs(cookie):
return pickle.loads(base64.b64decode(cookie)) # bytes controlados pelo atacante executam códigoconst cart = JSON.parse(Buffer.from(req.cookies.cart, "base64").toString());
total = cart.total; // o cliente escreveu este número<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.
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// 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);<script src="https://cdn.example.com/lib/chart-4.4.1.min.js"
integrity="sha384-<hash of the exact file>"
crossorigin="anonymous"></script># 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.tgzProve 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.
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()# 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.
conexões no mapa
- A03 Software Supply Chain Failuresé barrado ao verificarA08 Software or Data Integrity Failures
atualizado em 14/10/2026 · fontes para aprofundar · reportar erro
em outros domínios
- Hardening de CI/CDsecengo pipeline é parte do que precisa ser íntegro
Estude antes
teste o que entendeu
Carregando perguntas…