2012-08-17 4 views
5

특정 프로세스의 메모리에 액세스 할 수있는 커널 모듈을 작성 중입니다.커널 모듈에서 사용자 공간 메모리 보호 플래그를 변경하십시오.

#define MAP_FLAGS (MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS) 

prot = PROT_WRITE; 
retval = do_mmap(NULL, vaddr, vsize, prot, MAP_FLAGS, 0); 

vaddrvsize가 이전 설정하고, 호출이 성공 : 나는 do_mmap()와 사용자 공간 메모리의 일부에 익명의 매핑을 수행했다. 커널 모듈 (copy_to_user 경유)에서 그 메모리 블럭에 쓰기를 한 후에, 정상적인 사용자 공간에서 mprotect처럼 나는 그것에 대한 PROT_WRITE 허가를 제거하고 싶다. 나는 이것을 허용 할 함수를 찾을 수없는 것 같다.

영역의 매핑을 해제하고 올바른 보호 기능을 사용하여 매핑하려고 시도했지만 메모리 블록을 초기화하여 방금 쓴 모든 데이터를 지 웁니다. MAP_UNINITIALIZED을 설정하면 man 페이지에서, 그 문제를 해결하지만, 수 있습니다

MAP_UNINITIALIZED을

(리눅스 2.6.33 이후) 명확하지 익명 페이지를 수행합니다. 이 플래그는 내장 된 기기의 성능을 향상시키기위한 것입니다. 이 플래그는 커널이 CONFIG_MMAP_ALLOW_UNINITIALIZED 옵션으로 구성된 경우에만 적용됩니다. 보안 의미가 있기 때문에 보통 옵션은 내장 된 장치 (즉, 사용자 메모리의 내용을 전체 로 제어하는 ​​장치)에서만 사용할 수 있습니다.

그래서 내가 원하는대로 할 수는 있지만 매우 휴대 할 수는 없습니다. 제가 제안한 것을 성취 할 수있는 표준 방법이 있습니까?

+0

왜 왜 커널 모듈에서 모든 작업을 수행하고 있습니까? 산뜻하게 정의 된 API를 사용하면 사용자 공간 프로세스 자체로는 수행 할 수없는 이유가 없습니다. – mpe

+0

@mpe 사용자 공간에서 할 수없는 이유는 내가 작성한 모듈이 프로세스 로더라는 것입니다. 사용자 공간 코드에 영향을주지 않습니다. – nosuchthingasstars

+0

프로세스 로더 란 무엇입니까? binfmt 핸들러를 의미합니까? – mpe

답변

1

좀 더 연구 후에, 나는 그에게 kmap()와 커널 공간에 매핑하고 기록 할 수 주어진 주소 사용자 공간에서 페이지의 목록을 반환 get_user_pages()를라는 함수를 (내가 찾은 최고의 문서 here입니다) 발견 방법 (내 경우에는 kernel_read() 사용). 이것은 검색된 페이지에 대한 쓰기 권한을 강제로 허용하기 때문에 copy_to_user()의 대체로 사용할 수 있습니다. 유일한 단점은 한 번에 한 페이지 씩 작성하는 대신 한 페이지 씩 작성해야한다는 것입니다.하지만 제 질문에서 설명한 문제가 해결됩니다.

0

사용자 공간에는 기존 매핑의 보호 플래그를 수정할 수있는 시스템 호출 mprotect이 있습니다. 아마 그 시스템 호출의 구현을 따라야 할 수도 있고 코드에서 직접 호출 할 수도 있습니다. mm/protect.c을 참조하십시오.

관련 문제