Наши друзья
|
Доверие к входным данным
Среди разработчиков и программистов бытует распространенное предположение, что пользователи их программ будут вести себя благоразумно. К сожалению, это не так. Злоумышленники действительно существуют, и особенно быстро это проявляется, когда программное обеспечение принимает непроверенные данные из Internet. Другим широко распространенным заблуждением является идея, что пользовательский интерфейс клиентской программы не подходит для генерации определенных входных данных, т.е. ничего плохого якобы произойти просто не может. И это не со
ответствует действительности. Злоумышленнику вовсе не нужно использовать определенный программный код клиентского приложения для генерации данных для сервера. Хакер может просто подготовить нужные биты данных и отправить их по сети. Оба описанных предположения составляют основу большинства проблем, связанных с чрезмерным доверием к входным данным.
Любые данные, которые не входят в состав программного обеспечения сервера, не могут и не должны считаться надежными. Выражение "безопасность на стороне клиента" можно рассматривать как бессмысленное сочетание противоположных по значению слов. Следует пользоваться простой аксиомой, что все клиенты могут быть взломаны. Безусловно, здесь главная проблема — это доверие к клиенту. Слепое доверие клиенту и непосредственную обработку предоставленных им данных нельзя назвать удачным решением, однако часто именно такое решение реализуется на сервере.
Рассмотрим стандартную проблему. Если непроверенные данные будут считаться надежными и входные данные будут использоваться для создания имени файла или доступа к базе данных, то программа-сервер предоставит беспрепятственный доступ клиента к системе. Неоправданное доверие является постоянной, и, возможно, одной из самых серьезных проблем для системы безопасности. Система не должна доверять данным, отправляемым потенциальным злоумышленником. Данные пользователей всегда должны рассматриваться как нечто вредоносное. Программы, в которых используются входные данные из Internet (пусть даже для фильтрации этих данных используется брандмауэр приложения), должны разрабатываться с учетом защиты от вероятных атак. Тем не менее, большинство программ просто принимают данные пользователя и выполняют на их основе операции с файлами, запросы к базам данных и системные вызовы.
Одной из сложнейших проблем является создание "черных списков" фильтрации и удаление "вредоносных входных данных". Дело в том, что создать и постоянно поддерживать полный "черный список" блокируемых данных очень сложно. Намного проще задать перечень тех входных данных, которые могут быть пропущены в "белом списке". Ошибки в "черном списке" значительно упрощают задачу злоумышленника.
Многие уязвимые места возникают по причине неоправданного доверия к пользовательским данным. Это позволяет злоумышленникам открывать любые файлы, управлять запросами к базе данных и даже выключать компьютер. Некоторые из атак могут проводиться даже анонимными пользователями. Для проведения других требуется ввести имя учетной записи пользователя и пароль. Однако даже законным пользователям не следует разрешать копирование всей базы данных и создание файлов в корневом каталоге сервера.
Во многих случаях реализации стандартной технологии клиент/сервер в клиентской программе есть пользовательский интерфейс, который как бы служит промежуточным уровнем между пользователем и серверным приложением. В качестве примера можно назвать форму на Web-странице. Клиенту предоставляется удобное графическое окно, в которое он может вводить данные. Когда клиент нажимает кнопку "Отправить", программный код клиентского приложения принимает все данные из формы, упаковывает их в специальный формат и отправляет серверу.
Пользовательский интерфейс предназначен для добавления уровня абстракции между человеком и серверной программой. Поэтому клиентское программное обес
печение практически никогда не показывает, что передается от клиента серверу. Подобным образом клиентская программа стремится скрыть от пользователя большую часть данных, которые предоставляет сервер. Пользовательский интерфейс получает данные от сервера, конвертирует их для использования, делает их удобными для восприятия и т.д. Однако невидимо для пользователя осуществляется передача необработанных данных.
Безусловно, клиентское приложение только помогает пользователю в создании специально сформатированного запроса. Можно полностью отказаться от использования клиентского программного кода, если пользователь способен самостоятельно вручную создавать запросы в нужном формате. Но даже этот простой факт не учитывается в "безопасной архитектуре" многих Web-приложений. Злоумышленники широко пользуются возможностью создания вредоносных клиентских программ или непосредственного взаимодействия с сервером. Одной из самых любимых программ хакеров является программа net cat. Программа net cat позволяет просто открыть "анонимный" порт для подключения к удаленному серверу. После привязки к порту злоумышленник может вручную вводить строки данных или направлять поток данных на удаленный сервер. Вуаля, клиент просто исчез. |