LINUX.ORG.RU

Сброс состояния процесса

 , ,


0

3

Привет, ЛОР!

Хочу странного. А именно, хочу сбросить состояние процесса как если бы он только начался после exec*(), но при этом оставаясь в рамках того же потока выполнения. Особенно хочу unmap() всех страниц, которые были замаплены до этого, кроме страниц с кодом и стеком. Как это нормально сделать?

Поясню зачем это нужно. Хочу сделать песочницы в программе для работы с критичными данными. Песочница представляет собой дочерний процесс, в котором удалены/закрыты все ресурсы кроме связи с родителем и включен Landlock. Как я себе это представляю:

  1. создаю пару pipe() или сокет для связи
  2. делаю fork() (на самом деле, clone(), но это не важно тут)
  3. закрываю все fd кроме созданных в пункте 1 через close_range()
  4. убираю всю память кроме страниц с кодом и стеком
  5. включаю landlock, запрещающий примерно всё кроме общения через fd из пункта 1

Вопрос тут в том, как реализовать шаг 4.

UPD:

Судя по всему, никак. Либо парсить /proc/self/maps и удалять лишние страницы, либо делать exec в себя и ветвление в самом начале main().

★★★★★

Последнее исправление: hateyoufeel (всего исправлений: 3)
Ответ на: комментарий от RedTerror

По итогу скатывается в трастлеты у arm, мираж и ocaml

Solo5 вполне себе на сишечке. Всё православно, OCaml строго не обязателен.

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

Да нет, вводных тут вполне хватает. Судя по всему, лялекс просто не позволяет сделать то что я хочу. По крайней мере, без вагона костылей.

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

))) и сейчас вся метрика android на этом " компилировать код в байткод виртуальной машины и пихать этот байткод в ядро".
Потом идет kuber (и сильно), Cisco, а потом простые смертные, которые плюют на Astra, apparmor, secure linux etc )))

Да нет, вводных тут вполне хватает. Судя по всему, лялекс просто не позволяет сделать то что я хочу. По крайней мере, без вагона костылей.

зырни, откуда ноги: https://www.youtube.com/watch?v=Wb_vD3XZYOA

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

))) и сейчас вся метрика android на этом " компилировать код в байткод виртуальной машины и пихать этот байткод в ядро".

Ага. Это совершенно другой инструмент и совершенно другой сценарий использования. Метрика Android на eBPF (и скорее всего DPDK) потому что гугелю надо обходить тормозной люнексовый сетевой стек.

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

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

тормозной люнексовый сетевой стек

Хотел сказать полноценный сетевой стек против обкоцаного поделия сумрачного индийского гения работающего в тепличных условиях внутри гугловых дц?

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

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

Кому надо пусть юзают ptrace, вот что тебе ответят

Второе у тебя есть личность англоязычная которая с историей? Ну вот собственно и всё

RedTerror
()
Ответ на: комментарий от deep-purple

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

RedTerror
()

Хороший тред, покормлю.

убираю всю память кроме страниц с кодом и стеком

Если у тебя "библиотека" в произвольном процессе, то там с вероятностью близкой к единице будет libc или аналог, у которого будет bss.

У песочницы не должно быть динамической памяти, вызовы glibc тоже не предусмотрены.

Без libc или своих обёрток для сисколлов ты не сможешь пукнуть выхлопом своей песочницы, так что не лепи горбатого - у тебя там что-то будет libc’образное с bss’ом.

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

Либо парсить /proc/self/maps и удалять лишние страницы

Мне просто любопытно, а каким modprobe telepathy ядро должно было бы догадаться, какие страницы по твоему мнению "лишние"? Ну, раз уж ты собрался ядро патчить…

Повторю, функции семейства exec*() не подходят, поскольку требуют правок в main(), чтобы это всё работало.
Судя по всему, никак.

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

exec можно сделать себе в шаровары через fexecve. Шаровары себе можно сделать через memfd. Затянуть на шароварах кушак потуже можно через F_SEAL_FUTURE_WRITE и аналоги.

Не надо бороться с exec’ом, надо принять его как родного - он делает именно то, что ты хочешь.

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

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

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

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

Понимаешь? Есть rop fop and etc

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

Я хз что ты там себе лишнего придумал, но ход мыслей поясню:

Когда у тебя УЖЕ ЕСТЬ доступ к памяти процесса, который работает от рута, нет никакого смысла бегать по памяти копии процесса у пользователя с понижеными привилегиями.

Сразу пиши шелл с произвольной логикой.

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

Понимаешь?

deep-purple ★★★★★
()
Ответ на: комментарий от RedTerror

первое это снижает безопасность по их мнению, так же такое поведение нужно малварестроителям.

  1. Как это поведение поможет малвари?
  2. С каких пор Линуса и ко. волнует возможность запуска малвари в системе в принципе?
hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel
  1. Это не совсем малварь конечно, скорее сущность которая поселилась, зная версию сервиса и от чего он зависит, какой у нас дистр можно и других гаджетов поискать в системе и вызывать их, ну сам подумай

  2. Дарпа и ко (те самые компании на подряде) не одобряет такие патчи и каждого теперь под лупой рассматривают, дроны и прочее оборудование зачастую на линуксе

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

Без libc или своих обёрток для сисколлов ты не сможешь пукнуть выхлопом своей песочницы, так что не лепи горбатого - у тебя там что-то будет libc’образное с bss’ом.

Ага. Обёрток для сисколлов должно быть достаточно.

Мне просто любопытно, а каким modprobe telepathy ядро должно было бы догадаться, какие страницы по твоему мнению «лишние»? Ну, раз уж ты собрался ядро патчить…

Тем же, которым оно это делает при exec.

Не надо бороться с exec’ом, надо принять его как родного - он делает именно то, что ты хочешь.

Нет, не делает.

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

Это не совсем малварь конечно, скорее сущность которая поселилась

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

зная версию сервиса и от чего он зависит, какой у нас дистр можно и других гаджетов поискать в системе и вызывать их, ну сам подумай

Это всё предусматривает возможность запуска кода. А если ты можешь запустить код в системе, то на этом можно и успокоиться, потому что систему уже поимели.

Я всё ещё не понимаю, как clone() со страницами и тем более с CLONE_VM – то есть всё то, что давно с системах присутствует – будут безопаснее чем clone(), который заодно страницы памяти убирает.

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

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

Так зачем тогда вся это эпопея с unmap, landlock? Ведь шелл-код уже запущен…

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

При чем тут жидорептилоиды если так уж повелось, что множество малварь мейкеров неперсистентное зло ассоциируют с сущностью?

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

RedTerror
()
Ответ на: комментарий от cobold

Каких сортах, если запрещено ВСЁ, кроме форка памяти самого бинаря? Который тупо проинитит свои глобалы по дефолту или вообще откажется работать без наличия нужных ключей в переданном конфиге?

deep-purple ★★★★★
()
Ответ на: комментарий от cobold

Но по задаче запрещено только в одном форке! А родитель может всё, так то вот, форк исполняет роль изолированного микросервиса, не забывай, он только данные молотит

RedTerror
()
Ответ на: комментарий от cobold

Бляха... Он — фактически, а мы — теоретически, что он патч в ядро отправит, который позволит ограничивать. А пока вообще ограничения нет — в том и беда.

deep-purple ★★★★★
()
Ответ на: комментарий от hateyoufeel

Тем же, которым оно это делает при exec.

Но оно не делает ничего из того, что ты описал.

Тем же, которым оно это делает при exec.

он делает именно то, что ты хочешь.

Нет, не делает.

Ты хочешь сделать exec точно так же как exec, но чтобы это был не exec , потому что exec делает exec ? Я всё верно понял?

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

Тем же, которым оно это делает при exec.

Но оно не делает ничего из того, что ты описал.

Тогда зачем ты советуешь exec?

Ты хочешь сделать exec точно так же как exec, но чтобы это был не exec , потому что exec делает exec ? Я всё верно понял?

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

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

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

Так зачем тогда вся это эпопея с unmap, landlock? Ведь шелл-код уже запущен…

Запустить код в системе без ограничения привилегий. Это то, о чём @RedTerror тут пишет. Если я его правильно понял, ограничение привилегий процессу как-то поможет писателям малвари. Только я всё ещё не понял, как именно поможет-то. Причём тут C# я тоже не понимаю, но я про C# знаю достаточно мало.

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

Мне просто любопытно, а каким modprobe telepathy ядро должно было бы догадаться, какие страницы по твоему мнению «лишние»? Ну, раз уж ты собрался ядро патчить…

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

И удалена exec’ом?

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

любопытно, а каким modprobe telepathy ядро должно было бы догадаться, какие страницы по твоему мнению «лишние»

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

deep-purple ★★★★★
()
Ответ на: комментарий от mittorn

main() что так, что так — патчить. Т.к. что там патчить, знает только разработчик main() — ТС этого и желает — полного контроля над тем, что будет отнаследовано при форке.

deep-purple ★★★★★
()
Ответ на: комментарий от anonymous

Если он в состоянии не только мычать, но и реально сделать патч — я только ЗА (мне вот знаний и навыков не хватит нахрапом это взять). Ну а там видно будет, до какой степени обсуждения и реализации дойдет сия ветка — ждемс.

deep-purple ★★★★★
()