저는 컴퓨터 보안 시험을 공부하고 있는데 다음 샘플 질문을 이해하는 데 어려움을 겪고 있습니다.
'x86의 링 0에서 실행하는 것과 Linux에서 UID 0으로 실행하는 것의 차이점을 설명하세요. 각각은 가능하지만 다른 하나는 그렇지 않은 예를 들어보세요.'
현재 제가 알고 있는 바에 따르면 x86의 링 0은 가장 권한이 높은 OS 수준이고 커널 코드는 링 0에서 실행됩니다. UID 0은 기본적으로 무엇이든 실행할 수 있는 Linux 수퍼유저입니다. 현재 이러한 개념을 이해하고 있으므로 이 질문에 어떻게 답해야 할지 모르겠습니다.
이것은 숙제 문제가 아니며 성적을 매기는 것이 아니며 학습 자료일 뿐입니다.
답변1
당신의 이해가 정확합니다. "링 0"은 프로세서의 커널 모드를 나타내는 x86 용어입니다. "링 0에서 실행"은 "커널 코드"를 의미합니다.
보안 측면에서 프로세스(UID 하에서)가 수행할 수 있는 모든 작업은 커널에서 수행될 수 있습니다. 파일 열기와 같은 일부 작업은 커널 코드에서 수행하기 매우 불편하지만 가능합니다.
반대로, 일반적인 상황에서는 UID 0에서 코드를 실행할 수 있으면 커널 모듈을 로드하여 커널 코드를 실행할 수 있습니다. 따라서 일반적인 구성에서는 UID 0과 커널 수준 사이에 보안 장벽이 없습니다. 그러나 프로세스에서 실행되는 코드는 여전히 프로세서 사용자 모드의 제한 사항에 의해 제한됩니다. 즉, 주변 장치(디스크, 네트워크 등 포함)에 대한 모든 액세스는 여전히 시스템 호출을 거쳐야 합니다. 강력하지 않은 UID 0을 갖도록 시스템을 구성하는 것이 가능합니다. 예를 들면 다음과 같습니다.
- 커널 모듈 로딩을 비활성화합니다.
- 사용보안 프레임워크~와 같은SELinux프로세스에서 권한을 빼앗기 위해: UID 0이 반드시 그 권한보다 우선하는 것은 아닙니다. 예를 들어 UID 0으로 게스트 계정을 만드는 것이 가능하지만 올바른 SELinux 정책에서는 기본적으로 권한이 없습니다.
- UID 0사용자 네임스페이스네임스페이스 작성자의 권한만 가집니다.