로드 가능한 커널 모듈

Loadable kernel module

컴퓨팅에서 로드 가능한 커널 모듈(LKM)은 운영 체제의 실행 중인 커널, 즉 이른바 기본 커널을 확장하기 위한 코드가 포함된 개체 파일이다.LKM은 일반적으로 (장치 드라이버로서) 새로운 하드웨어 및/또는 파일 시스템에 대한 지원을 추가하거나 시스템 호출을 추가하는 데 사용된다.LKM이 제공하는 기능이 더 이상 필요하지 않을 경우 메모리 및 기타 리소스를 확보하기 위해 언로드할 수 있다.

대부분의 유닉스 유사 시스템과 마이크로소프트 윈도우즈FreeBSD커널 로드 가능 모듈(kld), MacOS커널 확장(kxt[1]),[2] AIX커널 확장 모듈, 윈도우즈 NT[3] 커널 모드 드라이버VxWorks다운로드 가능한 커널 모듈(DKM)과 같은 서로 다른 이름으로 로드 가능한 커널 모듈을 지원한다.그것들은 또한 커널 로드 가능한 모듈(또는 KLM)로 알려져 있으며, 간단히 커널 모듈(KMOD)로도 알려져 있다.

이점

로드 가능한 커널 모듈이 없다면 운영 체제는 기본 커널에 직접 컴파일된 가능한 모든 예상 기능을 포함해야 할 것이다.이러한 기능 중 대부분은 사용되지 않고 메모리에 저장되어 메모리를 낭비하게 되며, 사용자가 새로운 기능이 필요할 때마다 기본 커널을 재구성하고 재부팅해야 할 것이다.

단점들

정적 커널보다 모듈형 커널을 선호한다는 사소한 비판 중 하나는 소위 단편화 벌칙이다.기본 커널은 설정 루틴에 의해 항상 실제 연속 메모리로 압축된다. 따라서 기본 커널 코드는 결코 단편화되지 않는다.일단 시스템이 모듈을 삽입할 수 있는 상태가 되면, 예를 들어 모듈을 포함하는 파일 시스템탑재되면, 어떤 새로운 커널 코드 삽입도 커널을 조각내게 하여 더 많은 TLB 항목을 사용함으로써 사소한 성능 저하를 야기할 가능성이 높다.[citation needed]

서로 다른 운영 체제에 구현

리눅스

로딩 가능한 Linux 커널 모듈은 에 의해 로드된다(그리고 언로드됨).modprobe명령하다에 위치한다./lib/modules또는/usr/lib/modules그리고 그 연장선상에 있었다..ko("커널 오브젝트") 버전 2.6 이후(일반 버전에서 사용됨).o증축).[4]lsmod명령어는 로드된 커널 모듈을 나열한다.비상 시 모듈 파손 등으로 시스템 부팅에 실패할 경우 커널 부팅 매개 변수 목록(예: GRUB를 사용하는 경우 GRUB 시작 메뉴에서 'e'를 누른 다음 커널 매개 변수 라인을 편집하여 특정 모듈을 활성화하거나 비활성화할 수 있다.

라이센스 문제

리눅스 유지 관리자들의 의견에 따르면, LKM은 커널의[citation needed] 파생된 작품이다.리눅스 유지관리자는 독점 모듈의 배포는 허용하지만 기호는 GNU GPL(General Public License) 모듈에만 사용할 수 있는 것으로 표시되도록 허용한다.[citation needed]

독점적이거나 비 GPL 호환 모듈을 로드하면 실행 중인 커널에 '도색' 플래그가[5][6] 설정되며, 이는 경험된 문제나 버그가 유지관리자에 의해 조사될 가능성이 낮다는 것을 의미한다.[7][8]LKMs는 실행 중인 커널의 일부가 되어 커널 데이터 구조를 손상시키고 모듈이 실제로 독점적인 경우 조사할 수 없는 버그를 생성할 수 있다.

Linuxant 논란

2004년에는 전용 장치 드라이버를 로드 가능한 커널 모듈로 출시하는 컨설팅 회사인 리눅스ant가 자사의 null 터미네이터를 남용하려고 시도했다.MODULE_LICENSE, 다음 코드 발췌에서 볼 수 있는 바와 같이:

모듈_라이센스(GPL\0의 파일에 대해\"GPL\"디렉토리, 다른 사용자의 경우 LICE 파일만 적용됨"); 

당시 커널이 사용한 문자열 비교 코드는 모듈이 null 문자(Null 문자)에 도달했을 때 GPLed가 중지되었는지 여부를 확인하려고 했다.\0)) 그래서 이 모듈이 자신의 면허를 단지 "GPL"[9]이라고 선언하고 있다는 생각에 속았다.

자유BSD

FreeBSD용 커널 모듈이 다음 위치에 저장됨/boot/kernel/운영 체제와 함께 배포되는 모듈 또는 일반적으로/boot/modules/FreeB에서 설치된 모듈SD 포트 또는 FreeBSD 패키지 또는 독점 또는 바이너리 전용 모듈용.FreeBSD 커널 모듈에는 일반적으로 확장자가 있음.ko. 일단 기계가 부팅되면, 그들은 로딩될 수 있다.kldload명령, 언로드됨kldunload, 및 목록kldstat커널이 시작되기 전에 로더에서 자동으로 모듈을 로드할 수도 있다(을 통해)./boot/loader.conf) 또는 손으로.

마코스

MacOS의 일부 로드 가능한 커널 모듈은 자동으로 로드될 수 있다.로딩 가능한 커널 모듈도 로딩할 수 있음kextload명령하다에 의해 나열될 수 있다.kextstat명령하다로드 가능한 커널 모듈이 확장자와 함께 번들로 위치함.kext. 운영 체제와 함께 제공된 모듈은/System/Library/Extensions디렉토리; 제3자에 의해 제공된 모듈은 다양한 다른 디렉토리에 있다.

넷웨어

NetWare 커널 모듈은 NLM(NetWare Loadable Module)이라고 하며, LOAD 명령을 통해 NetWare 커널에 NLM을 삽입하고 언로드 명령을 통해 제거한다.modules명령어는 현재 로드된 커널 모듈을 나열한다.NLM은 NetWare 서버에 할당된 유효한 검색 경로에 있을 수 있으며.NLM파일 이름 확장명으로.

VxWorks

다운로드 가능한 커널 모듈(DKM) 유형 프로젝트를 생성하여 ".out" 파일을 생성하고 "ld" 명령을 사용하여 커널 공간에 로드할 수 있다.다운로드 가능한 커널 모듈은 "unld" 명령을 사용하여 언로드할 수 있다.

솔라리스

Solaris에는 구성 가능한 커널 모듈 로드 경로가 있으며, 기본적으로/platform/platform-name/kernel /kernel /usr/kernel대부분의 커널 모듈은 하위 디렉터리에 산다./kernel; init가 시작할 수 있는 지점까지 시스템을 부팅할 필요가 없다고 간주되지 않는 것들은 종종 (항상 그렇지는 않지만) 에서 찾을 수 있다./usr/kernel. DEBUG 커널 빌드를 실행할 때 시스템이 적극적으로 모듈을 언로드하려고 시도한다.

이진 호환성

리눅스는 커널 모듈에 안정적인 APIABI를 제공하지 않는다.서로 다른 커널 버전 간에 내부 구조와 기능에 차이가 있어 호환성 문제가 발생할 수 있다는 의미다.이러한 문제와 싸우기 위해 기호 버전 데이터는.modinfo로드 가능한 ELF 모듈의 섹션.이 버전 지정 정보는 모듈을 로드하기 전에 실행 중인 커널의 정보와 비교할 수 있다. 버전이 호환되지 않으면 모듈이 로드되지 않는다.

Solaris, FreeBSD, macOS, Windows와 같은 다른 운영 체제는 커널 APIABI를 비교적 안정적으로 유지하므로 이 문제를 피할 수 있다.예를 들어, FreeB커널 버전 6.0에 대해 컴파일된 SD 커널 모듈은 다른 FreeBSD 6.x 버전(예: 6.4)에서 재구성 없이 작동한다.그러나 다른 주요 버전과 호환되지 않으며 API와 ABI 호환성은 지점 내에서만 유지되므로 FreeBSD 7.x와 함께 사용하도록 다시 컴파일해야 한다.

보안

로드 가능한 커널 모듈은 실행 중인 커널을 수정하는 편리한 방법이지만, 이는 공격자가 손상된 시스템에서 악용하여 프로세스나 파일의 탐지를 방지하여 시스템에 대한 제어력을 유지할 수 있게 한다.많은 루트킷들은 이런 방식으로 LKM을 이용한다.대부분의 운영 체제 모듈에서는 LKM을 로드하는 데 상승된 권한이 필요하므로 권한 상승에 도움이 되지 않으며, 이는 공격자가 침입을 숨기기 쉽게 만들 뿐이다.[10]

리눅스

Linux를 통해 sysctl 옵션을 통한 모듈 로딩 비활성화/proc/sys/kernel/modules_disabledinitramfs 시스템은 부팅할 때 기계에 필요한 특정 모듈을 로드한 다음 모듈 로드를 비활성화할 수 있다.[11][12]이것은 보안을 단일 커널과 매우 유사하게 만든다.공격자가 initramfs를 변경할 수 있다면, 그들은 커널 바이너리를 변경할 수 있다.

마코스

OS X 요세미티 이후 버전에서 커널 확장은 이에 대한 특정 "엔티먼트"를 보유하는 개발자 인증서와 함께 코드 서명되어야 한다.이 같은 개발자 인증서는 애플이 요청하면 제공될 뿐 애플 개발자 회원에게는 자동으로 주어지지 않는다."kext signing"이라고 불리는 이 기능은 기본적으로 활성화되며 서명되지 않은 커널 확장이 있을 경우 커널 부팅을 중지하도록 커널에 지시한다.[13]OS X El Capitan 이상 버전에서는 시스템 무결성 보호의 일부다.

이전 버전의 MacOS에서 또는 kext 서명을 사용하지 않도록 설정한 경우 OSBundleAllowUserLoad 속성이 번들의 속성 목록에서 True로 설정된 경우 커널 확장 번들의 로드 가능한 커널 모듈을 루트 이외의 사용자가 로드할 수 있다.[14]그러나 실행 가능한 코드 파일을 포함하여 번들에 있는 파일 중 루트 및 그룹 휠에 의해 소유되지 않거나 그룹 또는 "기타"에 의해 쓰기 가능한 파일이 있는 경우 커널 로드 가능 모듈을 로드하려는 시도가 실패하게 된다.[15]

솔라리스

커널 모듈에는 선택적으로 검증된 부팅 정책 설정에 따라 로드 시 검증되는 암호화 서명 ELF 섹션이 있을 수 있다.커널은 모듈이 신뢰할 수 있는 인증서 세트에 의해 암호화된 서명되도록 강제할 수 있다. 신뢰할 수 있는 인증서의 목록은 일부 SPARC 기반 플랫폼에서 ILOM의 OS 외부에 보관된다.Userspace가 시작된 커널 모듈 로딩은 시스템이 Imable Global Zone 기능을 활성화한 상태에서 실행 중일 때만 Trusted Path에서 가능하다.

참고 항목

참조

  1. ^ "Deprecated Kernel Extensions and System Extension Alternatives". Apple Inc. Retrieved 13 March 2021.
  2. ^ "Kernel Extension Programming Topics: Introduction". Apple Inc. September 1, 2010. Archived from the original on May 4, 2013. Retrieved May 5, 2013.
  3. ^ "What Determines When a Driver Is Loaded". Microsoft Developer Network. Microsoft. November 21, 2012. Archived from the original on March 6, 2013. Retrieved May 5, 2013.
  4. ^ "The Linux Kernel Module Programming Guide, section 2.2 "Compiling Kernel Modules"". Retrieved 2020-10-05.
  5. ^ Linus Torvalds; et al. (2011-06-21). "Documentation/oops-tracing.txt". kernel.org. Archived from the original on 2011-10-02. Retrieved 2011-10-03.
  6. ^ "Tainted kernels". The Linux kernel user’s and administrator’s guide.
  7. ^ Jonathan Corbet (2006-03-24). "Tainting from user space". LWN.net. Archived from the original on 2011-11-16. Retrieved 2011-10-03.
  8. ^ "Novell support documentation: Tainted kernel". 2007-07-26. Retrieved 2011-10-03.
  9. ^ Jonathan Corbet (April 27, 2004). "Being honest with MODULE_LICENSE". LWN.net. Archived from the original on November 2, 2012. Retrieved October 30, 2012.
  10. ^ Wayback Machine에 아카이브된 2012-02-04 로드 가능한 커널 모듈 활용
  11. ^ "Sysctl/kernel.txt". Archived from the original on April 15, 2013. Retrieved January 4, 2013.
  12. ^ Kees Cook (2012-11-28). "Clean module disabling". outflux.net. Retrieved 2020-10-05.
  13. ^ "Kernel Extensions". Mac Developer Library. Apple. September 16, 2015. Archived from the original on August 17, 2016. Retrieved September 29, 2016.
  14. ^ "Info.plist Properties for Kernel Extensions". Apple Inc. Archived from the original on September 26, 2012. Retrieved September 27, 2012.
  15. ^ kextload(8)DarwinMacOS 시스템 관리자 설명서