"Качество" opensource, а так же "как сделать 'уязвимость', которую сложно обнаружить при review"

Aug 08, 2010 16:38

Искал на днях кое-какую информацию и абсолютно случайно вышел на баг-репорт один. Он меня, что называется, "поразил до глубины души".

Посмотрите вот на этот код в генераторе RSA-ключей. Между прочим - opensource (привет Debian-сообществу!).

{
CK_MECHANISM mechanism = {CKM_RSA_PKCS_KEY_PAIR_GEN, NULL_PTR, 0};
CK_ULONG modulusBits = 1024;
CK_BYTE publicExponent[] = { 65537 };
CK_BBOOL _true = TRUE;
CK_OBJECT_CLASS pubkey_class = CKO_PUBLIC_KEY;
CK_OBJECT_CLASS privkey_class = CKO_PRIVATE_KEY;
Этим кодом в декабре 2008 года была "повышена" безопасность генератора RSA-ключей: раньше по умолчанию использовался размер ключа - 768 бит, а экспонента была 3. Произведенные изменения: размер ключа стал 1024 бита, а экспонента - 65537 (общепринятая, безопасная).

Итак, все отлично. Безопасность повышена. RSA-ключи генерируются отличные, теперь можно спать спокойно.

А между тем, безопасноть не только не повышена, но и сведена полностью "на нет". Причем так, что даже при не беглом анализе кода не очень-то и понятно "где баг" и есть ли он тут вообще. А он несет за собой ужасные последствия. Ключи становятся абсолютно небезопасными, уязвимыми.

Должен отметить: баг просуществовал в таком виде, в том самом opensource, где каждый может делать review или смотреть в исходники... до 08 мая 2009 года. То есть ПОЛГОДА данная утилита генерировала ключи-пустышки. И люди их использовали.

Этот баг, кстати, наглядный пример того, как можно легко вставить "правительственный бэкдор" (применяю журналисткий термин) даже в opensource код. Вы все еще верите в качестве opensource? А так же в то, как вы "наглядно и без проблем можете посмотреть, нет ли какой-нибудь лажи; можно сбилдить самому из исходников"? Смотрели, смотрели, и видели - да ничего не видели.

Так вот, суть ошибки: при таком коде экспонента будет не 65537, а 1. Все. Это провал. Подсказка: см. тип данных.

Собственно, вот патч:

- CK_BYTE publicExponent[] = { 65537 };
+ CK_BYTE publicExponent[] = { 0x01, 0x00, 0x01 }; /* 65537 in bytes */
Идея понятна? 65537, да не тот...

Еще. Заголовок звучит "как сделать 'уязвимость', которую сложно обнаружить при review". Самое главное даже не в этом. А что такую уязвимость очень легко списать на "ошибку по невнимательности". И попробуй докажи, что это не так. Обычная ошибка. Да, с кем не бывает. А вот последствия...

Как это происходило.

weak cryptography, vulnerability, crap code, *nix, cryptography, security, opensource

Previous post Next post
Up