LINUX.ORG.RU
ФорумTalks

А почему большинство роутеров — такое г... ?

 , ,


1

2

Привет, ЛОР!

Прочитал сегодня новость на opennet про очередную дыру в очередном роутере. Скажи, а как вообще так получается? Ведь их же программируют суровые эмбеддщики на C, которые не могут вообще допускать ошибок. Настоящие программисты, которым ни Go ни Rust не помогают. И вот такой вот треш!

Особенно меня поразило следующее:

Третья уязвимость позволяет извлечь пароль из дампа сохранения конфигурации <…> Пароль присутствует в дампе в зашифрованном виде, но для шифрования используется алгоритм DES и постоянный ключ «NtgrBak», который можно извлечь из прошивки.

То есть, это не случайный обосрамс, как например когда @Eddy_Em не смог strcpy() написать. Это нужно было прицельно и целенаправленно насрать себе в штаны. Причём дважды. Один раз за DES, второй раз за захардкоженный пароль, доступный всем подряд, кто не поленится прошивку почитать.

ЛОР, как так вообще выходит, что вот уже на протяжении многих лет найти нормальный роутер без вот таких чудовищных дыр – задача на уровне фантастики? Туда каких-то специальных программистов выращивают? Или это весь embedded поражён, а роутеры просто на поверхности лежат?

★★★★★

Последнее исправление: hateyoufeel (всего исправлений: 2)

А где пруфы, что там работают суровые эмбедщики, а не люди с гендер-прононсами в профиле и цветными волосами?

Harald ★★★★★
()
Ответ на: комментарий от Harald

А таких разве берут писать на C? И разве они знают про DES?

hateyoufeel ★★★★★
() автор топика

Эмбеденщики те еще говнокодеры, научились биты экономить да и только, но ни в современную архитектуру хоть немного сложного ПО, ни в криптографию, вообще никуда, довольно ограниченные люди, ИМХО.

foror ★★★★★
()
Ответ на: комментарий от Harald

больше похоже на наших коричневых друзей из Индии

Это больше похоже на дизасм. Потому что это он и есть. В оригинале могло быть иначе оформлено.

hateyoufeel ★★★★★
() автор топика

Ведь их же программируют суровые эмбеддщики на C, которые не могут вообще допускать ошибок.

Нет, их программируют (даже не программируют, а методом тыка конфигурируют выданный производителем SoC SDK) косорукие галерные рабы, не знающие ни линукса, ни даже каких-то основ юниксовой петрушки. Причём делают это, как правило, под вендой, чему доказательство масса текстовых конфигов с +x и \r\n внутри.

Системы для роутеров сделанные нормальными людьми, типа OpenWRT такой херне не подвержены.

Stanson ★★★★★
()

Может эмбедщик уволился и решил таким образом хлопнуть дверью:

ados ★★★★★
()
Ответ на: комментарий от Harald

Возможно, там она и была, но компилятор перепилил.

hateyoufeel ★★★★★
() автор топика

Вторая дыра как раз самая любопытная, если смотреть на график в оригинальной статье, это получается там проц 20 миллисекунд тратит на сравнение с одним символом? Как-то нереалистично, 8-битные процы и то быстрее это делают.

Harald ★★★★★
()

А на го и русте значит нельзя DES реализовать или пароль захардкодить? Я понимаю если бы с памятью обосрались, но здесь к чему вброс про сишку и руст?

TheAnonymous ★★★★★
()
Ответ на: комментарий от TheAnonymous

Я понимаю если бы с памятью обосрались, но здесь к чему вброс про сишку и руст?

К тому, что суровые сишники не допускают ошибок. Вообще. Они сами так говорят. Что @Eddy_Em, что @Iron_Bug.

А тут такое!

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Они сами так говорят. Что @Eddy_Em, что @Iron_Bug.

разве они когда-либо работали в Netgear :)

Harald ★★★★★
()

Нормальные роутеры только asus делают. Я недавно только поменял asus 10-летней давности, к которому до сих пор апдейты прошивки приходили, на свежий asus. Поменял лишь потому что старый перестал справляться с множеством wifi 5ghz клиентов.

Reset ★★★★★
()

Пароль присутствует в дампе в зашифрованном виде, но для шифрования используется алгоритм DES и постоянный ключ «NtgrBak», который можно извлечь из прошивки.

А что такого, вроде все производители роутеров так делают.

ya-betmen ★★★★★
()

Прочитал сегодня новость на opennet

Скрины с кодом по ссылке очень подходят к твоей аватарке.

theNamelessOne ★★★★★
()

Тоже часто задаюсь этим вопросом. Может аутсорс свое дело делает? Отдали лоукост ресурсам админку пилить, вот они и напилили.

urxvt ★★★★★
()
Ответ на: комментарий от hateyoufeel

Ты нагло врешь! Я никогда не говорил, что не допускаю ошибок. В последней моей (еще недоделанной) поделкой до сих пор мною не обнаружено одно место, где течет память, и пару мест, где происходит рандомный сегфолт!

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

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Harald

The router stores this information (along with the majority of its configuration) in NVRAM,

Единственное правдоподобное объяснение, что в голову приходит, эта самая NVRAM замаплена напрямую в адресное пространство и каждое чтение оттуда, которое происходит в strcmp(), занимает по 20 миллисекунд. Тогда да, обосрамс. Иначе время выполнения strcmp() должно быть мизером на фоне остальных накладных расходов.

Harald ★★★★★
()
Ответ на: комментарий от Eddy_Em

ПИШЕШЬ НА C

@

ТЕЧЁТ ПАМЯТЬ

@

«НЕ ОБНАРУЖЕНО ОДНО МЕСТО, ГДЕ ТЕЧЁТ ПАМЯТЬ»

@

УСТРАНИЛ УТЕЧКУ

@

ПОЯВИЛАСЬ ЕЩЁ СОТНЯ МЕСТ С УТЕЧКАМИ

@

СИШКА ВАС ВСЕХ ПЕРЕЖИВЁТ

LikeABoss
()
Ответ на: комментарий от theNamelessOne

20 миллисекунд на символ - это обычно? Никаких подозрений не вызывает?

Harald ★★★★★
()

найти нормальный роутер без вот таких чудовищных дыр

OpenWrt, конечно с ним аппаратный nat не заведется, но если производительность не слишком важна, то вполне годно и стабильно.

Aber ★★★★★
()

Microsoft на страже безопасности. Отлично.

fsb4000 ★★★★★
()
Ответ на: комментарий от theNamelessOne

А дизасм разве позволяет восстановить название переменных?

Если они экспортируются, то да. Но вообще их мог обозвать так тот, кто дизассемблировал. Плюс, та же IDA вроде умеет сама обозвать строкой то, что очевидно строка. Про r2 не скажу.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от theNamelessOne

сравнение строк за константное время

Как ты себе это представляешь? Отключать все прерывания каждый раз, как со строками работаешь? А если чип с несколькими ядрами - отключать все ядра, кроме одного?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Необязательно константное, можно просто рандомное, рандомного слипа хватит, и это при том что нормальные люди хранят пароли зашифрованными и сравнивают хеши а не сами пароли.

TDrive ★★★★★
()
Ответ на: комментарий от Eddy_Em

строка может быть не только char*

Но и например такой:

struct Str {
  char* s;
  size_t len;
  uint32_t hash;
};

А сравнение например если len и hash совпадает, то строки равны. А если не совпадает то не равны.

Вот и константное время. Так как всегда лишь два числа сравниваем.

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

так он про прерывания а не количество необходимых команд для сравнения.

TDrive ★★★★★
()
Ответ на: комментарий от hateyoufeel

К тому, что суровые сишники не допускают ошибок. Вообще. Они сами так говорят. Что @Eddy_Em, что @Iron_Bug.

Посмотри вот этот коммент :)

$$ в C-коде (комментарий)

Ахаха, анекдот :)

Заявление: UB, компилятор даже не компилирует этот код.

Ответ: Бред! УМВР!
fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

если len и hash совпадает, то строки равны

Коллизии - не, не слышал

TheAnonymous ★★★★★
()
Ответ на: комментарий от fsb4000

А сравнение например если len и hash совпадает, то строки равны. А если не совпадает то не равны.

Нет, товарищ эксперт с Л.О.Р. Если len и hash совпадает, то строки не обязательно равны. Если не совпадают - то не равны. Но если совпадают, то надо сравнить традиционными методами. Такие дела.

lenin386 ★★★★
()
Последнее исправление: lenin386 (всего исправлений: 1)

Ведь их же программируют суровые эмбеддщики на C, которые не могут вообще допускать ошибок. Настоящие программисты, которым ни Go ни Rust не помогают.

Ой да ладно этот стереотип повторять! Встраивальщина в общем случае не сложнее прочих систем, просто своя специфика, и квалификация у встраивальщиков специфическая, но вовсе не обязательно исключительно высокая.

В конкретной ситуации может быть просто дешевый программист из Индии, наколбасил побыстрее, а в команде никто не проверил его ошибки. Еще характерный говнокод пишут хардварные инженеры, возможно, из-за специфики своей области и незнания особенностей ЯП общего назначения и эффективного и безопасного программирования.

Немаловажный фактор также отношение руководства к теме информбезопасности. Если она не является частью архитектуры, а рассматривается как просто некоторые дополнительные действия, которые можно на последней стадии проекта выполнить, типа как отдельная примочка, которую можно соплями к проекту привязать, то очень велик шанс, что в результате получится решето.

seiken ★★★★★
()
Последнее исправление: seiken (всего исправлений: 1)
Ответ на: комментарий от LikeABoss

На самом деле, если ты пишешь какое-то суппер важное для безопасности приложение, даже в правилах написания кода для подобных применений сказаны такие слова : минимизировать либо исключить использование динамической памяти. Лучше, исключить, потому что иначе бумаги много пейсать придётся. Это просто, и сишечка тут не причём. Такие приложения пишутся в ущерб быстродействию, «красоте» кода, которая только в головах, и прочей фигне.

lenin386 ★★★★
()
Последнее исправление: lenin386 (всего исправлений: 2)
Ответ на: комментарий от lenin386

Я знаю.

Твой алгоритм O(1) сравнения строк.

Я знаю только через хеши. Коллизиями пренебрегаем. В конце концов, сайты же делают точно также для авторизации. Так как хранят только хеши, а не пароли. (По крайней мере так часто заявляется, но с учётом того, что пароли утекают время от времени, то многие лукавят)

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

Твой тоже O(1), если хеш не лезет в машинное слово. А если он лезет - то он слабоват.

lenin386 ★★★★
()
Ответ на: комментарий от fsb4000

(По крайней мере так часто заявляется, но с учётом того, что пароли утекают время от времени, то многие лукавят)

Да их по базе хешей брутить то легко, из 1 ляма пользователей полюбому будут всякие qwerasdf и тд

Но бывает что и на хранение паролей хешами забивают да.

TDrive ★★★★★
()

суровые эмбеддщики на C

Я на заре своей карьеры работал с эмбеддщиками. Вот это был трэш и угар, какого я редко встречал и до и после. Полное игнорирование принципов разработки програмного обеспечения. Хардкодинг всего, что можно. Система контроля версий? Суровые эмбеддщики до такого не опустятся. Я в их сторону старался часто не смотреть, чтобы сохранить психику.

rupert ★★★★★
()

асус норм, модель 2012 года получила в начале года очередной фикс безопасности, 9 лет поддержки!

nuBacuk
()
Ответ на: комментарий от hateyoufeel

В оригинале могло быть иначе оформлено.

Я конечно слышал про компиляторы, которые любой код оптимизируют, но в реальности сильные отличия в дизасме видел только для нагенерированного шаблонной магией кода

SR_team ★★★★★
()
Ответ на: комментарий от LikeABoss

ТЕЧЁТ ПАМЯТЬ

Главное быстро перегрузить устройство, когда память кончится, чтобы никто не заметил. Тогда она как бы и не течет.

rupert ★★★★★
()
Ответ на: комментарий от theNamelessOne

А дизасм разве позволяет восстановить название переменных?

Они восстанавливаются тем, кто ревресит. Или по твоему кто-то использует для переменных имена типа DAT_004a8d38, и LAB_0040be04 для меток?

SR_team ★★★★★
()
Ответ на: комментарий от SR_team

LAB_0040be04

laba1, laba2, laba3 - мои любимые переменные.

rupert ★★★★★
()
Ответ на: комментарий от Eddy_Em

Я нашёл пункт в стандарте С++:

Each identifier that begins with an underscore is reserved to the implementation for use as a name in the global namespace.

http://eel.is/c++draft/lex.name#3.2

И пункт в стандарте С: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf

6.4.2:

All identifiers that begin with an underscore are reserved for use as identifiers with file scopein both the ordinary and tag name spaces.

+ clang в режиме С кода(и С++ тоже) выдал error.

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

«Константное» в этом контексте — значит, не зависящее от содержания сравниваемых объектов, а не то, что ты себе выдумал.

intelfx ★★★★★
()
Ответ на: комментарий от Eddy_Em

Ну, я конечно не он, но прерывания можно и не включать. И это даже какбэ желательно делать, если пишешь ответственные приложения. Об этом тоже в документации написано. Отдельным моментом идут исключения, но это детали. Что касается нескольких ядер - так они абсолютно независимые. До тех пор, пока общие ресурсы не используешь. А ты ведь их не используешь, и если используешь, то тщательно доказываешь каждый семафор, так ведь ?

lenin386 ★★★★
()
Последнее исправление: lenin386 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.