[Research] Linux Kernel Basic - (6) 디바이스 드라이버(Device Driver) 1편

[Research] Linux Kernel Basic - (6) 디바이스 드라이버(Device Driver) 1편


서론

해당 포스트에서는 모놀리식 커널과 마이크로 커널을 알아보고 리눅스 커널(Linux Kernel)은 어떠한 특성을 지니며 리눅스 커널 모듈(LKM)에 대한 설명을 진행하며 디바이스 드라이버를 직접 개발하여 직접 커널에 탑재해보는 연구를 진행하며 얻은 결과에 대한 포스팅을 진행하겠다.


모놀리식 커널과 마이크로 커널

커널의 종류

커널이란 운영체제의 핵심이 되는 소프트웨어이며 메인 메모리에 상주하여 시스템의 존재하는 자원을 효율적으로 관리하는 역할을 한다는 이야기를 언급하였다. 예를 들어 프로세스의 우선순위를 통해 컨텍스트 스위칭 시 어떤 프로세스를 실행시킬 것 인지 관리도 하며 가상 메모리를 통해 하드 디스크에서 프로그램을 로드할 경우 메모리를 할당하거나 하는 등의 사용자가 컴퓨터를 사용할 경우 내부적으로 하드웨어의 접근을 통해 결정을 하는 등의 주요 역할을 한다.

그러한 커널에도 크게 두 가지 종류의 커널이 있다고 볼 수 있다. 모놀리식 커널(Monolithic Kernel)마이크로 커널(Micro Kernel)이다. 모놀리식 커널의 경우는 시스템 기능인 (VFS, IPC, Device Driver)등과 같은 기능들을 커널이 수행하는 역할을 하지만 마이크로 커널(Micro Kernel)의 경우에는 운영체제로서 진행해야하는 핵심적인 기능(스케줄링, 메모리 관리)등의 기능만 커널에 담아 가벼운 형태로 만든 커널이다. 상단의 그림을 보면 기존에 커널이 제공해야만 한다고 생각하였던 File Systems, Process Server등이 User Space에서 돌아가고 있음을 볼 수 있다.

각 커널의 특성에 따라서 장단점을 가지고 있으며 모놀리식 커널에 특성상 주요 컴포넌트들이 커널에 위치하기에 커널 내부의 요소들이 복합적으로 상호작용을 하는 것이 간결하여 빠르다. 하지만 주요기능이 커널에 존재하여 메모리 충돌과 같은 이슈가 발생하면 커널 패닉(Kernel Panic)이 발생하며 시스템 자체가 종료된다. 마이크로 커널의 경우는 하드웨어 종속성을 최소화 시킨 형태로 핵심적인 기능만을 진행하기에 이식성이 높으며 새로운 기능을 추가할 경우 서버를 추가하는 방식으로 진행되기에 확장성이 좋다. 하지만 서로 다른 영역인 User Mode와 Kernel Mode의 빈번한 전환(Context Swithcing)이 발생하며 전체 속도면에서는 좋지 않다는 단점이 있다.


적재 가능 커널 모듈(LKM)

리눅스 커널은 앞서 이야기한 커널 중 모놀리식 커널(Monolithic Kernel)이다. 일반적으로 모놀리식 커널의 단점은 디바이스 드라이버와 같은 커널 모듈을 추가/삭제하기 위해서는 커널을 재빌드 해야 한다고 한다. 하지만 다음과 같은 경우에는 얼마나 큰 불편함이 생길지 고민해보겠다. 하드웨어는 커널에 근접되어 있으며 커널은 유저모드에서 분리되어 있다. 그렇기에 하드웨어를 제어하기 위해서는 유저 모드에서 커널에 요청을 보내서 제어하는 간접적인 형태로 볼 수 있다. 결과적으로 해당 디바이스를 제어하기 위해서는 커널에 탑재가 되어 있어야 한다.

현재는 전 세계가 메타버스 코인에 탑승하여 다양한 형태의 새로운 하드웨어 주변 장치들이 출시되고 있다. 그럴 경우마다 리눅스 커널에 해당 디바이스 드라이버를 포함하여 빌드한다면 절대로 끝나지 않는 무간지옥에 빠지는 꼴이 된다. 또한 커널을 필요할 때는 사용하고 필요하지 않을 때는 사용하지 않도록 메모리에 로드하거나 로드하지 않도록 한다면 이에 따른 이점도 생긴다. 이러한 불편함을 리눅스에서 제공하는 기능인 적재 가능 커널 모듈(Loadable Kernel Module)이다.

적재 가능 커널 모듈(Loadable Kernel Module)이란 보다 자유롭게 커널에 등록하거나 해제하거나를 통해서 손쉽게 다룰 수 있다. 일반적으로 LKM(Loadable Kernel Module)이 사용되는 경우는 다음과 같다.

디바이스 드라이버(Device Driver)
파일 시스템 드라이버(Filesystem Driver)
시스템 콜(System Call)
네트워크 드라이버(Network Driver)
터미널 드라이버(TTY line disciplines)
실행가능한 인터프리터(Executable Interpreters)

다음에 제시된 일반적인 용도를 살펴보면 새로운 장치의 디바이스 드라이버만을 이야기하는 것이 아닌 사용자가 정의한 형태의 시스템 콜도 모듈로 탑재가 가능하다는 것이다. 이러한 생각도 가능한 데 만약 권한상승 공격이 KASLR이나 여러가지 요소로 Exploit 자체가 확률적으로 수행된다면 루트 권한을 얻은 시점에서 특정 시스템 콜을 사용하면 루트 권한을 획득하는 형태로 모듈을 등록해놓는다면 매번 Exploit을 진행할 필요가 없이 성공적으로 권한 상승을 수행할 수 있다. 이러한 것이 일반적으로 언급되는 루트킷(rootkit)이다.

그렇다면 마이크로 커널(Micro Kernel)과 다른 점이 무엇이냐고 할 수 있다. 해당 언급은 어디에서도 찾아볼 수 없는 데 내가 생각하고 느낀 바로 가장 큰 차이점은 어떠한 영역에 커널이 탑재되냐는 것이다. 마이크로 커널(Micro Kernel)의 경우 디바이스 드라이버와 같은 기능들은 유저 영역의 메모리에 상주한다고 하면 적재 가능 커널 모듈(LKM)은 커널 영역에 로드가 되므로 이는 모놀리식 커널(Monolithic Kernel)의 확장으로 이해하는 것이 맞음으로 판단된다. 그렇지 않다면 Kernel Exploitation을 위한 공격 벡터로 볼 수 없기에 해당 포스트는 무의미한 포스트가 된다.


디바이스 드라이버

커널의 종류

이전 단락에서 LKM(Loadable Kernel Module)에 대해서 언급하였으며 해당 단락에서는 일반적으로 LKM으로 구현되는 디바이스 드라이버에 대한 언급을 진행하겠다. 다시 한번 강조하지만 유저 어플리케이션은 직접적으로 하드웨어를 제어할 수 없다. 커널에 요청을 하여 하드웨어를 제어해야 하며 이러한 매개체의 역할을 하는 것이 커널 중 디바이스 드라이버이다.

디바이스 드라이버는 컴퓨터와 연결된 장치를 추상화시키므로 유저 어플리케이션이 정형화된 인터페이스를 통해 장치에 접근할 수 있는 형태의 소프트웨어로 볼 수 있다. 커널이 컴파일될 때 부터 포함된 디바이스 드라이버도 있으며 커널 부팅 후에 로드하는 디바이스 드라이버도 존재한다. 결과적으로 LKM으로 볼 수 있다.



캐릭터 디바이스 드라이버(chrdev)

디바이스를 파일처럼 접근하며 해당 파일의 read/write를 수행하여 data를 stream방식으로 전송한다. 주로 console, keyboard, mouse, serial port driver등의 형태로 사용된다.

블록 디바이스 드라이버(blkdev)

disk와 같은 file system을 기반으로 block 단위로 데이터를 read/write한다. 주로 hard disk, CD ROM driver등에 사용된다. 시스템 버퍼 캐시를 사용한다는 특성을 가지고 있다.

네트워크 디바이스 드라이버(netdev)

network의 물리계층과 frame 단위의 데이터를 송수신하는 드라이버이다. 주로 이더넷 디바이스 드라이버(eth0)등에 사용된다.


유저 어플리케이션 입장에서는 가상 파일 시스템(VFS)를 사용하기 때문에 파일 디스크립터를 통해 특정 파일 접근하여 값을 읽거나(read) 쓰는 형태(write)로 쉽게 하드웨어가 제어가능하다. 이런 의미로 파일로 추상화 시켰다고 볼 수 있으며 정형화 된 인터페이스로 불 수 있다는 것 이다. 하지만 세부적으로 보았을 때 버퍼를 사용한다 사용하지 않는다 등의 특징이 있다.


정리

커널의 종류를 알아보았으며 해당 커널마다 어떠한 특성을 지니고 발생하는 단점을 해결하기 위해 LKM을 학습하였다. LKM으로 사용되는 예시 중 하나인 디바이스 드라이버에 대해서 조사해보았다. 글이 너무 길어져서 직접 디바이스 드라이버를 개발하는 것은 다음 포스트에서 진행하도록 하겠다.


한줄평

As Soon As (ex)Ploit...

참고

b30w0lf님의 운영체제(Operating System)
https://butter-shower.tistory.com/29
https://temp123.tistory.com/16
https://tribal1012.tistory.com/154
http://artoa.hanbat.ac.kr/lecture_data/embedded_sw/04_old.pdf