Я как-то давно уже писал заметки из серии "что бы хотелось", с сожалением упоминая безвременно почивший Эльбрус. Такой уж я динозавр, что Алголы и Эльбрусы засели в моем сознании наряду с теоремой Пифагора и законами Ньютона, в самых основах моего понимания предмета. Так вот, чтобы сделать защищенную операционную систему, в которой ничего нельзя сделать, кроме того что требуется, надо чтобы на каждом уровне можно было сделать только то, что требуется и ничего больше. As simple as that.
Проблема современных систем и их API-ев в том, что код, получив управление, может сделать всё, что угодно. Его ограничивают пользовательскими правами доступа, но это есть пережиток времен больших многопользовательских ЭВМ. В эпоху персональных компьютеров, не говоря уж о телефонах, предметом недоверия является не столько пользователь, сколько, например, источник выполняемого кода. Но даже если мы полностью запретим выполнять незнакомый код, никуда не деться от багов, которые позволяют внедрить код в систему. Или от ошибок или даже злого умысла автора программ.
Взять, например Notepad. Что мы хотим от редактора? Чтобы программа могла прочитать файл, который мы выбрали, потом позволяла редактировать его в окне с использованием мыши и клавиатуры, а потом позволяла записать текст в этот или другой файл по нашему выбору. В такой постановке вопроса программа выглядит безопасной. На самом деле код программы может делать все, что угодно, особенно если, например, "админ правит конфиги", выполняя программу с правами, требующимися для записи в системные файлы. Программа может лазить в сеть, модифицировать системные файлы, устанавливать кейлогеры и делать снимки экрана. Она даже может внедрить в систему драйвер и внедрить свой код во все процессы. Для всего этого система предоставляет программе соответствующие функции! Ибо "вдруг понадобится"?
Если мы хотим, чтобы всего этого Notepad сделать не мог, надо просто не дать ему возможности это сделать. Дайте ему API, который может только прочитать и записать один файл, рисовать в одном окне, иметь доступ к клавиатуре и мыши в этом окне И ВСЁ! И никакой вирус не сможет ничего сделать, кроме как поменять ваш текст перед сохранением. Конечно, если "админ правит конфиги", остается разгул для фантазии, но, тем не менее, возможности ограничиваются существенно.
В Эльбрусовской идеологии не было возможности преобразовать число в указатель. И тем более в указатель на интерфейс. Если вам дали указатель на интерфейс, можно с ним работать. Не дали - возможности нет НИКАКОЙ. Все просто. В современных компьютерах такая защита возможна только через границу ядра, потому вместо указателя нам нужен handle выданный ядром. Если есть у программы handle позволяющий читать один данный файл, она сможет читать этот файл. Фактически вместо API, который позволяет делать всё, нам нужны множество таких handle-ов, позволяющих делать лишь заранее предусмотренные действия с ограниченным набором объектов. Например, это может быть работа в заданном окне, или работа с файлами некоего каталога, или чтения некоего ключа реестра или какие либо иные конкретные действия.
Вместо того, чтобы любая программа вызывала любые функции системы, надо, чтобы эти API handles ей создавал, ограничивал и передавал родительский процесс, при этом, очевидно, он может лишь поделиться лишь теми правами, что сам имеет, он может их ограничить, но не может расширить. Естественно, самый главный процесс обладает всеми правами, но он недостижим, он в яйце, утке и зайце. Пользовательские программы запускаются вообще не им, а его далекими потомками.
Интересно, что подобная концепция приведет к некоему перераспределению кода по нескольким процессам с разными правами. Например, главное окно приложения, хотя бы и невидимое должен создавать не процесс программы, а родительский процесс. А диалог с выбором файла должен быть отдельным процессом с другими правами, вероятно частью Shell. Фактически, независимый программный компонент должен быть процессом. Или каким-нибудь легковесным процессом, типа потока с отдельным адресным пространством.
Чем больше думаю, тем больше мне эта идея нравится. Она ведет к существенно более простой, как ни странно, и защищенной системе. Что-то похожее есть в идее sandbox-ов, которые используются, например, в браузере Chrome, но хотелось бы, чтобы так работали все приложения.
Единственно, боюсь, что люди, как всегда, все испортят. Один напишет программу по старинке требующую права "на всё вообще", пользователь будет вынужден её запускать давая ей все права, а раз можно не париться одному, то и остальные тоже подтянутся. Не думать о безопасности - заразительно.
1 comment:
Для каждого процесса существует политика (чего может, чего нет), доступная на запись только ядру [возможно, на каждом процессе висит только декремент политики]. Процесс-потомок наследует политику с опциональным обрезанием. Любой запрос проверяется на попадание в политику процесса [возможно, по цепочке наследования до ответственного за ресурс или до ядра]. В ответ возвращается хэндл объекта (Notepad, редактирующий запрошенный файл в конкретном окне). Т.е. экземпляр объекта (вещь в себе) создаётся по предварительной спецификации.
Post a Comment