Существует актуальная фундаментальная уязвимость в любой программном средстве написанном на компилируемых языках.
Теория «Черного лебедя»
Автор теории Нассим Николас Талеб, описавший ее своей книге «Чёрный лебедь. Под знаком непредсказуемости». Теория рассматривает труднопрогнозируемые и редкие события, которые несут за собой значительные последствия. Процессы реального мира не возможно описать с точки зрение одной лишь математики, и в доказательство этому рассмотрим один простой пример.
Живую индюшку покупают на птицефабрике, и она попадает в гораздо лучшие условия.
Ее усиленно откармливают, заботятся, холят и лелеют. Каждый день ее кормушка заполняется кормом, ее загон теплый и комфортный. Каждый день, долгое время.
Обладай индюшка умением прогнозирования, она практически со 100 процентной вероятностью предсказала бы что и на следующий день корма будет вдоволь в ее теплом загоне.Но в один прекрасный день в ноябре, наступает день благодарения, и все тот-же заботливый хозяин сворачивает ей шею. Сюрприз. Случилось то, что индюшка не могла знать, и принципиально изменилась вся картина. Случилось то, что и есть Черный Лебедь- редкое непредсказуемое событие. Удар с неожиданной стороны. И такие события происходят в нашей жизни.
Если вы всю жизнь видели только белых лебедей, не значит что черных не существует.
Рассмотрев эту теорию можно понять актуальность потенциальной фундаментальной уязвимости любой автоматизированной системы. Проблема достаточно старая, существует столько же сколько и язык C.
Размышление о том, можно ли полагаться на доверие
В 1975 Кеном Томпсоном (создатель языка программирования C и операционной системы UNIX) была впервые поставлена проблема доверенного компилятора. Публично опубликована в 1984 году в его Тьюринговской лекции «Размышление о том, можно ли полагаться на доверие».
В лекции Кен Томпсон продемонстрировал атаку через бинарную версию компилятора С без необходимости модификации его исходных кодов. Была продемонстрирована закладка в компиляторе, которая добавляет вирусный код в программы скомпилированные этим компилятором. А также настроена и на сам компилятор.
Вирусный код невозможно отследить традиционными методами через исходный код.
А ведь компиляторы также компилируются компиляторами. Доверенному и проверенному исходному тексту компилятора нельзя верить до тих пор пока он сам не будет собран доверенным компилятором. Собирая новые версии компилятора размножается вирусный код в новых версиях компилятора. Яркий пример проявления проблемы «курицы и яйца».
Около 20 лет проблема считалась нерешаема.
Метод двойной раздельной кросс-компиляции
В 2005 году Дэвид Уилер представил решение этой проблемы, позволяющий точно распознать успешно проведенную атаку на компилятор.
Основная сложность теории заключается в том, что необходимо наличие доверенного компилятора.
Вкратце методика заключается в следующем:
1)берется проверенный исходный текст компилятора S (например gcc-4.7);
2)компилятор S компилируется проверяемым компилятором C1 и получается компилятор С1(S);
3)компилятор S компилируется доверенными компилятором C2 и получается компилятор С2(S);
4)на компиляторе C1(S) и C2(S) компилируется программа P, получаем бинарный код программы C1(S(P)) и С2(S(P));
5)сравниваем C1(S(P)) и С2(S(P));
Получившиеся бинарные файлы должен быть идентичны, в противном случае компилятор дискредитирован и имеет вирусный код (программную закладку).
Заключение
Распространение бинарных версии компиляторов происходило неконтролируемо, и невозможно утверждать, что на каких либо этапах не выкладывались компиляторы с описанной уязвимостью. На данный момент найти доверенный компилятор практически невозможно. Это говорит о наличии потенциальной фундаментальной уязвимости в любой автоматизированной системе. Наличие проверенных исходных кодов не является панацеей, так как наличие бинарных вирусов сводит на нет все преимущество легко поддающегося аудиту исходного кода.
Пример с индюшкой в начале статьи является попыткой доказать актуальность данной уязвимости, которой на протяжении многих лет уделяется недостаточно внимания.
Неизвестно кто и для чего мог сделать программную закладку в компиляторе, и не наступит ли «День благодарения» для нас всех.
Литература
1)Nassim Nicholas Taleb, The Black Swan: The Impact of the Highly Improbable,
http://www.nytimes.com/2007/04/22/books/chapters/0422-1st-tale.html?_r=0
2) Thompson, Ken, Reflections on Trusting Trust,
https://www.ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf
3)Wheeler, David A., Countering Trusting Trust through Diverse Double-Compiling (DDC),
http://www.dwheeler.com/trusting-trust/wheelerd-trust.pdf
Автор: Krasnoglazik