시스템의 빈 공간을 모두 할당하여 다른 프로그램에서 메모리를 읽을 수 있습니까?


26

이론적으로, 사용되지 않는 모든 메모리를 시스템에 할당하고 다른 응용 프로그램이 더 이상 필요하지 않은 메모리를 해제 할 때 더 많은 메모리를 계속 요청하면 다른 응용 프로그램에서 최근에 릴리스 된 메모리를 읽을 수 있습니다 ? 아니면 현대 운영 체제로 어떻게 보호됩니까?

나는 이것에 대한 실용적인 응용 프로그램이 없으며 단지 궁금합니다. "사용 가능한 모든 메모리"를 실제로 할당하는 데 문제가 있음을 알고 있습니다.

편집 : 명확히하기 위해 현재 다른 응용 프로그램에서 할당 한 메모리에 액세스하지 않고 "릴리스 된"메모리에 대해 구체적으로 묻습니다.

답변:


23

아닙니다. 좋은 커널은 프로세스에 발행하기 전에 메모리의 내용을 지워서 제안한 공격의 종류를 정확히 막기 때문입니다.

Unixy 시스템에서는 프로세스가 사용할 수있는 가상 주소 공간의 한계 인 프로그램 중단 을 확장하여 프로세스에 메모리가 할당됩니다 . 프로세스는 커널에게 주소 지정 가능한 공간을 확장하고 싶다고 알려주며, 메모리가 사용 가능하거나 호출이 실패하면 커널이이를 허용합니다. ( brk()시스템 호출 의 이름은 이 개념에서 나옵니다.)

실제로, 사용 가능한 메모리의 큰 블록은 종종 프로그램 중단과 맞대어지지 않습니다. 이는 프로그램 중단을 줄임으로써 프로세스가 메모리를 커널에 반환하는 데 필요한 프로세스입니다. 물론 이것은 모두 시스템의 malloc()및 구현에 따라 다릅니다 free(). 사용 가능한 소스가 있으면 메모리가 반환되는지 여부를 알려줍니다.

malloc()메모리를 초기화하면 메모리를 초기화하지 않고 동일한 프로세스로 brk()이전 free()에 작성된 것이기 때문에 메모리를 초기화 하지 않으면 보안에 영향을 주지 않습니다 .


19

예, 이론적으로 다른 프로세스의 릴리스 된 메모리를 읽을 수 있습니다. 그것은 당시에 수많은 권한 상승 공격의 원천이었습니다. 이 때문에 오늘날 운영 체제는 이전에 다른 프로세스에서 메모리를 할당 한 경우 효과적으로 메모리를 제로화합니다. 메모리가 항상 0으로 표시되지 않는 이유는 메모리가 이전에 동일한 프로세스에 의해 할당 된 경우 메모리를 0으로 지우지 않는 것이 더 효율적이기 때문입니다. OS는 가능한 경우 메모리 페이지를 동일한 프로세스로 되돌리려 고합니다.


1
"예, 아니오"는 "아니요"입니다. @Blrfl이 옳습니다.
로스 패터슨

4
@RossPatterson : 이론 상으로는 Karl이 실제로 나보다 옳습니다. 실제 현실은 주류 OS가 그 구멍을 몇 년 전에 닫았다는 것입니다.
Blrfl

@Blrfl 이해했습니다. 그러나 "몇 년 전"은 페이징 시스템과 가상 메모리가 처음 소개 된 1960 년대 후반이었습니다. 확실히 Multics, VM / 370 및 OS / VS 시대에는. 버그가 없으면 대부분의 연습 프로그래머의 기억으로는 불가능했습니다.
로스 패터슨

The reason you don't always see zeroed out memory is because it is more efficient not to zero out the memory if it was previously allocated by the same process 여기에 약간의 불일치가 있습니다. "같은 실행 파일"을 의미 했습니까? 디스크 경로를 통해 제로화되지 않는지 어떻게 확인합니까?
jakub.g

1
뭔가 빠진 것 같아요. 그렇다면 초기화되지 않은 정수로 일부 C ++ 프로그램을 컴파일하고 실행할 때 변수를 읽을 때 0이 아닌 이유는 무엇입니까?
jakub.g

2

여기에 답변에 영향을주는 몇 가지 계층이 있습니다.

최신 가상 메모리 운영 체제를 가정하면 할당 한 페이지에서 다른 프로세스 데이터의 나머지를 볼 수 없습니다.

프로세스가 처음로드되면 페이지 테이블이로드되고 잠재적으로 실제 메모리 프레임이 해당 페이지에 할당됩니다. 최소한 페이지 테이블 또는 보충 테이블에는 프로세스가 할당 할 수있는 모든 메모리의 맵이 포함됩니다. 또한 위에서 언급 한 초기 프로세스 중단이 설정됩니다.

malloc ()이 프로세스가 허용되는 경우 프로세스 나누기를 변경하여 프로세스 페이지 (보조 페이지) 테이블에 더 많은 페이지를 추가하여 요청을 충족시킬 수 있지만 한 프로세스가 다른 프로세스를 "가져올"수있는 장소는 하위 실제 메모리 계층

이 두 가지 시나리오에서 요구 페이징 또는 지연 할당을 사용하는 최신 운영 체제는 아직 물리적 메모리 (프레임)를 할당하지 않습니다. 운영 체제는 해당 프로세스의 가상 메모리가 유효한 것으로 간주되는 "메모 작성"입니다. 실제 메모리는 필요할 때만 할당됩니다.

가상 페이지가 구현되어 프로세스 페이지 테이블에 맵핑 될 때 실제 메모리 또는 프레임이 프로세스에 할당됩니다. 데이터 노출의 가능성이 존재합니다. 이것은 페이지 오류 중에 발생합니다. 노출은 이전 프로세스가 동일한 프레임을 사용하고 있었으며 현재 실제 메모리 요청을위한 공간을 만들기 위해 데이터가 버려지거나 스왑 아웃 되었기 때문입니다. 프로세스를 재개하기 전에 요청 프로세스 데이터가 올바르게 교환되거나 프레임이 지워지도록 운영 체제가주의해야합니다. 이것은 또한 "오래되었지만 해결 된"문제로 언급됩니다.

이것은 다른 프로세스 메모리가 "릴리스"되었는지 아닌지에 관계가 없습니다. "해제 된"다른 프로세스 메모리는 여전히 해당 프로세스에 할당 된 페이지에 상주하며 일반적으로 프로세스가 종료 될 때까지 메모리가 부족하거나 제거 될 때 스왑 아웃되므로 매핑 해제되지 않습니다. malloc () 및 free ()는 프로세스에 할당 된 가상 메모리를 (사용자) 수준에서 관리합니다.

귀하의 질문에 따르면 귀하의 프로세스는 이론적으로 더 많은 메모리를 계속 요청하여 다른 모든 프로세스를 메모리에서 밀어냅니다. 실제로는 글로벌 및 로컬의 프레임 할당 전략이 있으며 이에 대한 답변도 영향을받습니다. 운영 체제 및 기타 모든 프로세스를 오버런하기 전에 프로세스가 자체 페이지를 메모리에서 강제로 제거 할 수 있습니다. 이것은 당신의 초기 질문을 넘어서지 만.

이 모든 것은 MS-DOS와 같은 시스템에서 헛소리입니다. MS-DOS (및 기타 간단한 시스템)는 가상 메모리를 단독으로 사용하지 않으므로 다른 "프로세스"데이터를 쉽게 찌를 수 있습니다.

리눅스 소스 코드보다 이해하기 쉬운 좋은 참고 문헌은 좋은 운영 체제 교과서, Silberscatz, Gavin, Gange의 운영 체제 개념 또는 Andrew Tanenbaum의 운영 체제 설계 일 것입니다. Berkeley의 Nachos 또는 Stanford의 Pintos와 같은 것은 학습을 위해 만들어진 작은 운영 체제이며 그 안에 동일한 아이디어가 있습니다.


0

16.04 개월 전에 우분투에서 이것을 시도했습니다. 0xACE가 말했듯이 현대 OS는 malloc ()을 호출하면 0의 가상 페이지를 할당합니다. 그러나 할당 된 버퍼에 아무것도 쓰지 않으면 실제 메모리 (즉, 기록 중 복사 원칙)에 매핑되지 않으므로 항상 "초기화되지 않은"블록에서 0을 읽습니다. 더 나은 성능을 위해 "CONFIG_MMAP_ALLOW_UNITIALIZED"옵션으로 컴파일 된 일부 임베디드 OS가있을 수 있습니다.이 경우 원하는 성능을 얻을 수 있습니다.


-1

아니요, 이것은 페이징 의 마술 덕분에 다른 프로그램이 다른 프로그램의 메모리를 읽을 수 없도록 합니다. 이러한 방식으로 전체 메모리 사용량은 일부를 하드 드라이브로 오프로드하여 실제 램을 초과 할 수 있습니다.

또한 프로세스가 할당 할 수있는 최대 메모리는 OS에 의해 임의로 제한되며 (32 비트 아키텍처의 경우 최대 4 기가) 다음 alloc호출에서 메모리 부족 오류가 반환됩니다.


이를 우회 할 수있는 플랫폼 별 API가 없습니까? 솔직히 모르겠지만 놀라지 않을 것입니다 (예를 들어, Linux는 OS가 페이지를 통해 물리적 메모리에서 페이지를 이동시키지 못하게합니다 mlock).

4GB의 RAM이 있고 페이징이 8GB로 제한되는 경우 응용 프로그램에서 12GB (x64)를 요청하면 어떻게됩니까?
Arseni Mourzenko

사용 가능한 메모리가 너무 적 으면 시스템 호출에서 오류를 반환해야합니다. 또는 남아있는 공간이 없을 때 컴퓨터가 정지하기
ratchet freak

4
그는 다른 사람의 기억을 읽는 것이 아니라 RELEASED 기억을 읽는 것입니다. 램의 해당 부분은 현재 비어 있으며, .... 나는 생각하지 않습니다 ... 페이징 체계는 메모리가 해제 된 후 메모리를 0으로 만듭니다. 따라서 프로그램은 메모리 블록을 할당하고 이미 존재하는 초기화되지 않은 데이터를 분석합니다.
Philip

@ philip 맞습니다. 릴리스 된 메모리에 대해 구체적으로 묻습니다.
ConditionRacer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.