Автоматический статический анализ программных систем, записанных на языках программирования семейства С тема диссертации и автореферата по ВАК РФ 05.13.11, кандидат наук Сафин Ленар Камилевич
- Специальность ВАК РФ05.13.11
- Количество страниц 223
Оглавление диссертации кандидат наук Сафин Ленар Камилевич
Введение
Глава 1. Исследование программных систем в контексте
информационной безопасности
1.1 Задачи исследования двоичных образов программ без исходного
кода
1.1.1 Дефекты программного кода, связанные
с неопределённым поведением программы
1.1.2 Дефекты программного кода, связанные с небезопасными оптимизациями компилятора
1.2 Исследование программ в контексте информационной безопасности
1.2.1 Метод исследования программ на предмет соответствия требованиям информационной безопасности
1.2.2 Систематизация типовых программных дефектов программных систем, взаимодействующих
с программными компонентами для мобильных платформ
1.2.3 Результаты исследования типовых программных дефектов программных систем, взаимодействующих
с программными компонентами для мобильных платформ
1.2.4 Предпосылки и методы автоматического исследования программ в контексте информационной безопасности
1.3 Существующие методы автоматического анализа программных систем и программных компонентов, записанных на языках программирования семейства C
1.4 Автоматический статический анализ программных систем и программных компонентов, записанных на языках программирования семейства C
1.5 Выводы
Глава 2. Восстановление модели программы по двоичному образу
программы
2.1 Восстановление свойств двоичного образа программы
2.1.1 Восстановление информации о двоичных образах программных компонентов
2.1.2 Восстановление информации о вспомогательных
свойствах двоичных образов программных компонентов
2.1.3 Построение набора сигнатур подпрограмм
с использованием архивных наборов программных модулей
2.2 Построение модели виртуальной памяти программы
2.2.1 Модель виртуальной памяти программы
2.2.2 Модель памяти программы, основанной на страничной реализации виртуального адресного пространства программы
2.2.3 Подбор региона стекового сегмента модели памяти
2.3 Восстановление графа потока управления программы
2.3.1 Граф потока управления программы и набор подпрограмм исходной программы
2.3.2 Восстановление поднабора подпрограмм исходной программы по набору сигнатур подпрограмм
2.3.3 Восстановление набора подпрограмм исходной программы
2.3.4 Восстановление наборов адресатов неявных табличных переходов
2.3.5 Восстановление настроек смещения значения указателя
стека для инструкций вызова подпрограмм
2.4 Восстановление свойств потоков данных программы
2.4.1 Определение модели состояния микропроцессора в точках
исполнения программы, соответствующих адресам инструкций микропроцессора подпрограмм исходной программы
2.4.2 Определение наборов достигающих определений абстрактных ячеек памяти в точках исполнения программы, соответствующих адресам инструкций микропроцессора подпрограмм исходной программы
2.4.3 Построение наборов цепей типа «определение-использование» для абстрактных ячеек памяти в точках исполнения программы, соответствующих адресам инструкций микропроцессора
подпрограмм исходной программы
2.4.4 Подбор модели соглашения о вызовах подпрограмм исходной программы
2.4.5 Определение наборов неиспользуемых регистровых аргументов подпрограмм исходной программы
2.4.6 Определение набора объектов модели памяти исходной программы
2.5 Восстановление модели исходной программы
2.6 Выводы
Глава 3. Набор инструментальных средств автоматического
статического анализа программных систем Proust
3.1 Компоненты набора инструментальных средств статического
анализа Proust
3.1.1 Инструментальное средство трансляции двоичных образов программных компонентов в язык представления программ LLVM proust-dump
3.1.2 Инструментальное средство статического анализа программ, записанных на языке представления программ LLVM proust-check
3.2 Практические результаты
3.2.1 Практические результаты использования предлагаемых
методов восстановления модели программы по двоичному образу программы
3.2.2 Практические результаты использования предлагаемой методики автоматического статического анализа программных систем, записанных на языках
программирования семейства C
3.3 Выводы
Заключение
Список литературы
Список фрагментов программного кода
Список алгоритмов
Список таблиц
Приложение А. Формальные описания алгоритмов
Рекомендованный список диссертаций по специальности «Математическое и программное обеспечение вычислительных машин, комплексов и компьютерных сетей», 05.13.11 шифр ВАК
Методы и средства противодействия атакам на компьютерные системы, основанным на использовании уязвимостей программного кода2012 год, кандидат технических наук Гуров, Дмитрий Валерьевич
Поиск ошибок выхода за границы буфера в бинарном коде программ2018 год, кандидат наук Каушан Вадим Владимирович
Метод межпроцедурного и межмодульного анализа кодов программ, написанных на языках C и C++, для построения многоцелевого контекстно-чувствительного анализатора2017 год, кандидат наук Сидорин, Алексей Васильевич
Исследование и разработка методов декомпиляции программ2009 год, кандидат физико-математических наук Трошина, Екатерина Николаевна
Методы и алгоритмы оптимизации переходов в компиляторе базового уровня системы двоичной трансляции для архитектуры "Эльбрус"2013 год, кандидат наук Рыбаков, Алексей Анатольевич
Введение диссертации (часть автореферата) на тему «Автоматический статический анализ программных систем, записанных на языках программирования семейства С»
Введение
Актуальность. Развитие современного процесса разработки и сопровождения информационных систем обнаруживает увеличение требований к объёму, а как следствие, и к темпу разработки программного обеспечения и программного кода в частности. Актуальные исследования тенденций развития программной индустрии [1—3] отмечают увеличение количества внешних угроз и методов проникновения в информационные системы при уменьшении качественных характеристик программного кода.
Одним из необходимых этапов современного процесса разработки и сопровождения актуальных информационных систем является этап оценки информационной защищённости программной системы [4], то есть защищённости информационных ресурсов и информационной системы в целом от несанционированного доступа, использования, утечки, вмешательства, изменения или уничтожения для соблюдения свойств конфиденциальности, целостности и доступности информации [5—11]. В частности, в контексте информационной безопасности представляется целесообразным комплексное исследование свойств программной системы, включая оценку конфиденциальности информационных ресурсов системы, целостности и доступности информации в системе. Исследование свойств защищённости программной системы включает исследование программных компонентов информационной системы на предмет наличия в них программных дефектов, нарушающих свойство информационной защищённости системы, иными словами уязвимостей информационной системы, то есть дефектов информационных систем, процессов обеспечения информационной безопасности системы, внутренних процессов или программного кода, которые могут быть использованы или вызваны источником использования уязвимости [6—9; 11; 12]. К классу программных дефектов относятся некорректные составляющие программы или программной системы или её части, которые могут привести к некорректному поведению программы или программной системы, то есть поведению, несоответствующему спецификации программы или программной системы [13—15].
Принимая в учёт рассмотренные предпосылки возникает необходимость систематизации и автоматизации методов исследования информационных систем,
в частности, анализа программного кода информационных систем. Кроме того, целесообразность автоматизации методов исследования программного кода информационных систем обуславливается наличием большого количества ошибок первого и второго рода, возникающих в процессе ручного экспертного анализа программного кода. Следует также отметить замедленное развитие методов и инструментальных средств анализа программного кода, и, в частности, отсутствие приемлемых подходов и программных средств исследования двоичных образов программ [16].
В контексте автоматизации методов исследования программных систем и её компонентов различают методы статического и динамического анализа программ. К методам статического анализа программ относятся методы обнаружения программных дефектов и уязвимостей с использованием методов исследования программного кода программы и её двоичного образа для вывода свойств поведения программы при её исполнении. К методам динамического анализа программ относятся методы обнаружения программных дефектов и уязвимостей с использованием методов исполнения программы на ограниченном наборе входных данных и исследовании поведения программной системе при её исполнении [17].
Зачастую, современные программные системы используют и включают в себя программные компоненты, программный код которых является частично либо полностью недоступным для исследования. Тем не менее, в контексте исследования программных систем по требованиям информационной безопасности необходимо исследование программного кода всех программных компонентов информационной системы. Кроме того, в контексте такого исследования представляется целесообразным исследование взаимодействия программных компонентов системы между собой.
Таким образом, задачу исследования программных систем, включающих программные компоненты, программный код которых частично либо полностью недоступен, по требованиям информационной безопасности необходимо считать актуальной. Более того, следует заметить, что обнаружение некоторых программных дефектов информационных систем принципиально возможно только в контексте исследования программы в её двоичном представлении.
Целью настоящего исследования является разработка методики автоматического статического анализа программных систем, записанных на языках про-
граммирования семейства С В контексте предлагаемой в исследовании методики автоматического статического анализа программных систем, записанных на языках программирования семейства ^ представляются целесообразными разработка и формализация методов восстановления моделей программ с использованием двоичных образов программных компонентов.
Для достижения поставленной цели необходимо решить следующие задачи:
- разработать и формализовать методы восстановления графа потока управления исходной программы, в частности, набора подпрограмм исходной программы, включая методы восстановления информации позднего связывания и механизмов обработки исключительных ситуаций;
- разработать и формализовать методы построения набора сигнатур подпрограмм с использованием архивных наборов программных модулей и определения вхождений подпрограмм исходной программы по наборам определяемых сигнатур подпрограмм;
- разработать и формализовать методы восстановления свойств подпрограмм исходной программы, в частности, восстановления наборов адресатов неявных табличных переходов, восстановления настроек смещения значения указателя стека для инструкций вызова подпрограмм, определения соглашений о вызовах подпрограмм;
- разработать и формализовать метод определения набора объектов модели памяти программы, то есть определения локальных и глобальных переменных исходной программы и их типов.
Научная новизна.
1. Разработана и формализована методика автоматизации обнаружения типовых программных дефектов для программных систем, записанных на языках программирования семейства ^ включая компоненты систем, представленных двоичным образом программного компонента. Методика отличается от существующих возможностью исследования двоичных образов программных компонентов и взаимодействия между программными компонентами.
2. Разработаны и формализованы методы восстановления графа потока управления исходной программы, в частности, набора подпрограмм ис-
ходной программы, включая методы восстановления информации позднего связывания и механизмов обработки исключительных ситуаций. Методы превосходят существующие методы в точности распознавания набора подпрограмм исходной программы, элементов графа потока управления исходной программы, информации позднего связывания и механизмов обработки исключительных ситуаций.
3. Разработаны и формализованы методы построения набора сигнатур подпрограмм с использованием архивных наборов программных модулей и определения вхождений подпрограмм исходной программы по наборам определяемых сигнатур подпрограмм. Методы предложены впервые.
4. Разработаны и формализованы методы восстановления свойств подпрограмм исходной программы, в частности, восстановления наборов адресатов неявных табличных переходов, восстановления настроек смещения значения указателя стека для инструкций вызова подпрограмм, определения соглашений о вызовах подпрограмм. Методы превосходят существующие методы в точности восстановлении свойств подпрограмм исходной программы.
5. Разработан и формализован метод определения набора объектов модели памяти программы, то есть определения локальных и глобальных переменных исходной программы и их типов. Метод превосходит существующие методы в точности определения набора объектов модели программы.
Практическая значимость. Программная реализация разработанных в процессе исследования методов восстановления высокоуровневой модели программы позволяет осуществить исследование программной системы на уровне общего представления для всех её программных компонентов, включая программные компоненты, программный код которых частично либо полностью недоступен. Следует отметить, что практические применения разработанных методов восстановления модели программы не ограничены исследованием программной системы в контексте информационной защищённости и могут быть использованы, например, для трансляции двоичных образов программ в представ-
ление, приближенное к исходному коду программы, актуального, в частности, для инженерного анализа программных систем.
Основные положения, выносимые на защиту:
- методика автоматизации обнаружения типовых программных дефектов для программных систем, записанных на языках программирования семейства ^ включая компоненты систем, представленных двоичным образом программного компонента;
- методы восстановления графа потока управления исходной программы, в частности, набора подпрограмм исходной программы, включая методы восстановления информации позднего связывания и механизмов обработки исключительных ситуаций;
- методы построения набора сигнатур подпрограмм с использованием архивных наборов программных модулей и определения вхождений подпрограмм исходной программы по наборам определяемых сигнатур подпрограмм;
- методы восстановления свойств подпрограмм исходной программы, в частности, восстановления наборов адресатов неявных табличных переходов, восстановления настроек смещения значения указателя стека для инструкций вызова подпрограмм, определения соглашений о вызовах подпрограмм;
- метод определения набора объектов модели памяти программы, то есть определения локальных и глобальных переменных исходной программы и их типов.
Публикации. Основные результаты по теме диссертации изложены в 11 печатных изданиях, 8 из которых изданы в журналах, рекомендованных ВАК, 3 — в тезисах докладов.
Объём и структура работы. Диссертация состоит из введения, трёх глав и заключения.
Полный объём диссертации составляет 223 страницы, включая 20 фрагментов программного кода, 40 описаний алгоритмов и 5 таблиц. Список литературы содержит 130 наименований.
Глава 1. Исследование программных систем в контексте информационной
безопасности
В настоящей главе приводится исследование программных систем в контексте информационной безопасности. Исходя из полученных данных и выводов формулируется и обосновывается постановка задачи разработки методики автоматического статического анализа программных систем, записанных на языках программирования семейства C.
1.1 Задачи исследования двоичных образов программ без исходного кода
Процесс разработки информационных систем, к которым предъявляются повышенные требования безопасности, включает этап оценки защищённости программной системы, то есть исследования такой системы на предмет соответствия требованиям информационной безопасности. Эти системы могут включать в себя компоненты, исходный код которых частично либо полностью недоступен, например:
- программные модули, исходный код которых был утерян или не доступен изначально;
- программные библиотеки и программные средства, распространяемые без исходных кодов;
- окружения времени исполнения.
Основным предметом исследования настоящего раздела является анализ двоичного кода программных компонентов, полученных в результате трансляции программ, записанных на языках программирования семейства C, то есть C, C++, Objective-C и Objective-C++. В отличие от языков программирования, дизайн которых разрабатывался с учётом принципов строгой безопасности типов, таких как Java, ML и Haskell, языки программирования C, C++, Objective-C и Objective-C++ предоставляют непосредственный доступ к битовому представлению объектов в виртуальной памяти исполняющегося процесса. Кроме того, процесс управ-
ления динамической памятью процесса программ, записанных на языках программирования семейства C, зачастую осуществляется вручную. В некоторых случаях для управления памятью процесса могут быть применены техники подсчёта ссылок. Например, техника автоматического подсчёта ссылок может быть использована при написании программного кода на языке C++, с использованием шаблонного класса стандартной библиотеки std::shared_ptr<T>. Автоматический подсчёт ссылок достигается с использованием семантической концепции языка «получение ресурса есть инициализация» (Resource Acquisition Is Initialization, RAII). Для программ, записанных на языках Objective-C и Objective-C++, применение техники автоматического подсчёта ссылок доступно для объектов классов, унаследованных от класса NSObject. Автоматический подсчёт ссылок в таком случае достигается с использованием методов статического анализа программы (Automatic Reference Counting, ARC). Кроме того, процесс управления динамической памятью в программах, записанных на языках программирования семейства C, может осуществляться с использованием алгоритмов консервативной автоматической сборки мусора типа mark-and-sweep, однако реализация такого метода способна отрицательно сказаться на производительности программной системы. Следует отметить, что эффективная реализация автоматической сборки мусора типа mark-and-compact не применима к программам, записанных на языках программирования семейства C, вследствие того, что указатели на объекты в памяти не могут изменять своего значения.
Исходя из этого, исследование программ семейства C в контексте информационной безопасности представляет особый интерес вследствие присутствия широкого класса программных дефектов, связанных с ручной обработкой объектов памяти. Злоумышленник может использовать ошибки обработки объектов памяти, что может повлечь компрометацию конфиденциальных данных, внедрение исполняемого кода или отказ в обслуживании. Программам, записанным на языках программирования семейства C, также свойственны типовые классы уязвимо-стей, присущие программам, записанным на других языках программирования, например, ошибки обработки входных данных или использование программных интерфейсов, рассматриваемых как небезопасные.
Как было отмечено ранее, применение методов статического анализа двоичных образов программ представляется целесообразным при анализе программ-
ных компонентов, исходный код которых частично либо полностью недоступен. Тем не менее область применения методов анализа двоичных образов программ не ограничивается указанными случаями. В настоящем разделе рассматриваются классы программных дефектов, обнаружение которых принципиально невозможно при текстуальном анализе программ или которые могут быть обнаружены сочетанием методов текстуального и двоичного анализа. Следует отметить, что рассматриваемые свойства классы программных дефектов в равной степени относятся ко всем языкам программирования семейства С
1.1.1 Дефекты программного кода, связанные с неопределённым поведением
программы
Согласно стандарту языка программирования C++ [18], неопределённым называется поведение программы, на которое данным стандартом не накладывается никаких ограничений. В стандарте языка программирования C++ также указывается, что результат исполнения программы, вызывающей неопределённое поведение, непредсказуем. Таким образом, результат исполнения некорректно сформированной программы полностью зависит от стратегии реализации трансляции программного кода компилятора языка программирования C++, а также от настроек окружения данного компилятора и целевой среды исполнения программы.
Стандарт языка программирования C++ определяет набор некорректных языковых и семантических конструкций, приводящих к неопределённому поведению программы. Ряд таких конструкций, на практике, не приводит к проявлению незаложенных программных возможностей или может быть исправлен компилятором в автоматическом режиме. В частности, к таким конструкциям следует отнести программные модули, записанные в файлах без символа новой строки в конце файла [19], или декларацию пользовательских объявлений либо определений в стандартном пространстве имён std (за исключением некоторых случаев, например специализации шаблонных типов или функций). Однако часть конструкций языка, приводящих к неопределённому поведению программы, транслируется в двоичный код, который ведёт к ошибкам времени исполнения программы. Известными примерами таких конструкций являются разыменование нулевого
указателя, использование неинициализированных переменных, переполнение целочисленной переменной и нарушение правил строгой типизации псевдонимов указателей (Strict Aliasing Rule).
При компиляции исходного программного кода, содержащего синтаксические конструкции, потенциально приводящие к неопределённому поведению транслируемой программы могут быть произведены допущения, приводящие к генерации семантически неэквивалентного кода.
В фрагменте программного кода 1 рассматривается запись программы realloc, результат работы которой, согласно стандарту языка программирования C++, не определён.
1 #include <cstdio>
2 #include <cstdlib>
3
4 int
5 main()
6 {
7 auto orig = (char*)malloc(sizeof(char));
8 auto rlc = (char*)realloc(orig, sizeof(char));
9 *orig = 'a'; *rlc = 'b';
10 if (orig == rlc)
11 putchar(*orig), putchar(*rlc);
12 }
Фрагмент программного кода 1. Исходный код программы realloc
В фрагменте программного кода 2 рассматривается запись дизассемблиро-ванного двоичного кода подпрограммы main программы realloc для семейства микропроцессорных архитектур IA-32. Двоичный образ программы realloc получен в результате трансляции исходного кода компилятором языков программирования семейства C Clang версии 3.5.0.
1 <main>:
2 ; ... <prologue>
3 movl $0x1, (%esp)
4 call <malloc@plt>
5 mov %eax, %esi
6 mov %esi, (%esp)
7 movl $0x1, 0x4(%esp)
8 call <realloc@plt>
9 movb $0x61, (%esi) ; 'a'
10 movb $0x62, (%eax) ; 'b'
11 cmp %eax, %esi
12 jne exit
13 mov stdout, %eax
14 mov %eax, 0x4( %esp)
15 movl $0x61, (%esp) ; 'a'
16 call < IO putc@plt> ; putchar('a')
17 movsbl (%esi), %eax
18 mov stdout, %ecx
19 mov %ecx, 0x4(%esp)
20 mov %eax,(%esp)
21 call < IO putc@plt> ; putchar(*rlc
22 exit:
23 ; ... <epilogue>
Фрагмент программного кода 2. Дизассемблированный код программы realloc для семейства микропроцессорных архитектур IA-32
В таблице 1 рассматривается вывод программы realloc, полученный в результате исполнения двоичного образа программы realloc.
Вывод программы
ab
Таблица 1. Вывод программы realloc
В рассматриваемой программе realloc, согласно стандарту языка программирования C++, неопределённое поведение вызвано разыменованием указателя orig после того, как он был передан подпрограмме realloc. Значение указателя orig, а следовательно, и данные, на которые такой указатель ссылается после передачи подпрограмме realloc, не определено, вследствие чего компилятор применил оптимизирующие преобразования типа «распространение констант» (Constant Propagation) к значению *orig.
Возможная реализация стратегии трансляции языковых конструкций, потенциально приводящих к неопределённому поведению программы, исходит из предположения, что транслируемая программа является корректной, то есть строго удовлетворяет стандарту исходного языка программирования. Объедине-
ние таких предположений может использоваться компилятором в процессе оптимизации внутреннего представления программы или генерации машинного кода, накладывая ограничения на возможные значения переменных (которые зачастую оказываются неверными). В частности, в результате трансляции исходного кода оптимизирующим компилятором, реализующим указанную стратегию трансляции, могут быть применены оптимизирующие преобразования типа «удаление мёртвого кода» (Dead Code Elimination, DCE), устраняющие регионы программного кода, исполнение которых подразумевалось в текстуальном представлении исходной программы.
В фрагменте программного кода 3 рассматривается запись программы endless_loop, результат работы которой, согласно стандарту языка программирования C++, не определён.
1 #include <iostream>
2
3 int
4 main()
5 {
6 int number = 0;
7 while (++number);
8 std::cout << number << '\n';
9 }
Фрагмент программного кода 3. Исходный код программы endless_loop
В фрагменте программного кода 4 рассматривается запись дизассемблиро-ванного двоичного кода подпрограммы main программы endless_loop для семейства микропроцессорных архитектур IA-32. Двоичный образ программы endless_loop получен в результате трансляции исходного кода компилятором семейства языков программирования C GCC версии 4.9.2.
1 <main>:
2 jmp <main>
Фрагмент программного кода 4. Дизассемблированный код программы endless_loop для семейства микропроцессорных архитектур IA-32
В таблице 2 рассматривается вывод программы endless_loop, полученный в результате исполнения двоичного образа программы endless_loop.
Вывод программы
<бесконечный цикл>
Таблица 2. Вывод программы endless_loop
В рассматриваемой программе endless_loop, согласно стандарту языка программирования C++, неопределённое поведение вызвано потенциальным переполнением значения целочисленной переменной number. В результате трансляции подпрограммы main был получен программный код бесконечного цикла вследствие оптимизирующий преобразований графа потока управления программы компилятором, с учётом того факта, что тело цикла не производит побочных эффектов.
Важной особенностью рассматриваемых в настоящем подразделе программ является то, что семантика результирующего программного кода существенно дифференцируется в зависимости от используемого инструментального средства трансляции, настроек окружения такого транслятора и других факторов трансляции. В таблице 3 рассматриваются результаты работы программ realloc и endless_loop в зависимости от используемого транслятора и некоторых настроек трансляции.
Инструментальное средство трансляции Настройки трансляции Вывод программы realloc Вывод программы endless loop
Clang 3.5.0 -O0 bb 0
Clang 3.5.0 -O3 ab 0
GCC 4.9.2 -O0 bb 0
GCC 4.9.2 -O3 bb <бесконечный цикл>
Таблица 3. Сравнение результатов работы программ realloc и
endless_loop
Анализ рассмотренных в настоящем подразделе примеров позволяет сделать вывод, что трансляция некорректно сформированных программ на языках программирования семейства C может привести к генерации оптимизирующим
компилятором двоичного кода, семантически не соответствующего исходному текстуальному представлению программы. В частности, в результате трансляции таких программ, полученный программный код может содержать ошибки логики исполнения программы. В контексте анализа программного кода на предмет соответствия требованиям информационной безопасности ошибочная логика программы может привести к наличию в анализируемой программной системе уяз-вимостей или, иными словами, недекларируемых возможностей.
Необходимо отметить, что некоторые типы языковых конструкций, приводящих к неопределённому поведению программы, сами по себе классифицируются как потенциальные уязвимости программной системы или являются частным случаем неопределённого поведения программы [20]. К таким конструкциям, в частности, следует отнести:
- обращение к памяти за границей массива (Buffer Overflow);
- переполнение целочисленной переменной (Integer Overflow);
- двойное освобождение динамически распределяемой памяти (Double Free);
- использование некорректной форматной строки, то есть не соответствующей типам передаваемых аргументов функции (InvalidFormat String);
- разыменование нулевого указателя (Null Dereference).
Одним из примеров ошибочной логики программной системы, приводящей к уязвимости программной системы, является уязвимость CVE-2009-1897 [21], обнаруженная в подсистеме TUN ядра ОС Linux.
В фрагменте программного кода 5 рассматривается запись программного кода подпрограммы tun_chr_poll подсистемы TUN ядра ОС Linux.
1 /* Poll */
2 static unsigned int tun_chr_poll(struct file *file,
poll_table *wait)
4 {
struct tun_file *tfile = file—>private_data; struct tun_struct *tun = _tun_get(tfile);
7 struct sock *sk = tun—>sk; /* null dereference */
8 9 10 11 12
unsigned int mask = 0; if (!tun)
return POLLERR;
13 /*...*/
Фрагмент программного кода 5. Исходный код подпрограммы tun_chr_poll, файл drivers/net/tun.c
В фрагменте программного кода 6 рассматривается запись дизассемблиро-ванного двоичного кода подпрограммы tun_chr_poll подсистемы TUN ядра ОС Linux для семейства микропроцессорных архитектур IA-32.
1 tun_chr_poll:
2 pushl %ebp
3 movl %edx, %ebp
4 pushl %edi
5 pushl %esi
6 pushl %ebx
7 subl $4, %esp
8 movl %eax, (%esp)
9 movl 112(%eax), %ebx
10 movl (%ebx), %edx
11 testl %edx, %edx
12 je 17 <tun chr poll+0x26>
13 leal 1(%edx), %esi
14 movl %edx, %eax
15 lock
16 cmpxchgl %esi, (%ebx)
17 cmpl %edx, %eax
18 je 126 <tun chr poll+0xA0>
19 movl %eax, %edx
20 jmp —21 <tun chr poll+0x11>
21 xorl %esi, %esi
22 testl %ebp, %ebp
23 movl 100(%esi), %edi
24 je 11 <tun chr poll+0x3A>
25 ; ...
Фрагмент программного кода 6. Дизассемблированный код подпрограммы tun_chr_poll для семейства микропроцессорных архитектур IA-32
В рассматриваемом фрагменте программного кода подпрограммы tun_ chr_poll уязвимость проявляется вследствие наличия конструкции разыменования указателя tun перед проверкой его значения на соответствие нулю, вслед-
ствие чего последующая проверка его значения рассматривается оптимизирующим компилятором как мёртвый код. Таким образом, трансляция выражения проверки указателя не осуществляется компилятором, позволяя злоумышленнику повысить локальные права доступа в целевой системе, использующей уязвимую версию ядра операционной системы.
Ранее в настоящем подразделе было показано, что результат трансляции некорректно сформированных программ зависит от используемого инструментального средства трансляции программного кода, настроек окружения инструментальной среды и архитектуры целевого окружения времени исполнения. Как следствие, становится принципиально невозможным обнаружение некоторых типов программных дефектов программных систем, в том числе потенциальных уяз-вимостей таких систем, на основании статического текстуального анализа программного кода исходной программы. Более того, возможно показать, что обнаружение языковых конструкций, приводящих к неопределённому поведению программы, является алгоритмически неразрешимой задачей.
Похожие диссертационные работы по специальности «Математическое и программное обеспечение вычислительных машин, комплексов и компьютерных сетей», 05.13.11 шифр ВАК
Исследование и реализация базовой вычислительной машины с внутренним языком высокого уровня2003 год, кандидат технических наук Чернов, Сергей Александрович
Методы и средства эквивалентного преобразования программ на основе переносимой среды выполнения2020 год, кандидат наук Логинов Иван Павлович
Применение диверсифицирующих преобразований для защиты от эксплуатации уязвимостей2021 год, кандидат наук Нурмухаметов Алексей Раисович
Принципы и методы создания компилятора переднего плана Стандарта Cu ++1999 год, кандидат физико-математических наук Зуев, Евгений Александрович
Поиск ошибок переполнения буфера в исходном коде программ с помощью символьного выполнения2019 год, кандидат наук Дудина Ирина Александровна
Список литературы диссертационного исследования кандидат наук Сафин Ленар Камилевич, 2018 год
Список литературы
1. Hewlett Packard Enterprise. HPE Security Research Cyber Risk Report 2016: Technical Report / Hewlett Packard Enterprise ; Hewlett Packard Enterprise. — 2016.
2. Micro Focus. Security Innovation: Technical Report / Micro Focus ; Micro Focus. — 2017.
3. Ponemon Institute. Cost of Cyber Crime Study: Insights on the Security Investments That Make a Difference: Technical Report / Ponemon Institute ; Ponemon Institute. — 2017.
4. G. Post. Management Information Systems: Solving Business Problems with Information Technology / G. Post, D. Anderson. — McGraw-Hill School Education Group, 2002.
5. M. Swanson. Information Security: Special Publication / M. Swanson, J. Hash, P. Bowen ; National Institute of Standards and Technology. — 2006.
6. Joint Task Force Transformation Initiative. Guide for Applying the Risk Management Framework to Federal Information Systems: Special Publication / Joint Task Force Transformation Initiative ; National Institute of Standards and Technology. — 2010.
7. Joint Task Force Transformation Initiative. Security and Privacy Controls for Federal Information Systems and Organizations: Special Publication / Joint Task Force Transformation Initiative ; National Institute of Standards and Technology. — 2013.
8. Joint Task Force Transformation Initiative. Assessing Security and Privacy Controls in Federal Information Systems and Organizations: Special Publication / Joint Task Force Transformation Initiative ; National Institute of Standards and Technology. — 2014.
9. Volume I: Guide for Mapping Types of Information and Information Systems to Security Categories: Special Publication / K. Stine [h gp.] ; National Institute of Standards and Technology. — 2008.
10. Federal Information Processing Standards. Standards for Security Categorization of Federal Information and Information Systems: Standard / Federal Information Processing Standards ; Federal Information Processing Standards. — 2004.
11. Federal Information Processing Standards. Minimum Security Requirements for Federal Information and Information Systems: Standard / Federal Information Processing Standards ; Federal Information Processing Standards. — 2006.
12. Technical Guide to Information Security Testing and Assessment: Special Publication / K. Scarfone [и др.] ; National Institute of Standards and Technology. — 2008.
13. Burnstein I. Practical Software Testing: A Process-Oriented Approach / I. Burnstein. — Springer Publishing Company, Incorporated, 2003.
14. Institute of Electrical and Electronics Engineers. IEEE Standard Glossary of Software Engineering Terminology: Standard / Institute of Electrical and Electronics Engineers ; Institute of Electrical and Electronics Engineers. —1990.
15. Institute of Electrical and Electronics Engineers. ISO/IEC/IEEE International Standard - Systems and software engineering - Vocabulary: Standard / Institute of Electrical and Electronics Engineers ; Institute of Electrical and Electronics Engineers. — 2010.
16. Методы поиска ошибок в бинарном коде: Technical Report / В. В. Каушан [и др.] ; Институт системного программирования им. В. П. Иванникова Российской академии наук. — 2013.
17. Vetting the Security of Mobile Applications: Special Publication / S. Quirolgico [и др.] ; National Institute of Standards and Technology. — 2015.
18. Programming Language C++: Standard / International Organization for Standardization. — Geneva, CH, 2011.
19. Programming Language C++: Standard / International Organization for Standardization. — Geneva, CH, 2003.
20. Open Web Application Security Project. Category:Vulnerability — OWASP [Электронный ресурс] / Open Web Application Security Project. — URL: https : / / www. owasp . org / index . php / Category : Vulnerability (дата обр. 01.02.2017).
21. National Institute of Standards and Technology. NVD — CVE-2009-1897 [Электронный ресурс] / National Institute of Standards and Technology. — URL: https://nvd.nist.gov/vuln/detail/CVE-2009-1897 (дата обр. 01.02.2017).
22. National Institute of Standards and Technology. NVD — CVE-2010-4645 [Электронный ресурс] / National Institute of Standards and Technology. — URL: https://nvd.nist.gov/vuln/detail/CVE-2010-4645 (дата обр. 01.02.2017).
23. Open Web Application Security Project. Insecure Compiler Optimization — OWASP [Электронный ресурс] / Open Web Application Security Project. — URL: https : // www. owasp. org/index. php/Insecure_Compiler_Optimization (дата обр. 01.02.2017).
24. Programming Language C: Standard / International Organization for Standardization. — Geneva, CH, 2011.
25. Open Web Application Security Project. OWASP Mobile Security Project — OWASP [Электронный ресурс] / Open Web Application Security Project. — URL: https : //www. owasp. org/index. php/OWASP_Mobile_Security_Project (дата обр. 01.02.2017).
26. The Open Web Application Security Project Foundation. OWASP Top 10 — 2013. The Ten Most Critical Web Application Security Risks: Technical Report / The Open Web Application Security Project Foundation ; The Open Web Application Security Project Foundation. — 2013.
27. The Open Web Application Security Project Foundation. OWASP Top 10 — 2017. The Ten Most Critical Web Application Security Risks: Technical Report / The Open Web Application Security Project Foundation ; The Open Web Application Security Project Foundation. — 2017.
28. Web Application Security Consortium. The Web Application Security Consortium / Threat Classification [Электронный ресурс] / Web Application Security Consortium. —URL: http://projects.webappsec.org/wZpage/13246978/ Threat%20Classification (дата обр. 01.02.2017).
29. S. Turner. Prohibiting Secure Sockets Layer (SSL) Version 2.0: RFC / S. Turner, T. Polk ; RFC Editor. — 2011.
30. Deprecating Secure Sockets Layer Version 3.0: RFC / R. Barnes [и др.] ; RFC Editor. —2015.
31. National Institute of Standards and Technology. NVD — CVE-2009-3555 [Электронный ресурс] / National Institute of Standards and Technology. — URL: https://nvd.nist.gov/vuln/detail/CVE-2009-3555 (дата обр. 01.02.2017).
32. National Institute of Standards and Technology. NVD — CVE-2012-4929 [Электронный ресурс] / National Institute of Standards and Technology. — URL: https://nvd.nist.gov/vuln/detail/CVE-2012-4929 (дата обр. 01.02.2017).
33. National Institute of Standards and Technology. NVD — CVE-2010-3972 [Электронный ресурс] / National Institute of Standards and Technology. — URL: https://nvd.nist.gov/vuln/detail/CVE-2010-3972 (дата обр. 01.02.2017).
34. National Institute of Standards and Technology. NVD — CVE-2011-3389 [Электронный ресурс] / National Institute of Standards and Technology. — URL: https://nvd.nist.gov/vuln/detail/CVE-2011-3389 (дата обр. 01.02.2017).
35. National Institute of Standards and Technology. NVD — CVE-2014-0160 [Электронный ресурс] / National Institute of Standards and Technology. — URL: https://nvd.nist.gov/vuln/detail/CVE-2014-0160 (дата обр. 01.02.2017).
36. National Institute of Standards and Technology. NVD — CVE-2014-0224 [Электронный ресурс] / National Institute of Standards and Technology. — URL: https://nvd.nist.gov/vuln/detail/CVE-2014-0224 (дата обр. 01.02.2017).
37. National Institute of Standards and Technology. NVD — CVE-2014-3566 [Электронный ресурс] / National Institute of Standards and Technology. — URL: https://nvd.nist.gov/vuln/detail/CVE-2014-3566 (дата обр. 01.02.2017).
38. National Institute of Standards and Technology. NVD — CVE-2016-0800 [Электронный ресурс] / National Institute of Standards and Technology. — URL: https://nvd.nist.gov/vuln/detail/CVE-2016-0800 (дата обр. 01.02.2017).
39. OpenSSL Software Foundation. OpenSSL: The Open Source toolkit for SSL/TLS [Электронный ресурс] / OpenSSL Software Foundation. — URL: https://www.openssl.org/ (дата обр. 01.02.2017).
40. B. Schneier. Applied Cryptography: Protocols, Algorithms, and Source Code in C / B. Schneier. — John Wiley & Sons, 1996.
41. E. Barker. Transitions: Recommendation for Transitioning the Use of Cryptographic Algorithms and Key Lengths: Special Publication / E. Barker, A. Roginsky ; National Institute of Standards and Technology. — 2015.
42. X. Wang. How to Break MD5 and Other Hash Functions / X. Wang, H. Yu // Advances in Cryptology — EUROCRYPT 2005: 24th Annual International Conference on the Theory and Applications of Cryptographic Techniques, Aarhus, Denmark, May 22-26, 2005. Proceedings. — Berlin, Heidelberg : Springer Berlin Heidelberg, 2005. — С. 19—35.
43. S. Turner. Updated Security Considerations for the MD5 Message-Digest and the HMAC-MD5 Algorithms: RFC / S. Turner, L. Chen ; RFC Editor. — 2011.
44. X Wang. Finding Collisions in the Full SHA-1 / X. Wang, L. Y. Yiqun, Y. Hongbo // Advances in Cryptology — CRYPTO 2005: 25th Annual International Cryptology Conference, Santa Barbara, California, USA, August 14-18, 2005. Proceedings. — Berlin, Heidelberg : Springer Berlin Heidelberg, 2005. — С. 17—36.
45. Apple Inc. About App Sandbox [Электронный ресурс] / Apple Inc. — URL: https : / / developer . apple . com / library / content / documentation / Security / Conceptual/AppSandboxDesignGuide/ AboutAppSandbox/ AboutAppSandbox. html (дата обр. 01.02.2017).
46. D. Blazakis. The Apple Sandbox [Электронный ресурс] / D. Blazakis. — URL: https ://dl. packetstormsecurity. net/papers/general/apple- sandbox. pdf (дата обр. 01.02.2017).
47. Android Open Source Project. Security | Android Open Source Project [Электронный ресурс] / Android Open Source Project. — URL: https : // source. android.com/security/ (дата обр. 01.02.2017).
48. Android Developers. Intent | Android Developers [Электронный ресурс] / Android Developers. — URL: https://developer.android.com/reference/android/ content/Intent.html (дата обр. 01.02.2017).
49. Android Developers. Pendinglntent | Android Developers [Электронный ресурс] / Android Developers. —URL: https://developer.android.com/reference/ android/content/Pendinglntent.html (дата обр. 01.02.2017).
50. Android Developers. Content Providers | Android Developers [Электронный ресурс] / Android Developers. —URL: https://developer.android.com/guide/ topics/providers/content-providers.html (дата обр. 01.02.2017).
51. K. Nohl. Rooting SIM cards [Электронный ресурс] / K. Nohl. — URL: https: / / media. blackhat. com / us-13 /us-13 - Nohl - Rooting - SIM - cards - Slides. pdf (дата обр. 01.02.2017).
52. I. Goldberg. GSM Cloning [Электронный ресурс] /1. Goldberg, M. Briceno. — URL: http: // www. isaac. cs. berkeley. edu/ isaac/ gsm - faq. html (дата обр. 01.02.2017).
53. E. Barkan. Instant Ciphertext-Only Cryptanalysis of GSM Encrypted Communication / E. Barkan, E. Biham, N. Keller // Journal of Cryptology. — 2008. — Т. 21, № 3. — С. 392—429.
54. J. Golic. Cryptanalysis of Alleged A5 Stream Cipher / J. Golic // Advances in Cryptology — EUROCRYPT '97: International Conference on the Theory and Application of Cryptographic Techniques Konstanz, Germany, May 11-15, 1997 Proceedings. — Berlin, Heidelberg : Springer Berlin Heidelberg, 1997. —
C. 239—255.
55. P. Ekdahl. Another attack on A5/1 / P. Ekdahl, T. Johansson // IEEE Transactions on Information Theory. — 2003. — Т. 49, № 1. — С. 284—289.
56. A. Biryukov. Real Time Cryptanalysis of A5/1 on a PC / A. Biryukov, A. Shamir,
D. Wagner // Fast Software Encryption: 7th International Workshop, FSE 2000 New York, NY, USA, April 10-12, 2000 Proceedings. — Berlin, Heidelberg : Springer Berlin Heidelberg, 2001. — С. 1—18.
57. O. Dunkelman. A Practical-time Related-key Attack on the KASUMI Cryptosystem Used in GSM and 3G Telephony / O. Dunkelman, N. Keller, A. Shamir // Proceedings of the 30th Annual Conference on Advances in Cryptology. — Berlin, Heidelberg : Springer-Verlag, 2010. — С. 393—410.
58. K. Nohl. GSM — SRSLY? [Электронный ресурс] / K. Nohl, C. Paget. — URL: https://events.ccc.de/congress/2009/Fahrplan/ attachments/ 1519_26C3.Karsten. Nohl.GSM.pdf (дата обр. 01.02.2017).
59. U. Meyer. On the impact of GSM encryption and man-in-the-middle attacks on the security of interoperating GSM/UMTS networks / U. Meyer, S. Wetzel // 2004 IEEE 15th International Symposium on Personal, Indoor and Mobile Radio Communications (IEEE Cat. No.04TH8754). — New York, NY, USA : Institute of Electrical, Electronics Engineers, 2004. — С. 2876—2883.
60. P. Wagle. StackGuard: Simple Stack Smash Protection for GCC / P. Wagle, C. Cowan // Proceedings of the GCC Developers Summit. Ottawa, Ontario, Canada, May 25-27,2003. — Ottawa, Ontario, Canada : GCC Summit, 2003. — С. 243—256.
61. The KLEE Team. KLEE [Электронный ресурс] / The KLEE Team. — URL: https://klee.github.io/ (дата обр. 01.02.2017).
62. C. Cadar. KLEE: Unassisted and Automatic Generation of High-coverage Tests for Complex Systems Programs / C. Cadar, D. Dunbar, D. Engler // Proceedings of the 8th USENIX Conference on Operating Systems Design and Implementation. — Berkeley, CA, USA : USENIX Association, 2008. — С. 209—224.
63. LLVMProject. The LLVM Compiler Infrastructure Project [Электронный ресурс] / LLVM Project. — URL: http://llvm.org/ (дата обр. 01.02.2017).
64. The LLVM Compiler Infrastructure Project. clang: a C language family frontend for LLVM [Электронный ресурс] / The LLVM Compiler Infrastructure Project. —URL: https://clang.llvm.org/ (дата обр. 01.02.2017).
65. Microsoft Corporation. Microsoft Portable Executable and Common Object File Format Specification / Microsoft Corporation ; Microsoft Corporation. — 2015.
66. Tool Interface Standards (TIS). Executable and Linkable Format (ELF) [Электронный ресурс] / Tool Interface Standards (TIS). — URL: http://www.skyfree. org/linux/references/ELF_Format.pdf (дата обр. 01.02.2017).
67. Apple Inc. OS X ABI Mach-O File Format Reference [Электронный ресурс] / Apple Inc. — URL: https : //developer. apple. com /documentation/ DeveloperTools / Conceptual / MachORuntime / index . html (дата обр. 01.01.2015).
68. J. Levine. Linkers and Loaders / J. Levine. — Morgan Kaufmann Publishers Inc., 1999.
69. Н. В. Лихачев. Путь воина — внедрение в PE/COFF-файлы / Н. В. Лихачев // Системный администратор. — 2004. — 6(19). — С. 52—71.
70. IBM Knowledge Center. AR File Format (Big) [Электронный ресурс] / IBM Knowledge Center. —URL: https://www.ibm.com/support/knowledgecenter/ ssw_aix_61/com.ibm.aix.files/ar_big.htm (дата обр. 01.02.2017).
71. I. Skochinsky. Compiler Internals: Exceptions and RTTI / I. Skochinsky // International Conference REcon Montreal 2012. — 2012.
72. I. Skochinsky. Reversing Microsoft Visual C++ Part II: Classes, Methods and RTTI [Электронный ресурс] /1. Skochinsky. — URL: http://www.openrce. org/articles/full_view/23 (дата обр. 01.02.2017).
73. Linux Foundation Referenced Specifications. Itanium C++ ABI [Электронный ресурс] / Linux Foundation Referenced Specifications. —URL: http://refspecs. linuxbase.org/cxxabi-1.83.html (дата обр. 01.02.2017).
74. Free Software Foundation Inc. GCC, the GNU Compiler Collection [Электронный ресурс] / Free Software Foundation Inc. — URL: https://gcc.gnu.org/ (дата обр. 01.02.2017).
75. Apple Inc. Source Browser [Электронный ресурс] / Apple Inc. — URL: https: //opensource.apple.com/source/objc4/ (дата обр. 01.02.2017).
76. I. Skochinsky. Reversing Microsoft Visual C++ Part I: Exception Handling [Электронный ресурс] /1. Skochinsky. — URL: http://www.openrce.org/ articles/full_view/21 (дата обр. 01.02.2017).
77. M. Pietrek. A Crash Course on the Depths of Win32 Structured Exception Handling [Электронный ресурс] / M. Pietrek. —URL: https://www.microsoft. com/msj/0197/Exception/Exception.aspx (дата обр. 01.02.2017).
78. M. Russinovich. Windows Internals, Part 1: Covering Windows Server 2008 R2 and Windows 7 / M. Russinovich, D. Solomon, A. Ionescu. — Microsoft Press, 2012.
79. M. Russinovich. Windows Internals, Part 2: Covering Windows Server 2008 R2 and Windows 7 / M. Russinovich, D. Solomon, A. Ionescu. — Microsoft Press, 2012.
80. Microsoft Corporation. Structured Exception Handling Reference (Windows) [Электронный ресурс] / Microsoft Corporation. — URL: https : / / msdn . microsoft. com/ en - us / library / windows/ desktop/ms680660(v=vs. 85 ) .aspx (дата обр. 01.02.2017).
81. DWARF Standards Committee. The DWARF Debugging Standard [Электронный ресурс] / DWARF Standards Committee. — URL: http://dwarfstd.org/ (дата обр. 01.02.2017).
82. Microsoft Corporation. Microsoft/microsoft-pdb [Электронный ресурс] / Microsoft Corporation. — URL: https://github.com/Microsoft/microsoft-pdb (дата обр. 01.02.2017).
83. Microsoft Corporation. Symbol Files [Электронный ресурс] / Microsoft Corporation. — URL: https://msdn.microsoft.com/en-us/library/windows/ desktop/aa363368(v=vs.85).aspx (дата обр. 01.02.2017).
84. Microsoft Corporation. Debug Interface Access SDK [Электронный ресурс] / Microsoft Corporation. — URL: https : / / msdn. microsoft. com/ en - us / library / x93ctkx8.aspx (дата обр. 01.02.2017).
85. J. Hennessy. Computer Architecture, Fifth Edition: A Quantitiative Approach / J. Hennessy, D. Patterson. — Morgan Kaufmann Publishers Inc., 2011.
86. A. Tanenbaum. Structured Computer Organization / A. Tanenbaum, T. Austin. — Prentice Hall Press, 2012.
87. A. Tanenbaum. Modern Operating Systems / A. Tanenbaum, H. Bos. — Prentice Hall Press, 2014.
88. U. Drepper. What Every Programmer Should Know About Memory [Электронный ресурс] /U. Drepper. —URL: https://people.freebsd.org/~lstewart/articles/ cpumemory.pdf (дата обр. 01.02.2017).
89. Intel Corporation. Intel 64 and IA-32 Architectures Software Developer's Manual Combined Volumes: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D and 4 / Intel Corporation ; Intel Corporation. — 2007.
90. Advanced Micro Devices. AMD64 Technology AMD64 Architecture Programmer's Manual Volume 1: Application Programming / Advanced Micro Devices ; Advanced Micro Devices. — 2013.
91. ARM Limited. ARMv7-M Architecture Reference Manual / ARM Limited ; ARM Limited. — 2014.
92. ARM Limited. ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition / ARM Limited ; ARM Limited. — 2014.
93. ARM Limited. ARMv8-M Architecture Reference Manual / ARM Limited ; ARM Limited. — 2014.
94. Microsoft Corporation. _cdecl [Электронный ресурс] / Microsoft
Corporation. — URL: https://msdn.microsoft.com/en-us/library/zkwh89ks.aspx (дата обр. 01.02.2017).
95. Free Software Foundation Inc. x86 Function Attributes [Электронный ресурс] / Free Software Foundation Inc. — URL: https://gcc.gnu.org/onlinedocs/gcc/x86-Function-Attributes.html (дата обр. 01.02.2017).
96. A. Fog. Calling conventions for different C++ compilers and operating systems [Электронный ресурс] / A. Fog. — URL: http://agner.org/optimize/calling_ conventions.pdf (дата обр. 01.02.2017).
97. LLVM Project. LLVM Language Reference Manual [Электронный ресурс] / LLVM Project. — URL: http : / / llvm . org / docs / LangRef. html (дата обр. 01.02.2017).
98. Microsoft Corporation. _fastcall [Электронный ресурс] / Microsoft
Corporation. — URL: https://msdn.microsoft.com/en-us/library/6xa169sk.aspx (дата обр. 01.02.2017).
99. Microsoft Corporation. _stdcall [Электронный ресурс] / Microsoft
Corporation. — URL: https://msdn.microsoft.com/en-us/library/zxk0tw93.aspx (дата обр. 01.02.2017).
100. Microsoft Corporation. _thiscall [Электронный ресурс] / Microsoft
Corporation. — URL: https://msdn.microsoft.com/en-us/library/ek8tkfbw.aspx (дата обр. 01.02.2017).
101. Microsoft Corporation. Overview of x64 Calling Conventions [Электронный ресурс] / Microsoft Corporation. — URL: https://msdn.microsoft.com/en-us/library/ms235286.aspx (дата обр. 01.02.2017).
102. System V Application Binary Interface AMD64 Architecture Processor Supplement: Technical Report / M. Matz [и др.] ; System V. — 2014.
103. ARM Limited. Procedure Call tandard for the ARM Architecture / ARM Limited ; ARM Limited. — 2015.
104. ARM Limited. Procedure Call Standard for the ARM 64-bit Architecture (AArch64) / ARM Limited ; ARM Limited. — 2013.
105. A. Aho. Efficient String Matching: An Aid to Bibliographic Search / A. Aho, M. Corasick // Communications of the ACM. — 1975. — Т. 18, № 6. — С. 333— 340.
106. Microsoft Corporation. Considerations for Writing Prolog/Epilog Code [Электронный ресурс] / Microsoft Corporation. — URL: https://msdn.microsoft. com/en-us/library/6xy06s51.aspx (дата обр. 01.02.2017).
107. Microsoft Corporation. Prolog and Epilog [Электронный ресурс] / Microsoft Corporation. — URL: https://msdn.microsoft.com/en-us/library/tawsa7cb.aspx (дата обр. 01.02.2017).
108. Microsoft Corporation. ARM Prolog and Epilog (Compact 7) [Электронный ресурс] / Microsoft Corporation. — URL: https://msdn.microsoft.com/en-us/library/ee479911(v=winembedded.70).aspx (дата обр. 01.02.2017).
109. The Wikimedia Foundation, Inc. X86 Disassembly [Электронный ресурс] / The Wikimedia Foundation, Inc. —URL: https://upload.wikimedia.org/wikipedia/ commons/5/53/X86_Disassembly.pdf (дата обр. 01.02.2017).
110. Practical Reverse Engineering: x86, x64, ARM, Windows Kernel, Reversing Tools, and Obfuscation / B. Dang [и др.]. — John Wiley & Sons, 2014.
111. W. Hohl. ARM Assembly Language: Fundamentals and Techniques / W. Hohl. — CRC Press, Inc., 2009.
112. E. Eilam. Reversing: Secrets of Reverse Engineering / E. Eilam. — John Wiley & Sons, 2008.
113. Определение границ подпрограмм при статическом анализе бинарных образов / Л.К. Сафин [и др.] // Вопросы кибербезопасности. — 2016. — 1 (14).— С. 53—60.
114. W. Harrison. Compiler Analysis of the Value Ranges for Variables / W. Harrison // IEEE Transactions on Software Engineering. — 1977. — Т. 3, №3. —С. 243—250.
115. S. Muchnick. Advanced Compiler Design and Implementation / S. Muchnick. — Morgan Kaufmann Publishers Inc., 1997.
116. Compilers: Principles, Techniques, and Tools (2nd Edition) / A. Aho [и др.]. — Addison-Wesley Longman Publishing Co., Inc., 2006.
117. R. Morgan. Building an Optimizing Compiler / R. Morgan. — Digital Press, 1998.
118. K. Kennedy. Optimizing Compilers for Modern Architectures: A Dependence-based Approach / K. Kennedy, J. Allen. — Morgan Kaufmann Publishers Inc., 2002.
119. F Nielson. Principles of program analysis / F. Nielson, H. Nielson, C. Hankin. — Springer Publishing Company, Incorporated, 2015.
120. G. Balakrishnan. Analyzing Memory Accesses in x86 Executables / G. Balakrishnan, T. Reps // Compiler Construction: 13th International Conference, CC 2004, Held as Part of the Joint European Conferences on Theory and Practice of Software, ETAPS 2004, Barcelona, Spain, March 29 -April 2, 2004. Proceedings. — Berlin, Heidelberg : Springer Berlin Heidelberg, 2004. — С. 5—23.
121. D. Hochbaum. Can a System of Linear Diophantine Equations be Solved in Strongly Polynomial Time? [Электронный ресурс] / D. Hochbaum, W. Haas, A. Pathria. — URL: http://riot.ieor.berkeley.edu/~dorit/pub/lde.pdf (дата обр. 01.02.2017).
122. F. Ajili. Complete solving of linear Diophantine equations and inequations without adding variables / F. Ajili, E. Contejean // Principles and Practice of Constraint Programming — CP '95: First International Conference, CP '95 Cassis, France, September 19-22, 1995 Proceedings. — Berlin, Heidelberg : Springer Berlin Heidelberg, 1995. — С. 1—17.
123. C. Gao. ABS algorithm for solving a class of linear Diophantine inequalities and integer LP problems / C. Gao, Y. Dong // Journal of Applied Mathematics and Informatics. — 2008. — 26 (1—2). — С. 349—353.
124. J. Chinneck. Feasibility and Infeasibility in Optimization: Algorithms and Computational Methods / J. Chinneck. — Springer Publishing Company, Incorporated, 2007.
125. P. Belotti. The Maximum Feasible Subsystem problem [Электронный ресурс] / P. Belotti. —URL: http://risorse.dei.polimi.it/maxfs/ (дата обр. 01.02.2017).
126. O. Guieu. Analyzing Infeasible Mixed-Integer and Integer Linear Programs / O. Guieu, J. Chinneck // INFORMS Journal on Computing. — 1999. — Т. 11, № 1. —С. 63—77.
127. G. Kildall. A Unified Approach to Global Program Optimization / G. Kildall // Proceedings of the 1st Annual ACM SIGACT-SIGPLAN Symposium on Principles of Programming Languages. — New York, NY, USA : Association for Computing Machinery, 1973. — С. 194—206.
128. J. Ullman. Monotone data flow analysis frameworks / J. Ullman, J. Kam // Acta Informatica. — 1977. — № 3. — С. 305—317.
129. LLVM Project. LLVM's Analysis and Transform Passes [Электронный ресурс] / LLVM Project. — URL: http://llvm.org/docs/Passes.html (дата обр. 01.02.2017).
130. ООО «СОЛАР СЕКЬЮРИТИ» — система управления инцидентами ИБ. Solar inCode [Электронный ресурс] / ООО «СОЛАР СЕКЬЮРИТИ» — система управления инцидентами ИБ. — URL: http://www.solarsecurity.ru/ products/solar_inCode/ (дата обр. 01.02.2017).
Список фрагментов программного кода
1 Исходный код программы realloc.................. 14
2 Дизассемблированный код программы realloc для семейства микропроцессорных архитектур IA-32................. 14
3 Исходный код программы endless_loop.............. 16
4 Дизассемблированный код программы endless_loop для семейства микропроцессорных архитектур IA-32 .......... 16
5 Исходный код подпрограммы tun_chr_poll, файл drivers/net/tun.c .............................. 18
6 Дизассемблированный код подпрограммы tun_chr_poll для семейства микропроцессорных архитектур IA-32 .......... 19
7 Исходный код программы ub_undecidable............20
8 Исходный код подпрограммы process_user_data........23
9 Дизассемблированный код исследуемой программного компонента bank_mobile для семейства микропроцессорных архитектур ARM ............................. 46
10 Структуры данных, описывающие информацию о динамической идентификации типов данных, используемые инструментальным средством трансляции Microsoft Visual C++..............65
11 Структуры данных, описывающие информацию о динамической идентификации типов данных, используемые
инструментальными средствами, реализующими Itanium C++ ABI . 67
12 Структуры данных, описывающие информацию о полиморфных типах данных, используемые инструментальными средствами трансляции программного кода, записанного на языках программирования Objective-C и Objective-C++ ...........69
13 Структуры данных, описывающие информацию о механизме структурированной обработки исключительных ситуаций, используемые инструментальным средством трансляции Microsoft Visual C++ в процессе трансляции программного кода
для 32-битных целевых архитектур микропроцессора........73
14 Структуры данных, описывающие информацию о механизме структурированной обработки исключительных ситуаций, используемые инструментальным средством трансляции Microsoft Visual C++ в процессе трансляции программного кода
для 64-битных целевых архитектур микропроцессора........77
15 Фрагмент набора сигнатур подпрограмм инструментального средства proust-dump ........................162
16 Фрагмент таблицы имён символов базы знаний инструментального средства proust-dump.............165
17 Исходный код программы strbuf...................166
18 Вывод инструментального средства proust-dump для
двоичного образа программы strbuf.................167
19 Вывод инструментального средства clang для исходного кода программы strbuf...........................168
20 Вывод инструментального средства proust-check для представления программы strbuf, записанной на языке представления программ LLVM....................170
Список алгоритмов
1 Алгоритм ParseModule разбора двоичного образа программного модуля..........................195
2 Алгоритм Ра^е1шаде разбора двоичного образа программного модуля ..................................196
3 Алгоритм MakeObjectSignatures построения набора сигнатур подпрограмм с использованием двоичного образа программного модуля..........................197
4 Алгоритм MakeArchiveSignatures построения набора сигнатур подпрограмм с использованием архивного набора программных модулей..........................197
5 Алгоритм FetchVirtualSegment доступа к данным виртуального сегмента модели памяти.................198
6 Алгоритм CreateVirtualSegments, осуществляющий отображение БЬ: I ^ Ув .......................198
7 Алгоритм CreateVirtualMemory, осуществляющий отображение УМ: Ув ^ V ......................199
8 Алгоритм GetIterationRange...................199
9 Алгоритм GetVirtualPage.....................200
10 Алгоритм SanitizeSegmentation ................201
11 Алгоритм MapVirtualSegment...................201
12 Алгоритм FetchVirtualMemory..................203
13 Алгоритм GetRegionPermissions ................203
14 Алгоритм WriteShadowPage ....................204
15 Алгоритм ReadShadowPage.....................205
16 Алгоритм WriteShadow........................206
17 Алгоритм ReadShadow ........................206
18 Алгоритм Р^кАг^^ес^ге подбора модели целевой архитектуры микропроцессора.....................207
19 Алгоритм PickDisassembler подбора способа декодирования потока байтов ..............................207
20 Алгоритм Р1скСРи подбора модели состояния микропроцессора . 208
21 Алгоритм SimulateInstruction.................208
22 Алгоритм MatchMasks поиска набора подстрок, допускающих переменные символы..........................209
23 Алгоритм CreateEmptySubroutine................210
24 Алгоритм InitializeSubroutineAnalysisContext .... 211
25 Алгоритм RetrieveAdvancedSubroutinesWorkset.....212
26 Алгоритм CheckedDecode......................212
27 Алгоритм
InitializeConcreteSubroutineAnalysisContext .... 213
28 Алгоритм AnalyzeSubroutine...................216
29 Алгоритм AnalyzeSubroutine...................216
30 Алгоритм CreateOrSetUpSubroutine..............218
31 Алгоритм TerminateSubroutineAnalysisContext.....219
32 Алгоритм NullifyTemporaryShadow...............219
33 Алгоритм AnalyzeSubroutines, реализующий отображение
С: (1,У) — Т..............................220
34 Алгоритм CollectInstructionDUChains............221
35 Алгоритм CollectDUChains ....................221
36 Алгоритм SimulateInstructionOrIntrinsic ........222
37 Алгоритм GenerateDefSet .....................222
38 Алгоритм GenerateUseSet .....................222
39 Алгоритм GenerateKillSet ....................223
40 Алгоритм AdvanceReachSet ....................223
Список таблиц
1 Вывод программы realloc................................................15
2 Вывод программы endless_loop........................................17
3 Сравнение результатов работы программ realloc и endless_loop 17
4 Распределение классов программных дефектов программных систем, взаимодействующих с програмными компонентами для мобильных платформ...................................43
5 Практические результаты использования предлагаемых методов восстановления модели программы по двоичному образу программы . 173
Приложение А Формальные описания алгоритмов
В настоящем приложении приводятся формальные описания алгоритмов, рассматриваемых в настоящей работе.
Алгоритм ParseModule разбора двоичного образа программного модуля
В настоящем разделе формализуется алгоритм ParseModule разбора двоичного образа программного модуля. 1: function ParseModule(B)
2: for each IP e IP do 3: if B matches magic(IP) then 4: IР{ ^ IP 5: return IPi(B)
6: raise ParseModuleFailed
Алгоритм 1. Алгоритм ParseModule разбора двоичного образа программного
модуля
Алгоритм ParseImage разбора двоичного образа программного модуля
В настоящем разделе формализуется алгоритм ParseImage разбора двоичного образа программного компонента. 1: function ParseImage(B) 2: for each P e P do 3: if B matches magic(P) then
4: if P then
5: IP.\ ^ P
6: yield IPi(B)
7: else
8: AP% ^ P
9: for each B3 e APLi(B) do
10: yield ParseModule(Bj)
11: raise ParselmageFailed
Алгоритм 2. Алгоритм Parselmage разбора двоичного образа программного
модуля
Алгоритм MakeObjectSignatures построения набора сигнатур подпрограмм с использованием двоичного образа программного модуля
В настоящем разделе формализуется алгоритм MakeObjectSignatures построения набора сигнатур подпрограмм с использованием двоичного образа программного модуля.
1: function MakeObjectSignatures(I)
2: for each SC E I.SC do
3: SCSyms ^ Symbol sForSection(SC)
4: SCRels ^ RelocationsForSection(SC)
5: FSCSyms ^ SM | SM.type is Function, SM E SCSyms
6: SMOffs ^ SM.address | SM E FSCSyms
7: CDataList ^ split(dataof(SC), SMOffs)
8: SMDataList ^ lSM, CData) | SM E FSyms, CData E CDataList
9: for each SMData E SMDataList do 10: SCore ^ (byte, 0) | byte E SMData.CData 11: SRels ^ RL | RL in SMData.CData, RL E SCRels 12: for each SSym E SCore do 13: if SSym in SRels then 14: SSym.var ^ 1 15: MM ^ []
19:
17:
18:
for each SRel e SRels do
SRSM ^ SymbolForRelocation(SRel)
MPath ^ MakeMPath(S M Data.C Data, SRSM, SRel)
MM <r- MM + MPath
20:
SId ^ MakeSId(SMData.SM)
21:
yield (SCore, MM, SId)
Алгоритм 3. Алгоритм MakeObjectSignatures построения набора сигнатур подпрограмм с использованием двоичного образа программного модуля
Алгоритм MakeArchiveSignatures построения набора сигнатур подпрограмм с использованием архивного набора программных модулей
В настоящем разделе формализуется алгоритм MakeArchiveSignatures построения набора сигнатур подпрограмм с использованием архивного набора программных модулей.
1: function MakeArchiveSignatures(I) 2: for each (id(I ),I) el do 3: yield MakeObjectSignatures(I)
Алгоритм 4. Алгоритм MakeArchiveSignatures построения набора сигнатур подпрограмм с использованием архивного набора программных
модулей
Алгоритм FetchVirtualSegment доступа к данным виртуального сегмента
модели памяти
В настоящем разделе формализуется алгоритм FetchVirtualSegment доступа к данным виртуального сегмента модели памяти.
1: function FetchVirtualSegment(yS, address, size)
2: if (address, size) in (VS.address, VS.size) then 3: dstart ^ VS.address — address 4: dend ^ dstart + size 5: return VSdata [ dstart: dend ]
6: else
7: raise PageFault
Алгоритм 5. Алгоритм FetchVirtualSegment доступа к данным виртуального сегмента модели памяти
Алгоритм CreateVirtualSegments, осуществляющий отображение
SL: I VS
В настоящем разделе формализуется алгоритм CreateVirtual Segments, осуществляющий отображение SL: I ^ VS. 1: function CreateVirtualSegments(I)
2: for each SG e I.SQ do
3: if SG.loadable then
4: address ^ align(SG.address, SG.alignment)
5: end ^ alignup(SG.address + SG.vsize, SG.alignment)
6: size ^ end — address
7: patch ^ SG.address — address
8: offset ^ SG.offset — patch
9: of f size ^ SG.size + patch
10: offend ^ offset + off size
11: VSdata ^ byte[size]
12: VSdata [ : off size ] ^ B [ offset: offend ]
13: VSperms ^ SGperms
14: yield (address, size, VSdata, VSperms)
Алгоритм 6. Алгоритм CreateVirtualSegments, осуществляющий
отображение SL: I ^ VS
Алгоритм CreateVirtualMemory, осуществляющий отображение
VM: VS ^ V
В настоящем разделе формализуется алгоритм CreateVirtualMemory, осуществляющий отображение VM: VS ^ V. 1: function CreateVirtualMemory(VS) 2: VSMap ^ null 3: VHMap ^ null 4: V ^ (VSMap, VHMap, VS) 5: for each VS e V.VS do 6: MapVirtualSegment(V, VS)
7: return V
Алгоритм 7. Алгоритм CreateVirtualMemory, осуществляющий
отображение VM: VS ^ V
Алгоритм GetIterationRange
В настоящем разделе формализуется алгоритм GetVirtualPage, необходимый для реализации модели страничной реализации виртуального адресного пространства программы.
1: function GetIterationRange(address, size)
2: from ^ align(address, MMUM.pagesize)
3: if size = 0 then
4: high ^ align(address + size — 1, MMU M.pagesize)
5: else
6: high ^ from
7: to ^ max(from, high)
8: return (from,to)
Алгоритм 8. Алгоритм GetIterationRange
Алгоритм GetVirtualPage
В настоящем разделе формализуется алгоритм GetIterationRange, необходимый для реализации модели страничной реализации виртуального адресного пространства программы. 1: function GetVirtualPage(V, address) 2: i ^ Ncat 3: cat ^ V.VSMap 4: while cat = nullAi > 0 do
5: cindex ^ (address&MMUM.cmaski) > MMUM.cshifU
6: cat ^ cat[cindex\
7: i ^ i — 1
8: return cat
Алгоритм 9. Алгоритм GetVirtualPage Алгоритм SanitizeSegmentation
В настоящем разделе формализуется алгоритм SanitizeSegmentation, необходимый для реализации модели страничной реализации виртуального адресного пространства программы.
1: procedure SanitizeSegmentation(V, VS)
2: if -i aligned( VS.address, MMU M.pagesize) then 3: raise AlignmentError
4: if - aligned( VS.size, MMU M.pagesize) then 5: raise AlignmentError
6: IR ^ GetIterationRange(VS.address, VS.size)
7: VA ^ IR.from
8: while VA ^ IR.to do
9: if GetVirtualPage(V, VA) = null then
10: 11:
raise PageFault
VA ^ VA + MMUM.pagesize
Алгоритм 10. Алгоритм SanitizeSegmentation
Алгоритм MapVirtualSegment
В настоящем разделе формализуется алгоритм MapVirtualSegment, необходимый для реализации модели страничной реализации виртуального адресного пространства программы. 1: procedure MapVirtualSegment(V, VS)
2: SanitizeSegmentation(V, VS)
3: IR ^ GetIterationRange(V S.address, VS.size)
4: VA ^ IR.from
5: while VA ^ IR.to do
6: i ^ Ncat
7: cat ^ &V.VSMap
8: while i > 0 do
9: if (*cat) = null then
10: (*cat) ^ [MMUM.ccounti]
11: cindex (VA&MMUM.cmaski) > MMUM.cshifU
12: cat ^ &(*cat)[cindex]
13: i ^ i — 1
14: (*cat) ^ VS
15: VA ^ VA + MMUM.pagesize
Алгоритм 11. Алгоритм MapVirtualSegment
Алгоритм FetchVirtualMemory
В настоящем разделе формализуется алгоритм FetchVirtualMemory, необходимый для реализации модели страничной реализации виртуального адресного пространства программы. 1: function FetchVirtualMemory^, address, size)
2: VSPage null
3: requests ^ []
4: IR ^ GetIterationRange(address, .size)
5: VA ^ IR.from
6: while VA ^ IR.to do
7: VS ^ GetVirtualPage(V, VA)
8: if VS = null then
9: raise PageFault
10: else if VS = VSPage then
11: if VSPage = null then
12: vfrom ^ max(VA, address)
13: vto ^ min(VA, address + size)
14: requests ^ requests + (VS, vfrom, vto)
15: VSPage ^ VS
16: else
17: vfrom ^ requests—l].vfrom
18: vto ^ min(VA, address + size)
19: requests —1} ^ (VS, vfrom, vto)
20: VA ^ VA + MMU M.pagesize
21: fetched ^ [}
22: for each request E requests do
23: VS ^ request.VS
24: vaddress ^ request.vfrom
25: vsize ^ request.vto — request.vfrom
26: fetched ^ fetched+ FetchVirtualSegment( VS, vaddress, vsize)
27: return fetched
Алгоритм 12. Алгоритм FetchVirtualMemory Алгоритм GetRegionPermissions
В настоящем разделе формализуется алгоритм GetRegionPermissions, необходимый для реализации модели страничной реализации виртуального адресного пространства программы. 1: function GetRegionPermissions( V, address, size) 2: perms ^ (l, 1, l) 3: IR ^ GetIterationRange(address, .size) 4: VA ^ IR.from 5: while perms = 0 Л VA ^ IR.to do 6: VS ^ GetVirtualPage(V, VA)
7: vperms ^ if VS = null then VS.VSperms else 0
8: perms ^ perms&vperms
9: VA ^ VA + MMUM.pagesize
10: return perms
Алгоритм 13. Алгоритм GetRegionPermissions Алгоритм WriteShadowPage
В настоящем разделе формализуется алгоритм WriteShadowPage, необходимый для реализации модели страничной реализации виртуального адресного пространства программы.
1: function WriteShadowPage(V, address, size, tag) 2: i ^ Ncat 3: cat ^ &V.VHMap 4: while i > 0 do
5: if (*cat) = null then
6: if tag = NULLTAG then
7: return 0
8: (*cat) ^ [MMUM.ccounti]
9: cindex (VA&MMUM.cmaski) > MMUM.cshifti
10: cat ^ &(*cat)[cindex]
11: i ^ i — 1
12: if (*cat) = null then
13: if tag = NULL TAG then
14: return 0
15: (*cat) ^ [MMUM.page_size]
16: shadow ^ *cat
17: offset ^ address&(MMUM.page_size — 1)
18: i ^ 0
19: while i < size do
20: if shadow[of f set + i] = tag then
21: break
22: shadow[of f set + i] ^ tag
23: i ^ i +1
24: j ^ i
25: while j < size do
26: shadow[of f set + j] ^ tag
27: j ^ j + 1
28: return i = j
Алгоритм 14. Алгоритм WriteShadowPage
Обратите внимание, представленные выше научные тексты размещены для ознакомления и получены посредством распознавания оригинальных текстов диссертаций (OCR). В связи с чем, в них могут содержаться ошибки, связанные с несовершенством алгоритмов распознавания. В PDF файлах диссертаций и авторефератов, которые мы доставляем, подобных ошибок нет.