Linux 3.0: «обнаружен glibc» - отмена настройки повреждения - PullRequest
3 голосов
/ 08 марта 2012

Мое приложение Linux 3.0 / glibc 2.13 останавливается с ошибкой следующего вида:

*** glibc detected *** MYAPP: double free or corruption (fasttop): 0x000000000164fef0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x78a96)[0x7f9b114d4a96]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x6c)[0x7f9b114d8d7c]
MYAPP(...+0x131)[0x44e4c1]
MYAPP(...+0x3e8)[0x4441d8]
MYAPP(...+0x61)[0x440e41]

У меня вопрос , а не об ошибке, вызвавшей это.

У меня вопрос, с помощью какой функции «обнаружения коррупции» glibc останавливает мой процесс?Как это работает?Где задокументирована эта функция обнаружения повреждений?Какие настраиваемые параметры у него есть и как они доступны во время соединения и / или во время выполнения?

1 Ответ

5 голосов
/ 08 марта 2012

Это имеет склонность к безопасности, но очень богатый контент.http://www.blackhat.com/presentations/bh-usa-07/Ferguson/Whitepaper/bh-usa-07-ferguson-WP.pdf

Вот документация glibc по взаимодействию с системой: http://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html

Краткий ответ: Реализация распределения кучи обычно помещает значения стража перед возвращаемой памятью (и иногдапосле него).

В качестве фальшивого примера, поясняющего смысл, если вы запрашиваете 1000 байтов, 1012 байтов / может быть / выделено в 32-битной системе.Скажите 4 байта для указателя на то, что куча находит значимым, 4 байта для часового, например, 0x500DF00D, и, возможно, 4 байта в конце для другого часового, например, 0xABCDABCD.

Когда вы делаете 'free', тогда freeможно сделать несколько вещей.Найти контекст, посмотрев на этот указатель.Проверьте часовых на предмет превышения / недопущения и проверьте на двойное освобождение.Как это делает последнее.Давайте предположим, что буфер выглядел хорошо на 1-м свободном.

Если все выглядит хорошо, он может сделать что-то вроде изменения 0x500DF00D на 0x0BADF00D.

Так что free () также может проверить BADF00D для обнаружения несколькихпопытки освободить.

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

...