Ошибка Cyrix в виде комы
Ошибка Cyrix coma — это конструктивный недостаток процессоров Cyrix 6x86 (представленный в 1996 году), 6x86L и ранних версий 6x86MX, позволяет который непривилегированной программе зависать на компьютере.
Открытие
[ редактировать ]По словам Андрея Бальсы, примерно в то же время, когда была обнаружена ошибка F00F в процессорах Intel Pentium , Сергей Штылёв из Москвы обнаружил ошибку в процессоре Cyrix при разработке драйвера диска IDE на языке ассемблера . Александр Коносевич из Омска дополнительно исследовал ошибку и вместе с Уве Постом стал соавтором статьи в немецком технологическом журнале c't , назвав ее «скрытой ошибкой CLI» (CLI — инструкция, отключающая прерывания в архитектуре x86 ). Бальса, как участник списка рассылки ядра Linux , подтвердил, что следующая программа на C (которая использует встроенный x86 , специфичный для язык ассемблера ) может быть скомпилирована и запущена непривилегированным пользователем:
unsigned char c[4] = {0x36, 0x78, 0x38, 0x36};
int main()
{
asm (
" movl $c, %ebx\n"
"again: xchgl (%ebx), %eax\n"
" movl %eax, %edx\n"
" jmp again\n"
);
}
Выполнение этой программы делает процессор полностью бесполезным до его перезагрузки, так как он входит в бесконечный цикл , который невозможно прервать . Это позволяет любому пользователю, имеющему доступ к системе Cyrix с этой ошибкой, выполнить атаку типа «отказ в обслуживании» .
Это похоже на выполнение инструкции «Остановить и загореться» , хотя ошибка комы не является какой-то одной конкретной командой.
Анализ
[ редактировать ]Причина ошибки не в маске прерывания и не в явном отключении прерываний. Вместо этого аномалия в конвейере инструкций Cyrix не позволяет обслуживать прерывания на протяжении всего цикла; поскольку цикл никогда не заканчивается, прерывания никогда не будут обслуживаться. ХЧГ [ 1 ] Инструкция является атомарной , что означает, что другим инструкциям не разрешено изменять состояние системы во время ее выполнения. Чтобы обеспечить эту атомарность, разработчики Cyrix сделали xchg бесперебойным. из-за конвейеризации и прогнозирования ветвей Однако другой xchg входит в конвейер до завершения предыдущего, что приводит к взаимоблокировке .
Обходные пути
[ редактировать ]Исправление непреднамеренных случаев ошибки заключается в вставке в цикл еще одной инструкции, причем nop хорошим кандидатом является инструкция . Cyrix предложил сериализовать опкод xchg, минуя конвейер. Однако эти методы не помогут предотвратить преднамеренные атаки.
Ошибку также можно предотвратить, отключив неявную блокировку шины, обычно выполняемую инструкцией xchg . Это достигается установкой четвертого бита (маски 0x10
) в регистре конфигурации, CCR1
.
См. также
[ редактировать ]Примечания
[ редактировать ]Внешние ссылки
[ редактировать ]- Раннее описание ошибки Эндрю Бальса
- Регистры Cx6x86 (и недокументированные функции)