В далеком 1984 году легендарный Кен Томпсон, создатель языка программирования C и операционной системы UNIX (вместе с Деннисом Ритчи), опубликовал классическую лекцию «Размышления о доверии к доверию» (Reflections on Trusting Trust), в которой наглядно показал, как можно внедрить троян в бинарный файл с помощью «бага» в компиляторе. Триггер для внедрения трояна в бинарный файл содержится в исходном коде компилируемой программы и может выглядеть как тривиальная функция. Если вы не знаете, как работает «жучок» в компиляторе, то даже самое тщательное изучение исходного кода программы не выявит в ней никаких опасностей. Но скомпилированный файл будет уже заражен.

Кен Томпсон продемонстрировал атаку подобного типа через компилятор C и программу, написанную на C. Но то же самое можно сделать и через любую другую систему интерпретации: ассемблер, загрузчик, даже аппаратный микрокод. И чем глубже сидит «жучок», тем сложнее его обнаружить, а баг, например, в аппаратном микрокоде обнаружить почти невозможно.

Главный вывод, который делает гуру компьютерной науки — никакое количество верификации исходных кодов или контроля не защитит вас от угрозы. Вы не можете доверять никакому коду, если вы только не написали его сами, особенно нельзя доверять «коду от компаний, которые берут на работу таких как я», писал Томпсон 29 лет назад (что интересно, сейчас он работает в компании Google).

Вероятно, именно классическая статья Томпсона подтолкнула голландского программиста Йоса ван ден Увера (Jos van den Oever) провести проверку популярных дистрибутивов Linux. Программист просто захотел проверить, можно ли самостоятельно из предоставленных исходных кодов скомпилировать бинарный файл, который побитно совпадает с бинарным файлом, распространяемым официально.

Ван ден Увер ни разу так и не смог скомпилировать двоичный файл, совпадающий с аутентичным. Это и не удивительно. Например, компилятор GCC из одних и тех же исходников выдает всегда разные версии бинарного файла, из-за разных меток времени. В этом смысле Clang/LLVM понадежнее: он хотя бы позволяет получить одинаковые бинарные файлы из одних и тех же исходников, даже если компилировать их на разных машинах.

Таким образом, проверить соответствие исходных кодов Linux и распространяемого бинарного файла не представляется возможным.



Оставить мнение