Компания Varnish Software, разрабатывающая системы для построения сетей доставки и кэширования контента, представила открытый проект TinyKVM, развивающий инструментарий для изоляции выполнения отдельных процессов при помощи гипервизора KVM. Целью проекта заявлено создание самой быстрой системы sandbox-изоляции отдельных процессов, использующей аппаратную виртуализацию. Код проекта написан на языках C и С++, и распространяется под лицензией GPLv3...Подробнее: https://www.opennet.me/opennews/art.shtml?num=62898
Не понимаю зачем это нужно когда обычные процессы со своим адресным пространством и потоками -- это по сути и есть мини виртуальные машины.
Программы все еще работают слишком быстро. Надо срочно обвязать в новую прослойку.
А мне это видится, как замена тормознутой и ужасной JVM.
Если в вебе уже есть WebAssembly, то это для бека неплохая замена Джаве.
не понял, почему это замена Яве? это же просто ещё одна система виртуализации
Обе технологии - VM заточенные под процесс.
JVM через JNI позволяет запускать программы внутри свой VM на других языках, а не только Java-программы. Так что сходство у технологий есть.
у коровы и яишницы тоже есть сходство
нет, ты что, у коровы и яичницы гораздо меньше сходства.
как ты измерял?
на глаз
> GPLv3 (для не готовых выполнять требования GPLv3 предоставляется коммерческая лицензия).GPL прямо запрещает изенение или добавление любык пунктов к GPL лицензии а, значит и удаление их т.б.всех... хоть автором ПО.
Если они это игнрируют - они нарушиители GPL и закона.
Их исходный код под GPL - нелегален и пользователям...
Проект - максимувм в топку...
> GPL прямо запрещает изенение или добавление любык пунктов к GPL лицензии а,
> значит и удаление их т.б.всех... хоть автором ПО.можно накрутить свой проприетарный код поверх открытого GPL кода, при условии, что вы не изменяете оригинальный код. Чем собственно пользуются многие российские дистрибутивы Linux, например, им это не мешает.
А они и не меняют GPL, они предоставляют под совершенно другой лицензией, что GPL запретить не может ни явно, ни неявно. Но раз ты уверен, что незаконно — подавай в суд, прославишься.
Java через JNI запускает любой код за пределами VM.
Код на C или C++ или ассемблере может вмешаться и в память приложений.
И нарушить работу самой Java машины, деинсталлировать еë, и поставить Doom.
То есть мвхнуть рукой и начать играть в компьютерные игры? Нет, такой вариант плох, проходил. Впустую потрачено ценное жизненное время, а раз впустую значит в минус. Как минимум в минус, а с учётом какие бывают игры это ещё и вредно как просмотр фильмов ужасов.
>Впустую потрачено ценное жизненное времяВся ваша жизнь в глобальных масштабах не имеет никакого смысла. Также есть мнение, высказанное писателем Ричардом Бахом в одном из его произведений: "Мы пришли в эту жизнь ради двух вещей: обучение и получение удовольствий". Я к тому, что время, проведённое за играми, вполне себе имеет смысловое наполнение с такой точки зрения.
>вредно как просмотр фильмов ужасовГде-то читал, что просмотр фильмов ужасов наоборот полезен может быть. Так что и здесь вы неправы.
Не в одном, а в трех как минимум.
И Бах не давал оправданий растительной жизни, он предлагал задавать себе вопросы.
Например, "ну и чему ты научился, потратив годы на задрoтство?"...
Нет, jni работает внутри ОС, а не в jvm
Спасибо. Я как свинья в апельсинах в java.
Справедливости ради jni уже далеко не первый год как не исползуется. Так что все рассуждения про него явно устарели.
Нет, KVM обеспечивает лучшую изоляцию. KVM минимально вмешивается в работу нагрузки и он построен на хардварных методах виртуализации, поддерживает шифрование памяти, лучше производительность для сложных нагрузок. Namespaces и cgroups же это полностью программная виртуализация, больше накладные расходы, и отсюда же большая уязвимость. Ну и самое главное неправильно настроенные контейнеры могут стать огромной дырой в безопасности, с KVM практически не возможно ошибиться из-за большей простоты.
Непонятно, зачем изолировать отдельный процесс. Можно конкретный пример из обычной жизни, но толкьо без экзотики.
"системы для построения сетей доставки и кэширования контента" - для этого и пилят. DRM?
Какие вы неграмотные вещи пишете...Cgroups и namespaces вообще не имеют никаких накладных расходов, это просто ещё один int в таблице процессов.
И виртуализацией они тоже не являются ни в каком виде.
Дополню, при трансляции виртуального адреса в физический в виртуальной машине сначала адрес транслируется через 4-ре таблицы в виртуальной машине, а затем полученный адрес транслируется снова через 4-ре таблицы, но уже на хосте. Рост накладных расходов не просто в два раза, а в разы. Конечно в CPU есть ITLB1, DTLB1 и т.п. для кеширования адреса к которому часто обращаются, но чем больше виртуалок тем бестрее кеш "выедается" и всё это всё больше и больше тормозит.
> Cgroups и namespaces вообще не имеют никаких накладных расходов, это просто ещё один int в таблице процессов.И правда:
> Какие вы неграмотные вещи пишете...
Накладые расходы как раз много меньше.
> Namespaces и cgroups же это полностью программная виртуализация, больше накладные расходыСомнительный тезис. Они реализованы в ядре. Расходы вроде быть примерно одинаковые.
Как бы, вы ж в KVM тоже что-то запустите ведь, и это что-то должно будет тоже с железом взаимодействовать как-то.
В связи с этим:> лучше производительность для сложных нагрузок
Поискал сравнение перформанса между kvm/skvm/tkvm и ns+cg, не нашёл толком.
Если у вас есть аналитика на эту тему, я был бы признателен.> с KVM практически не возможно ошибиться из-за большей простоты
ну кстати да, вероятно
> Поискал сравнение перформанса между kvm/skvm/tkvm и ns+cg, не нашёл толком.Про docker то скорее всего слышали? ns+cg - это те самые контейнеры. И их сравнение с kvm найти уже никакой проблемы не составляет.
Окей, окей, лишнего написал. Конечно же интересует именно что skvm/tkvm.
там же написано. всякие ограничения, можешь заморозить\восстановить состояния. в целом нужно для запуска приложений, которым не доверяешь.
> в целом нужно для запуска приложений, которым не доверяешь.То есть это будет конкурент для flatpak и snap?
Они Erlang изобрели?
Твои проблемы, если не понимаешь. Такого ответа ещё было. Пользуйся.
Сперва всю изоляцию с сегментной адресацией и тремя уровнями привилегий загнали в плоское адресное пространство и два уровня привилегий, поделив это друг от друга только страничным механизмом, героически сделали этот горбыль легаси, теперь стали изобретать этот велосипед обратно.
>Сперва всю изоляцию с сегментной адресацией и тремя уровнями привилегийОт первого ушли вприпрыжку и без сожаления. Забавно было бы посмотреть как надо изгаляться на 16Гб с сегментной адресацией.
А последним и так не пользовались, слишком высоки накладные расходы, хотябы на переключение контекстов.
Какие проблемы создать сегмент на 48бит адресного пространства?Тем временем, 5 уровней таблицы страниц, разные по размерам страницы, для которых разные таблицы. Зато не изгаляются.
> Какие проблемы создать сегмент на 48бит адресного пространства?А толку? Вот какой глубинный смысл в этом?
Страницы позволяют создавать виртуальное адресное пространство которое отображается на физическое не линейно с гранулярностью в размер страницы. То есть последовательные страницы не обязательно отображаются на последовательные физические адреса. Это хорошо и удобно, потому что позволяет маппинг памяти, со всеми фишками типа shared memory и swapping. Эти вещи не противоречат сегментам, но для того чтобы иметь сегменты, которые так могут мапится на физическую память, всё равно придётся создавать таблицы страниц, которые будут задавать отображение. Отсюда вопрос: в чём тогда смысл создания сегментов?
Слишком высоки, неужто даже больше, чем"Накладные расходы на вызов каждого системного вызова составляют около 2 микросекунд."
При этом раз паравиртуализируются вызовы хост ОС, то получается, что все те же самые дыры полностью в распоряжении виртуалки.
Сегменты еще со времен x8086 всех достали
> разрабатывающая системы для построения сетей доставки и кэширования контентаИнтересно, как они собираются зарабатывать с такой-то лицензией.
> Код проекта написан на языках C и С++
Жду новостей "выполнение кода за пределами гостевой системы из-за выхода за пределы буфера"))
Тоже про c и c++ в самом начале новости так подумал и увидел твой коммент. Тут почти каждая первая новость про уязвимость связана с переполнением буфера.
Как и многогие другие комерсы - двойным лицензированием. Они собственники этого кода, поэтому так могут.
"Licensing
TinyKVM and VMOD-TinyKVM are released under a dual licensing model:Open Source License: GPL‑3.0 (see LICENSE).
Commercial License: Available under terms controlled by Varnish Software."
Ну тогда это следовало бы отразить в новости)
А то слегка вводит в заблуждение.ps отправил запрос на изменение новости
> Интересно, как они собираются зарабатывать с такой-то лицензией.При помощи двойного лицензирования и эксплуатируя тот факт, что в системах доставки контента софт —наименее сложная и интересная часть. Нет, софт конечно нужен, и как видишь иногда даже приходится самому что-то создавать под свои нужды, но это досадная необходимость, а не ядро бизнеса.
>> Интересно, как они собираются зарабатывать с такой-то лицензией.
> При помощи двойного лицензированияSaaS-овец (т.е. владелец "сети доставки") вообще может взять хоть прям "под GPL" - он же бинарник все равно только на своих мощностях крутить будет, т.е. сорцы и доработки никому "отдавать" не обязан.
>> разрабатывающая системы для построения сетей доставки и кэширования контента
> Интересно, как они собираются зарабатывать с такой-то лицензией.Зарабатывать с сетей доставки и с кода для сетей доставки - разные вещи.
>> Код проекта написан на языках C и С++
> Жду новостей "выполнение кода за пределами гостевой системы из-за выхода за пределы буфера"))А что вам ещё остаётся то?
kvm то давно в ведре.
> TinyKVM runs static Linux ELF programs.не очень понятно, зачем оно нужно, если всякий мутный бинарный софт, который хотелось бы запустить в виртуалке для безопасности основной системы, поставляется в виде динамических программ, или в виде AppImage или flatpak, не очень мутный софт с доступными исходниками задолбаешься конпелять статично, а для оставшихся трёх с половиной софтин на Go, которые можно сконпелировать статично, никакая виртуалка нафиг не нужна.
Тут ответ, хоть и про другую систему и технологию пишут
https://www.qubes-os.org/faq/#why-is-os-security-importantИдея в том, чтобы ОС не была коммунальной квартирой, а была изолированной, для программ.
Что касается статических и динамических программ, думаю это не проблема, просто для TinyKVM нужны будут базовые образы, содержащие в себе нужные библиотеки, как в образах контейнеров.
> чтобы ОС не была коммунальной квартирой, а была изолированной, для программ.кольца защиты и страничная трансляция это всегда делали. Дак что именно сабж предложил?
> что именно сабж предложил?Удобный и доступный интерфейс для всего этого. Это куда важнее языка реализации и использованных технологий.
Покусанный дизайнерами? Технологии как раз важнее, интерфейс можно навертеть какой угодно.
Ура, Товарищи! То что я более 10 лет назад сформулировал как "нужно сделать" - сделали (вообще-то сделали раньше, но QEMU для юзерспейса вообще не создавался как песочница).
Сформулировал, а потом 10 лет лежал на диване в ожидании? Бока не намял?
Он не мял бока и с телевизором разговривал, а разговаривал с Ним и формулировал то, что жалкие людишки сделают через 100, 1000 и даже 1_000_000 лет. Такой вот он скромный и незаметный прыщ-труженик.
Как радостно, что есть люди, способные это понять, и в то же время как грустно, что понял именно ты и что теперь тебя придётся убрать...
Просто системное программирование - не мой профиль. Но ежу понятно - для сандбоксинга надо:
1. порвать любую прямую связь программы с ОС
2. в непрямую связь вставить агрессивный фильтрПока у нас сисколлы обрабатываются ядром напрямую это невозможно. Всегда может оказаться возможность поломать ядро через манипуляцию структурами данных в сисколлах.
Отсюда простой вывод: с появлением аппаратной виртуализации ring 2,3 изжили себя. Ограничения на инструкции? Зачем, если можно каждой программе по своему ring 0 выдать. Ограничения на доступ к памяти? Зачем, если можно каждому процессу всё полностью своё адресное пространство выдать.
>В самой виртуальной машине не используются какие-либо драйверы, ввод/вывод и виртуальные устройства.Надо понимать, что процессы внутри этой ВМ не смогут писать логи - IO отсутствует.
Это решение для повышения безопасности? Я не ослышался?
Можно писать логи в сокет, видимо.
логи не повышают безопасность. особенно когда их никто не читает
>логи не повышают безопасностьНастоящее икспертное мнение.
>особенно когда их никто не читаетПочитай в википедии про SIEM
Логи сами себя на анализируют. SIEM - это уже не логи.
На сишке песочница? Это же как бэкдор в firewall.
Я почитал блог и глянул исходник.Это не песочница. Это просто stepping stone для TEE, смысл простой: засовывается любая обычная ELF-программа в TEE без всякого геморроя с анклавами, и их API - это всё на себя берёт TinyKVM. Просто на данном этапе TEE не реализовано.
Фильтра IO нет никакого. Это не для безопасности хоста от вредоносных приложений делалось. Это делается для "защиты" приложений от хостера. В кавычках - потому что держится такая "защита" на честном слове. Надо будет поломать очередной силк - просто придут к Intel - и аттестация будет подделана для конкретной физической машины - той, что у хостера стоит), когда быдло будет продолжать отведывать DеRьMа и наслаждаться им.
Для безопасности от хостера - только гомоморфная криптография.
> Накладные расходы на вызов каждого системного вызова составляют около 2 микросекундЭто считается мало?
Зачем это в реальной жизни???
... вот тоже ничего не понял ... " Вы можете взять обычную программу Linux, которую вы только что создали в своем терминале, и запустить ее в TinyKVM. " ... зачем ... зачем мне все это ... моей машиной управляет комп с линукс на борту , в моем телефоне линукс ( виртуализация на линукс ОС) на работе у меня ноут с Ubuntu , дома комп с Ubuntu ... меня все устраивает ... это куда ... может нужно научиться делать правильный выбор в начале ... ??? ... можно добавить SmartTV + Android Box и конечно же стиралка ... ... TinyKVM остался без работы ... и потом в терминале я могу наваять на скорую руку скрипт ... к чему из выше описанного его прикручивать ?
затем же, зачем и кубесОС
> для не готовых выполнять требования GPLv3 предоставляется коммерческая лицензиякак это обычно работает, если в проект контрибьютили сторонние люди? они не имеют права на часть прибыли от продаж коммерческой лицензии?
Они подписали передачу имущественных прав перед тем, как их коммит приняли и никаких прав на прибыль не имеют.
это в GPL такое написано? как подпись происходит и почему владелец репы не подписывал? он ведь такой же коммитер
Hugepage же обычно с 64кБ страницами используется, разве нет?
# grep Hugepagesize /proc/meminfo
Hugepagesize: 2048 kBВ принципе, должно зависеть от CPU. Но практически всегда (x86_64, arm64) — вот так:
# hugeadm --page-sizes-all
2097152
1073741824Или 2МБ (по умолчанию), или 1ГБ (не сталкивался с применением).
>Основные возможности TinyKVM:
>Ограничение потребления памяти.Интересно как. Современный софт не умеет ограничивать себя в потреблении памяти, hello world на go требует для своего запуска 1 Гб виртуальной памяти, на меньшем падает. А после того, как виртуальная память выделена, процесс может её сколь угодно много занимать, единственный вариант для борьбы с этим - убийство процесса.
Ну да, ведь без KVM ОС никак не может узнать, сколько памяти процесс потребляет.
Давайте, расскажите, как это сделать, с учётом overcommit-а, а так же того, что большая часть софта выделяет памяти на порядок больше, чем использует. Тот же go выделяет 1 Гб виртуальной памяти сразу же, даже если запускается буквально hello world.
Что именно рассказать? Что ОС "забыла" сколько страниц на физическую память отмапила?
Какие варианты кроме убийства процесса с возможной порчей файлов вы можете предложить? Надеюсь, вы знаете, что даже запись в массив может привести к выделению новых страниц в физической памяти?
> Какие варианты кроме убийства процесса с возможной порчей файлов вы можете предложить?
> Надеюсь, вы знаете, что даже запись в массив может привести к
> выделению новых страниц в физической памяти?Ну так RTFM
ps ax -o pid,user,args,vsz,rss,uss
Внезапно, page fault, который происходит при записи в неотмапленную страницу, обрабатывается тоже ОС, а не какими-нибудь волшебными феями.
>Внезапно, page fault, который происходит при записи в неотмапленную страницу, обрабатывается тоже ОСВот есть какой-то цикл на псевдокоде.
int * arr = malloc(big_size * sizeof(int));
for (size_t i = 0; i < big_size; i++) {
arr[i] = 0;
}
Вот на arr[i] = 0; памяти ещё хватало, а вот на arr[i++] = 0 - уже нет. Как сообщить об этом процессу, чтобы он мог это обработать, и самое главное, почему он должено обрабатывать эту ситуацию, а не int * arr = malloc(big_size * sizeof(int))?
Ваш вопрос понятен, но будьте справедливы - в новости указано "ограничение потребления памяти", что можно сделать и через cgroups, а не "гарантия доступности физической памяти", что действительно проще сделать виртуалкой. Кстати, и не факт, что с KVM это сработает - если в Hyper-V физическая память на виртуалку нарезается сразу, то насчёт KVM я не уверен.Так что простого решения нет, только mlock + инициализация.
Ну oom_score_adj.
Ближе к 1ГБ виртуальной. Которая вообще по фигу. "Обещать — не значит жениться."
И в районе 10МБ резидентной. Которую можно (жёстко) ограничить, посадив процесс в memory c-group.
И если RSS хоть на байт выбежит за лимит, к процессу придёт всамделишный OOM-киллер.
Мне не очень нравится такой трюк. Но у соседей в "кубиках" некие вопросы решаются именно так.…С другой стороны, 20кБ-фитюлька с буквально четырьмя syscall'ами на сях (вывод кой-чего на консоль). На свою миллисекундную работу (буквально, 3мс запустился-показал сотню vlan-всё) жрёт 1.5 МБ RSS в моменте. "640 килобайт хватит всем", ага.
>Которая вообще по фигу. "Обещать — не значит жениться."Нет. Вот есть вызов malloc, запрашивающий 10 Гб памяти. Без оверкоммита он вернёт либо указатель, если память есть, либо null, если памяти нет, что уже можно обработать в коде. С оверкоммитом он всегда вернёт указатель, которым уже можно начинать пользоваться. Если это массив, то при его заполнении память начнёт постепенно уходить, и размер резидентной начнёт приближаться к размеру виртуальной. И в тот момент, когда закончаться свободные страницы в физической памяти либо придёт oom, либо система просто зависнет. С точки зрения процесса совершенно непонятно, почему для a[i] = v; память есть, а для a[i + 1] = v; уже нет
>И в районе 10МБ резидентной. Которую можно (жёстко) ограничить, посадив процесс в memory c-group.При этом ограничении процесс просто упадёт, побив данные. Файлы в кеше останутся не удалёнными, файлы в процессе работы останутся частично записанными.
>И если RSS хоть на байт выбежит за лимит, к процессу придёт всамделишный OOM-киллер.Это годится для очень редких ситуаций, когда потребление памяти заранее известно. Но, если речь идёт про тот же сервер, на который бывают наплывы пользователей, то убийство процесса будет, даже если в системе есть свободная память
>Мне не очень нравится такой трюк.А мне это не нравится совсем
>С другой стороны, 20кБ-фитюлька с буквально четырьмя syscall'ами на сяхКак хорошо, что в 2025 году можно запускать софт на 20 Кб, как и в 90-ых
cow2 это новый elf... :-/
Это рано или поздно должно было произойти, низведение виртуализации до того, что должно было обеспечиваться механизмами защищённого режима.
А когда и kvm издырявят окончательно ради того, чтобы эта дичь нормально работала, очевидно интел/амд анонсируют ещё более крутую какую-нибудь метавиртуализацию/партишны/ещё что-нибудь и начнётся следующий круг.
> Это рано или поздно должно было произойти, низведение виртуализации до того, что
> должно было обеспечиваться механизмами защищённого режима.Побег двойным chroot, неаккуратная работа docker с namespaces и ошибки в самой реализации namespaces, уязвимости в невидии и io_uring — это всё, по-вашему, из-за одного адресного пространства на всех, что ли? Вылезайте из 1989-го, у современных ядер attack surface огого.
Одно адресное пространство на всех? А вы точно уверены насчёт того, кто именно в 1989?
> Одно адресное пространство на всех? А вы точно уверены насчёт того, кто
> именно в 1989?Ну а кто из нас в начале треда пишет про то, что защищённый режим — панацея от всего, забывая о других видах уязвимостей?
Вы точно уверены, что там так и было написано - "панацея от всего"?
Речь о совершенно обратном, что если напихивать в kvm фишки для интеграции виртуализованного процесса в хост ОС (а их будут напихивать, потому что hello world это одно, а нормальный процесс со всеми доступами к fs, ipc и т.д. это уже совсем другое), от защиты, которую даёт виртуализация не останется ничего.
Тут походу никто не понял что это аппаратная виртуализация ради надежности но вместо гостевой ОС все вызовы идут в хост ОС. Так понятнее? И не нужно плясать с докером и lxd