2gusia (2gusia) wrote,
2gusia
2gusia

Аппаратный бекдор в чипсте от Intel работает с пустым хешем пароля

5 мая новость про встроенный в чипсет аппаратный бекдор от Intel достигла рунета (на хабре, позже на гиктаймс), я тогда же взглянул, испытал вот эту самую эмоцию

вычитал, что вроде это про крутые системы с vPro, которого у меня нет и пошёл праздновать. Сегодня протрезвел достаточно, чтобы почитать подробнее.

1. Что за звери эти Intel AMT и Intel ME?
Вот хорошая старая картинка от Symantec

То есть это код, зашитый в железо работающий до операционной системы (соответственно до любого программного брандмауэра на этом компе). Активен даже при ВЫключенном компьютере (но не выдернутом из розетки). Позволяет (если должным образом конфигурирован, по умолчанию AMT выключен)
- KVM; получить полный доступ к клавиатуре, мыши и монитору, то есть удалённо проводить любые действия.
- IDE Redirection; удалённо изменять загрузочное устройство на физическое или виртуальный образ, указанный удалённо
- Serial over LAN: удалённо включать/ выключать/ перезагружать компьютер, редактировать настройки BIOS

Впечатляет, правда?

При этом AMT - это как бы драйвер, управляющий движком ME (Management Engine). Есть системы, на которых установлены и AMT и ME, есть - где только ME. Вроде бы для эксплуатации уязвимости требуются и AMT и ME. Но комментаторы расходятся в мнениях о возможностях дальнейшего углубления эксплуатации уязвимости.

2. Что за проблема?
Официальный документ Intel о проблеме
Intel AMT Vulnerability Tracking Page

Понятно, что такой функционал должен быть защищён. Но говнокодеры Intel в далёком 2008 г сделали так, что если послать пустой запрос, то получишь полную авторизацию. И с тех пор копи-пастили дырявый код. Нет, пустого пароля не достаточно, и пустой запрос в нормальной ситуации не формируется. Но его нетрудно искуственно создать. Хорошее изложение в комменте (английский)

[Spoiler (click to open)]The article is a bit confusing regarding this, but no, you can't send an empty password. That's because when a browser does digest authentication it doesn't actually send the password, or even a password hash, to the web server.

The browser sends instead a response MD5 hash computed on a string composed of various items, including a variable nonce sent by the server, in addition to the password, for example:

response=MD5(MD5(username:realm:password):nonce:MD5(method:digestURI))
https://en.wikipedia.org/wiki/Digest_ac ... entication

This means a normal browser would never send an empty response, even when you enter an empty password. It would always send a 32 hex digit MD5 hash looking like this:

response="6629fae49393a05397450978507c4ef1"

The server would then compute the same hash, and compare them. If they are equal, it allows login, if they are different it denies login.

The bug was in the code to compare the two strings. It used the strncmp function that compares the first N characters of two strings:

strncmp(string1, string2, N)
http://www.cplusplus.com/reference/cstring/strncmp/

And applied it to the computed hash and the hash response received from the browser, with N set to the length of the response received from the browser, so something like:

strncmp(computed_hash, response, strlen(response))

So when it compared a real hash generated by a browser it would do something like:

strncmp("6629fae49393a05397450978507c4ef1","d3d4914a43454b159a3fa6f5a91d801d", 32)

This would work just fine for hashes sent by the browser, which are always 32 characters in length. Even if the password field is empty, it would compare the two strings, they wouldn't match, and it would reject the empty password or invalid password.

So anyone testing this from a browser would find it works perfectly.

The problem is what happens if you don't use a browser, but you generate an invalid request manually or using a proxy to alter the response, sending an empty string instead of the 32 character hash. Then the compare code does this:

strncmp("6629fae49393a05397450978507c4ef1","",0)

This means the function will compare the first 0 characters between the two strings. So it is equivalent to:

strncmp("","",0)

Of course, two 0 length strings are equal, so it wrongfully concludes the hashes are equal.

What the programmer should have done is check if the hash coming from the browser has the correct length, 32 characters, before attempting to compare the two strings.

Or even better, the programmer should have used the proper string comparing function, strcmp, that already does that for you and you don't need to supply a length parameter, like this:

strcmp(string1, string2)
http://www.cplusplus.com/reference/cstring/strcmp/

3. Как проверить уязвимость моей системы?
Для Win7-10 Intel сваял утилиту. Как проверить комп не под Win и тем более не локальный, а сетевой - не уточняется.
Tags: it, Безопасность, железо
Subscribe

  • Цукерберг доигрался

    В отношении компании Facebook, которой принадлежит одноименная социальная сеть, а также мессенджер WhatsApp и приложение для обмена фото- и…

  • Сбер выкупил Рамблер

    29 октября 2020 года Сбер сообщил, что выкупил 45% акций Rambler Group у Александра Мамута и стал единственным владельцем компании. Окончательная…

  • Свобода и ЯндексGo, суперапп

    Недавно обнаружил в своем смартфоне старую новость. Оказывается, приложение Яндекс Такси, которым я изредка пользуюсь, превратилось в сабж. Так вот,…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 5 comments