LINUX.ORG.RU

Защита данных приложения linux_app_data_sec (песочницы для приложений)

 , ,


0

2

Привет. Проба пера.
Я разработчик приложений для Android. Меня очень долго волновал вопрос, почему в андроид приложениях есть песочница у каждого приложения, куда другим приложениям нет доступа без root, а у Linux приложения такой песочницы нет. Я попытался своими силами исправить эту проблему. Оказалось что не всё так просто. Первый вариант, который, я создал, но сейчас уже не использую - это запуск приложения через sudo с указанием дополнительной группы пользователя и установка для папки доступа только из этой группы. Если будет интересно, я расскажу подробнее, но это не достаточно удобный вариант, потому что при каждом запуске через sudo необходимо ввести пароль. А вот что бы без пароля запускать приложения… Пришлось написать модуль ядра, который даёт доступ приложению исходя из его полного пути на диске. Сразу скажу, доступ довольно быстр, потому что программа loader сканирует фс и создаёт для всех путей идентификатор nodeId, который является целым числом, а не строкой и проверяется в модуле ядра. Так как это целое число, проверка на доступ занимает минимум времени. Но некоторая задержка для всех файлов всё же существует. Забегая вперёд, скажу, что создатели Linux могли бы внедрить кеширование и подобную технологию в само ядро Linux, и тогда бы накладных промедлений не было бы вообще. А пока что при компиляции долгого проекта из 5 минут с ssd на M.2, я практически не заметил промедлений, но они в общем то есть. Думаю это хороший результат при 5 программах в конфигурации по 2-3 папки на программу.

Прежде всего эта утилита для разработчиков приложений Linux и может быть для администраторов. Для того что бы ваше приложение получило папку-песочницу её достаточно добавить в конфиг и установить саму утилиту. Подробнее в ReadMe проекта: https://gitlab.com/v.kudashov.work/linux_app_data_sec/-/blob/main/README.ru.md

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

Так же в проекте есть несколько практических конфигураций, которые, например, могут скрыть пользовательскую папку браузера от доступа из других приложений - в качестве улучшения защиты кеша браузера от доступа извне. Второй вариант практического применения - это защита образов virtualbox от доступа из других программ без sudo. Это что бы браузер или другая программа, например, не смогли сделать бинарный поиск в вашем не зашифрованном образе диска virtualbox. Это становится важным, прежде всего из за того, что программы бывают из разных стран и в условиях нестабильного мира неизвестно кто и что выкинет и куда полезет. Поэтому хотелось бы как в андроиде - никакая программа не может получить доступ к файлам другой программы без разрешения этой (другой) программы. Всем добра. Ссылка на утилиту: https://gitlab.com/v.kudashov.work/linux_app_data_sec/



Последнее исправление: wn1 (всего исправлений: 1)

Читай про user namespaces, а из готовых реализаций — про bwrap или firejail. Также читай про AppArmor и SELinux. Всё это значительно мощнее твоего велосипеда.

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

CrX ★★★★★
()

SELinux переизобретаешь?

Только вот что, SELinux, и прочие подобные системы - не особо полезные костыли по своей сути. Первая идея с назначением групп была более разумной.

И ещё меня удивило сочетание «sudo неудобно потому что спрашивает пароль» и «напишу ка я тогда модуль ядра». Какой у тебя опыт в написании модулей ядра? Впрочем, по ссылке никаких модулей ядра не видно.

Ты сам это писал или применял чатгпт и прочие бредогенераторы?

firkax ★★★★★
()
Ответ на: комментарий от CrX

Это не такая обёртка, как хочет ТС.

может быть, но flatpak по сути это максимальный аналог того как сделано на андроид в приложениях.

anonymous
()
Ответ на: комментарий от firkax

SELinux сложен, я попытался его как-то раз применить, но там нужно буквально всё описывать конфигом, получается много движений для настройки одной программы. А нужно просто, добавил путь для программы и путь для папки и всё готово.

У меня опыт работы с Си++ в прошлом лет 6 примерно. Но последние лет 10 занимаюсь андройд-разработкой. Сам изобретать архитектуру утилиты не стал, использовал что предлагает ИИ, но он часто ошибался и много труда потрачено чтобы исправить его ошибки. Но на начальном этапе помог он хорошо. По сути весь код приходилось читать и исправлять.

wn1
() автор топика
Ответ на: комментарий от wn1

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

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

firkax ★★★★★
()
Ответ на: комментарий от CrX

нет. пользователь тот же. В этом и смысл, что пользователя не нужно менять

wn1
() автор топика
Ответ на: комментарий от firkax

Ebpf для загрузчика и LSM (Linux Security Modules) для определения прав доступа

wn1
() автор топика
Ответ на: комментарий от CrX

используется просто смена пользователя

Создаётся карта защищаемых папок и защищаемых программ. eBPF хук позволяет проверить при доступе к папке, относится ли текущий процесс к одной из азщищаемых программ. Если относится - доступ как обычно на основе стандартов Linux, если не относится, то доступ блокируется. Но если пользователь root, то доступ не блокируется никогда, чтобы оставить совместимость для администрирования

wn1
() автор топика
Ответ на: комментарий от firkax

Нет, флаг setgid не позволяет установить дополнительную группу для исполняемого файла. Его назначение другое: он позволяет запускать исполняемый файл с правами группы, которая владеет этим файлом. Вот если бы можно было дополнительную группу для запуска файла назначить, то да. Дело в том, что приложения огут использовать основную группу для доступа к ресурсам, поэтому переопределять её нельзя. А дополнительную можно установить только используя sudo для запуска - что не юзер френдли. Т.е. я браузер запускаю, и мне нужно это сделать через sudo и пароль - не удобно. Поэтому и появилось ругое решение

wn1
() автор топика
Ответ на: комментарий от wn1

Я не предлагал с его помощью ставить группу...

только используя sudo

Пойми ты, sudo это обычная программа, при том написанная не очень разумными программистами. Никаких эксклюзивных свойств у неё нет, как и у любых других программ (в линуксе вообще только одна программа с особенными свойствами - та у которой pid=1). Тебе никто не мешает написать свою программу для замены групп и чего угодно ещё, а sudo вообще снести (как я и делаю везде).

Я поэтому и пишу, разберись что такое setuid (чем отличается real uid, effective uid, saved uid например), а то очень странно выглядит написание ядерных хуков и при этом отсутствие знаний об элементарных unix-правах процессов. Закрадывается подозрение что возможно ты не совсем сам писал те хуки.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Хуки писал не сам, их предложил deepseek, потому что не нашёл решения того, что мне нужно. Потом я дописывал за ним то что не работало. Зачем мне setuid, если я хочу что бы приложение могло исполняться от любого пользователя, но доступы для папки только для этого приложения сохранялись. Приложения ставятся для всех пользователей, поэтому stupid мне не поможет

wn1
() автор топика
Ответ на: комментарий от anonymous

Docker не совместим с публикацией приложений стандартным способом. Не каждый производитель по может похвастаться контейнером, который ставится из магазина приложений. Я же хочу что бы все необходимые настройки производились во время установки по из Discover

wn1
() автор топика
Ответ на: комментарий от wn1

их предложил deepseek

А, ну вот и разгадка. Печально.

Вобщем, совет прежний - изучай как работает система прав, и только потом что-то пиши. А бредогенераторами (дикпик чатгпт итд) пользоваться нежелательно.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Тебе никто не мешает написать свою программу для замены групп и чего угодно ещё,

А вот это интересно

wn1
() автор топика
Ответ на: комментарий от firkax

Я консультировался с одним из программистов Linux, он мне посоветовал qube os для того что бы сделать систему похожей на андроид. Но я пользуюсь Linux и думаю, что её потенциала должно хватить для хорошего решения этой задачи, но может написать нужно расширение для файловой системы и доработать ядро. Но сам я этими ресурсами не располагаю. Может кто то посоветует, как подобное создаётся в мире Линукс. Куда лучше всего написать, где идет предложить?

wn1
() автор топика
Ответ на: комментарий от firkax

А, ну вот и разгадка. Печально.

Я сам не люлю ии. Предпочитаю писать большую часть кода самостоятельно. Но в мире Linux у меня столько опыта не было. Мою задачу решение решило. Других решений аналогичных пока нет. Если кто то может помочь сделать другим способом недоступным кеш браузера Yandex от браузера Chrome, было бы очень хорошо. Т.е. предположим что война браузеров это не просто словесный оборот, что они решительно переходят к действию и удаляют мой профиль в Яндекс браузере. Что я могу противопоставить?

wn1
() автор топика
Ответ на: комментарий от wn1

Если кто то может помочь сделать другим способом недоступным кеш браузера Yandex от браузера Chrome, было бы очень хорошо

Дядь, тебе уже в первом сообщении предложили нормальное решение.

anonymous
()
Ответ на: комментарий от CrX

bwrap

Вы уверены что bwrap защищает приложение в песочнице от воздействия извне по тем пользователем. Грубо говоря песочницу может удалить любой браузер или телеграм или, о боже, макс

wn1
() автор топика
Ответ на: комментарий от anonymous

Дядь, тебе уже в первом сообщении предложили нормальное решение.

Пример, в контексте войны Chrome против Yandex можно?

wn1
() автор топика
Ответ на: комментарий от firkax

Тебе никто не мешает написать свою программу для замены групп и чего угодно ещё

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

wn1
() автор топика
Ответ на: комментарий от wn1

Думаю нужно запускать с setuid = 0, что бы это был суперпользователь

wn1
() автор топика
Ответ на: комментарий от wn1

Дополнительные группы ставятся сисколлом setgroups().

Чтобы пользоваться этим сисколлом, надо поставить программе setuid-root, да. А потом программа должна переставить пользователя назад на обычного (перед запуском целевой программы).

sudo все свои манипуляции тоже делает потому что на нём setuid-root.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Дополнительные группы ставятся сисколлом setgroups().Чтобы пользоваться этим сисколлом, надо поставить программе setuid-root, да. А потом программа должна переставить пользователя назад на обычного (перед запуском целевой программы)

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

wn1
() автор топика
Ответ на: комментарий от wn1

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

wn1
() автор топика
Ответ на: комментарий от firkax

Почитайте, пожалуйста, мой комментарий к вашему сообщению и его комментарий. Не всё просто. Нужен какой то способ определения guid на основе пути к приложению даже если оно запускается из другого приложения, а не через наш аналог sudo

wn1
() автор топика
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария