Сам по себе JavaScript достаточно безвреден, но именно он лежит в основе множества атак всех видов, предпринятых за последние несколько лет. Приведу несколько примеров: 1997 год – контроль посещаемости сайтов пользователями; 1998 – чтение случайно выбранных файлов на машине пользователя; тот же 1998 – перехват адреса электронной почты пользователя. Для большинства этих атак требуется слегка обмануть пользователя, заставив его сделать незначительную глупость, но это и не сложно. Недостатки в обеспечении безопасности браузеров, допускавшие такие атаки, были выявлены довольно быстро и устранены. Но регулярно обнаруживаются новые «дыры».
В ActiveX применяется защита при помощи подписывания кода. По сути, у каждого фрагмента кода ActiveX, называемого «control», проверяется цифровая подпись. (Microsoft вводит для этого понятие кода аутентичности.) После этого браузер открывает диалоговое окно и показывает пользователю имя программиста или компании, которые подписали код. Если пользователь соглашается принять код, программа загружается в браузер.
Любой подросток, к которому на вечеринку заявлялись случайные гости не лучшего сорта, знаком с этой проблемой. Безопасность системы полностью находится в руках пользователя. Как только код ActiveX проникает на машину пользователя, он может сделать все что угодно: переформатировать жесткий диск, изменить ваши однодолларовые ставки в тотализаторе на стодолларовые, собрать все ваши полные чувств любовные письма и послать их кинопродюсеру в Лос-Анджелес и пр. и пр.
Microsoft возразила, что подписи, конечно, будут указывать на автора, но это знание будет небольшим утешением человеку, у которого только что «рухнул» компьютер. Это все равно, что обязать преступников носить визитные карточки и перестать запирать двери на замок. «Мы сожалеем, что они вошли в ваш дом, съели всю вашу еду, сломали всю вашу мебель и унесли все ваши ценности. Но, по крайней мере, мы знаем, кто они». Причем в случае Интернета может быть такое уточнение: «Это были два подростка из страны, с которой у США нет договора об экстрадиции. Вам стало легче?» Кроме того, предполагается, что вы сможете определить, какая именно программа из десятков имеющихся у вас на жестком диске вызвала проблемы. Один исследователь показал, что при соединении двух безвредных средств управления ActiveX они способны стать разрушительными; и кто будет виноват в этом случае?
Существуют и более серьезные проблемы. В главе 17 подробно рассказывается о том, насколько сомнительно, что пользователи примут правильное и безопасное решение, здесь же достаточно сказать, что большинство людей не беспокоятся о том, каким средствам ActiveX можно доверять, а каким – нет. А это предполагает наличие инфраструктуры открытого ключа (PKI), поддерживающей подписи, о чем я еще буду сокрушаться в главе 15. Существует много возможностей обмануть PKI и заставить ее поверить, что средство управления подписано, когда это не так.
На самом деле ActiveX – это расширение старой системы компонентов Microsoft, так называемой DCOM. Это система, при помощи которой, например, Internet Explorer открывает и показывает таблицы Excel. Большинство используемых программами DLL на самом деле служат только транспортным средством для объектов DCOM. Explorer просто вставляет внутреннее содержимое книги Excel посредством DCOM и ActiveX. Это – невероятно мощная система, более гибкая, более доступная, более интересная архитектурно и невообразимо более опасная, чем аналогичные способы в других операционных системах.
В Java применяется совершенно иная модель. Это – просто язык программирования, специально разработанный для переносимого кода, создатели которого не забывали и о безопасности. Программы Java, запускаемые при помощи веб-браузера, называются апплетами, и им для работы отводится определенный участок памяти, «песочница», которая позволяет ограничить возможные повреждения. «Песочницы» защищаются по трем схемам.
Во-первых, существует так называемый верификатор байтового кода. При каждой загрузке апплета Java верификатор байтового кода сначала проверяет программу. Верификатор гарантирует, что байтовый код имеет правильный формат и не создаст каких-либо общих проблем.
Во-вторых, имеется загрузчик класса. Этот компонент определяет, как и когда апплет может быть добавлен к среде Java. Его задача – убедиться, что апплет не заменит уже существующую важную программу.
И в-третьих, есть администратор безопасности. Это устройство чем-то похоже на мониторы обращений, о которых шла речь в главе 8; к нему обращаются всякий раз, когда апплеты Java пытаются проделать что-то потенциально опасное: открыть файл, установить связь с сетью и т. д. В зависимости от способа установки апплета эти операции будут или разрешены, или запрещены. (Например, апплет, загруженный по Сети, имеет больше ограничений, чем апплет, установленный на компьютер при покупке операционной системы.)
Читать дальше