Випадковості третього сорту: як погана рандомизация спустошила гаманці користувачів Android
Тиждень тому Bitcoin-співтовариство було растревожено серією зухвалих крадіжок. Стало відомо, що з кількох гаманців, заведених і використовуваних їх власниками на Android-пристроях, повели сумарно близько півсотні BTC. В общем-то дрібниця, бо в перекладі на долари це приблизно п'ять тисяч - дурниця на тлі багатомільйонних пограбувань, якими нині бавляться чорні хакери. Шум, однак, піднявся такий, що втрутитися в те, що відбувається визнала за необхідне навіть Google. Причин тому кілька. По-перше, дрібне злодійство розкрило фундаментальну недопрацювання в Android, яка поставила під удар всіх користувачів Bitcoin на цій платформі. По-друге, коли пил вляглася, стало ясно, що постраждати можуть і користувачі безлічі інших Android-додатків, включаючи криптографічні. Нарешті, по-третє, проблема не вирішена до цього дня і в найближчі роки буде висіти дамокловим мечем над андроідовской екосистемою.
Втім, давайте по порядку. Формальним початком цієї історії стало з'явилося 11 серпня на сайті Bitcoin.org попередження : Біткойновие гаманці, згенеровані за допомогою Android-додатків, небезпечні. Щоб зрозуміти причину, не потрібно бути фахівцем з віртуальних грошей: досить згадати основи так званого асиметричного шифрування, званого також шифруванням з відкритим ключем. Засноване воно на використанні двох довгих чисел, одне з яких ( «відкритий ключ») доступно всім (з його допомогою можна, наприклад, зашифрувати повідомлення, що відправляється власнику ключа), інше ( «секретний ключ») зберігається в таємниці, оскільки потрібно для розшифровки , постановки цифрового підпису та інших операцій, право виконувати які має тільки власник ключа.
Bitcoin-гаманець - не що інше , Як такі ось два довгих числа. Дещо спрощуючи, можна сказати, що перше - відкрите - служить в якості номера гаманця, а друге - секретне - як ключ, який дозволяє вмістом гаманця розпоряджатися. Таким чином, щоб зловмисник зміг вивести гроші з чужого гаманця, йому потрібно знати друге число. Відгадати його підбором краще навіть не намагатися (256 біт). Але можна спробувати його обчислити, якщо власник, скажімо, переславши гроші пару раз, спирався на неякісний генератор випадкових чисел. Справа в тому, що для підпису кожної біткойн-транзакції використовується секретний ключ в суміші з довільним випадковим числом. Якщо замість випадкового було двічі використано одне й те саме число, обчислити секретний ключ стає легше легкого.
Тут-то і криється проблема. Генератори випадкових чисел (ГВЧ), реалізовані програмно, насправді, звичайно, видають псевдовипадкові послідовності: числа в такому ряду один від одного не залежать, але сам ряд завжди однаковий. Щоб кожен раз після включення комп'ютера не починати з одного і того ж місця, приступаючи до роботи, слід «крутануть рулетку» (форматувати початковий стан генератора, передавши йому отримане будь-яким чином одне істинно випадкове число). Так ось: виявилося, що ГВЧ в Android (конкретно - відповідний компонент Java-машини) «рулетку» не крутив. І - хоч і не завжди - міг видати однакові числа.
Так що зловмиснику досить переглянути всі транзакції, зроблені власником конкретного гаманця, і, виявивши хоча б дві з однаковими «випадковими» підписами, обчислити секретний ключ. Якщо вас цікавить математика, весь процес (з опорою на open source-пакет Sage) докладно, ще взимку, описав у своєму блозі хтось Нільс Шнайдер. Залишається загадкою, чому Bitcoin-спільноті треба було півроку, щоб оцінити важливість його відкриття.
Відповідь, втім, очевидний. Публіка в масі своїй має досить невиразні уявлення про стійкої криптографії і гидує або боїться заглядати глибше призначеного для користувача інтерфейсу. Ось і зараз від уваги багатьох популярних ресурсів, які написали про подію, вислизнув важливий нюанс: під загрозою спустошення знаходяться не тільки гаманці, згенеровані Android-додатками, але все біткойн-гаманці, якими користувалися на Android-пристроях. (Адже слабкість не в ключах, а в підписах транзакцій!) Так що якщо ви пересилали біткойни через Android, задумайтеся над оновленням софта і переказом коштів в новий гаманець.
Що стосується таємничого злодія, який скористався знахідкою Шнайдера (а може бути, що виявив проблему самостійно), він продовжує красти: остання операція по його гаманцю датована вчорашнім днем. І взагалі кажучи, поки в гаманцях, скомпрометованих Android-транзакціями, залишаються якісь кошти, крадіжки триватимуть, адже в системі Bitcoin абсолютно всі транзакції відкриті. А повернути гроші законним власникам, природно, не вдасться, тому що відкат транзакцій в Bitcoin неможливий принципово.
Але досить про Bitcoin. Я пропоную змінити дійових осіб. Замість програм, які працюють з біткойн-гаманцями, нехай на сцену вийдуть програми асиметричного шифрування документів - скажімо, GPG або PGP. Замість біткойн-транзакцій будуть текстового повідомлення, надісланого від користувача А до користувача Б. Звичайно, схема шифрування і підпису буде відрізнятися від реалізованої в Bitcoin, але принцип залишиться тим же: дрібна недоробка в генераторі випадкових чисел призведе до катастрофічних наслідків для стійкості шифру (сторонній спостерігач зможе відновити секретний ключ і читати або підробляти частина кореспонденції). І тут саме час згадати про підозри, висловлених недавно в зв'язку з галасом навколо Едварда Сноудена. Пам'ятайте, як пару тижнів назад експерти припустили , Що в мікропроцесорах Intel і AMD з ініціативи АНБ організовані штучні «слабкі місця»? Дивлячись на те, що відбувається з Bitcoin на мобільних пристроях, легко уявити, чим такі дрібниці можуть відгукнутися.
Але і для Android історія не завершена. Google відреагувала оперативно і вже розіслала виробникам пристроїв відповідний патч для операційної системи. Так що в найближчі тижні і місяці власники підтримуваних Android-пристроїв, ймовірно, його отримають. Однак сотні мільйонів користувачів сидять на мобільних пристроях, які вже не підтримуються і прошивки яких ніколи не будуть оновлені. Для них вразливість ГСЧ залишиться назавжди. І добре, якщо розробники прикладних програм, що використовують ГВЧ, знають про уразливість і самостійно подбали про те, щоб її обійти (як зробили автори всіх популярних мобільних Bitcoin-додатків). Але ж залишаться тисячі програм, творці яких про проблему і не підозрюють.
Співробітники Symantec не полінувалися оцінити чисельність армії додатків, що користуються збитковим ГСЧ в андроідовской Java. Це 360 тисяч програм, з яких тільки кожна дев'ята, звертаючись до ГСЧ, що не лінується примусово рандомизировать стартову точку генератора, тоді як інші сподіваються, що ГВЧ подбає про це сам. І добре, якщо програма, якої знадобилися випадкові числа, використовує їх, скажімо, для розстановки віртуальних ворогів на ігровому полі. Ось тільки іграшок в списку Symantec всього 10 відсотків ...