Как правило, одну и ту же задачу можно решать несколькими способами. Выбранный способ зависит от ресурсов, имеющихся в распоряжении исполнителя, и методов решений, которыми он лучше всего владеет. В случае исследования уязвимостей ресурсами являются программный код, время и инструментарий исследователя.
В некоторых случаях исследователь может легко получить исходный текст анализируемой программы. Для большинства людей экспертиза исходного текста программ – наиболее легкий способ определения наличия или отсутствия в программе уязвимостей. Причина многих уязвимостей состоит в использовании в программе специфических функций языка программирования и способов вызова внешних функций. Анализ исходного текста программы часто позволяет выявить уязвимости и понять их причины.
Другим способом определения возможных ошибок программы служит реинжиниринг, который позволяет восстановить структурную схему программы и алгоритм ее работы. Для реинжиниринга требуется специальный программмный инструментарий: дизассемблеры и отладчики. Любая трансляция программы сопровождается потерей части исходного текста программы или его неочевидными преобразованиями. Другими словами, при трансляции программы исходный текст заменяется объектным кодом таким образом, что точное обратное восстановление исходного текста в большинстве случаев невозможно. Поэтому, основываясь только на результатах реинжиниринга, понять логику работы программы очень сложно.
И наконец, последний рассматриваемый способ – тестирование методом
В этой главе будут рассмотрены различные методы изучения уязвимости и показаны примеры их использования.
Суть методологии исследования уязвимости
Поясним простым языком, что понимается под
Методы исследования уязвимостей по своей сути универсальны. Как домашний энтузиаст безопасности, так и корпоративные аудиторы безопасности в повседневной деятельности применяют одни и те же методы, один и тот же набор инструментальных средств. Диапазон применяемых средств широк: от шестнадцатеричных редакторов до дизассемблеров кода. Методы могут быть как эмпирическими, основанными на счастливой догадке, так и научно обоснованными на основе фундаментальных знаний. Некоторые из этих методов могут показаться хаотичными, в то время как другие – детализированными, строго регламентирующими последовательность выполняемых при исследовании действий. Новичок может предпочесть последние методы, в то время как закаленные исследователи с большим опытом программирования в большей степени полагаются на свою интуицию. Причина выбора тех или иных методов кроется в личном предпочтении исследователя.