Проверяй входящие данные. Исходная причина уязвимости и атаки на Cisco IOS

в 15:36, , рубрики: Анализ и проектирование систем, входные данные, доверие, информационная безопасность, переполнение буфера, Программирование, Промышленное программирование, Совершенный код, умолчания, уязвимость

Cisco IOS function weak
В пятницу 6 апреля 2018 началась мощная атака на оборудование Cisco.

Много пишут о том, что главная причина, по которой эта атака успешна, это открытые во внешние сети сервисные порты Cisco Smart Install.

Эти порты открыты по умолчанию. А люди в массе своей оставляют то, что сконфигурировано/выбрано/настроено таким, каким оно было по умолчанию. Как видим, на примере этого случая, это касается не только домашних роутеров, но и серьёзного оборудования в крупных компаниях, где цена ошибки значительно выше.

При создании системы вы не имеете права расчитывать на то, что значения по умолчанию, которые следует изменить будут изменены, причём в нужную сторону.
Вы лишь можете заставить изменить эти значения с помощью каких либо ограничивающих использование приёмов. Чему многие будут не рады. «Защита от дурака» это один из примеров этих обязывающих ограничений.

Про выбор по умолчанию

Есть исследование 2003 года «Спасает ли жизни выбор по умолчанию?», в котором есть диаграмма
image.
На русском подробнее.
В ней видно, что число тех, кто готов участвовать в программе донорства органов сильно зависит от того, какой выбор по умолчанию уже сделан в медицинской анкете.

Я хочу обратить внимание на корень самой уязвимости. В отчёте есть такая часть:

Переполнение буфера происходит в функции smi_ibc_handle_ibd_init_discovery_msg
Cisco IOS function weak
из-за того, что при копировании данных в буфер фиксированного размера их размер не проверяется. Размер данных и они сами напрямую берутся из сетевого пакета.

Т.е. при получении данных из вне не происходит проверки на их корректность.

Я считаю, что это то главное напоминание, которое нужно сделать в очередной раз.

Программист должен проверять данные, поступающие из вне.
Никаким данным, поступившим в систему со стороны пользователя(кто бы и что бы им ни было), нельзя доверять.

P.S. Кстати, эта функция как раз примеров того, что программист просто взял значение по умолчанию, оттуда, где оно есть — из сетевого пакета.

Автор: Георгий Оганисян

Источник

Поделиться

* - обязательные к заполнению поля