Действительно ли системный вызов является единственным способом, которым пользовательская программа может намеренно влиять на состояние ядра Linux?

[117758] Это работает достаточно хорошо. FIrstly скачайте и скомпилируйте sqlite на вашу локальную машину (не венв.). [118238]sudo pip install sqlite [118239] должен сделать это по иронии судьбы. Теперь добавьте ниже к вашему [118240]~/.pydistutils.cfg[12164]pip внутри venv теперь будет компилировать pysqlite против /usr/local/lib. THis [118242]может [118243] нарушить изоляцию - pysqlite зависит от библиотек вне венва. Если вас это беспокоит, то, боюсь, лучшая ставка - тюрьмы или LXC[117761].
1
16.12.2014, 10:29
3 ответа

Так получилось, что с ядром имеется ещё один значимый интерфейс: виртуальные файловые системы /proc и /sys. Хотя они не содержат обычных файлов, их содержимое является прямым шлюзом к ядру: действовать на них - значит действовать непосредственно на выделенную ядру память. Например, если вы хотите отказаться от всех кэшей памяти, вы можете использовать....

echo 3 > /proc/sys/vm/drop_caches

... и ядро отреагирует немедленно.

Теперь программе понадобятся системные вызовы, чтобы взаимодействовать с файловой системой: open, read, write, and so on... Тем не менее, ещё есть способ отследить все эти системные вызовы: ядро предоставляет механизм трассировки в разделе /sys/kernel/debug/tracing. Точнее, отслеживание системных вызовов обрабатывается в /sys/kernel/debug/tracing/events/syscalls. Этот виртуальный каталог содержит два подкаталога для каждого системного вызова. Например, при открытом системном вызове мы имеем:

  • sys_enter_open
  • sys_exit_open

В этих каталогах находится файл с именем enable. Если он содержит "1", то отслеживается связанное с ним событие (входящий или выходящий вызов open). Обычно я использую событие enter, но вы можете выбрать то, что больше соответствует вашим потребностям.

После активации трассировки системного вызова вы найдете журнал по адресу /sys/kernel/debug/tracing/trace . Помните, что системный вызов open часто используется . Это конечный шлюз между программой и файлом, а файлы могут быть литературны все, что угодно в системе Linux. Также имейте в виду, что

UNIX был разработан не для того, чтобы помешать своим пользователям делать глупые вещи, так как это также помешало бы им делать умные вещи. - Doug Gwyn

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

Управление механизмом трассировки требует разрешений в разделе /sys/kernel/debug/tracing/trace . Скорее всего, вам понадобится быть root, чтобы активировать трассировку и манипулировать ею. Не забудьте отключить трассировку, когда закончите.

6
27.01.2020, 23:13

Это зависит. Что вы подразумеваете под «проверкой»? Если вы просто хотите отслеживать, какие SESCalls некоторые процессы вызывают, то он возможен .. Обычно .... Но если вы чувствуете, что вы копаете глубже, то у вас проблемы ... Я не слышал о каких-либо инструментах, которые могли это сделать.

Вы можете использовать STRACE, чтобы увидеть, какие SESCalls некоторые конкретный процесс стрельба. Конечно, вам придется запустить его как root ... Однако вам не всегда будет преуспеть на всю сцепление, так как можно защитить приложение от мониторинга его деятельности - вызовы Ptrace сброшены. Попробуйте рассеять на хроме - вы увидите;)

Если поста не хватает недостаточно, чем я полагаю, вы поднимаетесь с разборкой каждого бинара приложения и вручную проверяют то, что он делает. Это должно быть весело :) (или, конечно, вы можете получить исходный код и увидеть все эти алгоритмы как читаемый для человеческого текста. Но зачем выбрать проще, когда вы можете пойти с ASM :))

1
27.01.2020, 23:13

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

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

Хорошо -известным способом смягчения последствий является использование микроядра . Меньше кода позволяет больше проверки. Благодаря микроядерной архитектуре объем кода драйвера устройства может быть значительно ограничен. Возможно, вполне так, если у вас есть адекватный IOMMU, а также MMU.

Однако это утверждение неверно.

Если вы ищете, используя правильные термины, я думаю, вы можете найти ряд уязвимостей, которые служат контрпримерами. Ошибки могут генерироваться в диапазонах памяти, которые даже не были сопоставлены :

.

«Linux Kernel i386 SMP Page Fault Handler Повышение привилегий» [SecuriTeam].

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

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

https://en.wikipedia.org/wiki/Row_hammer

0
27.01.2020, 23:13

Теги

Похожие вопросы