Крах Chrome при обработке ссылок c экранированным нулевым символом

В Chrome, Chromium, Opera и других браузерах на основе кода Chromium выявлена проблема, позволяющая инициировать крах браузера при открытии ссылок, содержащих экранированное представление нулевого символа. Крах наблюдается при открытии ссылок с %%300 или %%30%30 в URL, например, "http://a.com/%%300", "file:///%%300", http://a.com/%%30%30" и т.п. При наведении курсора на проблемную ссылку закрывается лишь текущая вкладка, но клик на ссылке приводит к закрытию браузера целиком.

Прямое использование "%00" в ссылках запрещено и вырезается на этапе разбора ссылки. Но косвенная передача нулевого кода оказалась возможной. При обработке ссылки последовательности "%%300" (%+%30+0) и "%%30%30" преобразуются в "%00" ("http://a.com/%00"), после чего передаются в вызов GURLToDatabaseURL(), внутри которого также вызывается функция ReplaceComponents(), предназначенная для удаления из ссылки информации логине и пароле. Внутри ReplaceComponents() дополнительно производится вторичная распаковка экранированных последовательностей, в результате которой "%00" превращается в символ с нулевым кодом. При возвращении в функцию GURLToDatabaseURL() выполняется вызов .spec(), который считает, что на вход передаётся корректный URL, но так как конец строки был сдвинут URL оказывается повреждён, что приводит к срабатыванию макроса DCHECK() и краху браузера.

©  OpenNet