Я недавно смотрел на использование уязвимости использования после освобождения в веб-браузере (в частности, Firefox). Я обнаружил, что в большинстве уязвимостей использования браузера после освобождения они используют обработчики событий J , зарегистрированные с некоторым событием DOM E (например, DOMNodeRemoved
). Внутри некоторой базовой функции C ++ F происходит событие E , и выполняется J , освобождая некоторые объекты. При возврате к F , есть коды, разыменовывающие висячий указатель и вызывающие уязвимость UAF.
Мой вопрос заключается в том, что я не уверен насчет основного механизма, отправляющего функции обратного вызова, Это правда, что F может продолжаться некоторое время, прежде чем будет запущен J ?
Например, если в Firefox codebase у меня есть:
void F(){
EventDispatcher::Dispatch(...) // dispatch event E
printf("FLAG 1\n");
printf("FLAG 2\n");
printf("FLAG 3\n");
}
// Assume javascript callback function J leads to the following C++ function C in Firefox codebase
void C(){
printf("Inside callback function J\n");
}
Возможно ли, что мы получим что-то вроде:
FLAG 1
Inside callback function J
FLAG 2
FLAG 3
или
FLAG 1
FLAG 2
Inside callback function J
FLAG 3
Если это возможно и происходит без нашего контроля, то при эксплуатации этого вида UAF Уязвимость, даже если нам удастся использовать одну из разыменований в функции F после возврата из обратного вызова, она может не срабатывать каждый раз, верно? Разыменование может произойти до выполнения обратного вызова.