디바이스 드라이버란?
컴퓨터와 연결된 장치들과 상호작용을 하기 위해 해당 장치로 접근할 수 있게 해주는 소프트웨어를 이야기한다.
커널이 컴파일 될 때부터 포함된 디바이스 드라이버도 있지만, 나중에 커널 부팅 시 또는 부팅 후 로드되는 드라이버도 있다.
이는 모듈의 일종이기에 모듈 프로그래밍을 통해 프로그래밍할 수 있다.
디바이스 드라이버의 종류
character device, block device, network device가 있다.
character device
디바이스를 파일과 같이 직접 접근해서 사용할 수 있도록 하는 드라이버다.
키보드, 마우스와 같은 드라이버를 이야기한다.
block device
하드디스크와 같은 파일 시스템과 관련된 디바이스 드라이버이다.
network device
네트워크 스택과 네트워크 하드웨어 사이에 데이터의 송수신을 담당하는 디바이스 드라이버이다.
통상적으로 character device가 kernel exploit의 대상이 되기에 이 부분만 보자.
file_operations 구조체
디바이스 드라이버와 어플리케이션 간의 커뮤니케이션을 위한 인터페이스이다.
다양한 함수 포인터들을 멤버로하고 있으며, read, write, open 함수 등이 있으며, 이를 드라이버에 등록하는 방식으로 사용하게 된다.
fs.h - include/linux/fs.h - Linux source code (v6.4.8) - Bootlin
fs.h - include/linux/fs.h - Linux source code (v6.4.8) - Bootlin
elixir.bootlin.com
이것이 등록되면 어플리케이션에서 해당 디바이스 드라이버의 함수를 호출하면 그 함수에 등록된 드라이버 내부 함수가 커널에서 실행된다.
디바이스 드라이버의 주요 함수
copy_from_user(dest, from, size), copy_to_user(dest, from, size)
커널 공간에서 유저 공간으로 또는 그 반대로의 데이터 이동은 자유롭지 못하기에 커널 내부 함수를 통해 복사한다.
그래서 함수 명과 동일한 행동을 각 인자를 통해 수행한다.
예를 들어 copy_from_user에서는 유저 공간의 주소 from에서 size만큼 커널 공간의 dest로 복사한다.
반대로 copy_to_user에서는 커널공간의 from 에서 size만큼 커널 공간의 dest로 복사한다.
mutex, spinlock
커널에서는 레이스 컨디션이 다양한 이유로 발생하기에 이를 방지하기 위한 커널 동기화 함수이다.
이외 kernel exploit시 참고할 함수는 따로 작성할 예정.
'Kernel Exploit' 카테고리의 다른 글
Kernel exploit - kernel build 및 file system build (0) | 2023.08.06 |
---|---|
Kernel exploit - 모듈 프로그래밍 (0) | 2023.08.06 |
Kernel exploit - 슬랩 할당자 (0) | 2023.08.06 |
Kernel exploit - task란 (0) | 2023.08.06 |
Kernel exploit - 커널이란 (0) | 2023.08.05 |