Переключение флагов для внедренных вызовов mprotect в многопоточных приложениях

Я работаю над проектом, где динамическая библиотека (.so) вводится в некоторую целевую программу во время выполнения (динамическое инструментирование). Библиотека обрабатывает свою собственную память, используя mmap/munmap, По соображениям безопасности требуется, чтобы какой-то сопоставленный регион в библиотеке только быть доступным для записи через открытые API из библиотеки.

То, что мы сделали, это тумблер флаг записи области памяти с использованием mprotect а также PROT_WRITE в прологе / эпилоге библиотечных функций, например:

void foo(void) {
mprotect(addr, PAGE_SIZE, PROT_READ | PROT_WRITE);
...
...
mprotect(addr, PAGE_SIZE, PROT_READ);
}

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

Итак, вопрос: возможно ли отключить другие задачи в процессе до foo возвращается? Если нет, то как вы предлагаете обойти это?

1

Решение

Ваша модель безопасности недействительна. Если код вашей библиотеки может mprotect эти регионы доступны для записи, как и любая другая часть программы. Вы не можете предотвратить это самозабвенно. Такие свойства безопасности могут быть достигнуты только при некотором внешнем наблюдении, либо непосредственно ядром, либо с помощью процесса трассировки (например, с использованием традиционной трассировки ptrace или seccomp).

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

0

Другие решения


По вопросам рекламы [email protected]