март 30, 2024

Реверсивно инженерство на сигнала от автомобилния електронен ключ

От няколко години изучавам протоколите за радиокомуникация. Всичко започна, когато от любопитство реших да експериментирам с USB ключ от типа на RTL-SDR. Винаги съм искал да разбера как се предават данните в дистанционните управления (особено при ключовете за автомобили), да се опитам да прихвана техния сигнал и да разбера какви други вектори за атака има в този случай.

Въпреки че през годините успях да прихвана няколко сигнала от подобни безжични ключове, не съм имал възможност да ги анализирам както трябва, тъй като достъпът до тези автомобили беше ограничен.

В тази статия ще запозная непредубедените потребители с моята история на успешно обратно инженерство и възпроизвеждане на сигнал от дистанционен ключ за автомобил, като започна от най-основните механизми на предаване на радиосигнала и завърша с целия ход на моите разсъждения и заключения в хода на проекта.

Техническите средства

RTL-SDR

За първи път навлязох в света на радиокомуникациите през 2016 г., когато научих, че евтин (~10 долара) USB TV/радио донгъл може лесно да се превърне в многофункционален радиоприемник за проверка и декодиране на почти цялата информация, предавана в диапазона от 24 до 1750 MHz. Това устройство е известно като RTL-SDR:

Тайната на тези мощни възможности се крие в чипа, който дава възможност за използване на софтуерно дефинирано радио (SDR). Оказва се, че с помощта на този чип (RTL2832U) е възможно да се пропусне обработката на сигнала, която обикновено се извършва на хардуерно ниво. Като е възможно преобразуването на необработения сигнал в „смислени“ данни. В случая става дума за телевизионни и радиопредавания.

С достъпа до необработените данни за фазов и квадратурен (I/Q) сигнал е възможно да се придобие, визуализира и съхрани практически всеки сигнал в необработен вид. При това без да е необходимо да се познават радиочестотните параметри на неговото предаване (модулация, честотен обхват, скорост на предаване и т.н.), тъй като можете сами да анализирате тези данни. По същество това ни дава възможност да сканираме практически всяка дейност в радиочестотната лента до 1,7 GHz.

Flipper Zero

Flipper Zero е електронно устройство, нещо като хакерско „швейцарско ножче“. Неговото излизане на пазара преди няколко години предизвика възторг сред младите хора и любителите на електрониката. То получи прозвището „швейцарското ножче“, защото използва няколко безжични комуникационни модула, които му позволяват да комуникира с потребителската електроника, домофоните, бариерите и други подобни устройства.

Интересуваме се конкретно от Sub-Ghz модула, който представлява чипа CC1101, поддържащ честоти до 1 GHz, които обикновено се използват в безжичната потребителска електроника.

Но трябва да се отбележи, че можете просто да закупите CC1101 отделно (~5 долара) и да го настроите чрез Arduino/Raspberry Pi или да използвате USB-TTL адаптер. Но Flipper очевидно е по-добър и по-практичен. ¯_(ツ)_/¯

CC1101 или RTL2832U

Чипът CC1101 във Flipper Zero, за разлика от RTL2832U от RTL-SDR, е приемо-предавател. Така че ще използваме Flipper за изпращане на сигнала.

CC1101 обаче не поддържа SDR, което означава, че ще изпраща обратно само данните, които е обработил напълно. С други думи, този чип ще ни бъде полезен само ако зададем правилните параметри на предавания сигнал.

Забележка: естествено, съществуват SDR приемо-предаватели, но те обикновено са много скъпи.

Визуалният анализ

SDR#

SDR# е безплатно, интуитивно компютърно приложение за DSP (цифрова обработка на сигналите), написано на C с акцент върху производителността. То осигурява визуализацията на радиочестотния спектър в реално време и поддържа демодулация на някои често срещани модулации. Освен това то дава възможност за използване на плъгини на трети страни за персонализирани модулации и интеграции.

С помощта на тази програма ще открием сигнала и ще извършим неговия първоначален анализ.

Откриването на сигнала

Като настроите честотата 433,92 MHz с RTL-SDR донгъла (използвайки WinUSB драйвер вместо стандартния DVB-T), можете да наблюдавате активността на повечето дистанционни управления, ако те са достатъчно близо. В ЕС и съседните страни, включително Мароко, където живея, честотата 433,92 MHz не е регулирана.

Натискането на който и да е бутон на електронния ключ на автомобила незабавно излъчва 3 последователни импулса, които могат да се видят на каскадната диаграма под визуализацията на спектъра:

Визуализация на сигнала от ключодържателя на автомобила с SDR#. Оста X е честота, ос Y е силата на сигнала

Можете също така ясно да видите, че сигналът има два основни пика от двете страни на честотата 433,92 MHz (червената линия в средата е точната честота на настройване).

Като се разрових в разпространените схеми за модулация, открих интересен вариант на 2-FSK.

2-FSK

FSK е съкращение от Frequency-Shift Keying (Иместване на честотата). Това е схема за честотна модулация, при която данните се кодират чрез периодично изместване на честотата на носещия сигнал между няколко стойности.

Дотук всичко е съвсем просто. Само че изглежда, че тук става въпрос за FM.

Интересен е префиксът „2“, който означава броя на кодиращите канали. Така че всъщност кодираме двоични данни в две отделни честоти, една за 0 и една за 1, което обяснява двата пика, които открихме по-горе.

Забележка: за тези, които се чудят какво представляват другите по-малки пикове, те по същество са нежелани честоти, генерирани на случаен принцип от чипа на предавателя. Появата им се дължи на евтиния чип и на непосредствената близост на ключа за автомобила и антената. Така че това е просто шум, който можете да игнорирате.

Практическият анализ

Време е да намерим начин да го анализираме приетия сигнал, за да разчетем битове от радиовълните и да открием в тях някаква структура или кохерентност.

Universal Radio Hacker

Според README в неговото хранилище Universal Radio Hacker (URH) е инструмент с изцяло отворен код за анализ на безжични протоколи с поддръжка на множество разпространени SDR. URH позволява лесна демодулация на сигналите заедно с автоматичното откриване на параметрите на модулацията, което значително улеснява идентифицирането на битовете и байтовете, предавани по въздуха.

Това е точно този вид софтуер, от който се нуждаем, за да декодираме радиовълните в битове.

При стартиране URH предлага да отворите файл или да започнете запис директно от устройството.

За да започнете да записвате, трябва да изберете източника и да конфигурирате някои параметри (лично аз просто зададох правилната честота, като оставих останалите по подразбиране).

След записването на сигнала URH се опитва да намери правилната конфигурация за декодиране на неговите радиовълни.

При първите записи не успях да накарам URH да намери правилните параметри и той даде неверни резултати. По-късно установих, че записването на няколко повтарящи се сигнала едновременно увеличава шанса приложението да открие правилната конфигурация. В моя случай тя се оказа: 50 проби/символ, FSK.

Когато увеличим един от сигналите, виждаме трите пика, които наблюдавахме в диаграмата SDR# (вторият се състои от 3 отделни пика – което означава, че имаме общо 5 фрагмента за анализ).

За всеки фрагмент автоматично се извлича последователността от битове, която може да се преобразува в шестнадесетичен формат за по-добра визуализация:

Вече се наблюдава ясна последователност и повтарящи се модели на байтове, така че сме на прав път.

Изглежда обаче пропускаме нещо, тъй като тук има един интересен момент, а именно повтарянето на едни и същи 5 шестнадесетични цифри с набор от байтовете 0x55 (01010101).

Когато превключим на съседния раздел “ Analysis“ (Анализ), виждаме байтовете, които току-що извлякохме от наблюдаваните импулси. Всеки от тях е представен като низ и програмата ни предлага възможност да ги декодираме, като използваме един от алгоритмите:

След като изпробвах всичко наред, забелязах, че Manchester II преобразува всички байтове 0x55 в нула без никакви грешки при декодирането:

Сега това вече е един по-приемлив вид.

Кодирането тип Манчестър

Манчестърското кодиране е много опростена схема за цифрова модулация, която гарантира, че сигналът не остава в състояние на логическа нула или единица за дълги периоди от време. И в същото време го прави самосинхронизиращ се (за възстановяване на синхронизацията).

Тези характеристики са много полезни при изпращане на цифрови данни по аналогови канали, които са податливи на шум и смущения.

В схемата на Манчестър двоичните данни се кодират в два противоположни бита, като 0 се превръща в 01, а 1 – в 10 (или обратното, в зависимост от стандарта):

Нека се върнем към нашия анализ.

Като правим ръчни проби и сравняваме различните снимки на сигнала, можем да видим, че всяко натискане на бутон генерира сигнал със следните характеристики:

  • Дълга серия (маркирана в жълто) без данни (декодирана в 100 нулеви байта).
  • Три много сходни серии – само 2 байта са частично променени (подчертани в червено).
  • Последна серия (подчертана в зелено), която е по-кратка, но все още много подобна на предишните три серии.

Реших да разгледам по-отблизо тези три импулса (да ги наречем пакети) в средата, тъй като изглежда, че те са важна част от сигнала. В резултат на това бързо забелязах нарастващ идентификатор (маркиран в синьо), който се увеличава с 1 при всеки следващ сигнал:

За да продължим анализа, трябва да се запознаем с един много важен механизъм за защита на отдалечения достъп.

Плаващият код

Плаващият или променящият се код се използва в системите за влизане без физически ключ, за да се предотвратят обикновените атаки с повторно възпроизвеждане, при които подслушващото устройство записва предаването на сигнала и по-късно го възпроизвежда, за отключване. Този тип защита често се използва в гаражните врати и системите за достъп до автомобилите.

Същността на принципа на механизма се състои в това, че автомобилният ключ и автомобилът „утвърждават“ помежду си криптографски защитен алгоритъм за генериране на променящ се код, който ще се използва за удостоверяване на дистанционния достъп.

Тези кодове се генерират и проследяват с помощта на брояч, който трябва да бъде синхронизиран между ключа и автомобила. Този механизъм елиминира възможното повторно използване на стар код за автомобила и също така гарантира, че електронният безжичен ключ винаги генерира нов код.

Пример за реализация на непрекъснато променящ се код е показан по-долу:

  • uid: идентификатор на превозното средство и на автомобилния ключ;
  • enck: изпълнение на алгоритъма за плаващ код;
  • ctr: брояч на автомобила;
  • ctr’: брояч на ключодържателя.

Прозорецът за достъп позволява на автомобилния ключ да остане синхронизиран в случаите, когато автомобилът не е получил сигнал (обикновено за максимум 255 натискания на бутоните извън обхвата, след което ключът трябва да бъде синхронизиран ръчно).

С това се оправихме. Време е да се върнем към анализа.

След като вече знаем, че плаващият код е криптографски защитен, можем лесно да определим частта от сигнала (маркирана в зелено), която е отговорна за тази реализация (това ще бъде частта с най-висока ентропия):

Освен това можем да предположим, че нарастващият идентификатор представлява брояча в системата с плаващ код, тъй като е удобно разположен до него.

Като сравних сигналите „заключване“ и „отключване“, успях бързо да намеря байта (подчертан в розово), отговорен за тази команда (8 = отключване, 4 = заключване):

Сега от „променящите се части“ на сигнала трябва само да разгадаем двете червени промени, които отбелязахме по-рано:

1) Що се отнася до първата, можем да видим, че едни и същи стойности се повтарят във всички прихванати сигнали.

Превръщайки тези три стойности в двоична форма, виждаме следното:

  • 0x60110
  • 0xA1010
  • 0xE1110

Интересно. Изглежда, че се създава нещо като пореден номер на пакетите.
Какво ще стане, ако проверим последния, четвърти пакет?

Точно така, предположението ми беше вярно (не обръщайте внимание на последната част, която се е променила тук).

2) Сега нека разгадаем последния байт.

Можете да видите, че той не само се променя за всеки пакет, но и че това се случва във всички сигнали.

Хм, последният байт на пакета се променя произволно, дали не е контролна сума…?

Като тест можем да се опитаме да извършим XOR между този байт и този, който току-що анализирахме, за да видим дали ще получим статична стойност (защото ако разгледаме 3 пакета с плаващ код, всичко, освен тези два байта, всъщност е статично).

Нека го проверим с два примера:

Пример 1:

  • 0x06 ^ 0xB9 = 0xBF
  • 0x0A ^ 0xB5 = 0xBF
  • 0x0E ^ 0xB1 = 0xBF

Пример 2:

  • 0x06 ^ 0xCC = 0xCA
  • 0x0A ^ 0xC0 = 0xCA
  • 0x0E ^ 0xC4 = 0xCA

Бинго! Това определено е контролна сума.

Като приложим XOR към всички байтове на пакетите, виждаме, че стойността винаги се измества с 1:

От това можем да заключим, че първите два байта от пакета най-вероятно са изключени от контролната сума (откъдето идва единицата):

Това е логично, тъй като тези байтове ще действат като синхронизираща дума, за да синхронизират приемника и да отбележат началото на данните.

Забележка: в случай че се чудите за целта на първата дълга серия, подчертана в жълто на снимките, тя е да събуди приемника и да го подготви за приемане на данните (тъй като той преминава в режим на пестене на енергия, когато не работи). А ако се чудите и защо автомобилният ключ изпраща три пакета с почти идентични данни, това е просто за повишаване на надеждността, в случай че един от пакетите се повреди по време на предаването (което се наблюдава на предишната снимка).

Крайният резултат

След като маркирах останалите байтове според предположенията си, получих следното:

Чудесно! Току-що се справихме с реверсивното инженерство на сигнала от електронния ключ на автомобила.


Оригиналът предизвика голям интерес и много коментари. Разбира се, това не е ръководство за хакване на електронните ключове на автомобилите – някои неща са променени, а други изпуснати. Освен това става дума за вече доста стари методи за безжично отключване на автомобилите. Но показаните похвати и идеи определено предизвикват интерес.

source

Сподели: