Восстановлен код UNIXv4, первой ОС с ядром на языке C. Уязвимость в UNIXv4

В конце прошлого года во время уборки в вычислительном центре Университета Юты была обнаружена архивная магнитная лента с кодом операционной системы UNIXv4, которая была разработана в 1973 году для ЭВМ PDP-11/45 и считалась утерянной. UNIXv4 продолжал развитие выпущенной за год до этого операционной системы UNIXv3, в которой впервые был использован язык Си и неименованные каналы. Особенностью UNIXv4 стало переписывание ядра с ассемблера на язык Си. Код ядра UNIXv4 был написан Кеном Томпсоном, а драйверов — Деннисом Ритчи.

В конце декабря 2025 года сотрудники музея истории вычислительной техники смогли найти необходимое оборудование и извлечь сохранённый на ленте архив. Для оцифровки записанного на ленту аналогового сигнала использован инструментарий readtape, а для раскодирования формата архива задействованы наработки, созданные в процессе восстановления архива с реализацией редактора Emacs от Джеймса Гослинга.

Помимо кода UNIXv4 на ленте также были найдены исходные тексты одного из первых компиляторов для языка Си и интерпретатора языка SNOBOL. Позднее код UNIXv4 был приведён в порядок и опубликован на GitHub в форме, пригодной для сборки и запуска в симуляторе PDP-11. Код UNIXv4 включает 61 тысячу строк, из которых 27 тысяч на языке Си, 33 тысячи на ассемблере для PDP-11 и около тысячи — заголовочные файлы.

 Восстановлен код UNIXv4, первой ОС с ядром на языке C. Уязвимость в UNIXv4

Один из исследователей безопасности обратил внимание на утилиту «su», поставлявшуюся в UNIXv4. Данная утилита включала менее 50 строк кода, устанавливалась с флагом setuid-root и позволяла запустить /bin/sh с правами root при вводе правильного пароля. Код содержал уязвимость, приводящую к переполнению буфера из-за копирования вводимого пользователем пароля в фиксированный 100-символьный массив без проверки размера вводимых данных.

Выявленную проблему прокомментировал 93-летний Дуглас Макилрой (Douglas McIlroy), входивший в команду изначальных разработчиков Unix в Bell Labs, предложивший концепцию неименованных каналов и создавший такие утилиты, как echo, spell, diff, sort, join и tr. По словам Дугласа, до появления червя Морриса в 1988 году мало кто обращал внимание на переполнения буферов. Добавление проверок размера вводимых вручную данных рассматривалось как добавление лишнего кода, а аварийное завершение при переполнении воспринималось как неуклюжая форма реагирования на некорректные входные данные. Со временем переполнения, возникающие при обработке автоматически генерируемых строк, стали исправлять, но для ручного ввода логика была на уровне «кому может понадобиться вручную вводить слишком длинные строки».

Источник: opennet.ru

Добавить комментарий