Слабка випадковість
Випадкове на вигляд — не те саме, що непередбачуване.
Що таке Слабка випадковість?
Слабка випадковість — це генерування значення, яке не можна вгадати, швидким некриптографічним генератором. Статистична рівномірність не означає непередбачуваності: стан малий, а функція переходу детермінована. Math.random() у V8 — це xorshift128+, 128 бітів стану, які можна відновити за чотирма спостережуваними значеннями. Ви зберете токени скидання для облікового запису, який контролюєте, розв'яжете задачу відновлення стану, передбачите наступний токен і викрадете чужий обліковий запис в ощадному застосунку, не заглядаючи до поштової скриньки її власника. Виправлення — один рядок, crypto.randomBytes(32).toString('hex') , а хешування слабкого результату нічого не змінює.
Що ви дізнаєтесь у Слабка випадковість
- Відрізняйте PRNG (швидкий, статистично рівномірний) від CSPRNG (стійкого до відновлення стану за спостережуваними вихідними значеннями)
- Усвідомлюйте, що хешування результату слабкого PRNG не робить його безпечним: хеш детермінований, а вхідні дані залишаються передбачуваними
- Застосовуйте <code>crypto.randomBytes</code> / <code>crypto.randomUUID</code> (Node), <code>crypto.getRandomValues</code> (Web Crypto) або <code>os.urandom</code> (Python) для кожного значення, важливого для безпеки
- Перевіряйте кодову базу на суміжні місця виклику: токени скидання, токени запрошень, резервні коди MFA, параметри state в OAuth, одноразові значення в підписаних URL, генератори паролів адміністраторів мають ту саму вразливість, якщо їх виведено з <code>Math.random</code>
- Засвойте правило: значення, яке зловмисникові вигідно передбачити, має походити з криптографічного джерела за замовчуванням; у кожній мові це вибір в один імпорт, тож неправильне джерело за замовчуванням не має виправдання
Слабка випадковість — Кроки навчання
-
Оцініть ціль
Боб заробляє на життя тим, що проникає в чужі облікові записи й забирає гроші, які на них лежать. Сьогодні його ціль — Nestward, застосунок для заощаджень, де на одному обліковому записі можуть лежати значні суми. Він починає зі сторінки скидання пароля — вхідних дверей, якими збирається зайти, — щоб побачити, як працює відновлення доступу, перш ніж щось робити.
-
Як працює відновлення доступу
Боба ця сторінка цікавить через одну деталь.
-
Запросіть скидання пароля для себе
Боб починає з кодів, які має право бачити. Йому належить одноразовий обліковий запис bob.reeve@proton.me, тому він запитує для нього скидання пароля й відкриває лист, який надсилає Nestward. Посилання для скидання в цьому листі містить код повністю.
-
Зберіть другий код
Одного коду замало, щоб помітити закономірність, тож Боб запитує ще одне скидання для того самого облікового запису й читає другий лист.
-
Ще один код
Третє скидання дає Бобові три коди, потрібні його розв'язувачу. Він читає останній лист і складає коди докупи.
-
Передбачте наступний код
Nestward генерує ці коди швидким некриптографічним генератором із малим внутрішнім станом. Боб подає розв'язувачу три коди, які прочитав у своїй поштовій скриньці; розв'язувач відновлює цей стан і проганяє генератор уперед. Інструмент виводить точний код, який застосунок поставить у наступне ж посилання для скидання, незалежно від того, для якого облікового запису запитують скидання.
-
Ініціюйте скидання пароля жертви
Передбачений код — наступний, який видасть генератор, тож Бобові треба змусити генератор видати цей код зараз. Він запитує скидання для справжньої клієнтки, renata.voss@gmail.com. Nestward генерує наступний код, вставляє його в посилання й надсилає листом Ренаті, до чиєї поштової скриньки Боб доступу не має.
-
Використайте передбачений код
Тепер Боб використовує код, який передбачив. Він надсилає код безпосередньо на ендпоінт скидання пароля разом із новим паролем, і, оскільки код збігається з тим, який Nestward щойно надіслав Ренаті, сервер приймає його й встановлює для її облікового запису пароль, який задав Боб.
-
Обліковий запис тепер у Боба
Ендпоінт прийняв код і змінив пароль. Тепер Боб увійшов в обліковий запис ощадного застосунку, який йому не належить.
-
Перевірка знань
Охоплення стандартів безпеки
OWASP Top 10
- A04:2025 Cryptographic Failures
- A02:2021 Cryptographic Failures
CWE
- CWE-330 Use of Insufficiently Random Values
- CWE-338 Use of Cryptographically Weak Pseudo-Random Number Generator (PRNG)
CIS Controls
- CIS 16 Application Software Security
NIST CSF
- PR.AT-02 Individuals in specialized roles are provided with awareness and training so that they possess the knowledge and skills to perform relevant tasks with cybersecurity risks in mind
- PR.PS Platform Security