본문 바로가기

Core BSP 분석/커널 트러블슈팅

[Kernel][Panic] crash due to "signature and/or required key missing"

#커널 크래시 디버깅 및 TroubleShooting
 
Built-in 타입 디바이스 드라이버 모듈을 적재하는 과정에서 커널 크래시가 발생했는데요.
개고생 하다가 결국 밝혀낸 것이 디바이스 드라이버 모듈의 signed build관련한 문제였어요.
 
이틀인가, 야근을 한 것 같은데. 그리 많이 공유할만한 자료가 없다는게 좀 더 허무하네요.
비슷한 문제를 겪는 분들은 아래 내용 참고하셔서 저 같이 쓸때없는 야근을 하시지 않길 바래요.
 
아래 콜스택으로 커널 패닉이 발생했는데요. 0xBF03B114란 주소에서 문제가 발생했는데.
0xBF03B114이면 드라이버 모듈 코드에서 커널 패닉이 일어났다는 것을 확인할 수 있죠.
-000|do_DataAbort(?)
-001|__dabt_svc(asm)
 -->|exception
-002|NSR:0xBF03B114(asm)  // <<--
-003|do_one_initcall_debug(inline)
-003|do_one_initcall(fn = 0xBF03B000)
-004|do_init_module(inline)
-004|load_module(info = 0xDE895F48, ?, ?)
-005|sys_init_module(umod = -1227014136, len = 284732, uargs = -1097475832)
-006|ret_fast_syscall(asm)
 
역시나 커널 패닉 발생 직전 아래 커널이 아래 로그를 토해내고 있네요. 뭐가 문제일까요?
[    6.886562] <c2> (6)[1:init]init: processing action 0x141078 (post-fs)
[    6.904338] <86> (2)[1:init]texfat: module license 'Commercial. For support email exfat-support@tuxera.com' taints kernel.
[    6.904365] <86> (2)[1:init]Disabling lock debugging due to kernel taint
[    6.904892] <a6> (2)[1:init][name:module&]texfat: module verification failed: signature and/or  required key missing - tainting kernel
[    6.908088] <e6> (2)[1:init]calling  init_exfat_fs+0x0/0x2f0 [texfat] @ 1
 
코드 리뷰를 해보니 세상에,
CONFIG_MODULE_SIG_FORCE 란 config가 빠져 있었네요.
 
비슷한 이슈가 예전 프로젝트에서도 리포트된 것 같은데요
[Documentation/module-signing.txt]
 (1) "Require modules to be validly signed" (CONFIG_MODULE_SIG_FORCE)
 
     This specifies how the kernel should deal with a module that has a
     signature for which the key is not known or a module that is unsigned.
 
     If this is off (ie. "permissive"), then modules for which the key is not
     available and modules that are unsigned are permitted, but the kernel will
     be marked as being tainted, and the concerned modules will be marked as
     tainted, shown with the character 'E'.
 
     If this is on (ie. "restrictive"), only modules that have a valid
     signature that can be verified by a public key in the kernel's possession
     will be loaded.  All other modules will generate an error.
 
     Irrespective of the setting here, if the module has a signature block that
     cannot be parsed, it will be rejected out of hand.
 
texfat란 드라이버 모듈은 제가 signed 빌드할 때 build 키를 쓰지 않고 빌드했을 꺼잖아요.
따라서 signing 안된 드라이버 모듈을 로딩을 하려고 하니 커널이 위 에러 로그를 토해내는 거구요.
 
제대로 signing된 디바이스 드라이버 모듈만 verification시키는 CONFIG_MODULE_SIG_FORCE 컨피그를 추가하니 문제가 사라졌어요.
 
 
"이 포스팅이 유익하다고 생각되시면 댓글로 응원해주시면 감사하겠습니다.  
그리고 혹시 궁금점이 있으면 댓글로 질문 남겨주세요. 상세한 답글 올려드리겠습니다!"
 
 
# Reference: For more information on 'Linux Kernel';
 
디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1
 
디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2