프로세스와 리눅스 커널 사이의 상호작용에 관한 질문입니다. 이는 형식적인 증명의 맥락이므로 설정이 조금 이상해 보일 수 있습니다. 일반적인 방법으로 ELF 파일에서 로드된 프로그램이 있고 "승인되지 않은" 방식으로 자체 코드 세그먼트나 데이터 세그먼트를 쓸 수 없으며 승인되지 않은 시스템 호출을 실행할 수 없지만 다른 위치에 쓸 수 있다고 가정합니다. 메모리(즉, 모든 위치에 쓰기를 허용함) 이거 안전한가요? 프로그램이 매핑되지 않은 페이지에 액세스하는지 여부는 중요하지 않습니다. 이로 인해 분할 오류가 발생하고 프로그램이 명백한 오류와 함께 종료되기 때문입니다. (관심은 프로그램이아니요그만두고 승인되지 않은 일을 하십시오. )
세그폴트 외에도 메모리의 임의 위치에 쓰면 어떤 영향을 미칠 수 있나요? 예를 들어, 프로세스 표시 페이지에 MMIO 또는 비밀 대체 시스템 호출/커널 통신 메커니즘이 있습니까?
제가 사실이기를 바라는 것은 다음과 같습니다. 메모리 주소 [xy](프로그램의 코드 및 데이터)에 V 값이 포함되어 있고 [xy] 이외의 위치에 쓰기가 실행되면 프로세스가 오류 코드와 함께 종료됩니다. 또는 [xy]의 메모리에는 여전히 V가 포함되어 있습니다(다른 모든 프로세스 불변성은 여전히 유지됩니다. 프로세스는 여전히 사용자 모드에 있고 커널은 MMIO 매핑을 생성하지 않았습니다. 등).
- 페이지 맵에 [xy] 외부의 미러가 포함된 경우 [xy] 외부 쓰기가 성공하고 [xy]의 데이터가 변경될 수 있습니다. 하지만 사용자가 요청하지 않는 한 커널은 일반적으로 이러한 유형의 페이지를 생성하지 않는다고 생각합니다.
- 가상 메모리 어딘가에 매핑된 vDSO 페이지가 있지만 이러한 기능이 필요하지 않으므로 여기에 쓰는 것은 괜찮습니다.
내가 메모리에 쓰기를 원하는 주된 이유는 스택 처리를 단순화하기 위해서입니다. 대부분의 컴파일러는 스택 경계 검사를 생성하지 않으며 Linux는 가드 페이지를 사용하여 스택 오버플로를 불완전하게 방지합니다. 나는 스택에 매우 큰 배열을 할당하고 그 안에서 신중하게 선택된 인덱스에 액세스함으로써 보호를 우회할 수 있다고 믿습니다. 애플리케이션의 데이터 페이지에 접근하면 프로그램이 확실히 다운되기 때문에 이것만은 보호해야 하는데, 또 무엇을 보호해야 할지 모르겠습니다. 스택에서 힙 할당( mmap
ped 페이지 및 )이 얼마나 멀리 떨어져 있습니까?sbrk
추상 의미론을 위반하기 위해 이와 같은 "스택 매싱" 기술을 사용하여 표준을 준수하는 C 프로그램을 얻는 것이 가능할 것으로 보입니다(큰 상수 크기 배열을 사용하거나 alloca
커널에 알리지 않고 많은 양의 메모리를 할당하거나, 그런 다음 malloc
커널은 메모리가 할당되었는지 알지 못하므로 배열에 쓰는 것은 malloc
'd 영역의 내용을 변경할 수 있습니다)를 사용하여 큰 배열 내부의 메모리를 가져옵니다.