Установка пароля BIOS является весьма популярным методом ограничения доступа к вычислительным ресурсам. Именно эти пароли становятся первой преградой на пути у потенциального взломщика (или пользователя, который забыл свой пароль). В данной статье речь пойдет о методах, позволяющих злоумышленникам обойти защиту подобного рода, а законным пользователям - осознать потенциальные угрозы и принять надлежащие меры защиты.
1. Аппаратное удаление паролей
Методы аппаратного удаления паролей известны, наверное, всем - отключение батарейки CMOS, закорачивание ее выводов при помощи подручных предметов, использование специально для этого предназначенной перемычки ("CMOS Clean Jumper") и т.д. При всей своей простоте данный метод имеет несколько недостатков, существенно ограничивающих область его применения. Во-первых, на сборку-разборку требуется много времени (да и как разобрать машину на глазах у ее владельца?); во-вторых, владелец машины сразу же обнаружит подобное вмешательство. Однако данный способ является "единственной надеждой" (см. пункт 3) человека, установившего пароль на загрузку машины ("BIOS FEATURES SETUP => Security Option = System"), а затем забывшего этот пароль.
2. Программное удаление паролей
Этим методом может воспользоваться взломщик, получивший доступ к машине под каким-либо благовидным предлогом. В отличие от предыдущего метода, в данном случае взлом не привлекает особого внимания и может быть проделан "на глазах" у владельца.
Пароли (и связанная с ними информация) хранятся в CMOS-памяти. Чтобы получить доступ к байту CMOS'а, его адрес (число в диапазоне от 00h до 7Fh) записывается в порт 70h, а значение считывается из порта 71h (либо записывается в этот порт).
2.1. Пароль администратора ("SUPERVISOR
PASSWORD")
Информация, связанная с паролем администратора, хранится в CMOS по адресам 11h, 1Ch и 1Dh, 2Eh и 2Fh. (см. таблицу).
Адрес | Комментарий |
11h | Первый бит определяет,
включен или выключен пароль
администратора (0 — выключен, 1 — включен). Нулевой бит определяет режим использования пароля (1 — «System», 0 — «Setup»). |
1Ch и 1Dh | 16-битный хэш-код пароля (1Ch —
младший байт, 1Dh — старший
байт). Алгоритм вычисления этого хэш-кода будет описан в пункте 4. |
2Eh и 2Fh | Контрольная сумма байт с
адресами от 10h до 2Dh (вычисляется путем сложения этих байт). |
Алгоритм отключения пароля администратора достаточно прост. Из CMOS считываются байты с адресами 11h, 2Eh и 2Fh. Если первый бит байта 11h установлен, сбрасываем его, записываем модифицированное значение в CMOS, корректируем контрольную сумму (отнимаем 2) и записываем модифицированное значение в CMOS. Простейшая программа, выполняющая вышеописанные действия, занимает всего 55 байт:
B0 11 E8 22 00 0F BA F1 01 73 1B E8 22 00 B0 2E E8 14 00 86 E9 FE C0 E8 0D 00 49 49 E8 11 00 FE C8 86 E9 E8 0A 00 C3 50 E6 70 E4 71 8A C8 58 C3 E6 70 8A C1 E6 71 C3
Ею можно воспользоваться, даже если у атакуемой машины отключены дисководы (мера, достаточно популярная в различных учебных заведениях) - достаточно набрать ее машинный код в любом HEX-редакторе, имеющемся на атакуемой машине, сохранить его с расширением.COM и выполнить полученный файл.
2.2. Пароль пользователя ("USER
PASSWORD")
Информация, связанная с паролем пользователя, хранится в CMOS по адресам 4Dh, 4Eh и 4Fh, 7Dh и 7Eh. (см. таблицу 2).
Адрес | Комментарий |
4Fh | Нулевой бит определяет,
включен или выключен пароль
пользователя (0 — выключен, 1 — включен). |
4Dh и 4Eh | 16-битный хэш-код пароля (4Dh — младший байт, 4Eh — старший байт). |
7Dh и 7Eh | Вторая контрольная сумма CMOS. |
Алгоритм отключения данного пароля сходен с вышеописанным.
3. Инженерный пароль
Инженерный пароль позволяет получить доступ к машине, не вводя пароля, определенного пользователем. Для AWARD BIOS известно почти два десятка таких паролей - "AWARD_SW", "AWARD_WG", "j262", "j256", "Syxz", "Wodj", "lkwpeter" и т.д. Инженерный пароль хранится не в CMOS, а в BIOS по адресу F000:EC60h либо по смещению 1EC60h от начала файла ORIGINAL.TMP - распакованной "прошивки" BIOS. Существует два формата хранения пароля:
3.1. "Старый" формат
Пароль хранится в виде 16-битного хэш-кода (См. пункт 4) по адресу F000:EC60h (признаком данного формата является наличие слова 1461h по адресу F000:EC62). При использовании этого формата пароль не уникален - все вышеперечисленные примеры паролей имеют одинаковый хэш-код 1EAAh, то есть с точки зрения BIOS они эквивалентны.
3.2. "Новый" формат
Пароль хранится в зашифрованном виде в строке длиной 8 байт по адресу F000:EC60h (если пароль короче 8 байт, неиспользуемые байты равны 0), признаком нового формата является наличие байта 14h по адресу F000:EC68h). Для шифрования пароля в каждом его байте три старших бита обмениваются местами с тремя младшими битами, а 3 и 4 биты остаются на своих местах. Пароль, хранимый в этом формате, уникален (но легко поддается дешифровке).
Однако многие производители материнских плат по какой-то непонятной причине используют новый формат, а данные пишут в старом - в результате инженерный пароль фактически отсутствует (его невозможно ввести с клавиатуры). В принципе, можно самоcтоятельно зашифровать какой-нибудь пароль (например, тот же "AWARD_SW"), вписать его в распакованную "прошивку" BIOS'а и перезаписать Flash-BIOS, но подобные эксперименты сопряжены с определенным риском. Тем не менее, в случае успеха данный метод поможет избежать неприятностей, связанных с забывчивостью и различного рода "шутниками".
4. Декодирование пароля
Уже несколько раз было упомянуто, что пароль BIOS хранится в виде хэш-кода. В данном пункте будет рассмотрена процедура, с помощью которой вычисляется этот хэш-код, а также алгоритм, позволяющий подобрать пароль по известному хэш-коду.
4.1. Хэширование
Алгоритм, при помощи которого символьный пароль (максимальная длина пароля - 8 символов) "сворачивается" в 16-битный хэш-код, достаточно прост и может быть представлен следующим кодом:
DWORD QHash = 0;int iPtr = 0;int Shift = 1; for (iPtr = lstrlen(PassWord)-1; iPtr!= -1; iPtr-) { QHash = (QHash+PassWord[iPtr]*Shift) % 65535; Shift*=4; } return QHash == 0? 65535: QHash;
4.2. Вычисление пароля по известному
хэш-коду
Сразу можно заметить, что восстановить введенный пользователем пароль невозможно (если его длина превышает 1 символ), возможно лишь сгенерировать последовательность символов, хэш-код которой будет равен хэш-коду пароля пользователя. Первое, что приходит в голову - последовательно генерировать пароли из 1, 2, 3...8 символов и сверять их хэш-коды с хэш-кодом, прочитанным из CMOS. Реализация этого метода достаточно проста, но он имеет серьезный недостаток: на поиск пароля затрачивается много времени.
Существует и более быстрый способ, позволяющий решить эту задачу (подбор паролей для всех вариантов хэш-кодов занимает около 2 секунд на Pentium 150 MHz). Рассмотрим применение этого метода на примере хэш-кода 1EAAh (при генерации пароля будут использованы символы от "0" (48) до "z"(122)). Первый шаг алгоритма состоит в определении минимальной длины пароля. Значение 1EAAh (десятичное 7850) лежит в промежутке от Min[4] до Max[4] - это значит, что минимальная длина генерируемого пароля для хэш-кода 7850 при использовании вышеуказанного алфавита равна 4 символам (если значение хэш-кода не попадает ни в один из промежутков, следует добавлять к нему число 65535 до тех пор, пока условие не будет выполняться). Символ пароля Pi подбирается таким образом, чтобы выполнялось неравенство Min[i-1] <= Hash Pi*22i <="Max[i-1]." После подбора i-того символа хэш-код перерасчитывается следующим образом: Hash="Hash" Pi*22i. (см. таблицу 3).
Промежутки Min[i], Max[i] для алфавита «0»...«z». | ||||||||
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Min[i] | 48 | 240 | 1008 | 4080 | 16368 | 65520 | 262128 | 1048560 |
Max[i] | 122 | 610 | 2562 | 10370 | 41602 | 166530 | 666242 | 2665090 |
Для хэш-кода 1EAAh подбор символов пароля происходит следующим образом:
- 1008 <= 7850 P3*64 <="2562" (P3="106" ("j");
- 240 <= 1066 P2*16 <="610" (P2="51" ("3");
- 48 <= 250 P1*4 <="122" (P1="50" ("2");
- P0 = 250 - P1*4 (P0 = 50 ("2").
Итак, пароль "j322" при хешировании "свернется" в хэш-код 1EAAh, что нетрудно проверить. Реализация вышеописанного алгоритма очень проста - весь код занимает менее 50 строк на C++.
5. Выводы
Из сказанного следует, что, вопреки мнению некоторых пользователей, пароля BIOS явно недостаточно для обеспечения безопасности компьютеров. В качестве дополнительных мер, затрудняющих проведение атак на пароли BIOS, можно указать:
- использование специальных механических устройств, препятствующих вскрытию корпуса компьютера;
- отключение клавиатуры при помощи надежного замка;
- применение хранителя экрана, защищенного паролем.
Кроме того, следует помнить, что пароль BIOS никак не защищает данные - злоумышленник может просто снять винчестер и просмотреть его содержимое на своей машине. Для защиты данных требуется использовать специализированное ПО (например, PGP или BestCrypt).
Александр БЫЧЕНКОВ,
eris-by@mail.ru
Комментарии
Во-вторых, в статье, как я понял, обсуждался Award версии 4.51, а здесь, насколько я знаю - 6.0...