2017-11-15 9 views
0

사용자 공간에 데이터를 읽고 쓰는 데 필요한 ioctl 드라이버를 작성하고 있습니다.드라이버에서 사용자 공간 포인터를 안전하게 처리합니까?

typedef struct { 
unsigned int* src; 
unsigned int* dst; 
unsigned int buffer_size; 
unsigned int key[8]; 
} aes_data 

나는 매우 메모리 작동 방법을 가상에 정통한 아니지만, 내가 여기에 위험이 있다고 생각 : 시각화를 들어, 여기에 드라이버 호출로가는 일반적인 인수입니다. 사용자 공간 프로세스는 자신이 소유하지 않은 메모리에 대한 포인터를 제공 할 수 있습니다. 제공된 버퍼 크기로 인해 다른 프로세스의 메모리로 오버플로가 발생할 수 있습니다. 드라이버에서 이러한 사용자 공간 포인터를 책임감있게 처리하려면 어떻게해야합니까?

+1

'copy_to_user' 및'copy_from_user' 커널의 기능을 알고 있습니까? 그렇지 않다면, 그들에 대해 배울 때입니다. 사용자 메모리 액세스 (읽기/쓰기)는 주어진 기능 (및 그 변형)으로 만 수행되어야합니다. – Tsyvarev

+0

나는 그것들을 사용했지만 그것이 그것이 전부라는 것을 깨닫지 못했습니다. 내 부분에 대한 명시적인 확인없이 사용자가 알려주는 곳이라면 누구나 쓸 수 있습니다. – Fadeway

+0

'copy_to_user'와'copy_from_user'는 기본 검사를 수행하며 복사를 완료하지 못했습니다. –

답변

1

드라이버에서 이러한 사용자 공간 포인터를 어떻게 처리합니까?

포인터가 유효한 항목을 가리키는 지 확인할 방법이 없기 때문에 단순히 그렇지 않습니다. 적절한 매개 변수를 제공하는 것은 ioctl() 사용자에게 달려 있습니다. 그들이 그것을하지 못하면, 그들을 위해 힘든 행운.