Разработка средства обнаружения перезаписи памяти - PullRequest
3 голосов
/ 23 декабря 2011

Я занимаюсь разработкой и написанием нового инструмента тестирования перезаписи памяти в Linux, который распознает ошибки из-за перезаписей в динамически выделяемой памяти.

Один хороший способ сделать это - , если пользователь запрашивает x байтов, то выделяет x + r байтов.Использование mprotect не дает доступа к r байтам, так что если пользовательская программа запускается в этой части, она будет остановлена, генерируя SIGSEGV.

Но проблема в вышеприведенном случае заключается в том, что mprotect требует отображенной памяти(mmap), и каждый раз, когда malloc запрос, отображающий байты x + r, является практически служебной информацией.

Можете ли вы предложить другой способ?Или какой-нибудь фрагмент кода, если вы работали над таким инструментом?

PS: Кто-нибудь может поделиться каким-либо документом дизайна любого такого инструмента с открытым исходным кодом, который он знает или использовал?

Ответы [ 3 ]

2 голосов
/ 23 декабря 2011

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

1 голос
/ 27 декабря 2011

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

Для читателя оставлено в качестве упражнения сделать то же самое для C ++: - {

0 голосов
/ 27 декабря 2011

Если вы хотите использовать mprotect, вам нужно работать по странице.
Предположим, что пользователю нужны x байтов, предположим, что x <= 4K (x> 4K немного усложняет).
Выделите 8K, используяmmap (который дает выровненные страницы), используйте mprotect для защиты от записи второй страницы.
При возврате пользователю не указывайте ему первую страницу, а p + 3096-x.
Теперь он будет иметь ровно x байтов и будет падать при попытке записи после него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...