OS가 메모리 액세스 위반을 감지하는 방법 보안, 무결성 및 그와 같은

운영 체제 (바람직하게는 Linux)는 허용되지 않은 메모리 위치에 액세스했음을 어떻게 알 수 있습니까?

이 질문은 그 망할 포인터에서 영감을 얻었습니다! 내가 보는 방식 : 컴퓨터의 모든 것은 속도, 보안, 무결성 및 그와 같은 것들 사이의 절충에 관한 것입니다.

나는 리눅스에서 메모리 맵을 잘 알고 있지만 커널이 액세스하려는 위치가 액세스 할 때마다 유효한 범위에 있는지 확인한다는 것은 약간 우스운 소리입니다. 너무 많은 시간을 낭비하는 것처럼 들리는데, 이는 더 생산적인 일을하는데 사용될 수 있습니다 (그러나 점검하지 않으면 덜 안전합니다!). 아니면 모든 최근 액세스를 기억하고 모든 하드웨어 타이머 틱에서 확인합니까? (하지만 안전하지 않은 것처럼 들리지만 다시 느리게 들립니다.)

이 질문에 답이없는 것 같습니다. 내가 항상 궁금했던 것입니다. OS를 대신하여 훌륭하고 편리한 추상화 수준 으로이 작업을 수행 할 하드웨어 섹션이 있다고 생각합니다. 그러나 여전히 모든 컨텍스트 스위치에서 다음 프로세스 메모리 맵을로드해야 할 수 있습니다.

그래, 어쨌든, 나는 조금 간다 : OS는 어떻게 메모리 위반을 감지합니까?

감사



답변

(다음 답변은 “현대적인”데스크탑, 서버 또는 고급 임베디드 플랫폼 (예 : 스마트 폰 및 더 작은 시스템)을 가정합니다. x86 시스템의 경우 최신 수단은 386 이상입니다. 다음 답변은 거의 모든 유닉스와 같은 “현대”OS 또는 95 이후 Windows.)

이것은 OS에서 발생하지 않으며 프로세서, 특히 MMU ( 메모리 관리 장치 )에서 발생 합니다. MMU는 가상 주소 지정을 지원하므로 포인터를 구성하는 비트는 메모리에서 비트의 물리적 위치를 직접 나타내지 않습니다.

일반적인 MMU에서 포인터가 역 참조되면 MMU는 비트를 두 그룹으로 분류합니다. 상위 비트는 페이지 번호를 구성하고 하위 비트는 페이지 내부의 주소를 구성합니다. 대부분의 데스크톱 및 서버 시스템은 4kB 페이지를 사용합니다. MMU는 TLB 라는 테이블에서 가상 페이지 번호를 찾습니다 ( “프로세스 메모리 맵”이라고합니다). TLB는이 가상 페이지에 해당하는 실제 페이지 수를 나타냅니다. 그런 다음 MMU는 메모리의 실제 페이지에서 데이터를 가져옵니다.

TLB에이 특정 가상 페이지 번호에 대한 항목이 없으면 MMU는 프로세서에 잘못된 액세스가 발생했음을 알립니다. 이를 일반적으로 예외라고합니다.

지금까지 OS에 대해서는 언급하지 않았습니다. 이 모든 작업이 OS와 독립적이기 때문입니다. OS는 두 가지 방식으로 구성하기 때문에 작동합니다.

  • OS는 작업 전환을 담당합니다. 그렇게하면 예상 한대로 현재 TLB를 저장하고 다음 예약 된 작업을 위해 저장된 TLB로 바꿉니다. 이러한 방식으로 각 프로세스에는 TLB가 있으므로 0x123456프로세스 X의 주소는 프로세스 Y의 동일한 주소와 동일한 RAM의 실제 위치를 가리 키지 않거나 단순히 유효하지 않을 수 있습니다. 프로세스가 주소 공간 외부에서 포인터를 역 참조하려고하면 다른 프로세스 공간에 도달 하지 않고 아무데도 도달 하지 않습니다 .

  • OS는 예외가 발생할 때 발생하는 사항을 결정합니다. 유효하지 않은 메모리 액세스를 수행하는 프로세스 (세그먼트 결함, 일반 보호 결함 등)를 종료 할 수 있습니다. 이는 스와핑이 구현되는 방식이기도합니다. 예외 핸들러는 스왑 공간에서 일부 데이터를 페치하고 이에 따라 TLB를 업데이트 한 후 다시 액세스를 수행하기로 결정할 수 있습니다.

프로세스가 자체 TLB를 변경할 수 없으므로 MMU는 보안을 제공합니다. OS 커널 만 TLB를 변경할 수 있습니다. TLB 변경 권한의 작동 방식은이 답변의 범위를 벗어납니다.


답변

1) Segfault는 메모리 관리 장치에 의해 감지됩니다. 메모리를 요청하면 OS는 메모리 관리 장치에 하드웨어에서 일부를 가져 오도록 요청합니다. OS가 제공하는 모든 큰 메모리 블록을 추적하는 무언가가 있어야합니다. MMU에 맡겨진 OS 종류. 그것은 당신에게주는 모든 메모리를 알고 있기 때문에 할당에서 얻지 못한 메모리 위치에 액세스하려고 할 때도 알 수 있습니다 .OS는 특별히이 이벤트를 가지고 있습니다. 결국 OS는 앱을 종료하여 segfault 또는 다른 OS에서 동등한 기능을 트리거합니다.

모든 OS에이 보호 기능이있는 것은 아닙니다. MMU가이를 지원했지만 MacOS 최대 9까지는이 중 하나도 없었습니다. Win 3.1도 마찬가지였습니다. Win95는 보호 기능이없는 것과 추가하는 것 사이를 전환하면서 약간의 보호 기능을 가지고있었습니다.

2) OS는 이것 이외의 세부 사항을 모른다. 할당하지 않은 메모리에 액세스하는 길 잃은 포인터가 있으면 알고 있습니다. 응용 프로그램의 다른 부분에 해당되는 것이 있으면 물론 알 수 없습니다. 이를 손상시킬 수 있습니다. 여기에서 앱의 다른 부분을 덮어 쓰는 앱의 포인터가 손상되어 스택이 손상됩니다.

예, 자신의 데이터를 망칠 수 있습니다. 자신의 앱을 덮어 쓰는 길 잃은 포인터가있는 경우 스택을 가져 오는 것이 좋습니다. 스택을 반환하려고 할 때 다른 위반이 발생할 수 있지만 자신의 데이터에 도달하면 알 수 없습니다.

‘보호 없음’보다 더 엄격하게 시도 할 수 있습니다. Electric Fence ( http://perens.com/FreeSoftware/ElectricFence/ ) 라는 도구가있어 MMU를 조금 더 작동시켜 더 많이 감지하게합니다. 결함.