Искал на днях кое-какую информацию и абсолютно случайно вышел на баг-репорт один. Он меня, что называется, "поразил до глубины души".
Посмотрите вот на этот код в генераторе 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". Самое главное даже не в этом. А что такую уязвимость очень легко списать на "ошибку по невнимательности". И попробуй докажи, что это не так. Обычная ошибка. Да, с кем не бывает. А вот последствия...
Как это происходило.