Pull to refresh

Comments 14

По существу написать нечего, но такие истории всегда захватывающие и читаются на одном дыхании, из минусов только навязчивое послевкусие, что я не true-программист.

А ещё я впервые читаю расследование, в конце которого "убийцу" так и не нашли.
Интересно, такие книги-детективы существуют?

А если в объявлении функции явно указать extern __attribute__((__sysv_abi__)) void my_linux_style_assembly_function(); компилятор под виндой сам не сохранит недостающие регистры?

Сохранит, если поймёт этот атрибут.

UFO just landed and posted this here
UFO just landed and posted this here
Поэтому пожалуйста, восстанавливайте регистры, завершив с ними работу

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

Если ко мне придёт гость и нагадит в гостиной, я перестану пускать его, а не стану надевать памперсы на каждого входящего.

Иными словами, если библиотека не выполняет требования ABI, надо решать проблему с библиотекой, а не оборачивать всё в дополнительные защиты.

От кривых изменений памяти как защититься, кстати? Всю доступную память на диск сбросить, после вызова функции раскатать обратно?

Я про это и говорю. Что гости бывают разные и у вас должны быть органы чувств что бы обнаружить подобное. А не просто верить что всё нормально.

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

Эта либа устанавливала хуки на системные вызовы, которые работают с диском.

And I was able to confirm (in some of the dumps, we don't collect the right heap information in all dumps) that Trend Micro code (one region is a DLL that seems to be called ApiHookStub.x64.dll, another is not a direct DLL copy) which has been allocated on our process heap without going through the loader, presumably via something like ::VirtualProtectEx and ::WriteProcessMemory. This is a pattern I see used broadly in Edge crashes we root cause to third-party software.

https://bugs.chromium.org/p/chromium/issues/detail?id=1218384#c81

хуки на системные вызовы, которые работают с диском

Но т.к. с диском работает примерно весь софт, она должна была валить любой софт, который использует диск и регистр XMM7. И, как видим, в данном случае XMM7 используется компилятором просто как ещё один регистр общего назначения для хранения константы.

Вообще конечно жесть. МакАффи как были руко*опами 20 лет назад, так и остались.

Помню, в середине-конце нулевых был аналогичный случай, когда корпоративный McAfee Antivirus заставлял вылетать Recovery Manager for Active Directory, при попытке этого ПО осуществить вполне легитимный вызов DLL-injection.
Sign up to leave a comment.

Articles