Рукостискання, яке закінчується помилкою, здається атакою, доки не подивишся на повідомлення, і найчастіше це арифметика: немає спільної пропозиції, сертифікат прострочений або пакет так і не надійшов. Атака зниження — це конкретна річ: противник штовхає обидві сторони до слабшої поведінки, ніж вони обрали б, і вона залишає інші сліди. Якщо вважати кожну невдачу злим умислом, ви шукаєте жертву, якої може й не бути, а якщо вважати справжнє зниження помилкою конфігурації, слабший результат залишається на місці. Ці дві помилки коштують по-різному, і лише одна з них дешево виправляється.

Що насправді змінює атака зниження

Мета — не зламати шифр і не вгадати ключ. Мета — вплинути на переговори так, щоб обидві сторони зупинилися на старішій версії або слабшому алгоритмі, з яким противник упорається, або щоб одна сторона повірила, що інша підтримує лише це.

Змінюється угода, а не автентифікація. Якщо противник може змінити пропозицію непомітно, сторони все одно можуть завершити рукостискання і все одно автентифікувати одна одну, але з параметрами, які надає перевагу противник. Тому цікаве питання — чи охоплені самі переговори захистом цілісності.

Чому самі переговори мають бути автентифіковані

TLS 1.3 робить цей захист явним. Клієнт, який запропонував новішу версію, може виявити сервер, що тихо відкотився, бо випадкове значення сервера несе фіксований шаблон, коли він домовляється про 1.2 або нижче, і клієнт зобов'язаний перерватися, побачивши це. Повний транскрипт також покритий фінальними повідомленнями, тому зміна будь-де в переговорах провалюється пізніше, а не проходить тихо.

Старіші версії протоколу мали слабші історії, і саме тому правила відкату мають значення. Кінцева точка TLS 1.0 у тій самій конфігурації — не атака зниження; це дозволений результат, який ви самі обрали дозволити. Різниця в тому, чи слабший результат прийшов із захищеного рішення, чи з незахищеного шляху, на який міг вплинути посередник. Щойно ви сформулюєте це так, більшість інцидентів зводиться до питання конфігурації.

IKEv2 поводиться інакше, але спирається на ту саму ідею. Пропозиція передається в обміні, який згодом автентифікує обидві сторони, тому проміжний пристрій, що переписує алгоритми, ламає автентифікацію, а не керує нею. Канал керування OpenVPN захищає свої переговори за допомогою TLS, а потім використовує цей канал, щоб узгодити шифри каналу даних, і саме тому цікавий рядок журналу каналу керування.

Налаштована сумісність — не атака

Адміністратор може навмисно дозволити старіші варіанти, щоб підтримати документований клієнт, і це рішення видно в конфігурації. Противник не може створити таку конфігурацію; він може лише скористатися шляхом, що дозволяє впливати на пропозицію.

Небезпечне виправлення — те, що прибирає доказ різниці. Увімкнення всіх старих опцій, вимкнення перевірки сертифікатів або приймання будь-якого шифру, аби помилка зникла, розширює те, на що погодиться кінцева точка, і прибирає перевірки, які повідомили б про слабший результат.

Якщо треба зберегти одну стару опцію, назвіть причину і клієнта в коментарі конфігурації, а потім обмежте опцію профілем, якому вона потрібна. Виняток сумісності, обмежений одним слухачем, можна перевірити; застосований глобально — це просто слабше значення за замовчуванням, яке ніхто не пам'ятає, що обирав.

Прочитайте збій, перш ніж називати причину

Збережіть точний рядок помилки, версії клієнта і сервера та час до будь-яких змін. Потім класифікуйте: сторони не дійшли згоди щодо пропозиції, шлях пакетів відмовив чи одна сторона відхилила параметр, який колись приймала?

Незбіг пропозиції зазвичай називає винні версії або алгоритми і провалюється в тій самій точці щоразу. Проблема маршрутизації або MTU застрягає чи завершується тайм-аутом, і часто залежить від мережі. Прострочений сертифікат дає помилку перевірки, а не переговорів.

Ніщо з цього не є доказом противника. Приписати злий умисел при першому збої — і є помилка, бо це приховує детерміновану помилку, яка провалиться знову завтра.

Підтвердьте, що саме було вибрано

Після будь-якого виправлення читайте узгоджений результат, а не покладайтеся на те, що з'єднання піднялося. З'єднання, яке вдається тому, що перевірку прибрали, — це результат, якого ви намагалися уникнути. Дві команди нижче показують вибрані версію і шифр для кінцевої точки з TLS попереду, а також рядок каналу керування з журналу сервера OpenVPN.

openssl s_client -connect 198.51.100.30:443 -servername vpn.example.net -brief </dev/null
grep -iE 'Control Channel|Data Channel' /var/log/openvpn.log | tail -5

Порівняйте результат із конфігурацією, яку ви задумали, а не з тим, що тепер підключається. Якщо вибрана версія старіша за дозволений мінімум, профіль або список відкату — це місце для пошуку, і відповідь — виправити цей список, а не оголошувати атаку й перебудовувати все навколо.

Схожі статті