Секреты и ложь. Безопасность данных в цифровом мире (Шнайер) - страница 141

И в-третьих, еще не существует такой операционной системы, которая помогла бы решить две вышеуказанные проблемы. При старом принципе построения программ различные части программного обеспечения сообщались только через операционную систему. Хорошая операционная система могла обеспечивать взаимодействие программ и не допускать, чтобы одна программа повреждала другую. Современные компоненты непосредственно обращаются друг к другу, без посредничества операционной системы, поэтому применяемые в последних меры безопасности могут не работать.

Эти проблемы безопасности пытались решать с применением некоторых общих методов, одни из которых принесли больший, другие – меньший успех. Но все эти подходы лучше выглядят в теории, чем работают на практике.

Автономность (Isolation) и защита памяти. Эта мера направлена на то, чтобы помешать одному из компонентов умышленно или случайно воздействовать на остальную систему: читать или вносить изменения в память другого компонента, выходить за пределы отведенной ему памяти и приводить к поломке системы или доставлять другие неприятности. Автономное использование памяти предполагает, что каждому компоненту отводится свой участок памяти, за пределами которого этот компонент не может ни читать, ни записывать. Время от времени контролирующие программы (program checkers), установленные на машине пользователя, проверяют коды компонентов, чтобы убедиться, что не происходит ничего недозволенного. Примером реализации этой идеи служит «песочница» (sandbox) Java: все компоненты вынуждены «играть» в отдельных «песочницах», из которых они не могут повредить друг друга. Этот принцип защиты работает хорошо, но некоторые ошибки он не позволяет обнаружить, кроме того, за него приходится расплачиваться скоростью работы программ.

Контроль доступа в интерфейсе. Сделав компонент полностью изолированным, мы не решаем проблему полностью: ведь ему необходимо взаимодействовать с другими компонентами (а также с экраном, клавиатурой, мышью и т. д.). На рис. 10.2 показаны пути взаимосвязей между компонентами. Устанавливая правила контроля доступа в точках соприкосновения, мы можем надеяться, что компоненты правильно взаимодействуют друг с другом. Проблема в том, что вы должны выбрать политику контроля доступа, которая должна быть достаточно жесткой, чтобы приносить действительную пользу. «Песочницы» Java позволяют добиться хороших результатов, однако недостаток их политики состоит в том, что она либо чересчур бескомпромиссная, либо излишне либеральная – «золотой середины» в реальности не существует. (Java 2 имеет мелкомодульный контроль, но он недостаточно используется.)