Почему whitelist не работает

Удаление Whitelist в bios ноутбуков на примере Lenovo X230

Недавно понадобилось поставить новую wifi карточку стандарта ac в свой ноутбук Lenovo x230, в котором есть whitelist для wlan карточек. Ниже опишу свои изыскания по отключению whitelist’а.

Для начала нам надо слить дамп нашего биоса, сделать это можно с помощью утилиты FPT
fpt -d bios.rom -BIOS
Далее нам понадобится утилита PhoenixTool 2.52. Запускаем её, выбираем наш bios.rom и ждём, пока она его распакует, далее в поле Manufacturer выбираем Lenovo и жмём кнопку Advanced, там ставим галочки «Allow user to modify other modules» и «No SLIC»

Нажимаем «Done» и «Go», когда откроется окошко

ничего не нажимаем и идём в папку DUMP, куда распакован наш биос. Далее нужно найти файл отвечающий за whitelist. Ищем просто по тексту ошибки (в кодировке UTF-16), которая выводится на экран при вставленном модуле не из вайтлиста «1802: Unauthorized network card is plugged in»

Находим файл 79E0EDD7-9D1D-4F41-AE1A-F896169E5216_2207.ROM — это модуль биоса для вайтлиста.
Далее грузим его в IDA, смотрим код и ищем нашу строку «1802: Unauthorized network card is plugged in»

К этой строке идёт обращение в процедуре Sub_A0C. Т.е. процедура Sub_A0C предположительно занимается выводом ошибки на экран, смотрим откуда она вызывается (кликаем по имени процедуры и нажимем клавишу X на клавиатуре)

Видим что это процедура Sub_B20. Идём в эту процедуру и нажимаем пробел для перехода к схематичному представления кода.

Видим что процедура Sub_A0C вызывается из блока кода на метке Loc_BDD. Далее можно проследить условные переходы к этой метке и т.д. Но я решил, чтобы лучше понять код работы этой процедуры, пройти код от начала процедуры.
Итак, первое условное ветвление проверяет регистр edx на ноль

т.к. регистр edx выше в этой процедуре нигде не инициализируется, то понятно, что ему должно присваиваться значение перед вызовом процедуры Sub_B20. Это можно увидеть в коде
и
Что означает значение в регистре edx я не понял, поэтому пройдёмся по обоим веткам ветвления.
Пойдём для начала по правой веке, на Loc_C6E

В eax кладётся адрес данных qword_270, двойным щелчком по qword_270 переходим к просмотру этой записи, далее переходим на вкладку Hex View-A. Это и есть наш whitelist, он идёт с адреса 270h до 3FFh. С форматом тоже всё просто, каждая запись длинной в 16 байт (4 слова по 32bit) соответствует одному устройству: первое слово — какой-то флаг, принимающий значение 0, 1, 5 или 6, второе слово — это system id, третье — subsystem id, четвёртое — ещё один флаг, имеющий значение 0 или 1. Предполагаю что первый флаг определяет тип устройства: 0 — wifi карточка, 1 — модем, 5 — ?, 6 — конец списка.

Вернёмся к коду. Сравниваем eax с шестёркой, а шестёрка у нас — это конец вайтлиста, т.е. если вайтлист получается пустой, то идём сразу на Loc_BDD, которая у нас вызывает ошибку. Это условие нам не интересно, т.к. вайтлист у нас не пустой, и условие не выполнится. Далее кладём адрес qword_270 в регистр rdx, проверяем eax (первый флаг записи в вайтлисте) на ноль, если флаг отличный от нуля, переходим к ошибке. Это условие нас тоже не интересует. Это же условие является началом цикла обхода вайтлиста.
Дальше командами

Помещаем system id из вайтлиста в регистр ecx. Регистр r8 здесь выступает в роли инкремента в цикле, изначально он равен нулю.
Далее сравниваем ecx (system id из вайтлиста) и значение в памяти по адресу в регистре rdi.

Читайте также:  Не работает только тахометр шевроле авео

Несложно догадаться, что по адресу в регистре rdi у нас лежит идентификатор нашей вставленной wifi карточки, а в начале процедуры в регистр rdi мы кладём r8, т.е. процедуре Sub_B20 в качестве параметра использется регистр r8, где должен лежать адрес ячейки памяли с идентификатором нашей карточки.
Если идентификатор не совпал, то идём на Loc_CBA, там мы увеличиваем инкрементный регистр r8 на 10h (для этого в регистре r13w у нас заранее должна лежать единица)

и проверяем, не в конце ли мы вайтлиста

Если в конце, то выходим из цикла и выдаём ошибку, если не в конце, то идём в начало цикла.
Понятно, что для обхода вайлиста, нам надо убрать условный переход при сравнении system id, т.е. заменить jnz short loc_CBA на jmp $+2 .
Далее, если system id совпал, идёт аналогичный код для сравнения subsystem id

Если subsystem id не совпал, то перебираем по циклу идентификаторы дальше. Тут нам тоже необходимо поправить условные переход на безусловный jz short loc_CD5 на jmp short loc_CD5 .
Дальше по коду уже нет переходов на ошибку, но есть интересный код, проверяющий второй флаг в записи вайтлиста, про который я писал ранее, он сравнивается с регистром r13d, и если совпадает, то выполняется некий дополнительный кусок кода. Что делает этот код понять трудно, по анализу вайтлиста можно заметить, что этот флаг стоит только у карточек фирмы Intel.

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

Далее сравнивается eax (первый флаг) и r13d (что за параметр лежит в r13d я так и не разобрался, в начале процедуры него кладётся значение по адресу [rbx+1]), далее в зависимости от выполнения этого условия, попадаем сразу на код проверки system id, либо выполняем интересное сравнение

Проверяем первый флаг в записи вайтлиста на 5, если условие выполняется, то пропускаем эту запись вайтлиста (т.е. игнорируем wifi карточку) и идём далее по циклу проверки.
Чтобы понять что же это за такой интересный флаг, надо понимать, что передаётся в процедуру Sub_B20. Если помните, в правой ветке кода, если этот флаг был отличный от нуля, то выдавалась ошибка о неподдерживаемой карте. Т.е. чтобы карточка с флагом 5 загрузилась, должны выполниться следующие условия вызова процедуры Sub_B20: регистр edx должен быть отличным от нуля, а регистр r13d не должен быть равен пяти ( cmp eax, r13d , а в eax у нас лежит наш флаг равный пяти). Можно лишь догадаться, что для запуска карточки с таким флагом, требуется ещё какое-то условие, кроме нахождения её в вайтлисте. Дальше выполнять анализ для меня было довольно сложно, поэтому, что же это за условие, узнать не удалось.

Далее по коду, мы аналогично правой ветке, проверяем в цикле system id

Здесь нам надо также заменить условный переход jz loc_DF3 на безусловный jmp loc_DF3 .
Что интересно, далее в левой ветке нет проверки subsystem id, т.е. достаточно совпадения system id. Из вышеизложенного можно предположить, что правая ветка — проверка wifi карточек, а левая проверка модемов. А в регистре edx при вызове функции содержится тип устройства: 0 — wifi, 1 — модем. Но тут тоже непонятка, т.к. каточка 0087:8086 с флагом 5 — это wifi+wimax, а не модем, да и в edx может быть больше единицы, т.к. из edx вычитается r13d, а потом сравнивается с четвёркой:

Собственно на этом анализ можно заканчивать. Нужные места для патча мы нашли.
Переводим команды в опкоды и делаем замены в hex редакторе, в итоге получаем такой патч:

Сохраняем пропатченый файл 79E0EDD7-9D1D-4F41-AE1A-F896169E5216_2207.ROM и нажимеам в окне PhoenixTool кнопку Ok.
PhoenixTool соберёт новый биос с именем bios_SLIC.rom.

Осталось дело за малым, необходимо прошить новый биос. В свежих ноутбуках Lenovo, включая мой x230, изменённый bios нельзя прошить программно, поэтому шьём его программатором. Фото процесса прошивки через программатор к сожалению не делал. Биос находится в микросхеме MX25L3206E рядом с разъёмом ExpressCard. Эта микросхема представляет из себя обычный SPI EEPROM 25ой серии, простой программатор для которой стоит 300р.

Читайте также:  Как понять что газовый счетчик не работает

На этом всё, наслаждаемся работой новой wifi карточки.

Источник

WhiteList vs BlackList: как реализовать проверку расширений файлов и не стать жертвой хакеров

Нередко, во время анализа защищенности веб-приложений мы сталкиваемся с загрузкой каких-либо файлов на сервер – это могут быть и фотографии учетной записи, и какие-то текстовые документы, и что угодно другое. Существуют расширения файлов, с которыми многие работали и знают, почему нужно запретить их загрузку на сервер (например, при использовании веб-сервера apache в связке с PHP, наверное, лучше избегать загрузку файлов с расширением «.php» от пользователей). Однако, мне показалось, что остались еще некоторые малоизвестные форматы, которые по-разному воспринимаются различными веб-серверами.

При написании кода, который отвечает за загрузку файлов, разработчики веб-приложений, могут прибегнуть к проверке расширения загружаемого файла либо по WhiteList (и тогда можно загружать только файлы с определенным расширением), либо по BlackList (и тогда можно загружать любые файлы, которые не описаны в списке). Если все-таки используется второй вариант, то это нередко может выливаться в уязвимость (например, XSS или даже RCE).

Как правило, программисты вносят в BlackList уже известные и очевидные расширения. В статье же будут рассмотрены не самые распространенные типы файлов.

Для демонстрации PoC использовались следующие пейлоады:

    Базовый XSS-вектор, используемый для тестов (Basic вектор):

XSS-вектор с использованием XML (XML-based вектор):

Далее я покажу результаты этого небольшого исследования.

По умолчанию IIS отдает файлы, приведенные в списке ниже с content-type: text/html.

Расширения, которые позволяют использовать Basic-вектор:

  • .cer
  • .hxt
  • .htm

Таким образом, есть возможность внедрить XSS-вектор в загружаемый файл. При обращении к файлу, браузер успешно исполнит javascript.

Следующую группу расширений IIS отдаёт с таким content-type, который позволяет выполнить XSS через XML-вектор.

Расширения, которые позволяют использовать XML-based вектор:

  • .dtd
  • .mno
  • .vml
  • .xsl
  • .xht
  • .svg
  • .xml
  • .xsd
  • .xsf
  • .svgz
  • .xslt
  • .wsdl
  • .xhtml

IIS по умолчанию поддерживает SSI, однако секция exec запрещена в целях безопасности. При стандартном конфигурировании мы не сможем добиться произвольного выполнения команд, но будет возможность читать локальные файлы. Ниже приведены расширения, при использовании которых, IIS позволяет использовать SSI директивы.

Расширения для эксплуатации SSI:

  • .stm
  • .shtm
  • .shtml

Детальнее про использование SSI описано в твите @ldionmarcil.

Дополнение:

Так же есть еще два интересных расширения (.asmx и .soap), которые могут привести к выполнению произвольного кода. Это было обнаружено при сотрудничестве с моим коллегой – Юрием Алейновым (@YuryAleinov).

Asmx-расширение

1. Если есть возможность загрузки файлов с расширением «.asmx», то это может привести к исполнению произвольного кода. Для примера возьмем файл со следующим содержимым и загрузим на сервер:

2. Далее отправляем следующий POST запрос к файлу, который удалось загрузить:

3. В результате IIS запустит процесс «calc.exe»

Soap-расширение:

1. Содержимое файла, которое загружается с расширением «.soap»:

Apache (httpd или Tomcat)

Расширения, которые позволяют использовать Basic-вектор:

Расширения, где можно использовать XML-based вектор:

  • .rdf
  • .xht
  • .xml
  • .xsl
  • .svg
  • .xhtml
  • .svgz

* — если в имени файла после .html следует .xxx, где xxx – любые символы, то Apache отдаст файл с Content-Type text/html. Если же вместо xxx будет, например, de,en,ru и т.д., то веб-сервер еще добавит в ответ заголовок Content-language с соответствующим значением.

Дополнение:

Большое количество файлов с разными расширениями Apache и Tomcat возвращает без заголовка Content-type, что позволяет провести XSS-атаку, т.к. браузер зачастую сам решает, как обрабатывать данную страницу. Хорошо описан этот вопрос в данной статье. Так, файлы с расширением .xbl обрабатываются браузером Firefox, как xml (если в ответе отсутствует заголовок Content-Type), поэтому есть возможность эксплуатирования XSS используя XML-based вектор в данном браузере.

Nginx

Расширения, которые позволяют использовать Basic-вектор:

Расширения, где можно использовать XML-based вектор:

Заключение

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

Читайте также:  Как настроить детский аккаунт гугл

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

Автор: Михаил Ключников, Positive Technologies

Источник

Как работает whitelist?

Как выясняется, в моём ноуте используется подобная хрень. Что оно из себя представляет, кто-нибудь знает? Список VID:PID или как-то понавороченней? Если он регулярно пополняется, то новинку просто так не вставишь и нужно разлоченный биос ведь..

Работает примерно так: при сборке ноута производитель заказывает у разных поставщиков модули связи и просто добавляет их id в список внутри прошивки на мамке. Прошивка при загрузке проверяет id железок на портах и отказывается продолжать инициализацию. Подробную техническую реализацию нужно искать у производителя прошивки.

Т.е. это не какой-то whitelist в вакууме, а просто какие-то модули, которые были протестены в момент сборки. Т.е. с большей вероятностью случайно купленный модуль работать откажется.. Понял, пошёл разлоченный биос искать.

Понял, пошёл разлоченный биос искать.

Это какой? Coreboot чтоли?

Это обычный, только без вайтлиста

Я не знаю что такое coreboot. Я не спец по биосам. Разлоченный — это по крайней мере без whilelist. Судя по bios-mods, бонусом идёт то, что некоторые скрытые меню ещё показываются.

от производителя чтоли?

Модифицированный умельцами биос от производителя. Или старый биос для этой модели, в котором вайтлиста ещё не было.

Да прям. Производитель взял и выдал новую прошивку без возможности заработать на этом $$$

Kaschenko

я просто не слышал про биосы без whitelist. Знал только про coreboot. Но это совсем другой уровень.

По моей ссылке выше можно много разных найти. Я ещё не пробовал, но народ вроде доволен.

Да все биосы до недавнего времени были без whitelist, это новомодный анальный зонд. Ну и выпиливается он, видимо, без особых сложностей.

Если прошивки без whitelist нету, нужно дергать его из прошивки и искать vid+pid которые примет ноут, а дальше либо шить имеющийся модуль c этими данными, попутно получая проблемы с драйверами, либо покупать заведомо подходящий модуль.

Или более сложный вариант — добавление вашего модуля в список, но тут лучше запастись spi программатором (или raspberry pi на худой конец).

Лёгких путей не ищем? Попробуй с другой стороны подойти к проблеме )

я просто не слышал про биосы без whitelist

внезапно не слышал как раз про биосы с такой жопой внутри. Можт у меня железо древнее

Недавно покупал ноут, рассматривал Lenovo, очень хорошо что не купил

Не обольщайся, судя по тырнетам, оно почти во всех сейчас есть. По слухав в asus’e нет вроде.

судя по тырнетам, оно почти во всех сейчас есть.

А всего какой-то год назад, когда Столлман говорил, что биос должен быть свободным, на лоре ржали и шутили

Я на своем ноуте просто поставил карточку из списка совместимых.

А список ты взял где?

Посмотрел с какими модулями идут остальные конфигурации этого ноута и понял, что подходят некоторые карты atheros, просто воткнул первую попавшуюся из хламосборника. И мне повезло!

Сколько лет ноуту, что ты «посмотрел остальные конфигурации этого ноута»?

Брал 2 года назад, это lenovo thinkpad e320.

Ну так моему одному 4 года, второму 6 лет. Думаю, не стоит говорить, что их давно уже нет в продаже.

Тогда есть вариант покопаться в сервис-мануалах, там могут быть sku модулей, которые ставили на эту модель, по sku найти подходящие.

5 GHz на ноут четырёхлетней давности? ORLY?

Я лулзов ради втыкал в восьмилетний ноут mini-pci модуль с 802.11n. И оно даже работало!

А нахрена собственно 5 ггц в такого дедушку? 2.4 закончился в доме?

Источник

Оцените статью