CPU 보호 링은 컴퓨터에 설치된 응용 프로그램과 핵심 프로세스 간의 상호 작용을 제한하는 구조적 계층입니다. 일반적으로 가장 바깥쪽 레이어인 Ring 3에서 가장 안쪽 레이어인 Ring 0(커널이라고도 함)까지 다양합니다.
링 0은 모든 시스템 프로세스의 핵심입니다. 커널을 제어할 수 있는 사람은 기본적으로 컴퓨터의 모든 측면을 제어할 수 있습니다. 이 코어의 남용을 방지하기 위해 컴퓨터 시스템 설계자는 상호 작용을 이 영역으로 제한합니다. 따라서 컴퓨터 사용자가 액세스할 수 있는 대부분의 프로세스는 링 3으로 제한됩니다. 그러면 권한 링은 어떻게 작동합니까?
권한 링의 상호 작용 방식
링 0 프로세스는 감독자 모드에서 작동하므로 사용자 입력이 필요하지 않습니다. 이를 방해하면 주요 시스템 오류와 해결할 수 없는 보안 문제가 발생할 수 있습니다. 이것이 컴퓨터 사용자가 액세스할 수 없도록 의도적으로 설계된 이유입니다.
Windows를 예로 들어 보겠습니다. Ring 3 프로세스가 Ring 0에 액세스하는 것은 몇 가지 데이터 명령으로 제한됩니다. 커널에 액세스하려면 링 3의 응용 프로그램이 가상화된 메모리에서 처리하는 연결을 만들어야 합니다. 그럼에도 불구하고 이 작업을 수행할 수 있는 응용 프로그램은 거의 없습니다.
여기에는 네트워크 액세스가 필요한 브라우저와 네트워크 연결이 필요한 카메라가 포함됩니다. 또한 이러한 데이터 호출은 중요한 시스템 프로세스를 직접 방해하는 것을 방지하기 위해 절연됩니다.
일부 이전 Windows 버전(예:Windows 95/98)은 권한 링 사이의 차폐가 적습니다. 이것이 그들이 그렇게 불안정하고 오류가 발생하기 쉬운 주요 이유 중 하나입니다. 최신 시스템에서 커널 메모리 보안은 특수 하드웨어 칩에 의해 강화됩니다.
침입에 대한 현재 Windows 커널 메모리 보호
Microsoft는 Windows 10 버전 1803부터 커널 메모리에 대한 강력한 보호 기능을 도입했습니다.
가장 주목할만한 것은 커널 DMA 보호였습니다. 전체적인 기능은 DMA(직접 메모리 액세스) 공격, 특히 PCI 핫 플러그를 통해 구현되는 공격으로부터 개인용 컴퓨터를 보호하도록 설계되었습니다. 보호 범위는 M.2 슬롯과 같은 내부 PCIe 포트를 포함하도록 빌드 1903에서 확장되었습니다.
Microsoft가 이러한 섹터에 추가 보호를 제공하기로 선택한 주요 이유 중 하나는 PCI 장치가 이미 DMA를 사용할 수 있기 때문입니다. 이 기능을 통해 시스템 프로세서 권한 없이 시스템 메모리를 읽고 쓸 수 있습니다. 이 속성은 PCI 장치가 고성능을 갖는 주된 이유 중 하나입니다.
DMA 보호 프로세스의 미묘한 차이
Windows는 IOMMU(입/출력 메모리 관리 장치) 프로토콜을 사용하여 승인되지 않은 주변 장치가 DMA 작업을 수행하지 못하도록 차단합니다. 그러나 드라이버가 DMA 재매핑을 사용하여 실행되는 메모리 격리를 지원하는 경우 규칙에 예외가 있습니다.
즉, 추가 권한이 여전히 필요합니다. 일반적으로 OS 관리자에게 DMA 인증을 제공하라는 메시지가 표시됩니다. 관련 프로세스를 추가로 수정하고 자동화하기 위해 IT 전문가가 DmaGuard MDM 정책을 변경하여 호환되지 않는 DMA 재매핑 드라이버를 처리하는 방법을 결정할 수 있습니다.
시스템에 커널 DMA 보호가 있는지 확인하려면 보안 센터를 사용하고 메모리 액세스 보호 아래의 코어 격리 세부 정보에서 설정을 확인하십시오. Windows 10 버전 1803 이후에 출시된 운영 체제에만 이 기능이 있습니다.
CPU가 링 1 및 2 권한에 거의 의존하지 않는 이유
링 1과 2는 주로 드라이버와 게스트 운영 체제에서 사용됩니다. 이러한 권한 수준의 코드 대부분은 용도도 일부 변경되었습니다. 따라서 대부분의 최신 Windows 프로그램은 시스템이 커널과 사용자 수준의 두 가지 수준만 있는 것처럼 작동합니다.
즉, VirtualBox 및 Virtual Machine과 같은 가상화 응용 프로그램은 Ring 1을 사용하여 작동합니다.
특권에 대한 마지막 말씀
다중 권한 링 디자인은 x86 시스템 아키텍처로 인해 발생했습니다. 그러나 모든 링 권한 수준을 항상 사용하는 것은 불편합니다. 이로 인해 지연 시간이 늘어나고 호환성 문제가 발생합니다.