Хакеры ищут новые способы проникновения в информационные системы. И находят

Сейчас для проникновения на Web-сайты все чаще применяется метод так называемых инъекций — использование фрагментов кода, которые могут быть загружены удаленным пользователем вместе с данными. Инъекции представляют собой код, написанный на каком-нибудь интерпретируемом языке, расположенный в зоне его вероятного исполнения интерпретатором. Так как большинство современных Web-систем допускают использование сценариев, то в «неграмотно» написанном Web-ресурсе найдется масса мест для расположения инъекций, которые, скорее всего, будут выполнены сервером.

Инъекции и переполнение буфера

Если сравнивать характерные особенности ошибки переполнения и инъекции, то можно проследить определенную преемственность. Ошибка переполнения буфера возникает из-за некорректных данных, которые передаются в подпрограммы, портят управляющие структуры приложения и таким образом становятся исполнимыми. То есть для реализации нападения используются архитектурные особенности управления памятью в ОС. Техника инъекций основана на интерпретации, то есть прямом исполнении пользовательских данных. Она требует обмана не операционной системы, а приложения, в котором встроен интерпретатор. Часто в качестве такого приложения выступает Web-сервер, взаимодействующий с командной оболочкой операционной системы или базой данных. Впрочем, атаке может быть подвержен и интерпретатор языка, встроенного в офисное приложение. Примером такого нападения являются хорошо известные макровирусы для Word — в данном случае инъекция встраивается в документ.

По потенциальной опасности инъекции сравнимы с ошибкой переполнения буфера — оба метода нападения позволяют удаленному злоумышленнику исполнять код в атакуемой системе. Однако использование переполнения буфера требует серьезного знания управляющих структур приложения и кропотливой работы по корректному их изменению, чтобы сохранить работоспособность атакованной системы. Для этого опытные хакеры составляют типовые примеры нападений — эксплойты, которым в дальнейшем придаются нужные свойства. В то же время в качестве инъекции может быть использована практически любая корректная команда на интерпретируемом, часто понятном человеку языке программирования. Фактически это означает, что «делать инъекции» проще, чем «переполнять буфер».

По принципу атаки оба способа отличаются существенно. Если переполнение буфера возникает из-за того, что при проектировании приложения в нем не была предусмотрена проверка данных на корректность, то возможность проведения инъекций часто связана с использованием средств быстрой разработки приложений, к которым, в частности, можно отнести встроенные интерпретаторы. В результате возможность инъекций, как правило, возникает по вине разработчика конкретного сайта и потому является эксклюзивной, то есть ее сложно использовать для написания «общеупотребительных» вирусов, но легко — для проведения целенаправленной атаки. Правда, если возможность инъекции появится в достаточно популярном продукте, то она может стать причиной вирусной эпидемии.

Впрочем, у инъекций есть серьезная особенность — эта атака не зависит от операционной системы, а только от интерпретируемого языка. В то же время такие технологии, как Java, SQL или PHP, могут работать в самых разных ОС. То есть угроза инъекций является аппаратно-независимой, чего не скажешь про ошибки переполнения буфера. А стало быть, расширяется и область использования этого метода атаки. В итоге инъекции имеют все возможности такого популярного способа атаки, как переполнение буфера, и поэтому они не менее опасны.

Как избежать инъекций

Сейчас наиболее популярными языками для атак посредством инъекций являются SQL и PHP. Базы данных часто составляют основу динамического Web-сайта и содержат много полезной для нападения информации. Язык сценариев PHP удобен для разработки простых и эффективных сайтов, а нападающему помогает исполнять команды в атакуемой операционной системе. Впрочем, не исключена возможность использования для инъекций байт-кода Java или .Net.

Чтобы защититься от инъекций, Стивен Адлер, руководитель по разработке стратегии безопасности Microsoft EMEA, предлагает делать проверку информации, которую пользователь вводит в Web-форму, на наличие в ней недопустимых знаков. Например, в почтовом индексе могут быть только цифры, а значит, все остальные знаки нужно считать ошибкой и просто не давать их вводить. Эту проверку можно организовать даже на стороне клиента с помощью простого кода JavaScript. Но ее стоит продублировать и на сервере, чтобы исключить обман клиентской проверки.

Эра атак с переполнением буфера, похоже, отходит в прошлое. В частности, Microsoft, по заверениям Адлера, собирается в Windows XP SP2 перекомпилировать ядро, создав защиту от переполнения буфера, и встроить поддержку более защищенных процессорных архитектур. Когда эта операционная система и защищенные процессоры станут массовыми, то переполнение буфера уйдет в историю. Однако не исключено, что ее место займут инъекции. Вероятность этого велика хотя бы потому, что технология .Net, на которую Microsoft собирается переносить свои продукты, является интерпретируемой, а следовательно, подверженной атакам с помощью инъекций.