비 권한 모드에서도 mmap ' ing / dev / mem은 어떻게 작동합니까?
On 2월 9, 2021 by admin내가 이해하는 한 사용자 공간 프로그램은 비 권한 모드로 실행되므로 메모리 나 I / O에 직접 액세스 할 수 없습니다.
그런 다음 사용자 공간 프로그램에서 mmap / dev / mem을 수행 할 때 메모리 또는 I / O 위치에 정확히 어떻게 직접 액세스 할 수 있습니까?
예 :
int fd = 0; u8 leds = 0; fd = open("/dev/mem", O_RDWR|O_SYNC); leds = (u8 *)mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x80840000);
임베디드 기기에서 매우 일반적으로 사용되는 해킹입니다.
이제 leds
변수를 즉시 사용하여 액세스 할 수 있습니다. 0x80840000에있을 수있는 모든 장치.
더 이상 해당 주소에 액세스하기 위해 시스템 호출을 사용하지 않습니다.
leds[0x20] = val;
작동합니다.
그러나 I / O 주소에서 직접 읽기 / 쓰기와 같은 권한있는 작업은 시스템 호출을 통해 프로세서를 권한 모드로 전환하는 경우에만 가능해야합니다.
출처 .
댓글
,하지만 그 ' 코드 일 뿐이며 실제로 권한이없는 사용자로 작동한다는 증거는 없습니다. 내 (제한된) 경험에서는 모든 것이 루트로 실행됩니다. 내장 된 장치입니다.
root
사용자는 기존의 권한을 재정의 할 수있는 권한을 포함하여 많은 권한을가집니다. 파일 시스템 권한. 일부 " 파일 "은 일반 사용자가 사용할 수없는 장치 (예 : 디스크 또는 메모리)에 대한 액세스 권한입니다. root
가 아닙니다. 그러나 root
는 사용자 공간 에서 실행되므로 ' 시스템 모드의 모든 권한을 누리지 못합니다. (대부분 권한있는 지침 실행). 답변
/dev/mem
는 실제로 보안 문제이며 허용되지 않아야합니다.
내 시스템에서 ls -l /dev/mem
는 다음과 같습니다.
crw-r----- 1 root kmem 1, 1 Sep 8 10:12 /dev/mem
root
가 읽고 쓸 수 있도록 kmem
그룹 (아무것도 없음)은 읽을 수는 있지만 쓸 수는 없으며 다른 모든 사람은 열 수 없습니다. 따라서 이것은 안전해야합니다.
/dev/mem
가 저와 같은 경우 권한이없는 프로세스가 파일을 열 수 없었을 것입니다. mmap
확인하세요.
시스템에서 /dev/mem
권한이 안전한지 확인하세요!
댓글
- 하지만 루트 권한으로이 작업을 하고 있다고 가정하면 루트가 실행하는 프로세스가 커널을 얻는다는 의미입니까? 레벨 액세스 권한이 있습니까?
- 글쎄, ' 루트로이 작업을 수행하면 모든 것에 액세스 할 수 있습니다. ' " 커널 수준 액세스 권한 "이 무엇을 의미하는지 잘 모르겠지만 root는 어떤 방식 으로든 원하는 모든 작업을 수행 할 수 있습니다 (특히 새 커널 모듈을 만들고 동적으로로드하는 등).
- 예, 그렇습니다. '가 정확합니다. 파일을 매핑 할 때 나중에 ststem 호출을 사용하지 않고 & 파일을 읽을 수 있습니다. 이는 ' 일반 디스크 파일을 매핑 했든
/dev/mem
와 같은 특수 장치를 매핑 했든 ' 사실입니다. div>. 원하는 경우/dev/mem
를 열고read()
및write()
시스템 호출을 실행할 수 있습니다. 그러면 시스템 호출을 사용하지 않고 I / O를 보내지 않을 것입니다. 최종 결과는 동일하지만 수행 할 작은 I / O가 많으면mmap()
및 직접 액세스가 특히 더 잘 수행 될 것입니다. ' 시스템 호출이 필요하지 않습니다! 일반 파일에서도 마찬가지입니다! - @ Stark07 ' 요점을 놓친 것 같습니다.
mmap
(및/dev/mem
) 자체는 액세스 권한을 제공하지 않습니다 . 링 4에서는 그렇게하는 것이 불가능합니다. 대신 프로그램이로드 될 때 발생하는 것과 같이 파일 (또는 리소스)을 호출 프로세스의 특정 가상 주소에 매핑하는 것입니다 ./exec
ed (이 경우 프로그램 이미지는 가상 메모리에mmap
저장됩니다). - TL; DR 권한이없는 프로세스는 시스템 리소스에 대한 직접 액세스 권한을 갖지 않지만 해당 리소스가 가상 주소 공간에 매핑 될 때 할 수 있습니다 . . 스택 / 힙 / rodata / whatsoever에 액세스하는 것과 커널 메모리에 액세스하는 것 사이에는 ' 차이가 없습니다. 결국 둘 다 실제 물리적 메모리에 액세스하지만 후자의 경우는 프로그램 '의 제어.
답변
표시되는 주소 사용자 프로세스 (루트로 실행 되든 권한이없는 사용자로 실행 되든)는 페이지 테이블을 통해 MMU에 의해 물리적 주소에 매핑되는 가상 주소입니다. 페이지 테이블 설정은 권한이 부여 된 작업이며 커널 코드로만 수행 할 수 있습니다. 그러나 페이지 테이블이 설정되면 사용자 모드에서 메모리 액세스가 허용됩니다.
구체적으로 코드는 mmap
를 사용하여 커널이 주어진 범위의 실제 메모리에 대한 액세스를 허용하는 페이지 테이블. 커널은 프로세스의 권한 (/dev/mem
에 대한 읽기 / 쓰기 액세스 권한이 있음)을 확인하고 물리적 메모리에 액세스 할 수 있도록 페이지 테이블을 설정합니다.
답변
leds
의 값은 가상 주소입니다. 사용자 공간에있는 한 현재 프로세스의 RAM에서이 가상 주소가 매핑 된 위치에 관계없이 프로세스는 권한 모드에 있지 않아도 leds[0] = val
와 같은 지침을 통해 직접 액세스 할 수 있습니다.
*
가 누락 된 것 같습니다. “1a3ad27bd2″>