Não
O ataque, como descrito originalmente, nunca foi uma ameaça. Embora um compilador possa teoricamente fazer isso, na verdade, realizar o ataque exigiria a programação do compilador para
- Reconheça quando o código-fonte que está sendo compilado é de um compilador e
- Descubra como modificar o código-fonte arbitrário para inserir o hack nele.
Isso implica descobrir como o compilador funciona a partir do seu código-fonte, para poder modificá-lo sem interrupção.
Por exemplo, imagine que o formato de vinculação armazene os comprimentos dos dados ou o deslocamento do código de máquina compilado em algum lugar do executável. O compilador precisaria descobrir por si mesmo quais deles precisam ser atualizados e onde, ao inserir a carga útil de exploração. As versões subseqüentes do compilador (versão inócua) podem alterar arbitrariamente esse formato, portanto o código de exploração precisaria efetivamente entender esses conceitos.
Trata-se de programação autodirecionada de alto nível, um difícil problema de IA (a última vez que verifiquei, o estado da arte estava gerando código praticamente determinado por seus tipos). Veja: poucos humanos conseguem fazer isso; você precisaria aprender a linguagem de programação e entender primeiro a base de código.
Mesmo que o problema da IA seja resolvido, as pessoas notariam se a compilação de seu minúsculo compilador resultasse em um binário com uma enorme biblioteca de IA vinculada a ele.
Ataque análogo: confiança de autoinicialização
No entanto, uma generalização do ataque é relevante. A questão básica é que sua cadeia de confiança precisa começar em algum lugar e, em muitos domínios, sua origem pode subverter toda a cadeia de uma maneira difícil de detectar.
Um exemplo que poderia ser facilmente realizado na vida real
Seu sistema operacional, por exemplo, o Ubuntu Linux, garante a segurança (integridade) das atualizações verificando os pacotes de atualização baixados na chave de assinatura do repositório (usando criptografia de chave pública). Mas isso garante apenas a autenticidade das atualizações se você puder provar que a chave de assinatura pertence a uma fonte legítima.
Onde você conseguiu a chave de assinatura? Quando você baixou a distribuição do sistema operacional pela primeira vez.
Você precisa confiar que a fonte de sua cadeia de confiança, essa chave de assinatura, não é má.
Qualquer um que possa MITM a conexão à Internet entre você e o servidor de download do Ubuntu - este pode ser o seu ISP, um governo que controla o acesso à Internet (por exemplo, China) ou o provedor de hospedagem do Ubuntu - poderia ter invadido esse processo:
- Detecte que você está baixando a imagem do CD do Ubuntu. Isso é simples: veja se a solicitação está indo para qualquer um dos espelhos do Ubuntu (listados publicamente) e solicita o nome do arquivo da imagem ISO.
- Atenda a solicitação em seu próprio servidor, fornecendo uma imagem de CD contendo a chave pública do atacante e o local do repositório, em vez da do Ubuntu.
A partir de agora, você receberá suas atualizações com segurança do servidor do invasor. As atualizações são executadas como raiz, para que o invasor tenha controle total.
Você pode impedir o ataque, certificando-se de que o original seja autêntico. Mas isso requer que você valide a imagem do CD baixada usando um hash ( poucas pessoas realmente fazem isso ) - e o próprio hash deve ser baixado com segurança, por exemplo, por HTTPS. E se o invasor puder adicionar um certificado ao seu computador (comum em um ambiente corporativo) ou controlar uma autoridade de certificação (por exemplo, China), mesmo o HTTPS não fornecerá proteção.