펜티엄 F00F 버그
Pentium F00F bugPentium F00F 버그는 Intel Pentium, Pentium MMX 및 Pentium OverDrive 프로세서 대다수의 설계 결함(모두 P5 마이크로아키텍처 내)이다.1997년에 발견되었으며, 컴퓨터가 물리적으로 재부팅될 때까지 프로세서가 작동을 멈추게 할 수 있다.그 버그는 운영체제 업데이트를 통해 우회되었다.
그 이름은 의 속칭이다.F0 0F C7 C8
, 하나의 위반 명령의 16진수 인코딩.[1]좀 더 형식적으로 이 버그를 CMPXCHG8B 명령 버그가 잠긴 잘못된 피연산자라고 부른다.[2]
설명
x86 아키텍처에서 바이트 시퀀스F0 0F C7 C8
가르침을 나타내다.lock cmpxchg8b eax
(등록기 EAX에서 8바이트의 비교 및 교환 잠금).버그는 또한 다음과 같이 끝나는 opcode에도 적용된다.C9
을 통해CF
, EAX 이외의 레지스터 피연산자를 지정한다.그F0 0F C7 C8
교육에는 특별한 특권이 필요하지 않다.
이 명령 인코딩은 유효하지 않다.그cmpxchg8b
명령어는 EDX와 EAX 레지스터의 값을 메모리 위치의 8바이트 값과 비교한다.그러나 이 경우에는 메모리 위치 대신 레지스터를 지정하여 사용할 수 없다.
정상적인 상황에서 이는 단순히 예외를 초래하지만, 잠금 접두사(보통 두 프로세서가 동일한 메모리 위치를 방해하지 않도록 하기 위해 사용됨)와 함께 사용될 경우 CPU는 잠긴 버스 사이클을 잘못 사용하여 불법 명령 예외 핸들러 설명자를 읽는다.잠긴 읽기는 잠긴 쓰기와 쌍을 이루어야 하며, CPU의 버스 인터페이스는 해당 쓰기가 발생할 때까지 다른 메모리 액세스를 금지함으로써 이를 강제한다.아무것도 준비되지 않았기 때문에, 이러한 버스 사이클을 수행한 후 모든 CPU 활동이 중지되고 CPU가 복구되도록 재설정되어야 한다.
인텔 마이크로프로세서의 확산으로 인해, 이 개방형 특권 지침의 존재는 당시 심각한 문제로 여겨졌다.운영체제 공급업체들은 이 상태를 감지하고 충돌을 방지하는 해결 방안을 구현하는 것으로 대응했다.[3]버그에 대한 정보는 1997년 11월 8일경 인터넷에 처음 등장했다.[4]F00F 버그가 상식화되었기 때문에, 이 용어는 때때로 Cyrix 혼수상태 버그와 같은 유사한 하드웨어 설계 결함을 설명하기 위해 사용된다.
취약한 시스템에서 F00F 명령을 실행해도 영구적인 하드웨어 손상은 발생하지 않으며 재부팅할 때까지 잠길 뿐이다.그러나 디스크 버퍼가 플러시되지 않았거나, 쓰기 작업 중에 드라이브가 중단되었거나, 일부 다른 비원자성 작업이 중단되었으면 저장되지 않은 데이터의 데이터 손실이 발생할 가능성이 높다.
myB2 스텝은 인텔 펜티엄 프로세서의 이 문제를 해결했다.[2]
F00F 지침은 HCF(Stop and Catch Fire) 지침의 예로 간주할 수 있다.
해결책
이 문제에 대한 확실한 해결책은 일종의 하드웨어/펌웨어 수정이 필요했지만, 그 당시에는[1] 이 문제를 이용하여 영향을 받는 기계에 대한 서비스 거부 공격을 발생시키지 못하게 하는 해결책이 제안되었다.모두 프로세서 행정을 책임지는 결함 있는 버스 접속 패턴을 강제로 해체한 것에 바탕을 두고 있었다.인텔이 제안한 솔루션(따라서 "공식")은 프로세서가 정의되지 않은 opcode 예외에 대한 설명자가 포함된 메모리에 접근할 수 있기 전에 개입 페이지 결함을 강제로 발생시키는 부자연스러운 방법으로 인터럽트 설명자 테이블을 설정할 필요가 있었다.이러한 외부 메모리 액세스는 버스 인터페이스가 버그의 근본 원인인 잠금 요구 사항을 해제하기에 충분한 것으로 밝혀졌다.
구체적으로, 일반적으로 단일 메모리 페이지에 존재하는 인터럽트 설명자 테이블은 대신 처음 7개의 예외 처리기에 대한 설명자가 한 페이지에 있고, 나머지 테이블은 다음 페이지에 위치하도록 2페이지에 걸쳐 분할된다.정의되지 않은 opcode 예외에 대한 처리기는 첫 번째 페이지의 마지막 설명자가 되며, 페이지 오류 예외에 대한 처리기는 두 번째 페이지에 위치한다.이제 첫 번째 페이지는 표시되지 않을 수 있다(보통 다른 데이터를 저장할 공간을 확보하기 위해 디스크로 스왑된 페이지를 나타냄). 그러면 프로세서가 페이지 결함 예외 처리기의 설명자를 가져오게 된다.표의 두 번째 페이지에 있는 이 설명자는 평소와 같이 메모리에 존재한다(만약 그렇지 않다면 프로세서가 이중으로, 그리고 그 다음에 삼중으로 오류가 발생하여 셧다운이 된다.이러한 추가 메모리 사이클은 원래의 불법 명령에서 발행한 메모리 잠금 요구 사항을 무시한다(단층 명령어는 예외 핸들러가 돌아온 후에 다시 시작할 수 있어야 하기 때문이다).그러나 인터럽트 설명자 테이블의 전반부에 누락된 페이지를 제공해야 하는 필요성에 대처하기 위해 페이지 결함 예외에 대한 처리기를 수정해야 한다.
인텔의 두 번째 공식 해결책은 모든 페이지를 메모리에 보관하되 첫 번째 페이지를 읽기 전용으로 표시하는 것을 제안했다.원래 불법 지시는 메모리 쓰기 사이클을 실행하도록 되어 있었기 때문에, 이 정도면 페이지 오류 처리기의 개입을 다시 강요하기에 충분하다.이 변형은 페이지 결함 처리기에 필요한 수정이 첫 번째 변종에 필요한 수정에 비해 매우 작다는 장점이 있다. 이 변형은 기본적으로 정의되지 않은 예외 처리기로 리디렉션하면 된다.그러나, 이 변형은 운영 체제 자체가 (글로벌 프로세서 플래그의 설정을 통해) 읽기 전용 페이지에 쓰는 것을 방지해야 하며, 모든 커널이 이러한 방식으로 설계되는 것은 아니다; 사실 더 최근의 커널은, 이것은 쓰기 방식의 복사를 구현하는 데 사용되는 동일한 기본 메커니즘이기 때문이다.
인텔의 공식 해결책 외에 추가적인 해결책이 제안되었다. 많은 경우 이러한 해결책은 효과적이고 구현이 훨씬 쉽다는 것이 입증되었다.[1]가장 간단한 것은 인터럽트 설명자가 포함된 페이지를 캐시 불가능으로 표시하는 것이었습니다.이번에도 예외 핸들러를 호출할 때마다 프로세서가 RAM에서 데이터를 가져오기 위해 강제로 거쳐야 했던 추가 메모리 사이클이 프로세서가 잠기지 않도록 하는 데 필요한 것으로 보였다.이 경우 예외 처리기에 대한 어떠한 수정도 필요하지 않았다.그리고, 엄격히 필요한 것은 아니지만, 이 경우에는 인터럽트 설명자 테이블의 동일한 분할이 수행되었고, 첫 페이지만 캐시 불가로 표시되었다.대부분의 설명자(그리고 사실 더 자주 필요한 설명자)가 들어 있는 페이지가 캐시에 남아 있을 수 있기 때문에 성능상의 이유 때문이었다.
알 수 없는 이유로, 이러한 추가적이고 비공식적인 해결책은 인텔에 의해 승인되지 않았다.영향을 받는 모든 프로세서 버전에서 작동하지 않을 수 있다는 의심이 들 수도 있다.
참고 항목
참조
- ^ a b c Collins, Robert R. (May 1, 1998). "The Pentium F00F Bug". Dr. Dobb's Journal. Retrieved 27 July 2015.
- ^ a b Intel (1998). "81. Invalid Operand with Locked CMPXCHG8B Instruction". Pentium® Processor Specification Update, Version-041 [Release Date January 1999] (PDF). Santa Clara, CA, USA: Intel. p. 51f. Archived from the original (PDF) on 4 March 2016. Retrieved 27 July 2015. 이 사양 업데이트의 시작은 다음과 같다.
문제: CMPXCHG8B 명령은 EDX와 EAX의 8바이트 값을 메모리(대상 피연산자)의 8바이트 값과 비교한다.이 지침에 유효한 대상 피연산자는 메모리 피연산자뿐입니다.대상 피연산자가 레지스터인 경우 프로세서가 잘못된 opcode 예외를 생성해야 하며 CMPXCHG8B 명령의 실행을 중지해야 하며 프로세서가 잘못된 opcode 예외 핸들러를 실행해야 한다.이 에라타트는 LOCK 접두사를 (잘못된) 레지스터 대상 피연산자와 함께 CMPXCHG8B 명령과 함께 사용할 경우 발생한다.이 경우, 버스가 잠겨 있기 때문에 프로세서가 잘못된 opcode 예외 핸들러의 실행을 시작하지 못할 수 있다.이로 인해 시스템이 중단된다.시사: CMPXCHG8B 지침 및 LOCK 접두사와 함께 (잘못된) 레지스터 대상 피연산자를 사용할 경우 시스템이 중단될 수 있다.메모리 데이터가 손상되지 않았으며 사용자가 정상 작동으로 돌아가기 위해 시스템 재설정을 수행할 수 있다.이 에라타 발생에 필요한 특정 유효하지 않은 코드 시퀀스는 일반적으로 프로그래밍 과정에서 생성되지 않으며, 상업적으로 사용할 수 있는 소프트웨어에서 생성되는 것으로 Intel에 의해 알려진 시퀀스도 아니다.이 에라타트는 Pentium 프로세서, MMX 기술이 적용된 Pentium 프로세서, MMX 기술이 적용된 Pentium OverDrive 프로세서, MMX 기술이 적용된 Pentium OverDrive 프로세서에만 적용된다.Pentium Pro 프로세서, Pentium II 프로세서 및 i486TM 및 이전 프로세서는 영향을 받지 않음…
- ^ "torvalds/linux". GitHub. Retrieved 2021-07-09.
{{cite web}}
: CS1 maint : url-status (링크) - ^ Hovers, Onno; et al. (8 November 1997). "Nieuwe Intel Pentium Bug" [New Intel…] (newsgroup thread, 38 posts by 22 authors) (in Dutch). Newsgroup: nl.comp.hardware. Retrieved 27 July 2015.
Als je er nog niet over gehoord hebt, er is een nieuwe Intel Pentium BUG. Daardoor is het vanuit userspace mogelijk om de Pentium helemaal te laten crashen met 1 instructie. De bug doet zich voor op de Intel Pentium en de Intel Pentium MMX. De bug doet zich niet voor op de Intel Pentium Pro, de Intel Pentium II, de chips van AMD, Cyrix e.d. Deze bug is alleen van belang voor sommige mensen die een multiuser (shell) systeem draaien op een Intel Pentium. Op zo'n systeem kan elke user het systeem crashen…
추가 읽기
- Crothers, Brooke (November 10, 1997). "Net reacts to "F0" Pentium bug". CNET News. online. Retrieved 27 July 2015.
- Collins, Robert R. (May 1, 1998). "The Pentium F00F Bug". Dr. Dobb's Journal. Retrieved 27 July 2015.
- "PC World". 16. 1998: 55. Retrieved 27 July 2015.
{{cite journal}}
:Cite 저널은 필요로 한다.journal=
(도움말)
외부 링크
- 인텔 펜티엄 에라타
- Microsoft 기술 자료 문서
- F00F CVE 버그 입력