Со строки номер 25a24 начинаются различия в исходных текстах программ. Переменная Size_t есть в файле sncpyfix.c, но отсутствует в scpybufo.c. А в строке под номером 27c26 видна замена функции strcpy на strncpy. Хотя сравнить столь небольшие файлы можно и вручную, целесообразность применения команды diff для cравнения больших файлов более очевидна. Далее будут обсуждены причины поиска различий.
Почему нужно знать о различиях файлов?
Какая необходимость искать различия в файле или памяти до и после каких-либо действий? Причин может быть несколько. Например, потребуется найти местонахождение представляющих интерес данных. Если в распоряжении хакера окажется двоичный файл паролей приложения в неизвестном ему формате, то, скорее всего, ему будет интересно узнать, где именно в файле они хранятся.
Для этого ему следует сделать копию файла, сменить пароль и сравнить копию с измененным файлом. Различия между этими файлами, а их может быть несколько, позволит найти пароль. Зная место (места) хранения пароля, хакер может изменять двоичный файл в обход исследуемой программы. В этой главе будет рассмотрен пример, поясняющий сказанное. В подобных случаях целью злоумышленника является непосредственное изменение хранимых в файле данных.
Иногда злоумышленник в большей степени заинтересован в декодировке информации, а не в ее изменении. До обнаружения различий последовательность действий может совпадать с уже рассмотренной. После выявления различий, вместо того чтобы записать по найденным адресам свою информацию, злоумышленника могут заинтересовать причины и условия подобных изменений.
Другая причина поиска различий кроется в исследовании безопасности программ. Во времена всеобщей открытости обычной практикой производителей остается выпуск обновлений программ без раскрытия их сути. Виновники этой практики – некоторые ведущие производители программного обеспечения, как, например, Microsoft, Hewlett-Packard и Caldera. С другой стороны, производители Linux (за исключением Caldera) – исключение из этого правила. А ряд компаний занимают промежуточную точку зрения по этому вопросу, как, например, Cisco.
Метод поиска различий позволяет изучить заявленную производителем уязвимость, но до конца им не раскрытую. В результате выявления различий в исходных текстах двух программ становятся ясны недостатки программы, и можно оценить их влияние на безопасность. Кроме того, выявленные различия позволят найти ошибки, которые производитель устранил без лишнего шума в старших версиях программы.
Просмотр исходного текста программы
Вернемся к обсуждению различий в исходных текстах программ. На рисунках 5.1 и 5.2 приведен исходный текст двух версий одной и той же программы. В первой версии программы выполнение функции strcpy могло привести к переполнению буфера, поэтому во второй версии ошибка была исправлена заменой функции strcpy на strncpy.
Благодаря отчету команды diff, приведенному на рис. 5.3, можно найти два исправления в исходном тексте программы. Первое состоит в добавлении переменной size_t в программу sncpyfix.c. Второе – в замене функции strcpy в программе scpybufo.c на функцию strncpy в программе sncpyfix.c.
Найти ошибки в открытых программных средствах относительно легко. (open source software – открытые программные средства – лицензионные программы вместе с их исходными текстами, не связанные ограничениями на дальнейшую модификацию и распространение с сохранением информации о первичном авторстве и внесенных изменениях). Зачастую это объясняется возможностью инсталляции файлов, устраняющих ошибки. Это можно наблюдать на примере патчей (заплаток), выпущенных производителями операционных систем семейства UNIX, например Linux и BSD. Проанализируйте патч на рис. 5.4 выявленной уязвимости FreeBSD-SA-02:02 (FreeBSD Security Advisory FreeBSD-SA-02:02).
Этот патч представлен в унифицированном формате различий. Хотя предоставленная службой компьютерной безопасности FreeBSD информация о патче содержит все необходимые сведения, включая детальное описание уязвимости, анализ отчета результата сравнения двух файлов позволяет понять ее суть. Из первой строки протокола патча ясно, что он применяется к программе pwupd.c из директории usr.sbin/pw/.
Утилита pw операционной системы FreeBSD предназначена для добавления, удаления или модификации пользователей системы либо их групп. Выявленная уязвимость состояла в том, что при работе утилиты pw создавался временный файл с разрешениями, которые позволяли всем пользователям читать его. Разрешения временного файла в отчете выделены знаком минус (-). В результате пользователь мог получить доступ к зашифрованным паролям системы.