No final do ano passado, durante a limpeza no centro de computação da Universidade de Utah, foi encontrada uma fita magnética arquivada com o código do sistema operacional UNIXv4, desenvolvido em 1973 para a máquina PDP-11/45 e considerado perdido. O UNIXv4 continuou o desenvolvimento do sistema operacional UNIXv3, lançado um ano antes, que foi o primeiro a usar a linguagem C e canais não nomeados. Uma característica do UNIXv4 foi a reescrita do núcleo de assembly para a linguagem C. O código do núcleo UNIXv4 foi escrito por Ken Thompson, enquanto os drivers foram desenvolvidos por Dennis Ritchie.
No final de dezembro de 2025, funcionários do museu da história da computação conseguiram encontrar o equipamento necessário e extrair o arquivo armazenado na fita. Para digitalizar o sinal analógico gravado na fita, foi utilizado a ferramenta readtape, e para decodificar o formato do arquivo, foram empregadas contribuições feitas durante o processo de recuperação do arquivo com a implementação do editor Emacs por James Gosling.
Além do código UNIXv4, a fita também continha os textos fonte de um dos primeiros compiladores para a linguagem C e do interpretador da linguagem SNOBOL. Posteriormente, o código UNIXv4 foi organizado e publicado no GitHub em uma forma adequada para compilação e execução no simulador PDP-11. O código UNIXv4 inclui 61 mil linhas, das quais 27 mil estão na linguagem C, 33 mil em assembly para PDP-11 e cerca de mil — arquivos de cabeçalho.

Um dos pesquisadores de segurança se deparou com a utilidade “su”, incluída no UNIXv4. Esta utilidade consistia em menos de 50 linhas de código, era instalada com a flag setuid-root e permitia executar /bin/sh com privilégios de root ao inserir a senha correta. O código continha uma vulnerabilidade que levava a um estouro de buffer devido à cópia da senha do usuário em um array fixo de 100 caracteres sem verificar o tamanho dos dados inseridos.
Douglas McIlroy, de 93 anos, que fazia parte da equipe original de desenvolvedores do Unix nos Bell Labs, comentou sobre o problema identificado. Ele propôs o conceito de canais sem nome e criou utilitários como echo, spell, diff, sort, join e tr. Segundo Douglas, antes do surgimento do verme Morris em 1988, poucos prestavam atenção ao estouro de buffers. A adição de verificações de tamanho para dados inseridos manualmente era vista como um acréscimo desnecessário de código, e o encerramento por estouro era percebido como uma forma desajeitada de lidar com dados de entrada inválidos. Com o tempo, os estouros que surgiam ao processar strings geradas automaticamente começaram a ser corrigidos, mas para a entrada manual, a lógica era no nível de "quem poderia precisar inserir manualmente strings muito longas".
Fonte: opennet.ru
