시릭스 혼수 곤충
Cyrix coma bugCyrix Coma 버그는 Cyrix 6x86(1996년에 도입), 6x86L 및 초기 6x86MX 프로세서의 설계 결함으로, 권한이 없는 프로그램이 컴퓨터를 행업할 수 있습니다.
검출
Andrew Balsa에 따르면 인텔 Pentium에서 F00F 버그가 발견될 무렵 모스크바의 Serguei Shtyliov는 어셈블리 언어로 IDE 디스크 드라이버를 개발하다가 Cyrix 프로세서에서 결함을 발견했습니다.Omsk의 Alexandr Konosevich는 이 버그를 한층 더 조사해, 독일 테크놀로지 매거진 c't에 「숨겨진 CLI 버그」라고 하는 기사를 Uwe Post와 공동 집필했습니다(CLI는 x86 아키텍처의 인터럽트를 무효로 하는 명령입니다).Linux 커널 메일링 리스트의 멤버로서 Balsa는 권한이 없는 사용자가 다음 C 프로그램(인라인 x86 고유의 어셈블리 언어 사용)을 컴파일하여 실행할 수 있음을 확인했습니다.
서명되어 있지 않다 차 c[4] = {0x36, 0x78, 0x38, 0x36}; 인트 주된() { asm ( " 이동 $c, %ebx\n" "다시: xchgl (%ebx), %eax\n" " 이동 %eax, %edx\n" "jmp 다시"\n" ); }
이 프로그램을 실행하면 프로세서는 중단될 수 없는 무한 루프에 들어가기 때문에 재부팅될 때까지 완전히 사용할 수 없게 됩니다.이것에 의해, 이 버그가 있는 Cyrix 시스템에 액세스 할 수 있는 유저는, 서비스 거부 공격을 실행할 수 있습니다.
이것은 Halt and Catch Fire 명령 실행과 유사하지만, 혼수 버그는 특정 명령이 아닙니다.
분석.
이 버그의 원인은 인터럽트 마스크도 아니고 인터럽트를 명시적으로 디세블로 하는 것도 아닙니다.대신 Cyrix 명령 파이프라인에 이상이 있으면 루프가 지속되는 동안 인터럽트가 처리되지 않습니다.루프가 끝나지 않기 때문에 인터럽트는 처리되지 않습니다.xchg[1] 명령은 atomic입니다.즉, 실행 중에는 다른 명령으로 시스템 상태를 변경할 수 없습니다.이러한 원자성을 보장하기 위해 Cyrix의 설계자는 xchg를 무정전 상태로 만들었습니다.그러나 파이프라인 및 분기 예측으로 인해 이전 xchg가 완료되기 전에 다른 xchg가 파이프라인에 들어가 교착 상태가 발생합니다.
회피책
의도하지 않은 버그 인스턴스의 수정 방법은 루프에 다른 명령을 삽입하는 것입니다. nop 명령이 좋은 후보입니다.Cyrix는 xchg opcode를 직렬화하여 파이프라인을 우회할 것을 제안했습니다.그러나 이러한 기술은 의도적인 공격을 방지하는 데 도움이 되지 않습니다.
이 오류를 방지하는 방법 중 하나는 컨피규레이션레지스터 CCR1에서 비트0x10을 유효하게 하는 것입니다.그러면 일반적으로 xchg 명령에 의해 수행되는 암묵적인 버스 잠금이 비활성화됩니다.이 오류의 영향을 받는 CPU는 멀티프로세서시스템에서 동작하도록 설계되어 있지 않기 때문에 xchg 원자성의 손실은 [citation needed]무해합니다.
「 」를 참조해 주세요.
메모들
외부 링크
- 앤드류 발사의 초기 버그 설명
- Cx6x86 레지스터(및 문서화되어 있지 않은 기능)