Вышло (https://lists.strongswan.org/pipermail/announce/2013-April/0...) экстренное обновление strongSwan 5.0.4 (http://www.strongswan.org/), свободного пакета для создания VPN-соединений на базе протокола IPSec, используемого в Linux, Android, FreeBSD и Mac OS X. В новой версии устранена серьёзная уязвимость (CVE-2013-2944), проявляющаяся при использовании плагина "openssl" в выпусках с 4.3.5 по 5.0.3 включительно, и позволяющая установить соединение с использованием некорректного сертификата или сигнатуры. Суть ошибки состоит в том, что любая пустая, нулевая или ошибочная цифровая подпись ECDSA воспринималась как корректная. Обязательным условием успеха атаки является использование бэкенда OpenSSL (по умолчанию не используется и включается при сборке с опцией "--enable-openssl") и задействование аутентификации ECDSA (Elliptic Curve Digital Signature Algorithm).URL: https://lists.strongswan.org/pipermail/announce/2013-April/0...
Новость: http://www.opennet.me/opennews/art.shtml?num=36854
Это баг в strongswan или в openssl?
Соответственно, затрагивает ли это, к примеру, openssh с ecdsa?
ошибка в strongSwan, т.к. не корректно обрабатывали ошибки OpenSSL.
> Это баг в strongswan или в openssl?Не, не, не, только сильныйлебядь.
valid = ECDSA_verify(0, hash.ptr, hash.len,
- signature.ptr, signature.len, this->ec);
+ signature.ptr, signature.len, this->ec) == 1;Вот нафига так сравнивать? Потом придут новые майнтенеры, начнут оптимизить, и покоцают == 1;
Неужели все ресурсы выжрет один добавленный if ?
ret = ECDSA_verify(0, hash.ptr, hash.len, signature.ptr, signature.len, this->ec);
if (1 == ret)
valid = TRUE;Во, OpenSSL, специально для Равшанов и Джамшутов, в мане написал как надо делать!
http://www.openssl.org/docs/crypto/ecdsa.html
Third step: verify the created ECDSA signature using ... ECDSA_verifyret = ECDSA_verify(0, digest, 20, buffer, buf_len, eckey);
// and finally evaluate the return value:if (ret == -1)
{
/* error */
}
else if (ret == 0)
{
/* incorrect signature */
}
else /* ret == 1 */
{
/* signature ok */
}
На фоне таких ошибок становится понятно адекватность использования ТОЛЬКО boolean в операциях if.В С/С++ можно подсунуть int или любую цифру в if и не отловить некорректный ответ. В java только прямая проверка.
PS а что они будут делать если придет возврат -2? ошибка? да, ошибка. но по логике man-ов будет signature ok.
почему в мане они предлагают серию if, а не switch case, где default будет ругаться в логи? или хотя бы проверяли на ==1.
> В С/С++ можно подсунуть int или любую цифру в if и не отловить некорректный ответ.Думать надо перед написанием программы, а не сразу топтаь клавиатуру.
Если не твоя, внешняя функция возвращает три результата,
то ты ОБЯЗАН обработать все три результата, а не оставлять на авось
и модальные округления, типа 23 mod 12 тоже 11 будет, и пофиг утра или вечера.> В java только прямая проверка. PS а что они будут делать если придет возврат -2?
Куда придёт? Откуда?
> почему в мане они предлагают серию if, а не switch case, где
> default будет ругаться в логи? или хотя бы проверяли на ==1.Ты каким местом читаешь? В серии if-elif-else именно это и есть! :)
Пусть используют установку побитовых-масок в макросах и не выеживаються
В твоем примере ошибка. valid - не инициализирован. И нафига тебе if, в оригинале очень даже годно написано.
Это ж трындец, товарищи!
> Это ж трындец, товарищи!Этому багу сто лет в обед. Его воспроизводят и воспроизводят. Это NULL authentification.
Вот так всегда - ждёшь уязвимости в php, а получаешь в IPSec. Не гневай Господа ямой, и сам туда не попадёшь.
Affected are only installations that have enabled and loaded the OpenSSL crypto backend (--enable-openssl). Builds using the default crypto backends are not affected.
Использую libgmp (http://gmplib.org), а не openssl.
очередные «оптимизаторы» не читают документацию. молодцы, они В Тренде.
Тэги: ШГ, УГ, апинастос, гвано, ссанина, мазоль, тваражог_солмнана, щвабботка
> Тэги: ШГ, УГ, апинастос, гвано, ссанина, мазоль, тваражог_солмнана, щвабботкаЭто чё, из серии - хотел пофлудить, но мозга не хватило?