Подходы к защите разрабатываемых программ от автоматической генерации инструментальными средствами программных закладок

Если целью атаки является нанесение как можно большего вреда, то заманчивой целью для нарушителя, пытающегося внедрить РПС, являются программы, которые используют много различных пользователей, например, компиляторы [45]. Для того, чтобы понять, как это можно сделать рассмотрим следующую упрощенную структуру компилятора, которая дает представление об общих принципах его работы:

compile:
	get (line);
translate(line);

Согласно этой структуры компилятор сначала "получает строку", а затем транслирует ее. Конечно, настоящий компилятор устроен намного сложнее, чем эта схема, но этой иллюстрации отдано предпочтение потому, что она в виде некой модели разъясняет фазы лексического анализа трансляции компилятора. Целью РПС будет поиск новых текстовых участков во входных программах, которые будут транслироваться, и вставление в эти участки различного кода. В примере, представленном ниже, компилятор ищет текстовый участок "read_pwd(p)", наличие которого в функции входа в данную компьютерную систему известно, как мы предполагаем, нападающей программе. Когда этот участок будет найден, компилятор не будет транслировать "read_pwd(p)", а вместо этого буде транслировать вставку из РПС, которая может устанавливать "лазейку", которая потом позволит злоумышленнику легко получить доступ к системе. Измененный код компилятора следующий:

compile;
get (line)
if line="readpwd(p)" then
translate (destructive means insertion);
else
translate(line);
fi;

В этом измененном коде, компилятор получает строку, ищет нужный текст, и если находит то транслирует код РПС. Код РПС может включать в себя простую проверку пароля "черного входа" (например, может признаваться правильный пароль "12345" для любого пользователя). Это особенно опасно, поскольку код источника больше не отражает того, что находится в объектном коде и просмотр кода источника (не смотря на то, что проверяется и компилятор) никогда не позволит уловить эту атаку.

Заметим, чти на 12 исходный текст или исполняемый код, включающий только те выражения, которые предлагались его разработчиком назван чистым, а код, содержащий РПС, грязным. Далее заметим, что если компилируется атакованный компилятор и грязный исполняемы код устанавливается код в какойлибо рабочий директорий (так обычно и бывает), то компилятор с внедренным РПС может быть обнаружен, только если ктонибудь вернется к источнику компилятора и проверит его (что редко случается). Но настоящий источник может быть восстановлен злоумышленником после компилирования грязного источника и создания грязного исполняемого компилятора. Это, вообще говоря, потом поможет восстановить настоящий исполняемый компилятор при рекомпиляции источника, но это редкий случай.

12. Работа компилятора с привнесенным РПС


Ведете ли вы блог?

Да
Нет
Планирую


Результаты опроса

Новостной блок