CVE 2023-0567

В ПХП нашли достаточно серьёзный, на мой взгляд, баг — на некоторых повреждённых хешах функция password_verify возвращает true на любой пароль. Получается, хитрый хакер может оставить себе тайный ход — поменять в базе хеш на битый, и пользователь ничего не заметит — пароль-то по-прежнему подходит.

Вот как это выглядит:

var_dump(password_verify("foo", '$2y$04$00000000$')); // true
var_dump(password_verify("bar", '$2y$04$00000000$')); // true

Удивляет, что один из разработчиков попытался защитить текущее поведение интерпретатора:

The documentation for password_verify() clearly states that the $hash has to be valid:

> hash
> A hash created by password_hash().

I fail to see how this is a bug if you feed it garbage; also the documentation to crypt states:

> Using characters outside of this range in the salt will cause crypt() to return a zero-length string. The two digit cost parameter is the base-2 logarithm of the iteration count for the underlying Blowfish-based hashing algorithm and must be in range 04-31, values outside this range will cause crypt() to fail.

PHP clearly behaves as described.

Что бы ни было написано в документации, возвращать true на любой пароль из функции проверки правильности пароля — очень плохая идея, как мне кажется, это должно быть довольно очевидно.

При анализе оказалось, что баг занесён ещё в 2008-м году (!), причём исследовавший эту историю разработчик хоть и осторожен в выражениях, всё же похоже считает, что уязвимость появилась неслучайно:

PHP’s implementation of crypt_blowfish differs from the upstream Openwall version by adding a «PHP Hack», which allows one to cut short the BCrypt salt by including a $ character within the characters that represent the salt.

Hashes that are affected by the «PHP Hack» may erroneously validate any password as valid when used with password_verify and when comparing the return value of crypt() against the input.

The PHP Hack exists since the first version of PHP’s own crypt_blowfish implementation that was added in 1e820ec.

No clear reason is given for the PHP Hack’s existence. This commit removes it, because BCrypt hashes containing a $ character in their salt are not valid BCrypt hashes.

Оставить комментарий

«Ухарь-купец»

Не знал, что в начале двадцатого века существовало такое явление, как раскрашенные вручную фильмы. Как и многие, я слышал, что в чёрно-белом фильме 1925 года «Броненосец Потёмкин» есть красное знамя, раскрашенное вручную, кадр за кадром, но думал, что это уникальное явление, из ряда вон.

А тут при изучении сайта «Утерянные медиа», наталкиваюсь на новость, что в прошлом году удалось разыскать считавшийся утерянным фильм «Ухарь-купец» — первый российский цветной фильм 1909 года. И он целиком раскрашен вручную!

Чёрно-белый кадр: мужчина в шляпе и пальце протягивает бутылку женщине в длинном платье и платке; на фоне деревянные избы, телега и сельская улица.
Кадр из цветного фильма «Ухарь-купец», 1909 год

Вот это постпродакшн! Длительность фильма — около восьми минут, что даёт нам, при скорости съёмки 15 кадров в секунду по стандарту того времени 7200 кадров (8×60×15).

Красили, правда, насколько я мог разобраться, не кисточкой, а методом вирирования, — это способ, который изобрёл Жорж Мельес, один из основоположников кинематографа. Метод заключался в вырезании трафаретов из напечатанных с плёнки дополнительных позитивов, при помощи которых покадрово наносились оттеночные химикаты.

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

Лубок «Ухарь-купец»: купец в красной рубахе среди толпы, сцены деревни, стихотворный текст внизу.
Типо-литография торгового дома Е. Коновалова и Ко, хромолитография, начало 20-го века

«Ухарь-купец» — экранизация известной русской песни по стихотворению И. С. Никитина «Ехал из ярмарки ухарь-купец».

Стихотворение рассказывает о совращении проезжим купцом деревенской девушки с согласия её отца. Оно, кстати, в своё время изменило значение слова «ухарь». Первоначальное значение «весёлый, энергичный человек» перешло в негативное.

Было отчего — кончается стихотворение довольно мрачно:

Молится богу старуха-жена,
Плакать бы надо — не плачет она.
Дочь их красавица поздно пришла,
Девичью совесть вином залила.
Что тут за диво! и замуж пойдет…
То-то, чай, деток на путь наведет!
Кем ты, люд бедный, на свет порожден?
Кем ты на гибель и срам осужден?

Фильм тоже не хеппиэндом кончается — дочь прибегает в родительский дом, и мать, поняв её нынешнее положение по символически обрезанной купцом косе, будит пьяницу-мужа, чтобы, заламывая руки, рассказать ему что случилось под плач опозоренной девушки.

Оставить комментарий