Linux에서 내 커널 모듈에 서명하는 방법은 무엇입니까?

Linux에서 내 커널 모듈에 서명하는 방법은 무엇입니까?

나는 Linux에서 간단한 hello world 커널 모듈을 작성하고 이를 커널에 로드하려고 했습니다. 하지만 로드하려고 할 때 이 오류가 발생하기 때문에 불가능합니다.

module verification failed: signature and/or required key missing - tainting kernel

해결책을 찾으려고 노력했지만 내가 찾은 모든 것은 실제 시스템이 아닌 가상 머신에 관한 것이었습니다.

보안 부팅이 비활성화되어 있으며 커널 구성을 변경하고 다시 빌드하고 싶지 않습니다.

또한 openssl 및 MOK를 사용하여 키를 생성하고 등록하려고 시도했지만 모듈에 서명하려는 마지막 단계에서 중지했습니다.해당 파일이나 디렉터리가 없습니다.실수. /scripts/sign-file못찾 겠어요/usr/lib/linux-headers-5.11.0-16-generic

나는 이 질문에 대한 답을 따랐습니다. 커널 모듈 서명

완전 혼란스러워요! 누가 날 도울 수 있죠? ?

내 운영 체제는 우분투이고 커널 버전은 5.11.0-16입니다.

고쳐 쓰다:이제 내 모듈이 명령을 통해 서명된 것으로 보이며 modinfo hello.ko그 결과는 다음과 같습니다.

$ modinfo hello.ko
filename:       /home/###/Documents/kernel/hello.ko
description:    This is the module description.
author:         ###
license:        Dual BSD/GPL
depends:        
retpoline:      Y
name:           hello
vermagic:       5.11.0-16-generic SMP mod_unload modversions 
sig_id:         PKCS#7
signer:         ###
sig_key:        58:26:4E:F2:6A:5F:2F:DB:F0:21:E0:8C:79:60:E9:C8:78:38:01:3F
sig_hashalgo:   sha256
signature:      67:F2:74:BF:6A:AB:D4:AD:6C:EA:BD:35:D6:7A:9A:94:0F:C7:0F:6B:
        AD:10:18:26:D1:D9:8A:07:DD:89:36:03:D0:C9:AA:10:A1:52:71:A0:
        CF:D0:7D:C6:2E:D7:E2:B1:AF:1D:45:A4:97:13:23:23:C8:B7:99:6D:
        4A:F9:60:B7:64:D0:E4:3C:EE:74:9F:68:D2:C5:EC:C0:C9:F3:09:76:
        EF:B5:C4:46:62:36:1B:95:EC:4A:D3:4D:B7:2F:87:71:E1:D2:D7:ED:
        EE:F3:04:58:3F:F9:EA:16:4C:39:BD:B5:50:60:FC:A7:96:AF:03:74:
        F0:03:76:98:95:91:A9:5A:1B:50:17:8A:71:A2:C0:D6:B4:DD:D3:50:
        FE:2A:05:29:03:D6:E6:A0:69:F4:18:44:2B:EC:F6:41:6D:A3:E7:EF:
        10:3D:98:A8:33:21:56:0E:D6:8E:67:88:18:7F:31:DB:2E:CA:70:F7:
        7E:03:42:04:F5:99:64:BD:EE:0F:04:DA:56:50:B5:2E:7A:B7:AE:D0:
        ED:07:6B:86:89:45:38:B4:7C:FE:B9:B3:F4:5D:17:1B:6F:04:33:52:
        BE:0E:1F:D3:CA:F1:9D:17:AD:EC:A4:DC:84:25:47:73:ED:02:9E:74:
        4C:AD:25:35:2B:E4:C0:BE:15:F2:FF:99:CE:89:82:E6

하지만 모듈을 삽입할 때 여전히 오류가 발생합니다.

$ sudo insmod hello.ko
insmod: ERROR: could not insert module hello.ko: Invalid module format

답변1

module verification failed: signature and/or required key missing - tainting kernel

이것은 실제로아니요모듈이 로드되지 않았음을 의미합니다. 이는 모든 커널 oops/panic 메시지에는 서명되지 않은 모듈이 로드되었음을 나타내는 일부 정보가 포함된다는 의미입니다. 이 메시지는 오류가 아닌 경고입니다.

(그러나 taint 태그와 함께 oops/panic 메시지가 포함된 커널 버그 보고서를 제출하려고 하면 "먼저 비표준 커널 모듈 없이 버그를 재현해 보십시오. 아니면 소스를 보여주십시오."라는 응답을 받을 가능성이 높습니다. 문제 해결과 관련이 있을 수 있으므로 사용자 정의 모듈의 코드를 사용하면 사람들이 실험적인 작업을 하고 있다는 사실을 언급하지 않고 버그 보고서를 제출하는 경우가 있기 때문에 커널 개발자와 배포판 유지 관리 담당자의 시간을 절약할 수 있습니다.

데비안은 sign-file유틸리티를 패키지로 묶습니다 linux-kbuild-<kernel version>. 나는 우분투도 마찬가지라고 믿습니다. 따라서 패키지가 linux-kbuild-5.11설치되어 있는지 확인해야 합니다. 이 유틸리티의 경로는 sign-file입니다 /usr/lib/linux-kbuild-5.11/scripts/sign-file.

그러나 Secure Boot가 비활성화되면 모든 Secure Boot 단계를 우회하고 shimx64.efi실제 부팅이 직접 로드됩니다 .grubx64.efiMOK 로딩을 포함합니다.MOK가 로드되지 않으면 커널은 모듈의 서명이 유효한지 여부를 인식하지 못합니다. 보안 부팅이 비활성화되면 유효하지 않은 서명이 있는 서명된 모듈은 거부되는 반면, 서명되지 않은 모듈은 향후 모든 오류/패닉 메시지에서 경고 및 오염 표시만 받게 됩니다.

insmod: ERROR: could not insert module hello.ko: Invalid module format

커널 모듈 로드에 실패한 후에는 dmesg출력을 확인해야 합니다. 출력에는 보다 구체적인 오류 메시지가 포함될 수 있습니다. 이 경우 모듈 서명이 유효성 검사에 실패했음을 나타낼 수 있습니다.

관련 정보