PDA

Просмотр полной версии : Ковырялся тут по теме защиты от «тиражирования»



Yegor
16.09.2015, 12:52
Вроде были вопросы о том, как сделать программу работоспособной только на одном/нескольких контроллерах, то есть предотвратить её выполнение на других контроллерах той же модели с той же прошивкой. Консенсус был таков, что уникальных ключей у идентичных контроллеров нет, и нужно использовать внешний (аппаратный) ключ.

Но кажется, у меня получилось организовать чисто программную проверку заводского MAC-адреса ПЛК серий 110 и 160. Вкратце: заводской MAC-адрес обнаружился по адресам 2069CD2E у ПЛК160 и 2060E5B0 у ПЛК110-32.

Подробнее... Я поставил задачу найти заводской MAC-адрес в оперативной памяти ПЛК после того, как адрес в файле local_addres.dat был изменён (естественно, не натыкаясь на константы в своей же программе). На коленке был написан вот такой сканирующий память код:
VAR
i, g, c: DWORD;
go: BOOL;
mac0: ARRAY[0..5] OF BYTE;
END_VAR
VAR CONSTANT
MAC: ARRAY[0..5] OF BYTE := 16#6A, 16#77, 16#00, 16#00, 16#00, 16#F8;
END_VAR

IF go THEN
g := i + 2000;
FOR i := i TO g DO
SysMemCpy(ADR(mac0), i, SIZEOF(mac0));
go := NOT(mac0[0] = MAC[0] AND mac0[1] = MAC[1] AND mac0[5] = MAC[5] AND i <> ADR(MAC));
IF NOT go THEN
c := i;
i := i + 1;
EXIT;
END_IF
END_FOR
END_IFВ константах записан заводской адрес контроллера с изменёнными 4 и 5 байтами. Программа ищет совпадение в памяти по первому, второму и шестому байтам. Если при нахождении адреса мы наблюдаем в mac0 заводской адрес, и после перезагрузки результат получается тот же самый, то можно из своей программы удостоверяться в подлинности контроллера по этому адресу. Что-то вроде genuine := SysMemCmp(16#2060E5B0, ADR(MAC), SIZEOF(MAC)) = 0; Конечно, в боевой программе MAC-адрес лучше хранить не в открытом виде как показано выше, а хэшем константы с солью, чтобы исключить атаку тупой подменой байтов в бинарнике с пересчётом контрольной суммы. Обход такой защиты уже может оказаться нетривиальным и оттого нецелесообразным.

Дальше исследовать способ предлагаю заинтересованным в защите лицам.

petera
16.09.2015, 13:58
У меня ПЛК160, версия прошивки 2.15.3
19984
Ваша программа ничего не находит. Затыкается, причем на разных "i".
19985
19986
19987

После чего происходит перезагрузка контроллера.
Чтение по адресу 16#2069CD2E всегда дает 00:00:00:00:00:00

Yegor
16.09.2015, 14:24
Близко к началу берёте. Там, судя по всему, недопустимые диапазоны — у меня тоже крэшилось. Попробуйте от 16#20000000 до 16#20900000 просканировать. И не забудьте предварительно в local_addres.dat что-нибудь левое прописать и перезагрузиться, чтобы ложных совпадений в районе 20300000 не было. И прошивки у меня от 2011 года — там адреса другие, видимо.

petera
16.09.2015, 15:26
Близко к началу берёте. Там, судя по всему, недопустимые диапазоны — у меня тоже крэшилось. Попробуйте от 16#20000000 до 16#20900000 просканировать. И не забудьте предварительно в local_addres.dat что-нибудь левое прописать и перезагрузиться, чтобы ложных совпадений в районе 20300000 не было. И прошивки у меня от 2011 года — там адреса другие, видимо.
Получилось.
Для версии прошивки 2.15.3 в ПЛК160 адрес заводского MAC обнаружился по адресу 16#2056E959.
В local_addres.dat оригинальный МАС изменил, ПЛК перезагружал.
Однако возникает вопрос, ведь ПЛК я перепрошил, а если при перепрошивке я бы указал другой МАС, отличный от заводского то, что бы я получил по адресу 16#2056E959? Оригинальный заводской или тот, что укажу при перепрошивке.
Для справки МАС, указанный в local_addres.dat нашелся по адресу 16#203801A0

Yegor
16.09.2015, 15:38
Если перепрошивка меняет этот адрес, то тема объявляется закрытой :)

capzap
16.09.2015, 19:10
мне кажется нужно искать тогда не мак адрес, а например серийник процессора, правда не представляю как узнать настоящий, не разглядывал разобранный плк

Yegor
16.09.2015, 19:15
Ну, метод можно обобщить и, вооружившись двумя-тремя одинаковыми ПЛК, искать хоть что-нибудь уникальное. Только для удобства надо будет снять как можно более полный дамп.

Филоненко Владислав
16.09.2015, 19:20
Итак, товарищи пионеры.
С одной стороны Вы копаете в верном направлении.
С другой на другой версии ПЛК/ПО значение MAC будет в другом адресе. Т.ч. защита без модификации работает только на одной модели (включая модификацию) и одной версии прошивки.
И наконец, зачем такие сложности, если можно просто почитать local_addres.dat?

P.S. Серийника на этих процессорах нет :(
P.P.S. Т.к. файл в открытом доступе - ломается на раз. Гораздо надёжнее читать файл с паролем изнутри запароленного ПЛК.

Эдуард_Н
16.09.2015, 19:29
Все предлагают разные способы защиты, а где производители, почему молчат? Им ведь проще проработать данный вопрос.

Yegor
16.09.2015, 19:30
С другой на другой версии ПЛК/ПО значение MAC будет в другом адресе.Ну, предполагается, что заинтересованная в защите сторона найдёт время всякий раз отыскивать новый адрес.
читать файл с паролем изнутри запароленного ПЛКА пароль спасёт от всяких plc_io и прочих поделок типа моего самопального шелла? Завтра попробую.

capzap
16.09.2015, 19:41
Все предлагают разные способы защиты, а где производители, почему молчат? Им ведь проще проработать данный вопрос.

Вас чем Владислав то не устраивает

petera
16.09.2015, 21:43
Итак, товарищи пионеры.
С одной стороны Вы копаете в верном направлении.
С другой на другой версии ПЛК/ПО значение MAC будет в другом адресе. Т.ч. защита без модификации работает только на одной модели (включая модификацию) и одной версии прошивки.
И наконец, зачем такие сложности, если можно просто почитать local_addres.dat?

P.S. Серийника на этих процессорах нет :(
P.P.S. Т.к. файл в открытом доступе - ломается на раз. Гораздо надёжнее читать файл с паролем изнутри запароленного ПЛК.
1."на другой версии ПЛК/ПО значение MAC будет в другом адресе. Т.ч. защита без модификации работает только на одной модели (включая модификацию) и одной версии прошивки."
Это не страшно, автор проекта может это учитывать и для каждой модели/версии прошивок будет использовать нужные адреса с заводским МАС.
2."зачем такие сложности, если можно просто почитать local_addres.dat?"
В том то и дело, что первоначальный -заводской МАС остается таковым по найденному в эксперименте адресу, даже если в файле local_addres.dat будет затем прописан совершенно другой МАС, что должно было бы не позволить "злодею" скопировать все файлы из оригинального ПЛК в другой.
Но пока не ясно, останется ли первоначальный заводской МАС если ПЛК перепрошить с указанием совершенно левого МАС
19991

Эдуард_Н
17.09.2015, 04:07
Вас чем Владислав то не устраивает

Я не против Владислава, но чего они (производители) в сторонке стоят и молчат? Может они сделали бы что-то универсальное, в таргет допустим запихали такую штуку, что бы не думать как привязаться к той или иной модели PLC.

Yegor
17.09.2015, 06:57
Защита паролем (setpwd) вообще никудышная. Сторонними утилитами типа plc_io можно не только молча зайти на контроллер без пароля, но даже посмотреть или удалить пароль.

19996

capzap
17.09.2015, 07:35
Я не против Владислава, но чего они (производители) в сторонке стоят и молчат? Может они сделали бы что-то универсальное, в таргет допустим запихали такую штуку, что бы не думать как привязаться к той или иной модели PLC.

и у кого это реализовано? У семена видели список модулей в конфигурации,, на все случай свой и как то не стремятся универсалить. А что уж говорить про тиражиравоность у семена, даже ноухау можно спокойно вскрыти и посмотреть из чего состоит поу

Дмитрий Артюховский
17.09.2015, 09:11
Я не против Владислава, но чего они (производители) в сторонке стоят и молчат? Может они сделали бы что-то универсальное, в таргет допустим запихали такую штуку, что бы не думать как привязаться к той или иной модели PLC.

Они принципиально против ограничения переносимости кода. Причин, как я думаю, несколько:
1. Они продают железо, и если удачную разработку будут массово копировать - то наступит счастье ))
2. Система потенциально сложна в использовании и будет вызывать придирки и многочисленные вопросы низкоквалифицированных пользователей
3. Контроллеры применяются в потенциально опасных установках и если система "глюканет" в неподходящий момент, мало не покажется...
4. Система уменьшает ремонтопригодность в случае защиты от копирования ядра

petera
17.09.2015, 10:52
Короче, предполагаемый способ с поиском адресов заводского МАС не работает. При подключении к ПЛК через порт Debug адреса не находятся нигде.
Так, что найденные адреса это фантомы от подключения к КДС через Ethernet.

Филоненко Владислав
17.09.2015, 11:26
Давайте по порядку.
1. Я и есть представитель производителя, разработчик, так сказать.
2. В CoDeSys действительно была проблема с парольной защитой, но как только они её пофиксили - мы выпустили обновление ПО.
3. Заводской MAC всегда один и тот-же.
4. Над проблемами защиты мы работаем и в новом релизе ПЛК целых 3 способа есть.

Эдуард_Н
17.09.2015, 17:03
Интересно , а как обстоят дела с защитой от «тиражирования» в КДС3

Филоненко Владислав
17.09.2015, 17:28
Аналогично. Кроме пароля Кодесис ничего не предоставляет

capzap
17.09.2015, 17:35
Аналогично. Кроме пароля Кодесис ничего не предоставляет

а как же залезть в папку /proc и например прочесть cpuinfo

Филоненко Владислав
17.09.2015, 20:04
Это уже сами, а не на блюдечке

spectrum48k
17.09.2015, 23:23
такое чувство, что изготовитель сознательно недоговаривает о некоторых известных ему способах теста на уникальность аппаратного обеспечения, т.к. заинтересован в тиражировании ПО для обеспечения бессмертия плк в существующих шкафах автоматики с применением неограниченного числа "respawn" )

Александр Приходько
18.09.2015, 01:29
Интересно , а как обстоят дела с защитой от «тиражирования» в КДС3
Замечательно. Если есть немного знаний в области Linux, то можно из консоли сменить пароль ROOTи ни кто просто так в ваш контроллер не залезет. Придется заниматься полноценным хаккерством. В новой прошивке, что мы анонсировали пароль ROOT можно будет менять из конфигуратора. А функция резервного копирования и восстановления защищается паролем. В общем все спрятано под семью печатями.


Аналогично. Кроме пароля Кодесис ничего не предоставляет

И еще. Влад ответил верно, есть еще различного рода защиты в самом CODESYS. Начиная от тривиального USER MANAGEMENT, который разделяет права пользователей на визуализации, заканчивая многопользовательским доступом в проекте (аналогично как в CODESYS 2.3, но с большим размахом).

Резюме.
На новой прошивке мы даем пользователю все инструменты, для закрытия контроллера от доступа из вне (DEBUG/ETHERNET/конфигуратор). Не зная этих паролей проек "слить" будет крайне и крайне сложно, только если вы в состоянии обойти защиту Linux. Но боюсь в нашей аудитории таких спецов нет.