Безопасность в Internet- Intranet



         

Почему нарушители могут проникать внутрь систем?


Программное обеспечение (ПО) всегда имеет ошибки и уязвимости. Системные администраторы и программисты никогда не могут отследить и исключить все возможные проблемы. Нарушителю же надо найти только одну "дыру", чтобы проникнуть внутрь.

1.4.1 Ошибки ПО

Ошибки ПО можно классифицировать следующим образом:

Переполнение буфера. Почти все уязвимости, о которых вы можете прочитать в прессе, связаны с этой проблемой. Типичный пример - программист, который хранения имени пользователя выделает только 256 символов. Несомненно, программист думает, что ни у кого не будет имени состоящего, из более чем 256 символов. Но хакер думает иначе, "Что произойдет, если я введу ложное имя пользователя длиннее 256 символов?" Где хранятся дополнительные символы? Если хакеры выполнят свою работу "правильно", они могут послать 300 символов, включая исполняемый код, который будет выполняться сервером, что может привести к опасным последствиям. Хакеры находят эти ошибки различными путями. Прежде всего, в Сети имеется исходный код для массы сервисов. Хакеры, как правило, просматривают этот код в поисках программ и утилит, имеющих проблемы с переполнением буфера. Во-вторых, хакеры могут и сами изучать программы с целью определить, имеют ли они какие-нибудь проблемы, хотя чтение двоичного кода является достаточно трудной задачей. В третьих, хакеры будут исследовать каждый участок программы, который работает с входными данными, и будут пытаться переполнить его с помощью случайных (произвольных) данных. Если программа выходит из строя, то появляется хороший шанс для проникновения внутрь. Отметим, например, что эта проблема является широко распространенной в программах, написанных на C/C++, но редкой в программах, написанных на языке Java.

Неожиданные комбинации. Программы обычно составляются с использованием многих слоев (уровней) кода, включая ядро операционной системы (ОС) в качестве основы для большой части других слоев. Нарушители могут часто посылать входные данные, которые являются бессмысленными для одного слоя (уровня), но много значащими для другого. Наиболее распространенный язык для обработки входных данных пользователя на Web - PERL. Программы, написанные на PERL, как правило, будут посылать эти входные данные к другим программам для дальнейшей оценки. Наиболее распространенный хакерский метод - ввести строку типа "| mail < /etc/passwd". И она будет выполняться, потому что PERL "просит" ОС запустить дополнительную программу с этими входными данными. Однако ОС перехватывает символ '|' и запускает 'mail' -программу, которая передает нарушителю файл паролей по электронной почте.

Необрабатываемые входные данные. Большинство программ пишутся для обработки достоверных входных данных. Большинство программистов не учитывают ситуацию, когда кто-то вводит данные, не соответствующие спецификации.

Состязания. Большинство систем сегодня являют "многозадачными ". Это означает, что они могут выполнять одновременно более одной программы. Есть опасность, если двум программам требуется доступ к одним и тем же данным в одно и то же время. Представим себе две программы А и В, которым необходимо изменить один и тот же файл. Для того, чтобы модифицировать файл, каждая программа должна сначала загрузить файл в оперативную память, изменить содержание в памяти, затем скопировать из памяти обратно в файл. Состязание имеет место, когда программа A читает файл в памяти, а затем производит изменение. Однако, до того как А запишет файл, программа В вступит в действие и полностью прочитает/модифицирует/запишет в файл. Теперь программа A записывает свою собственную копию обратно в файл. Поскольку программа А начала свое копирование до того, как программа В сделала свои изменения, все эти изменения, сделанные программой В, будут потеряны. Так как вы получаете последовательность событий как раз в правильном порядке, "состязание" проявляется очень редко. Нарушители, обычно, делают сотни и тысячи попыток, прежде чем они смогут реализовать данную ситуацию и проникнуть в систему.

1.4.2 Конфигурация системы




Содержание  Назад  Вперед