thedeemon: (Default)
[personal profile] thedeemon
Внезапно всплывший перевод интервью двухлетней давности с кернел-разработчиком, который пытался улучшить поведение декстопного Линукса, но не мог толком эти улучшения продемонстрировать, вызвал очередные дискуссии про перспективы Линукса на десктопе.

Да нет у него никаких перспектив.

Основная его проблема - мало нужного, качественного и удобного софта. И главная ее причина, на мой взгляд, - отсутствие бинарной совместимости. Когда есть куча плохо совместимых дистрибутивов, в них куча несовместимых версий, единственный более-менее работающий способ распространения софта - в исходниках, со сборкой на месте. Кому это подходит?

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

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

Типичные слова линуксоеда: "Если бы люди умели пользоваться vim, grep, sed, awk, то миллионы программных продуктов так никогда и не были бы созданы (C) кто-то умный". В том-то и беда. Именно так теряется 95% аудитории - основная масса юзеров не будет тратить по полгода на изучение этих ваших vim, grep, sed, awk, perl и bash. Им нужна программа с красивым окошком и кнопкой "сделать п%$дато", а не набирать в консоли "ps aux | grep dmz | awk '{ print $3, " ", $2 }' | sort | tail -n 5 | awk '{ print $2 }' | xargs kill -9". Нужен простой и удобный в использовании софт, решающий конкретные задачи рядовых и не очень пользователей. Такие программы будут только там, где будут коммерческие разработчики, которые смогут их продавать за доступные хоум-юзерам деньги. А для такого софта дистрибуция в исходниках никак не годится.

Вот есть, например, Маки. Там дистрибуция и установка программ в бинарной форме была отточена отлично, оттого куча удобного, приятного и радующего пользователей софта, за который те с радостью платят деньги. Есть винда, где я компилю в Win7 бинарник с минимумом зависимостей, и он прекрасно работает и в Висте, и в ХР, и даже в Win98. В нем я могу реализовать какую-то пусть не идеальную, но работающую защиту от взлома, и спокойно его продавать. А вот понадобилось мне недавно простейшую консольную прогу запустить на хостинге с этим вашим линупсом, так нет - нужного компилятора там не стоит и прав нет поставить, просто собранный бинарник не работает из-за другой версии GLIBC, а статически собранный - не работает, потому что ядро, дескать, слишком старое, хотя и там и там 2.6.чего-то. При таком подходе я буду продолжать делать шаровары для винды и мака, а линуксоеды пусть дальше довольствуются своими поделками.

Re: подсказка

Date: 2009-09-20 05:53 pm (UTC)
From: [identity profile] nealar.livejournal.com
Можно и это закрыть, по той же цене, что и в рантайме (да, способа без оверхеда я не знаю). Но можно придумать какую-нибудь более хитрую атаку. А потом ещё более хитрую. Просто этот язык программирования предназначен для другого. Его не сделать безопасным (в этом смысле).

Re: подсказка

Date: 2009-09-20 06:01 pm (UTC)
From: [identity profile] stepancheg.livejournal.com
Можно и это закрыть, по той же цене, что и в рантайме

Я про это недавно писал у себя в блоге — в значительном количестве случаев оверхед на проверку выхода за границу массива отсутствует.

Повторяю ещё раз: запретить обращение к удалённому объекту в статике невозможно.

Но можно придумать какую-нибудь более хитрую атаку.

Нельзя. Насколько я знаю, за последние несколько лет ни одной уязвимости Sun JVM (к примеру) не было — а это очень мощная и сложная виртуальная машина.

Re: подсказка

Date: 2009-09-20 07:30 pm (UTC)
From: [identity profile] nealar.livejournal.com
Проверку обращений к удалённым объектам и выходы за границы можно, например, взвалить на MMU. Который и под линуксом работает и к времени выполнения свою долю прибавляет. Код создания объекта потяжелеет и переключение контекста будет медленней, чем в линуксе. А всё остальное не изменится. По сравнению с переключением между контекстами ВМ это всё равно копейки. И это самое примитивное тупое решение.
Если мы говорим о языках со сборкой мусора и без арифметики указателей, то там обращение к удалённым объектам просто невозможно, его и запрещать не надо.
Нельзя.
Это доказано кем-то или это только эмоции?

Re: подсказка

Date: 2009-09-20 07:43 pm (UTC)
From: [identity profile] stepancheg.livejournal.com
Код создания объекта потяжелеет и переключение контекста будет медленней, чем в линуксе

Код создания какого объекта?

Переключения контекста вообще не будет, и это одна из фишек виртуальных машин.

Если мы говорим о языках со сборкой мусора и без арифметики указателей, то там обращение к удалённым объектам просто невозможно, его и запрещать не надо

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

Это доказано кем-то или это только эмоции?

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

Re: подсказка

Date: 2009-09-20 08:18 pm (UTC)
From: [identity profile] nealar.livejournal.com
Код создания какого объекта?
Того объекта, к которому невозможно будет обратиться, если он удалён.
Переключения контекста вообще не будет, и это одна из фишек виртуальных машин.
Вообще никогда? То есть, у нас получится однозадачная система?
Виртуальная машина не поддерживает арифметику указателей
Арифметика указателей - свойство не реализации, а языка. Не важно, компилируем мы C статически или создаём для него VM - арифметика указателей будет. Языки без арифметики указателей тоже бывают разные - рассчитанные на VM и статически компилируемые. Правда, у статически комилируемых в рантайме появляется обязательно сборщик мусора, а это уже как бы кусок виртуальной машины.
В виртуальной машине есть набор инструкций, каждая из которых не позволяет выйти за рамки машины
Вы не поняли вопрос. В рамках машины доступны все ресурсы процесса под данной ОС. То есть, можно много всего испортить, не выходя из рамок машины. Например, ява-задачам я на своём компе не ставлю каких-то ограниченных прав, не понижаю им scheduling priority по сравнению с обычными программами, не запускаю их под специальным бесправным юзером java-task и т.д. Они, вероятно, не могут делать атаки на ядро через переполнение стека и т.п. - от этого защищает их проверка типов (возможные баги в JVM исключаем напрочь - речь не о них). Защищает ли их типизация от открытия сокетов без закрытия, от поедания данным куском кода излишнего количества памяти (что, напоминаю, должно проверяться статически, перед началом выполнения задачи, динамически линукс умеет сишные задачи убивать, когда весь своп выжрут) и подобных неприятностей? А если мы размещает ВМ в ядре, то у неё возможностей ещё больше и проверять правильность запускаемого кода хотелось бы ещё строже. Либо тупо следить в рантайме - есть ли выход за границы массива, не схавала ли она памяти больше положенного и т.д.

Re: подсказка

Date: 2009-09-20 08:30 pm (UTC)
From: [identity profile] stepancheg.livejournal.com
Код создания какого объекта?
Того объекта, к которому невозможно будет обратиться, если он удалён.


Создание объекта через malloc и в хитрой виртуальной машине стоит примерно одинаково. Удалять объект дорого. Удалять можно через GC. Можно делать escape analysis.

Re: подсказка

Date: 2009-09-20 09:25 pm (UTC)
From: [identity profile] nealar.livejournal.com
Удалять объект дорого.
А почему?

Re: подсказка

Date: 2009-09-20 08:33 pm (UTC)
From: [identity profile] stepancheg.livejournal.com
Переключения контекста вообще не будет, и это одна из фишек виртуальных машин.
Вообще никогда? То есть, у нас получится однозадачная система?


Не будет переключеня контекста в смысле изменения адресного пространства. Переключение потоков, конечно, будет.

Re: подсказка

Date: 2009-09-20 09:24 pm (UTC)
From: [identity profile] nealar.livejournal.com
Я чё-то вообще не врубаюсь, чьё адресное пространство имеется в виду. Задач внутри виртуальной машины? У них оно будет общее? Или разделённое? У одной виртуальной машины внутри ОС одно адресное пространство, поэтому его не надо переключать вообще.

Re: подсказка

Date: 2009-09-20 09:33 pm (UTC)
From: [identity profile] stepancheg.livejournal.com
Адресное пространство — это понятие железа. Адресное пространство — это соответствие виртуальных адресов памяти реальным. Виртуальная память поддерживается аппаратно. В случае виртуальной машины виртуальная память не нужна в том смысле, в каком она используется сейчас, все процессы будут выполняться в общем адресном пространстве.

неясно

Date: 2009-09-20 10:23 pm (UTC)
From: [identity profile] nealar.livejournal.com
все процессы будут выполняться в общем адресном пространстве
То есть, таких штук, как realloc в той виртуальной машине нет? Нельзя уже выделенный массив увеличить, не меняя его адреса? Или в ней просто нет понятия "адрес", а доступ ко всем объектам идёт по нечисловым ссылкам?

Re: неясно

Date: 2009-09-20 10:54 pm (UTC)
From: [identity profile] stepancheg.livejournal.com
Нельзя уже выделенный массив увеличить, не меняя его адреса

Этого и с помощью realloc нельзя.

Re: подсказка

Date: 2009-09-20 08:42 pm (UTC)
From: [identity profile] stepancheg.livejournal.com
В рамках машины доступны все ресурсы процесса под данной ОС. То есть, можно много всего испортить, не выходя из рамок машины.

Виртуальной машине все ресурсы доступны, конкретному модулю — нет. Драйверу сетевой карты доступен интерфейс DMA. Драйверу файловой системы доступен только интерфейс блочных устройств, и никакого прямого доступа к оборудованию у него нет. У пользовательского процесса есть только API типа POSIX.

От поедания памяти защищает счётчик использованной памяти, привязанный к каждому модулю. Сокеты должны явно закрываться (либо неявно при завершении процесса/модуля), и тут нет отличия от обычных операционных систем.

Re: подсказка

Date: 2009-09-20 09:21 pm (UTC)
From: [identity profile] nealar.livejournal.com
Это замечательно! А как система типов виртуальной машины гарантирует, что драйвер файловой системы не имеет доступа к интерфейсу DMA, а драйвер сетевой карты не имеет доступа к интерфейсу блочных устройств? Сделает объект "файловая система" потомком "блочного устройства", а объект "сетевая карта" потомком "устройства с DMA"? И сделает их типы несовместимыми? И сделает архитектуру систмы такой, что ни один компонент не будет иметь одновременно оба интерфейса "блочное устройство" и "устройство с DMA", чтобы файловая система не смогла косвенно обратиться через этот компонент к сетевой карте и получить доступ к DMA?

Re: подсказка

Date: 2009-09-20 09:29 pm (UTC)
From: [identity profile] stepancheg.livejournal.com
А как система типов виртуальной машины гарантирует, что драйвер файловой системы не имеет доступа к интерфейсу DMA

Загрузчик модуля выдаст ошибку, если в коде модуля файловой системы будет присутствовать упоминание класса для работы с DMA.

Re: подсказка

Date: 2009-09-20 10:18 pm (UTC)
From: [identity profile] nealar.livejournal.com
А почему? Файловая система, например, NFS, не может работать с классом, например, сетевого протокола, который работает с классом сетевой карты, который работает с DMA? И по этой цепочке ошибкой обвалить всю систему. :) Современные эксплойты в монолитных системах примерно так и работают.

Re: подсказка

Date: 2009-09-20 11:08 pm (UTC)
From: [identity profile] stepancheg.livejournal.com
Файловая система NFS, да, сможет работать с модулем сетевого протокола.

(тут была небольшая неточность, я смешал в кучу файловые системы блочных устройств и файловые системы без устройств)

Но модуль NFS не сможет напрямую обратиться к сетевой карте, только через модуль сетевого стека, набор вызовов которого очень ограничен. Поэтому модуль NFS не сможет ничего поломать.

А почему?

Почему что? Почему загрузчик модуля выдаст ошибку? У него есть список правил, что можно модулю делать, а что нельзя.

Но на самом деле разговор ущёл немного в сторону. Описанные рассуждения про то, что разрешено делать, а что запрещено, важны, скорее, для пользовательских процессов.

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

Re: подсказка

Date: 2009-09-21 03:00 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Фигасе вы тут нафлудили, футурологи!
Не продолжить ли вам это на своих страницах?

Re: подсказка

Date: 2009-09-21 05:51 am (UTC)
From: [identity profile] nealar.livejournal.com
Хорошая мысль!

Re: подсказка

Date: 2009-09-20 06:04 pm (UTC)
From: [identity profile] stepancheg.livejournal.com
Нет, вру, баги в JVM, конечно, были. Но это совсем другое — вероятность поломки системы от бага в виртуальной машине на порядки меньше вероятности поломки системы от баге в модуле, выполняющемся в монолитном ядре.

Profile

thedeemon: (Default)
Dmitry Popov

December 2025

S M T W T F S
 12 3456
789101112 13
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 28th, 2026 10:37 am
Powered by Dreamwidth Studios