Wiegand, вразливість у вашій системі доступу — як саморобний пристрій відкриває двері

21.04.2025 1 хвилин Автор: Cyber Witcher

Розповідаємо, як за допомогою простого саморобного пристрою можна перехоплювати та емулювати сигнали Wiegand, відкриваючи двері без авторизації. Ми детально описуємо процес створення такого пристрою, його підключення до системи та демонструємо, наскільки легко можна обійти захист, який здається надійним.​ Цей матеріал призначений для фахівців з інформаційної безпеки, розробників СКУД та всіх, хто зацікавлений у підвищенні рівня захисту своїх систем.

Роспочнемо

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

Йдеться про Wiegand — застарілу технологію, вразливість якої вдалося продемонструвати на практиці. Було зібрано компактний пристрій, що здатен перехоплювати сигнали системи, копіювати картки доступу та точно відтворювати їх у потрібний момент.

Цей приклад публікується не для того, щоб навчити зламувати системи — охочі вже давно знаходять такі інструкції самостійно. Основна мета — нагадати: користуватись технологією, якій понад пів століття, у критичній інфраструктурі — ризиковано. Особливо у 2025 році, коли кіберзагрози розвиваються швидше, ніж оновлюються СКУД.

Викопний протокол

Ми зіткнулися з протоколом Wiegand – справжнім динозавром у світі систем контролю доступу. Історія цього стандарту розпочалася у 70-х роках з цікавої технології — пластикових карток із вплавленими відрізками дроту із сплаву заліза, кобальту та ванадія. Цей матеріал назвали на честь винахідника Джона Віганда (John R. Wiegand ).

Карта Wiegand-26

Карти Wiegand вирізнялися винятковою простотою завдяки своїй конструкції — вони працювали на основі фізичних властивостей самого матеріалу. Їм не потрібні були батарейки, вони не боялися вологи й не піддавалися розмагнічуванню. Достатньо провести таку картку повз зчитувач — і вмонтовані дротики по черзі створювали послідовність електричних імпульсів.

Найпоширеніший формат — Wiegand-26 — передбачає передачу даних по двох лініях: одна відповідає за нулі, інша — за одиниці. Загалом передається 26 біт, з яких 2 використовуються для контролю парності, а решта 24 — це власне дані. Ні шифрування, ні захисту від перехоплення — усе залишилось на рівні 70-х, коли калькулятор був найрозумнішим пристроєм в офісі.

Тимчасова діаграма протоколу Wiegand. Зверніть увагу на затримки, 200 та 2000 мкс.

Час минав, технології змінювалися: спочатку магнітні карти, потім безконтактні RFID, потім з’явилася біометрія. Але сам протокол Wiegand залишився практично незмінним legacy. Індустрія СКУД вчепилася в нього мертвою хваткою.

Виробників можна зрозуміти: по-перше, Wiegand неймовірно простий у реалізації — лише три дроти (DATA0, DATA1 і земля), а по-друге, навіщо міняти те, що начебто функціонує, якщо заміна вимагатиме мільйонів на нове обладнання?

Спрощена принципова електрична схема підключення зчитувача та контролера СКУД за протоколом Wiegand

У результаті виявилося, що навіть у 2025 році біометрична СКУД у нашому офісі працює на основі протоколу, створеного ще в 70-х. Під час обговорення безпеки в переговорній хтось із команди задумливо мовив: «Почекайте, якщо цей протокол такий елементарний… ми ж можемо просто його підслухати?»

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

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

Мікроконтролер, дві кнопки та трохи магії

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

Почали із проектування. Буквально за пару вечорів накидали принципову схему та розвели плату. Паралельно визначились із компонентною базою. Враховуючи простоту протоколу, нам мало вистачити самого базового мікроконтролера. Зупинилися на STM32 серії F0 з мінімальною обв’язкою – гарний компроміс між доступністю та функціональністю.

Апаратна платформа

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

Загальний вид плати імпланту, лицьова сторона

А тепер давайте розглянемо малюка ближче. Для підключення до ліній Wiegand ми використовуємо звичайні клемники: два сигнальні дроти та загальний провід для зворотного струму.

Щоб спілкуватися з комп’ютером, ми додали порт UART із простим триконтактним роз’ємом (RX, TX, GND). До нього підключається стандартний USB-TTL перетворювач.

Загальний вид плати імпланту, зворотний бік

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

По імпланту

Прошивку писали мовою C у середовищі Cube IDE — типовому інструменті для роботи з мікроконтролерами STM32. Але вже на старті виникла проблема: наш мікрочіп мав дуже обмежені ресурси, тож довелося серйозно попрацювати над оптимізацією. Кілька разів код переписували з нуля — просто не вистачало пам’яті, аби зберігати номери карт.

Робота пристрою побудована на точному дотриманні часових параметрів протоколу. Коли на лінії з’являється імпульс, мікроконтролер перевіряє його тривалість — у протоколі Wiegand вона має становити приблизно 200 мікросекунд.

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

Коли ж пристрій перемикається в режим «підміни зчитувача», процес відбувається у зворотному порядку. Він генерує точні копії сигналів DATA0 та DATA1, чітко повторюючи збережені біти. СКУД при цьому нічого не підозрює — система думає, що має справу з оригінальним, довіреним зчитувачем.

// фрагмент коду передачі бітів

if(bit_level_state == LEVEL_HIGH) // якщо рівень сигналу на лінії високий
{
    bit_delay++;

    if(bit_delay > 9) // робимо затримку 2000 мкс. між початком першого та другого біта
    {
    	bit_delay = 0;

    	if(transfer_bit_counter > 0) // якщо лічильник біт на передачу ще не обнулився
    	{
        	if( ( (rfid_number_wiegand_transfer >> (transfer_bit_counter-1)) & 0x01 ) == 0x01 ) // якщо біт на передачу дорівнює 1
        	{
            	HAL_GPIO_WritePin(PORT_WRITE_1, PIN_DATA_WRITE_1, GPIO_PIN_SET); // виставляємо у низький стан на порту W1
            	transfer_bit_counter--; // зменшуємо лічильник передачі бітів
            	bit_level_state = LEVEL_LOW; // виставляємо низький стан на лінії
        	}
        	else // якщо біт на передачу дорівнює 0
        	{
            	HAL_GPIO_WritePin(PORT_WRITE_0, PIN_DATA_WRITE_0, GPIO_PIN_SET); // виставляємо у низький стан на порту W0
            	transfer_bit_counter--; // зменшуємо лічильник передачі бітів
            	bit_level_state = LEVEL_LOW; // виставляємо низький стан на лінії
        	}


    	}
    }
}
else if(bit_level_state == LEVEL_LOW) // якщо рівень сигналу на лінії низький
{
    HAL_GPIO_WritePin(PORT_WRITE_0, PIN_DATA_WRITE_0, GPIO_PIN_RESET); // виставляємо у високий стан на порту W0
    HAL_GPIO_WritePin(PORT_WRITE_1, PIN_DATA_WRITE_1, GPIO_PIN_RESET); // виставляємо у високий стан на порту W1
    bit_level_state = LEVEL_HIGH;
    if(transfer_bit_counter == 0)
    {
    	data_transfer_state = DATA_TRANSFER_END; // передача закінчена

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

Стандарт, якого ніхто не дотримується

Ми вирішили підійти до справи ґрунтовно і зібрали набір вимірювального обладнання: осцилограф Rigol DS1052E для аналізу сигналів, мультиметр Fluke 28-II (не найдешевший, між іншим) для перевірки рівнів напруги та логічний аналізатор Saleae Logic для детального аналізу протоколу.

Логічний аналізатор та осцилограф, використані в проекті

Тестування імпланта проходило поетапно — як і годиться інженерам. Спершу перевіряли кожен окремий компонент, ніби проводили unit-тести, тільки не в коді, а на залізі. «Мікроконтролер працює? Є! Кнопки відгукуються? Супер!» Коли ж почали об’єднувати все в єдину систему — почалося найцікавіше.

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

Особливий виклик виник із кодом. Потрібно було втиснути купу логіки в обмежену пам’ять мікроконтролера та ще й дотриматися мікроскопічної точності таймінгів. Найменше відхилення в довжині імпульсу — і контролер СКУД просто не розпізнає передані дані.

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

Починали з підтримки класичного Wiegand-26, але в ході тестів поступово додали формати 34, 42, 48 біт та інші — бо на практиці доводиться мати справу з усім, що тільки можливо.

Довелося з головою зануритись у технічну документацію. Уявіть, скільки часу йде на те, щоб розібратись у десятках специфікацій — особливо коли в кожній другій трапляються фрази типу «рекомендоване значення, що може змінюватись залежно від реалізації».

Щоб провести експеримент максимально об’єктивно, зібрали добірку різних зчитувачів. Усі вони використовували базову архітектуру Wiegand, та кожен по-своєму «фантазував». Найчастіше траплялися варіації у тривалості бітів і довжині пауз між ними — то довше, то коротше, без жодної системи.

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

СКУД на обідньому столі

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

У центрі конструкції — компактний контролер, до речі, виробництва компанії Bastion (вийшло іронічно, правда?). До нього підключили справжній електромагнітний замок із кнопкою виходу, встановили RFID-зчитувач для карт доступу. А щоб усе виглядало ще атмосферніше, додали трохи ностальгії — iButton-зчитувач, той самий для круглих металевих «таблеток».

Тестовий стенд, що імітує типову точку доступу СКУД

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

Найцікавіше почалося, коли перейшли до фінальних випробувань на діючих СКУД. Величезна подяка колегам із колишньої роботи, які дозволили використати свої системи для тестів — вони стали першими «добровольцями» у нашому польовому експерименті.

І от тоді остаточно стало зрозуміло: усе значно простіше, ніж здається. Хочете обійти систему безпеки за мільйони? Знайдіть на зчитувачі чотири дроти. Два — живлення (плюс і мінус 12 вольт), ще два — лінії даних (зазвичай зелений W0 і білий W1). Навіть кольорове маркування стандартне.

Далі — майже смішно. Обережно знімається зчитувач — у більшості випадків це просто два гвинти. Під’єднується наш імплант до дротів, усе акуратно ставиться на місце. Тепер кожен, хто прикладає свою картку, сам того не підозрюючи, передає нам свій код — пристрій тихо перехоплює сигнал і зберігає його.

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

Ще й складного нічого: не треба бути хакером із фільму. Лише трохи кмітливості, базова плата з кількома компонентами і кілька вільних вечорів.

Замість укладання: тривожний дзвіночок для промисловості

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

Наша мініатюрна плата має ще багато потенціалу. Її можна оснастити повноцінним RFID-зчитувачем з окремою антеною, а також додати бездротовий модуль, наприклад, LoRa. Це дозволить збирати дані дистанційно, навіть не наближаючись до об’єкта — ідеально для прихованого моніторингу.

Якщо говорити про висновки з усього експерименту, то він максимально простий: у 2025 році використовувати Wiegand на серйозних об’єктах — це все одно, що намагатись захистити банківський сейф замком від поштової скриньки.

Звісно, є способи частково знизити ризики — сховати проводку, встановити камери, регулярно перевіряти обладнання. Але це радше латання дір, ніж справжній захист. Повноцінне рішення потребує системного підходу: виробники мають припинити підтримку протоколів із минулого століття, а користувачам варто оцінювати безпеку СКУД не за дизайном і брошурами, а за реальною стійкістю до сучасних загроз.

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

Підписатися
Сповістити про
0 Коментарі
Найстаріші
Найновіше Найбільше голосів
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.