Существует актуальная фундаментальная уязвимость в любой программном средстве написанном на компилируемых языках.

Теория «Черного лебедя»


Автор теории Нассим Николас Талеб, описавший ее своей книге «Чёрный лебедь. Под знаком непредсказуемости». Теория рассматривает труднопрогнозируемые и редкие события, которые несут за собой значительные последствия. Процессы реального мира не возможно описать с точки зрение одной лишь математики, и в доказательство этому рассмотрим один простой пример.

Живую индюшку покупают на птицефабрике, и она попадает в гораздо лучшие условия.
Ее усиленно откармливают, заботятся, холят и лелеют. Каждый день ее кормушка заполняется кормом, ее загон теплый и комфортный. Каждый день, долгое время.

Обладай индюшка умением прогнозирования, она практически со 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