Блог Лаборатории невидимых вещей

Ядро, гипервизор, виртуализация, доверенные вычисления и другие вопросы безопасности на системном уровне

Суббота, 23 апреля 2011 г.

Цирк безопасности Linux: Об изоляции графического интерфейса

Есть одна вещь, которую большинство пользователей Linux не осознают в своих системах Linux... это отсутствие изоляции на уровне графического интерфейса, и то, как она сводит на нет всю безопасность рабочего стола. Я писал об этом несколько раз, я говорил об этом несколько раз, и все же я постоянно сталкиваюсь с людьми, которые не понимают этого.

Итак, позвольте мне подчеркнуть это еще раз: если у вас есть два GUI-приложения, например, текстовый процессор OpenOffice Word Processor и глупая игра Tetris, оба из которых получили доступ к вашему экрану (вашему X-серверу), то между этими двумя приложениями нет никакой изоляции. Даже если они работают под разными учетными записями пользователей! Даже если они каким-то образом изолированы SELinux или чем-то еще! Нет, ноль, ноль, ноль, ноль!

Архитектура X-сервера, разработанная давным-давно счастливыми хиппи, которые считали, что все приложения для людей хороши и не вредоносны, просто позволяет любому GUI-приложению управлять любым другим. Не требуется никаких ошибок, никаких эксплойтов, никаких уловок. Все это сделано специально. Одно приложение может подслушивать или передавать нажатия клавиш другому, делать снимки экрана, занятого окнами, принадлежащими другому приложению, и т.д.

Если вы мне не верите, я предлагаю вам провести простой эксперимент. Откройте окно терминала, как обычный пользователь, и запустите xinput list, который является стандартной диагностической программой для Xorg (на Fedora вам, скорее всего, придется сначала установить его: yum install xorg-x11-apps):

$ xinput list

Он покажет вам все устройства указателя и клавиатуры, о которых знает ваш Xorg. Обратите внимание на ID устройства, указанного как "AT keyboard", а затем выполните команду (как обычный пользователь!):

$ xinput test id

Теперь он должен начать отображать сканкоды для всех клавиш, которые вы нажимаете на клавиатуре. Если этого не происходит, значит, вы использовали неправильный идентификатор устройства.

Теперь, для лучшего результата, запустите другое окно терминала и переключитесь на root (например, используя su или sudo). Обратите внимание, что xinput, запущенный от имени пользователя, способен перехватить все ваши нажатия клавиш, включая пароль root (для su), а затем все нажатия клавиш, которые вы вводите в сессии root. Запустите какое-нибудь GUI-приложение от имени root или от имени другого пользователя, и снова обратите внимание, как ваш xinput может пронюхать все нажатия клавиш, которые вы вводите в это другое приложение!

Да, я понимаю, что сейчас происходит в вашем уме и сердце... Не волнуйтесь, другие тоже прошли через это. Не стесняйтесь ненавидеть меня, бросать оскорбления в мой адрес и т.д. Я не против, правда (я просто не буду их модерировать). Когда вы успокоитесь, продолжайте читать.

В Qubes вышеописанной проблемы не существует, потому что каждый домен (каждый AppVM) имеет свой собственный локальный, изолированный, фиктивный X-сервер. Главный X-сервер, который работает в Dom0 и обрабатывает реальное отображение, никогда не подвергается прямому воздействию ни одной из AppVM (AppVM не могут подключаться к нему по X-протоколу). Подробности см. в этом техническом обзоре.

Вы можете повторить тот же эксперимент в Qubes. Вам просто нужно использовать ID устройства "qubesdev", как показано в списке xinput (должно быть 7). Запустите xinput в одном из ваших доменов, например, в "красном". Поскольку мы используем одно и то же устройство и для мыши, и для нажатия клавиш, теперь вы должны видеть как сканкоды клавиш, так и все события мыши. Обратите внимание, как ваш xinput способен уловить все события, предназначенные для других приложений, принадлежащих тому же домену, где вы запускаете xinput, и как он не может уловить ничего, предназначенного для других доменов или Dom0.

BTW, Windows - единственная из известных мне основных ОС, которая действительно пытается реализовать некоторую форму изоляции на уровне GUI, начиная с Windows Vista. Смотрите, например, эту древнюю статью, которую я написал в те дни, когда я использовал Vista на своем основном ноутбуке. Конечно, эту изоляцию все еще легко обойти из-за огромного интерфейса, который открывается каждому клиенту GUI (который также включает GPU API). Тем не менее, они по крайней мере пытаются предотвратить это на уровне архитектуры.

Переведено при помощи Deepl
Источник: https://theinvisiblethings.blogspot.com/2011/04/linux-security-circus-on-gui-isolation.html?m=1