Статья описывает проблему использования программных уязвимостей повреждения памяти в Cisco IOS.
Recurity Labs GmbH
Успешное использование программных уязвимостей в Cisco IOS было продемонстрировано различными независимыми исследователями и группами, которые в своей работе применяли разные приемы и основывались на различных предположениях. Тем не менее, каких-либо значимых известных или неизвестных эксплойтов Cisco IOS сообществом безопасности ПО зарегистрировано не было.
По мере развития инструмента Cisco Incident Response Tool и бесплатного онлайн-сервиса[1], команда Recurity Labs нацелилась на наблюдение успешных взломов маршрутизаторов Cisco IOS. С момента предоставления этого сервиса стал очевидным факт выбора цели для атаки, основываясь на неправильно настроенной системе и функциональных уязвимостях, таких как CVE-2008-0960. Это наблюдение показывает фундаментальную разницу между атаками на инфраструктуру и атаками на концевой сетевой узел, как например серверы или клиенты любого типа.
Доклад осветит причины малого количества двоичных эксплойтов и разработки, предвещающие рассвет надежного использования уязвимостей сетевого оборудования Cisco IOS. Автор верит, что атаки на сетевую инфраструктуру будут использовать для получения доступа методы двоичного эксплуатирования уязвимостей. По этой причине должно быть опубликовано исследование с точки зрения атакующего с целью разработки методов защиты в будущем.
По мере широкого распространения межсетевых экранов для промышленных и домашних систем, открытость потенциально уязвимых сервисов значительно снизилась. Поэтому усилия злоумышленника сместились на клиентскую сторону, где ненадежная информация постоянно обрабатывается пользователем. Пользователь отправляет вложения по электронной почте или посещает веб-страницы. Злоумышленникам куда проще получить контроль над веб-браузером, управляемым человеком, чем над автономно работающим сервисом.
Cisco IOS может выступать в качестве сетевого сервера и клиента одновременно. Сетевые сервисы IOS включают в себя HTTP сервер для настройки и мониторинга, HTTPS сервер для тех же задач, удаленный доступ Telnet и SSH, FTP и TFTP сервер для удаленного доступа к файловой системе. Уязвимости повреждения памяти в HTTP, FTP и TFTP сервисах были идентифицированы ранее. Для них были разработаны и опубликованы соответствующие эксплойты.
Для злоумышленника, желающего получить контроль над важной сетевой инфраструктурой, подобные сервисы не представляют интереса, т.к. данные системы не дадут воспользоваться этими сервисами.
Маршрутизаторы также должны делать доступными определенные сервисы, соответствующие их назначению. Это включает в себя сервисы связи протоколов маршрутизации (EIGRP, OSPF, ISIS, BGP) и такие сетевые сервисы как DHCP ретрансляция и IPv6. В отличие от описанных выше HTTP и FTP серверов, данные сервисы необходимы в большинстве сетей и они доступны на большом количестве сетевого оборудования. Тем не менее, поскольку большинство сервисов протоколов маршрутизации подвержены влиянию подменных сообщений (если не настроены на использование MD5 аутентификации), чаще всего они охраняются и редко открыты удаленной сети, как например, Internet.
Реализация BGP сервиса в Cisco IOS является хорошим примером невидимости сервиса любому сетевому узлу. Для работы BGP необходима TCP сессия между двумя настроенными участниками. Если подобная TCP сессия запрашивается системой, ненастроенной на Cisco IOS в качестве участника, роутер отправит в ответ TCP RST пакет, как будто сервис недоступен или вообще не настроен на роутере. Эта простая конфигурация сводит количество атак на BGP в Cisco IOS только к атакам от систем, настроенных системным администратором в качестве участников.
Другие сервисы маршрутизации, такие как OSPF и EIGRP, получают сетевой трафик на широковещательный адрес IPv4 чтобы убедиться, что отправитель находится внутри того же широковещательного домена, что и маршрутизатор-получатель. Для злоумышленника в интернете подобные сервисы не представляют ценности вследствие своей недоступности.
Заметное исключение из этого списка составляет уязвимость IP опций в Cisco IOS[3], где некорректно реализована обработка нескольких IPv4 протоколов. Здесь протоколы обрабатывались при адресации к IOS роутеру (ICMP запросы) и код, генерировавший ответ, был подвержен уязвимости повреждения памяти в виде переполнения буфера в стеке. Это настолько редкие уязвимости в сервисах, используемых в каждой сети, что можно говорить о появилении значительной угрозы для Cisco IOS.
В недавнем прошлом Cisco начала добавлять промышленные сервисы и сервисы связи, которые получат широкую реализацию по мере того как системные администраторы будут считать Cisco IOS с этими сервисами стабильными. Данные новые сервисы включают[4] в себя быстрорастущий набор VoIP сервисов: Lawfull Interception, SSL VPN Termination, Web Service Management Agent (настройка Cisco IOS через веб-сервис SOAP), XML-PI и H.323. Чем больше эти сервисы адаптируются к промышленным сетям и сетям связи, тем большему полю атак будут подвержены индивидуальные маршрутизаторы.
Как только данные сервисы будут развернуты более широко, поле значительно изменится по отношению к полю атак, использующих двоичные эксплоиты. Однако инженеры по сетевой безопасности должны тщательно изучить этот вопрос, если они хотят использовать дополнительные сервисы в маршрутизаторах Cisco IOS. Если использование подобных сервисов неизбежно по какой-то причине, то наблюдение за ситуацией и анализ по факту должны соответствовать новому уровню открытости сетевой инфраструктуры.
Сетевые инженеры и персонал службы поддержки обычно не используют маршрутизаторы Cisco IOS для доступа к сервисам сети. Соответственно, злоумышленники не могут использовать эти уязвимости, даже если они им известны.
Ситуация также может измениться с введением новой функциональности в Cisco IOS. Это зависит от уровня доступа, который сможет получить злоумышленник в IOS удаленно. Например, злоумышленник может заставить IOS маршрутизатор подключиться к стороннему HTTP серверу любого назначения (VoIP сервисы, к примеру). Целый диапазон уязвимостей в клиентском коде HTTP становится доступным в качестве направления атаки.
Но до настоящего момента, уязвимости на стороне клиента не сыграли какой-либо роли в атаках на Cisco IOS.
Транзитные уязвимости очень редки. Любой маршрутизатор создается с целью направления трафика от одного интерфейса к другому настолько быстро, насколько это возможно. Следовательно, количество байтов в каждом пакете, проверяемом перед направлением, минимально. В любом устройстве маршрутизации решения направления зачастую принимаются уже на интерфейсе. В этих случаях только первый пакет проверяется высокоуровневым программным обеспечением, а остальные пакеты обрабатываются оборудованием. Таким образом, сокращается необходимость использовать процессор при прохождении каждого пакета.
Рассматривая вышеописанное, отметим ситуации, в которых пакет "выбивается", что на сленге Cisco означает проталкивание пакетов от механизмов “быстрого перенаправления” (как CEF) к механизмам "коммутации процессов (process switching)" или "быстрой коммутации (fast switching)", использующих центральный процессор для принятия решения о перенаправлении. Такие ситуации, разумеется, включают в себя весь трафик, направленный от одного из адресов интерфейса, но такой трафик не будет являться транзитным. Более интересными случаями являются: переборка IP-фрагмента (IP fragment reassembly), пакеты с IP опциями как IPv6 с Hop-by-Hop заголовками, требующими обработки.
До настоящего времени автору неизвестно ни одной Транзитной уязвимости. Если подобные уязвимости появятся и их можно будет использовать, то эффект будет разрушительным. Особенно если уязвимость будет задействоваться после решения о перенаправлении, и трафик будет направлен к следующему промежуточному маршрутизатору.
IOS имеет архитектуру общей линейной памяти. Здесь используется функциональность процессора для преобразования адресов только до момента создания карты памяти, как в любом двоичном файле ELF в UNIX. Процессы в IOS являются чем-то большим, чем потоки. Каждый процесс имеет собственный контекст и блок памяти в качестве стека, но никакого больше разделения между процессами не происходит. Все процессы в IOS имеют общую кучу, большой дважды связанный список блоков памяти, ссылающийся на пару маленьких связанных списков для свободного отслеживания блоков. В зависимости от платформы маршрутизатора существуют дополнительные области памяти. Они доступны из любого куска кода, запущенного на машине.
IOS использует ожидание завершения выполнения процесса. Все выполняемые процессы должны своевременно возвращать управление планировщику для выполнения других процессов. В противном случае, срабатывает сторожевой таймер, поддерживаемый процессором, и вызовет System Forced Crash, перезагружающий роутер.
Роутеры Cisco IOS обычно работают на 32-х битных процессорах PowerPC и 32-х и 64-х битных процессорах MIPS. Оба процессора поддерживают разделение привилегий для реализации пространства ядра и пользователя. Использование ни одной из этих особенностей в IOS не изучалось до настоящего момента. Любое исполнение происходит на самом высоком уровне привилегий, поддерживающимся процессором - уровне супервизора.
Вследствие архитектуры, описанной выше, при возникновении исключительной ситуации перезагружается все устройство. Архитектура IOS не имеет какого-либо рода частичной перезагрузки, т.к. неправильно работающий процесс уже записал информацию в память. Таким образом, единственное безопасное действие – перезагрузка всего устройства.
Такое поведение повышает сложность надежного использования уязвимостей повреждения памяти.
На популярных операционных системах, в частности на платформе Windows, вызов исключения процессора для получения возможности выполнения кода является нормальной практикой. Однако, на Cisco IOS любая непредвиденная ситуация процессора вызовет перезагрузку. На первый взгляд это может показаться удовлетворительным для злоумышленника. Однако, если учесть, что сетевая инфраструктура средней важности подвергается мониторингу на предмет аварийного завершения работ и перезагрузок на протяжении 24-х часов 7 дней в неделю, то планка для эксплойта поднимается.
Тоже относится к любому шелл-коду, запущенному, как только будет получено управление над потоком команд. Шелл-код должен не только не вызвать исключение во время выполнения, но и недопустить попытку вернуть исключение в эксплуатируемый процесс.
Кроме того, размещение стеков процессов в общей куче создает еще одну проблему использования уязвимости. Переполнение буфера в стеке является наиболее простой и многосторонней уязвимостью повреждения памяти, и IOS в этом плане ничем не отличается от других операционных систем. К сожалению, стеки, выделенные каждому IOS процессу, относительно малы (6000 байт) и схема вызываемых функций внутри кода относительно коротка. Таким образом, буфер для переполнения зачастую близок к верхней границе стека. Переполнение буфера большим количеством информации вызовет перезапись заголовка следующей кучи. Как только заголовок кучи будет уничтожен, любое размещение или освобождение памяти любым процессом в IOS вызовет частичную проверку целостности кучи и произойдет перезагрузка роутера при обнаружении поврежденного заголовка кучи.
Дополнительно в IOS имеется процесс CheckHeaps, периодически (каждые 30 секунд) проходящий через весь связанный список куч и проверяющий их целостность. Он также вызовет перезагрузку при обнаружении любого несоответствия.
Оба типа процессоров в оборудовании Cisco используют 32-х битные инструкции. Уязвимость переполнения буфера в стеке трудно эксплуатировать внутри границ доступного пространства, находящегося перед следующим заголовком блока кучи.
Все это создает огромную проблему на пути разработчика эксплойта. Когда он получает контроль над указателем инструкций, возникает вопрос: Куда он должен указывать?
Так как стек любого процесса IOS является произвольно расположенным блоком памяти, его местоположение случайно. Методы вроде Heap Spray применимы только к ситуациям, когда злоумышленник имеет полный доступ. Это не относится к сетевому оборудованию. Остается только класс методов "повторного использования кода", использующих существующий код для выполнения начальной самозагрузки перед кодом злоумышленника.
К сожалению, образы Cisco IOS собираются индивидуально инженерами Cisco. Таким образом, содержимое образа и внутреннее расположение зависит от:
При поиске образов в Cisco Feature Navigator[6], поддерживающих функцию "IP Routing” (основная функция любого маршрутизатора), результат насчитывает 272722 разных образов IOS на момент написания статьи. Взяв только одну платформу 7200er для примера, мы найдем 15878 образов. Это приведет к еще большей путанице, чем любые реализации случайного расположения адресного пространства (ASLR) в популярных операционных системах.
Дополнительно, злоумышленник, желающий применить метод “повторного использования кода” должен иметь копию кода для анализа. Однако, образы IOS являются продуктом компании Cisco Systems и, следовательно, недоступны бесплатно. Некоторые специальные серии образов доступны только определенным группам, например военным или правоохранительным органам.
Маршрутизаторы Cisco используют изначально доступный для выполнения кусок кода после сброса процессора - ROMMON. ROMMON служит в качестве кода начальной загрузки IOS. ROMMON также содержит функциональность, необходимую для восстановления при неполадках (загрузка нового образа в случае повреждения существующего) и некоторые основные функции настройки.
У автора на платформе Cisco ROMMON расположен в самых верхних областях памяти после виртуальной адресации процессора и инициализации преобразования адреса для соответствия распределения памяти IOS образа. Следовательно, его местоположение известно и неизменно.
Решающим фактором использования ROMMON в качестве точки возврата является небольшое количество версий для каждой платформы маршрутизатора. Если взять 2600 платформ маршрутизаторов, получится 8 версий ROMMON, известных автору. С некоторыми исключениями вследствие аппаратной поддержки, добавленной в поздние версии ROMMON, обновления ROMMON выходят для оборудования редко. По этой причине огромное количество маршрутизаторов имеют текущую версию ROMMON на момент их изготовления. Так как при построении сетевой инфраструктуры оборудование обычно заказывается оптом, версии не будут отличаться и поздние версии будут похожими.
Применяя метод Return Oriented Programming к коду, найденному в ROMMON, было продемонстрировано,[7] как 32-х битная случайная память записывается в область, содержащую обработчики исключений. Они могут использоваться на маршрутизаторах Cisco с процессорами PowerPC и MIPS для переполнения буфера в стеке и выполнения кода.
Данный метод применяет возврат в функцию выхода. Он выполняет запись в регистр памяти, управляемым злоумышленником, содержимого другого регистра. На PowerPC это регистры, сохраняемые по границам функции (т.е. от R13 до R31).
Для злоумышленника выгодно содержание в ROMMON кода, используемого для отключения кэша инструкций и данных процессора, так как это позволяет записывать данные и выполнять их напрямую.
Первое связано с неопределенностью количества версий ROMMON на практике, с которыми придется столкнуться при работе с маршрутизаторами Cisco. Недорогие маршрутизаторы начального уровня обычно не поддерживают обновления ROMMON, поэтому даже на сайте производителя невозможно будет найти информации об используемой версии. Даже при выходе обновления для платформы, мы не сможем выяснить, сколько версий поставлялось изначально.
Второе препятствие: разработчик эксплойта должен иметь копию каждого известного ему ROMMON для целевой платформы. Поскольку изначальные версии (получившие широкое распространение) недоступны для загрузки, это требует получение временного доступа к маршрутизаторам с наиболее распространенной версией ПО. Также будет очень трудно определить наиболее распространенную версию.
Следует отметить, что злоумышленнику должна быть известна аппаратная платформа маршрутизатора Cisco, т.к. от этого будет зависеть расположение памяти ROMMON и набор инструкций (т.е. PPC и MIPS).
Третья проблема с методом на основе ROMMON заключается в невозможности убедиться в правильности адресов перед запуском эксплойта. Подходящие уязвимости и надежные эксплойты оборудования Cisco имеют высокий денежный результат на момент написания этой статьи. Соответственно, злоумышленник сначала захочет убедиться в правильности адресов, исключая риск перезагрузки, собственного разоблачения и разоблачения самого эксплойта.
На момент написания этой статьи, результаты исследования пока недоступны.
В эксплуатировании уязвимостей концевых узлов, получение шелл-доступа злоумышленником (открытие его на TCP порте или подключение к хосту злоумышленника) является обычной практикой. Похожий шелл-код был продемонстрирован для определенных образов IOS.
Альтернативный метод, доказавший более высокую надежность, чем “bind shell”, основывается на том, что почти любой маршрутизатор Cisco IOS уже имеет настроенный сервис удаленной командной строки либо через Telnet либо через SSH. Удалив требование аутентификации при помощи изменения кода, выполняющего проверку, или изменяя записи в структурах данных, содержащих аутентификационную конфигурацию для удаленных терминалов, можно с легкостью использовать существующий сервис для получения удаленного доступа. Как только будет получен привилегированный доступ к интерактивной командной строке на маршрутизаторе Cisco IOS, злоумышленник сможет использовать всю функциональность IOS для достижения своей цели. В качестве альтернативы код злоумышленника может являться реализацией приложения IOS без необходимости подключаться к командной строке и вручную изменять конфигурацию.
Однако, была продемонстрирована[8] возможность использования TCL скриптов для реализации сложных сервисов, включая реализацию клиента зомби-сети или реализации поддержки сервиса Twitter.
Поскольку функциональность TCL в маршрутизаторах Cisco IOS увеличивается, злоумышленники смогут найти все, что им нужно для задач “стандартного” он-лайн преступления и мошенничества, используя скрипты для IOS.
Введение и широкое развертывание образов IOS с функцией санкционированного прослушивания внутри сетей провайдеров может открыть новые возможности для злоумышленника. Функциональность санкционирования прослушивания трафика должна быть прозрачной для сетевого инженера, т.е. он не должен наблюдать активный перехват. Данная функция также разработана для более эффективной и выборочной передачи трафика, соответствующего определенному правилу, третьему лицу. Если эта функциональность доступна внутри образа и злоумышленник знает, как получить к ней доступ (т.е. вызвав соответствующую функцию, которая также может быть включена через SNMPv3 CISCO-TAP-MIB и CISCO-TAP2-MIB), он сможет выборочно отслеживать интересный ему трафик на любой удаленной системе, доступной скомпрометированному маршрутизатору.
Однако, это возможно в некоторых линейках маршрутизаторов Cisco IOS и образах, использующих списки управления доступом (ACL) для поиска соответствия определенного трафика и выполнения определенных действий над ним. Эта функциональность может быть использована внутри шелл-кода для получения пакетов, содержащих интересную для злоумышленника информацию. Строгим ограничением является наличие такой информации уже в первом пакете. Поскольку первый пакет, скорее всего, будет “выбит”, снижение производительности будет незначительным.
Например, любой протокол основывается на последовательности чисел, ID запроса или другой величине, известной только отправителю и получателю. Для предотвращения имитации соединения (например TCP, DNS) проверяется совпадение этих чисел и это число отправляется злоумышленнику. В таком случае злоумышленник может имитировать DNS ответы или внедрять данные в TCP сессии, т.к. ему известна секретная величина.
Выборочное перенаправление[9] является простым и эффективным инструментом для предотвращения использования веб-сайтов и сервисов с шифрованием (HTTPS) простыми пользователями.
Данная статья рассматривает множество проблем использования уязвимостей в маршрутизаторах Cisco IOS. Поскольку надежное эксплуатирование уязвимости является требованием для разработки рабочего шелл-кода, то в будущем вполне возможно решение многих проблем, описанных в статье. Таким образом, будет разработано больше практических подходов к использованию взломанных маршрутизаторов.
Когда будет разработан надежный эксплойт, независимый от различия образов IOS, промышленные сети и сети провайдеров должны приготовиться к изменению частоты, с которой они выбирают и разворачивают образы IOS. Однако, этого можно будет достигнуть, только если Cisco изменит способы выпуска своих образов, предоставляя понятные пути обновления, что позволит большим организациям обновляться до новых версий IOS без проблем, обычно сопряженных с этим процессом.
В текущих сетях маршрутизаторов Cisco обновление нарушает сетевую функциональность. У сетевых инженеров нет возможности поддерживать недавние версии IOS на своих маршрутизаторах, что делает сеть уязвимой к атакам, т.к. доступность сети оценивается значительно выше, чем целостность ее центральных узлов.
[1] Recurity Labs CIR, http://cir.recurity-labs.com
[2] http://www.cisco.com/en/US/products/products_security_advis ories_listing.html
[3] cisco-sa-20070124-crafted-ip-option
[4] http://cisco.com/en/US/docs/ios/12_4/release/notes/124TNEWF.html
[5] https://www.blackhat.com/presentations/bh-usa-08/Shacham/BH_US_08_Shacham_Return_Oriented_Programming.pdf
[6] http://cisco.com/go/fn
[7] http://cir.recurity.com/wiki/PPCreliableCodeExec.ashx
[8] http://ph-neutral.darklab.org/talks/christoph.html
[9] http://www.blackhat.com/html/bh-europe-09/bh-eu-09-speakers.html#Marlinspike