기술(IT)

메모리 보호 (Memory Protection)

2019. 10. 22.
728x90

메모리 보호는 컴퓨터의 메모리 액세스 권한을 제어하는 방법으로 대부분의 최신 명령 집합 아키텍처와 운영 체제의 일부분이다. 메모리 보호의 목적은 프로세스가 할당되지 않은 메모리에 액세스하는 것을 방지하는 것이다. 이는 프로세스 내의 버그나 멀웨어가 다른 프로세스 또는 운영 체제 자체에 영향을 미치는 것을 방지한다. 보호는 메모리의 특정 영역에 대한 모든 접근, 쓰기 접근 또는 해당 영역의 내용을 실행하려는 시도를 포함할 수 있다. 소유하지 않은 메모리에 액세스하려고 하면 분할 오류 또는 스토리지 위반 예외라고 하는 하드웨어 결함이 발생하여 일반적으로 위반 프로세스가 비정상적으로 종료된다. 컴퓨터 보안을 위한 메모리 보호에는 주소 공간 레이아웃 랜덤화 및 실행 공간 보호와 같은 추가 기술이 포함된다.


분할 (segmentation)
메모리 위치에 대한 참조에는 세그먼트와 해당 세그먼트 내의 오프셋을 식별하는 값이 포함된다. 분할이란 컴퓨터의 메모리를 세그먼트로 나누는 것을 말한다.  x86 아키텍처는 다중 분할 기능을 가지고 있으며, 이는 이 아키텍처에서 보호된 메모리를 사용하는 데 유용하다. x86 아키텍처에서, 글로벌 기술자 표와 로컬 기술자 표를 사용하여 컴퓨터 메모리의 세그먼트를 참조할 수 있다. x86 프로세서의 메모리 세그먼트에 대한 포인터도 프로세서의 세그먼트 레지스터에 저장할 수 있다. 

페이징된 가상 메모리
페이징을 지원하는 대부분의 컴퓨터 아키텍처들은 또한 페이지를 메모리 보호를 위한 기초로 사용한다. 호출할 때 메모리 주소 공간은 페이지라고 불리는 동일한 크기의 블록으로 나뉜다. 가상 메모리를 사용하면 선형 가상 메모리 주소 공간을 확보하고 이를 사용하여 물리적 메모리 주소 공간에 분산된 블록에 액세스할 수 있다. 페이지 테이블은 가상 메모리를 물리적 메모리에 매핑한다. 페이지 테이블은 보통 프로세스에 보이지 않는다. 페이지 테이블은 물리적 메모리의 어느 곳에서든 새 페이지를 할당할 수 있기 때문에 추가 메모리를 더 쉽게 할당할 수 있도록 한다. 모든 메모리 주소는 해당 애플리케이션에 할당된 페이지를 가리키거나 페이지 장애라고 하는 인터럽트를 생성하기 때문에 애플리케이션이 명시적으로 할당되지 않은 페이지에 접근하는 것은 불가능하다. 할당되지 않은 페이지와 다른 응용 프로그램에 할당된 페이지는 응용 프로그램 관점에서 어떠한 주소도 가지고 있지 않다. 페이지 결함은 반드시 오류를 나타내지는 않을 수 있다. 페이지 고장은 메모리 보호에만 사용되는 것이 아니다. 운영 체제는 이전에 디스크로 스왑 아웃된 페이지에 대한 참조가 페이지 결함을 발생시키는 방식으로 페이지 테이블을 관리할 수 있다. 운영체제는 페이지 결함을 가로채고, 필요한 메모리 페이지를 로드하고, 결함은 없었던 것처럼 애플리케이션을 계속한다. 가상 메모리로 알려진 이 체계는 현재 사용 중이 아닌 인메모리 데이터를 디스크 스토리지로 이동한 후 애플리케이션에 투명한 방식으로 다시 이동하여 전체 메모리 용량을 증가시킬 수 있도록 한다. 일부 시스템에서는 페이지 장애 메커니즘이 실행 가능한 공간 보호에도 사용된다.

보호 키 (Protection keys)
메모리 보호 키 메커니즘은 물리적 메모리를 특정 크기의 블록으로 나누고, 각각은 보호 키라고 불리는 관련 숫자 값을 가진다. 각 프로세스에는 이와 관련된 보호 키 값도 있다. 메모리 액세스에서 하드웨어는 현재 프로세스의 보호 키가 액세스 중인 메모리 블록과 관련된 값과 일치하는지 점검한다. 그렇지 않으면 예외가 발생한다. 이 메커니즘은 시스템/360 아키텍처에 도입되었다. 실행 중인 프로세스에는 여러 개의 보호 키 레지스터가 있다. 가상 주소에서 선택한 변환에는 각 보호 키 레지스터와 비교하여 키가 있다. 그것들 중 하나라도 일치하면, 접근이 허용된다. 일치하는 항목이 없으면 결함 또는 예외가 발생함. 소프트웨어 결함 처리기는 필요할 경우 누락된 키를 소프트웨어에 의해 유지되는 더 큰 키 목록과 대조하여 확인할 수 있으므로, 프로세서 내부의 보호 키 레지스터는 프로세스와 관련된 더 큰 키 목록의 소프트웨어 관리 캐시로 취급될 수 있다. x86에서 보호 키 아키텍처는 16개의 보호 키 중 하나로 사용자 페이지의 가상 주소 태그를 지정할 수 있다. 동일한 보호 키로 태그된 모든 페이지는 보호 도메인을 구성한다. 새 레지스터에는 각 보호 도메인과 관련된 사용 권한이 포함되어 있다. 로드 및 저장 작업은 가상 주소의 보호 도메인과 관련된 페이지 테이블 사용 권한과 보호 키 사용 권한 모두에 대해 검사되며, 두 사용 권한이 모두 액세스를 허용하는 경우에만 허용된다. 보호 키 사용 권한은 사용자 공간에서 설정할 수 있으므로 OS 개입 없이 애플리케이션이 애플리케이션 데이터에 대한 액세스를 직접 제한할 수 있다. 보호 키는 가상 주소와 연결되어 있으므로 보호 도메인은 주소 공간당 있으므로 서로 다른 주소 공간에서 실행되는 프로세스는 각각 16개의 도메인을 모두 사용할 수 있다.

시뮬레이션된 분할
CPU에 적절한 시설이 존재하는 경우에는 컴퓨터에서 귀중한 처리 능력을 소모하므로 일반적으로 메모리 보호 방법을 사용하는 것은 바람직하지 않다. 그러나 일반적으로 디버깅 및 테스트 목적으로 일반적인 스토리지 위반에 대해 세부적인 수준을 추가로 제공하기 위해 사용되며, 보호되지 않은 스토리지와 동일한 스토리지 키를 가질 수 있는 스토리지의 특정 섹션을 덮어쓰려는 지침을 정확하게 나타낼 수 있다. 시뮬레이션은 일부 컴퓨터 아키텍처의 기계 코드 지침을 해석하기 위해 모니터링 프로그램을 사용하는 것이다. 이러한 명령 집합 시뮬레이터는 분할 방식과 같은 방식을 사용하고 각 명령의 목표 주소와 길이를 실제로 실행하기 전에 실시간으로 검증함으로써 메모리 보호를 제공할 수 있다. 시뮬레이터는 반드시 목표 주소와 길이를 계산하고 이를 스레드의 시작 이후 획득한 동적 메모리 블록과 유효한 공유 정적 메모리 슬롯과 같은 스레드의 환경과 관련하여 보유하고 있는 유효한 주소 범위 목록과 비교해야 한다. 유효하다는 의미는 문맥에 따라 실의 생애 전반에 걸쳐 변화할 수 있다. 때로는 정적 스토리지 블록을 변경할 수 있고, 때로는 현재 실행 모드에 따라 스토리지 키 또는 감독자 상태에 따라 변경될 수도 있고 그렇지 않을 수도 있다.

기능 기반 주소 지정
기능 기반 주소 지정은 현대 상업용 컴퓨터에서는 사용되지 않는 메모리 보호 방법이다. 이 방법에서 포인터는 커널에 의해서만 실행될 수 있는 특권적인 명령이나 그렇게 하도록 허가된 일부 다른 프로세스를 통해서만 생성될 수 있는 보호대상물체로 대체된다. 이렇게 하면 커널이 별도의 주소 공간이나 컨텍스트 스위치를 사용할 필요 없이 메모리에 있는 어떤 개체에 액세스할 수 있는 프로세스를 효과적으로 제어할 수 있다. 

다이나믹 타인팅 (Dynamic tainting)
동적 테이닝은 프로그램을 불법 메모리 액세스로부터 보호하는 기술이다. 메모리가 할당되면 런타임에 이 기법은 동일한 색인 표시를 사용하여 메모리와 해당 포인터를 모두 색인한다. 그런 다음 프로그램이 실행되는 동안 적절히 도색 표시가 전파되고 포인터 p를 통해 메모리 주소 m에 액세스할 때마다 점검된다. m과 p와 관련된 도색 표시가 다를 경우 실행이 중지되고 불법 액세스가 보고된다. 

LIST

'기술(IT)' 카테고리의 다른 글

프록시 서버 (Proxy Server)  (0) 2019.10.24
페이징 (Paging) 정보  (0) 2019.10.23
서비스 지향 아키텍처 (SOA)  (0) 2019.10.21
PCM (Pulse Code Modulation)  (0) 2019.10.20
ISI (Inter Symbol Interference)  (0) 2019.10.19

댓글

추천 글