Изменяет ли включение LLVM MemorySanitizer ABI библиотек

Проекты LLVM. MemorySanitizer имеет довольно сложное для удовлетворения ограничение, заключающееся в том, что все системные библиотеки также должны быть построены с помощью MemorySanitizer.

Я думал о некоторых способах включения MSAN для проекта, над которым я работаю (он уже использует ASAN и UBSAN), особенно в отношении этого ограничения. Одно из возможных решений, которое я рассматривал, могло бы привести к ситуации, когда при компиляции проекта с-fsanitize=memory, он будет связываться с неинструментированными версиями динамических системных библиотек, таких как libc, а также libstdc++, и скажи libcrypto(чтобы добавить тот, который на самом деле не является частью "цепочки инструментов"). Но затем во время выполнения инструментальный двоичный файл будет работать в специальной среде (в основном в другом пользовательском пространстве), где все системные динамические библиотеки были построены с-fsanitize=memory.

Жизнеспособна ли такая схема? Мне кажется, это зависит от того, будет ли построена библиотека с-fsanitize=memory изменяет свой ABI, потому что, если ABI библиотеки различается между инструментальными и неинструментированными версиями, то образ, созданный для неинструментированных системных динамических библиотек, будет катастрофически отказывать во время выполнения при запуске в среде с инструментальными системными библиотеками.

1 ответ

Решение

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

Прежде всего, компиляция с -fsanitize=memory делает изменения ABI, например, путем добавления дополнительных (теневые) операндов вызовов функций. Это означает, что объединение очищенного и необработанного кода во время выполнения, скорее всего, приведет к сбою.

С другой стороны, Msan не изменяет ABI библиотеки времени компоновки, т. Е. Не изменяет размеры или имена символов, поэтому внешний интерфейс библиотеки (т.е. содержимое ее таблицы символов ELF) скомпилирован с-fsanitize=memory не меняется.

Это означает, что связывание с незащищенной версией и последующий запуск с очищенной версией в порядке.

Другие вопросы по тегам