메모리 보호

Memory protection

메모리 보호는 컴퓨터의 메모리 액세스 권한을 제어하는 방법이며, 대부분의 현대적인 명령 집합 아키텍처운영 체제의 일부분이다.메모리 보호의 주요 목적은 프로세스가 할당되지 않은 메모리에 액세스하지 못하도록 하는 것이다.이것은 프로세스 내의 버그나 악성 프로그램이 다른 프로세스 또는 운영 체제 자체에 영향을 미치는 것을 방지한다.보호는 특정 메모리 영역에 대한 모든 액세스, 쓰기 액세스 또는 영역의 콘텐츠를 실행하려는 시도를 포함할 수 있다.무단[a] 메모리에 액세스하려고 하면 하드웨어 결함(예: 분할 결함, 스토리지 위반 예외)이 발생하여 일반적으로 위반 프로세스가 비정상적으로 종료된다.컴퓨터 보안을 위한 메모리 보호는 주소 공간 배치 무작위화, 실행 가능한 공간 보호와 같은 추가 기술을 포함한다.

방법들

분할

분할은 컴퓨터의 메모리를 분할하는 것을 말한다.메모리 위치에 대한 참조는 해당 세그먼트 내에서 세그먼트와 오프셋을 식별하는 값을 포함한다.세그먼트 설명자는 특정 에서만 액세스 권한을 제한할 수 있다.

x86 아키텍처는 이 아키텍처에서 보호된 메모리를 사용하는 데 유용한 여러 분할 기능을 가지고 있다.[1]x86 아키텍처에서 글로벌 설명자 테이블로컬 설명자 테이블을 사용하여 컴퓨터 메모리의 세그먼트를 참조할 수 있다.x86 프로세서의 메모리 세그먼트에 대한 포인터는 프로세서의 세그먼트 레지스터에도 저장할 수 있다.처음에 x86 프로세서는 4개의 세그먼트 레지스터, CS(코드 세그먼트), SS(스택 세그먼트), DS(데이터 세그먼트), ES(추가 세그먼트)[1]를 가지고 있었다. 후에 또 다른 2개의 세그먼트 레지스터가 추가되었다. FS와 GS.

페이징된 가상 메모리

페이징에서 메모리 주소 공간이나 세그먼트는 페이지라고 하는 동일한 크기의 블록으로[b] 나뉜다.가상 메모리 하드웨어를 사용하면 각 페이지는 컴퓨터의 물리적 메모리의 적절한 경계에서 임의의 위치에 상주하거나 보호되는 것으로 플래그를 표시할 수 있다.가상 메모리는 선형 가상 메모리 주소 공간을 확보하고 이를 사용하여 물리적 메모리 주소 공간에 조각난 블록에 액세스할 수 있게 해준다.

페이징을 지원하는 대부분의 컴퓨터 아키텍처들은 또한 페이지를 메모리 보호의 기초로 사용한다.

페이지 테이블은 가상 메모리를 물리적 메모리에 매핑한다.아키텍처와 OS에 따라 단일 페이지 테이블, 각 프로세스에 대한 페이지 테이블, 각 세그먼트에 대한 페이지 테이블 또는 페이지 테이블의 계층이 있을 수 있다.페이지 테이블은 보통 프로세스에서 보이지 않는다.페이지 테이블은 각각의 새로운 페이지를 물리적 메모리의 어디에서나 할당할 수 있기 때문에 추가 메모리를 할당하는 것을 더 쉽게 한다.일부 시스템에서는 페이지 테이블 항목이 페이지를 읽기 전용으로 지정할 수도 있다.

일부 운영 체제는 각 프로세스에 대해 서로 다른 주소 공간을 설정하여 하드 메모리 보호 경계를 제공한다.[2]모든 메모리 주소가 해당 애플리케이션에 할당된 페이지를 가리키거나 페이지 장애라는 인터럽트를 생성하기 때문에 권한[c] 없는 응용 프로그램이 명시적으로 할당되지 않은 페이지에 액세스하는 것은 불가능하다.할당되지 않은 페이지와 다른 응용 프로그램에 할당된 페이지는 응용 프로그램 관점에서 주소가 없다.

페이지 결함이 반드시 오류를 나타내는 것은 아닐 수 있다.페이지 결함은 메모리 보호에만 사용되는 것이 아니다.운영 체제는 이전에 2차 저장소로[d] 호출된 페이지에 대한 참조가 페이지 오류를 발생시키는 방식으로 페이지 테이블을 관리할 수 있다.운영체제는 페이지 결함을 가로채고, 필요한 메모리 페이지를 로드하며, 애플리케이션이 마치 고장이 발생하지 않은 것처럼 계속된다.가상 메모리의 일종인 이 체계는 현재 사용하지 않는 메모리 내장 데이터를 보조 스토리지로 이동했다가 애플리케이션에 투명한 방식으로 다시 이동시켜 전체 메모리 용량을 증가시킬 수 있도록 한다.

일부 시스템에서는 가상 스토리지에 대한 요청이 페이지 프레임이 할당되지 않은 가상 주소 블록을 할당할 수 있으며, 시스템은 페이지 장애가 발생할 때만 페이지 프레임을 할당하고 초기화한다.일부 시스템에서는 오류 감지를 위해 또는 데이터 구조를 자동으로 증가시키기 위해 가드 페이지를 사용할 수 있다.

일부 시스템에서는 페이지 결함 메커니즘이 W^X와 같은 실행 가능한 공간 보호에도 사용된다.

보호 키

메모리 보호 키(MPK)[3] 메커니즘은 물리적 메모리를 특정 크기(예: 4 KiB)의 블록으로 나누는데, 각각은 보호 키라고 불리는 관련 수치 값을 가진다.각 프로세스에는 이와 관련된 보호 키 값도 있다.메모리 액세스에서 하드웨어는 현재 프로세스의 보호 키가 액세스 중인 메모리 블록과 관련된 값과 일치하는지 점검하십시오. 그렇지 않으면 예외가 발생한다.이 메커니즘은 시스템/360 아키텍처에 도입되었다.그것은 오늘날의 System z 메인프레임에서 사용 가능하며 System z 운영 체제와 그 하위 시스템에 의해 많이 사용된다.

위에서 설명한 시스템/360 보호 키는 물리적 주소와 연관되어 있다.이는 가상 주소와 연관되어 있으며 프로세스당 복수의 키를 허용하는 Hewlett-Packard/Intel IA-64 및 Hewlett-Packard PA-RISC와 같은 아키텍처가 사용하는 보호 키 메커니즘과는 다르다.

Itanium 및 PA-RISC 아키텍처에서 번역(TLB 항목)은 (Itanium) 또는 액세스 ID(PA-RISC)가 연결된 구조다.실행 중인 프로세스에는 여러 개의 보호 키 레지스터(Itanium의 경우 16개,[4] PA-RISC의[5] 경우 4개)가 있다.가상 주소에서 선택한 변환에는 각 보호 키 레지스터와 비교하여 키가 있다.이들 중 하나라도 일치하는 경우(다른 가능한 검사 포함) 액세스가 허용된다.일치하는 항목이 없으면 오류 또는 예외가 생성된다.소프트웨어 결함 처리기는, 원하는 경우, 소프트웨어에 의해 유지 관리되는 더 큰 키 목록과 비교하여 누락된 키를 확인할 수 있으므로, 프로세서 내부의 보호 키 레지스터는 프로세스와 관련된 더 큰 키 목록의 소프트웨어 관리 캐시로 취급될 수 있다.

PA-RISC는 15–18비트의 키를 가지고 있다. Itanium은 최소한 18비트를 요구한다.키는 일반적으로 라이브러리, 모듈 등과 같은 보호 도메인과 연관된다.

x86에서 보호 키[6] 아키텍처는 16개의 보호 키 중 하나로 사용자 페이지에 대한 가상 주소 태깅을 허용한다.동일한 보호 키로 태그가 지정된 모든 페이지는 보호 도메인을 구성한다.새 레지스터는 각 보호 도메인과 관련된 권한을 포함한다.로드 및 저장소 작업은 가상 주소의 보호 도메인과 관련된 페이지 테이블 권한과 보호 키 권한 모두에 대해 확인되며, 두 권한이 모두 액세스를 허용하는 경우에만 허용된다.사용자 공간에서 보호키 권한을 설정할 수 있어 OS 개입 없이 애플리케이션 데이터에 대한 액세스를 애플리케이션이 직접 제한할 수 있다.보호 키는 가상 주소와 연관되어 있기 때문에 보호 도메인은 주소 공간마다 다르기 때문에 서로 다른 주소 공간에서 실행되는 프로세스는 각각 16개의 도메인을 모두 사용할 수 있다.

보호 링

그것으로부터 파생된 Multics 및 시스템에서, 각 세그먼트는 읽기, 쓰기 및 실행을 위한 보호 링을 가지고 있다; 세그먼트의 링 번호보다 더 높은 링 번호를 가진 프로세스에 의한 시도가 결함을 야기한다.더 낮은 링에서 실행되는 절차를 안전하게 호출하고 더 높은 링으로 되돌리는 메커니즘이 있다.낮은 링 번호로 실행되는 루틴이 자신의 링과 발신자의 링 중 더 큰 링을 가진 파라미터에 접근하기 위한 메커니즘이 있다.

시뮬레이션 분할

시뮬레이션은 일부 컴퓨터 아키텍처의 기계 코드 명령을 해석하기 위한 모니터링 프로그램의 사용이다.그러한 명령 집합 시뮬레이터는 분할과 같은 체계를 사용하고 실제로 명령어를 실행하기 전에 각 명령의 목표 주소와 길이를 실시간으로 검증함으로써 메모리 보호를 제공할 수 있다.시뮬레이터는 반드시 대상 주소와 길이를 계산하고 스레드의 개시 이후 획득한 동적 메모리 블록과 유효한 공유 정적 메모리 슬롯과 같이 스레드의 환경과 관련하여 보유하고 있는 유효한 주소 범위 목록과 비교해야 한다."유효한"의 의미는 문맥에 따라 실의 수명 전반에 걸쳐 바뀔 수 있다.보관 키 또는 감독자 상태에 따라 달라질 수도 있고 그렇지 않을 수도 있는 현재 실행 모드에 따라 저장소의 정적 블록을 변경할 수도 있다.[citation needed]

CPU에 적절한 설비가 있는 경우 컴퓨터의 귀중한 처리 능력을 필요로 하기 때문에 일반적으로 메모리 보호 방법을 사용하는 것은 바람직하지 않다.그러나 일반적으로 디버깅 및 테스트 목적으로 사용되며 그렇지 않은 경우 일반 스토리지 위반에 대한 세분화 수준을 추가로 제공하기 위해 사용되며, 보호되지 않은 스토리지와 동일한 스토리지 키를 가질 수 있는 스토리지의 특정 섹션을 덮어쓰려는 지침을 정확하게 나타낼 수 있다.

기능 기반 주소 지정

기능 기반 주소 지정은 현대의 상용 컴퓨터에서는 사용되지 않는 메모리 보호 방법이다.이 방법에서 포인터는 커널에 의해서만 실행될 수 있는 특권적 명령이나 그렇게 하도록 허가된 일부 다른 프로세스를 통해서만 생성될 수 있는 보호된 개체(기능이라고 함)로 대체된다.[citation needed]이를 통해 커널은 별도의 주소 공간이나 컨텍스트 스위치를 사용할 필요 없이 메모리에 있는 개체에 액세스할 수 있는 프로세스를 효과적으로 제어할 수 있다.일부 상용 제품만 기능 기반 보안을 사용:Plessey System 250, IBM System/38, Intel iAPX 432 아키텍처 및 KeyKOS.역량 접근은 EROS, 컴벡스 DARPA 브라우저와 같은 연구 시스템에 널리 사용된다.이들은 개념적으로 일부 가상 머신, 특히 스몰토크자바를 기반으로 사용된다.현재 케임브리지 대학의 DARPA가 지원하는 CERI 프로젝트는 레거시 소프트웨어도 지원하는 현대적인 능력 기계를 만드는 작업을 하고 있다.

다이나믹 타인팅

동적 태닝은 불법 메모리 액세스로부터 프로그램을 보호하는 기술이다.메모리가 할당될 때, 런타임에, 이 기술은 동일한 색상을 사용하여 메모리와 해당 포인터를 모두 손상시킨다.그런 다음 프로그램이 실행되는 동안 얼룩 마크는 적절하게 전파되며, 포인터 p를 통해 메모리 주소 m에 접근할 때마다 확인된다. m과 p와 관련된 얼룩 마크가 다를 경우 실행을 중지하고 불법 액세스가 보고된다.[7][8]

SPARC M7 프로세서(이상)는 하드웨어에서 동적 태인을 구현한다.Oracle은 이 기능을 SMSM(Silicon Secured Memory)(이전의 ADI(Application Data Integrity)[9] 브랜드로 마케팅한다.

저RISC CPU 설계에는 Tagged Memory라는 이름으로 동적 태인화가 포함된다.[10]

방안

특정 구현의 보호 수준은 최소 특권의 원칙에 얼마나 밀접하게 부합하는가에 의해 측정될 수 있다.[11]

서로 다른 운영 체제에서 메모리 보호

서로 다른 운영체제는 다른 형태의 메모리 보호나 분리를 사용한다.메모리 보호는 1960년대부터 대부분의 메인프레임과 많은 미니컴퓨터 시스템들에서 공통적으로 사용되었지만, 1987년 OS/2 (및 RISC OS에서)가 출시되기 전까지는 가정용 컴퓨터 운영체제에서는 진정한 메모리 분리가 사용되지 않았다.이전 시스템에서는 이러한 보호 부족이 프로세스 포인터를 보내 프로세스 간 통신의 한 형태로까지 사용되었다.윈도우즈 9x 운영 체제 제품군에서 시스템 메모리에 액세스하는 프로세스가 가능하다.[12]

메모리 보호를 구현하는 일부 운영 체제에는 다음이 포함된다.

Unix와 유사한 시스템에서는mprotect 시스템 호출은 메모리 보호를 제어하기 위해 사용된다.[14]

참고 항목

참조

  1. ^ a b Intel (July 2008). Intel 64 and IA-32 Architectures Software Developer's Manuals: Volume 3A: System Programming Guide, Part 1 (PDF). Intel. Retrieved 2008-08-21.
  2. ^ 제프리 S.체이스; 헨리 M.레비; 마이클 J.필리와 에드워드 D.라조즈카."단일 주소 공간 운영 체제에서 공유 보호". doi:10.1145/195792.195 1993. 페이지 2
  3. ^ 메모리 보호 키, Jonathan Corbet, 2015년 5월 13일, LWN.net
  4. ^ "Keys in Itanium" (PDF). Archived from the original (PDF) on 2007-11-28.
  5. ^ "Memory protection in HP PA-RISC" (PDF). February 1994. Archived from the original (PDF) on 2015-09-05. Retrieved 2018-10-29.
  6. ^ "Intel Software Developer Manual" (PDF). March 2012. Archived from the original (PDF) on 2012-06-01. Retrieved 2018-10-29.
  7. ^ Clause, James; Doudalis, Ioannis; Orso, Alessandro; Prvulovic, Milos (2007). Effective memory protection using dynamic tainting (PDF). Proceedings of the Twenty-second IEEE/ACM International Conference on Automated Software Engineering. p. 284. doi:10.1145/1321631.1321673. ISBN 9781595938824. S2CID 6334541.
  8. ^ Doudalis, Ioannis; Clause, James; Venkataramani, Guru; Prvulovic, Milos; Orso, Alessandro (2012). "Effective and Efficient Memory Protection Using Dynamic Tainting" (PDF). IEEE Transactions on Computers. 61 (1): 87–100. doi:10.1109/TC.2010.215. ISSN 0018-9340. S2CID 15913190.
  9. ^ Jenkins, Michelle. "Oracle Announces Breakthrough Processor and Systems Design with SPARC M7". www.oracle.com. Retrieved 2016-11-18.
  10. ^ "Tagged memory support". www.lowrisc.org. Retrieved 2018-05-24.
  11. ^ 1978년 5월 조지아 주 애틀랜타에서 열린 제3차 소프트웨어 엔지니어링 국제회의에 참석한 D.J. 측정 메모리 보호.
  12. ^ "Windows 9x does not have true memory protection". Everything2. 2000-06-24. Retrieved 2009-04-29.
  13. ^ "Pharos".
  14. ^ "mprotect". The Open Group Base Specifications Issue 6. The Open Group.

메모들

  1. ^ 아키텍처에 따라 할당되지 않은 페이지 및 세그먼트, 다른 보호 도메인의 페이지, 더 높은 권한 수준을 요구하는 페이지를 포함할 수 있다.
  2. ^ z/OS와 같은 일부 시스템은 페이지 크기를 두 개 이상 지원한다.
  3. ^ 일부 시스템에는 실제 주소로 스토리지 액세스하기 위한 권한이 부여된 지침이 있다.
  4. ^ 초기에는 페이징을 공유하는 것이 보통 자기 드럼에 대한 것이었다. 현대 시스템에서는 페이징은 보통 하드 디스크나 솔리드 스테이트 장치에 대한 것이다.

외부 링크