xác minh mô-đun không thành công chữ ký và / hoặc thiếu khóa yêu cầu


9

Tôi đang làm việc trên một mô-đun hạt nhân, đang hoạt động tốt. Tuy nhiên, xem qua dmesg, tôi thấy một thông báo liên quan đến mô-đun của tôi rằng xác minh mô-đun không thành công (xác minh mô-đun không có chữ ký và / hoặc thiếu khóa bắt buộc).

Làm thế nào tôi có thể giải quyết vấn đề này? Làm cách nào để mô-đun của tôi được ký để xác minh?

Cảm ơn.


Câu trả lời:


2

Tất cả những gì bạn cần được mô tả ở đây

KUEL MODULE ĐĂNG KÝ CƠ SỞ


NỘI DUNG

  • Tổng quat.
  • Cấu hình ký mô-đun.
  • Tạo khóa ký.
  • Khóa công khai trong kernel.
  • Ký các mô-đun thủ công.
  • Các mô-đun đã ký và tước.
  • Đang tải các mô-đun đã ký.
  • Chữ ký không hợp lệ và các mô-đun không dấu.
  • Quản trị / bảo vệ khóa riêng.

TỔNG QUAT

Cơ sở ký kết mô-đun hạt nhân ký mã hóa các mô-đun trong khi cài đặt và sau đó kiểm tra chữ ký khi tải mô-đun. Điều này cho phép tăng cường bảo mật hạt nhân bằng cách không cho phép tải các mô-đun không dấu hoặc mô-đun được ký với khóa không hợp lệ. Việc ký mô-đun tăng tính bảo mật bằng cách làm cho việc tải mô-đun độc hại vào kernel khó hơn. Việc kiểm tra chữ ký mô-đun được thực hiện bởi kernel để không cần thiết phải có các bit không gian người dùng đáng tin cậy.

Cơ sở này sử dụng chứng chỉ tiêu chuẩn X.509 ITU-T để mã hóa các khóa công khai có liên quan. Các chữ ký không được mã hóa trong bất kỳ loại tiêu chuẩn công nghiệp. Cơ sở hiện chỉ hỗ trợ tiêu chuẩn mã hóa khóa công khai RSA (mặc dù nó có thể cắm được và cho phép người khác sử dụng). Các thuật toán băm có thể có thể được sử dụng là SHA-1, SHA-224, SHA-256, SHA-384 và SHA-512 (thuật toán được chọn bởi dữ liệu trong chữ ký).


XÁC NHẬN MODULE MODULE

Tiện ích ký mô-đun được bật bằng cách đi tới phần "Bật hỗ trợ mô-đun có thể tải" của cấu hình kernel và bật

CONFIG_MODULE_SIG   "Module signature verification"

Điều này có một số tùy chọn có sẵn:

  1. "Yêu cầu các mô-đun được ký hợp lệ" (CONFIG_MODULE_SIG_FORCE)

    Điều này xác định cách kernel sẽ xử lý một mô-đun có chữ ký mà khóa không được biết hoặc mô-đun không được ký.

    Nếu điều này bị tắt (nghĩa là "cho phép"), thì các mô-đun không có khóa và các mô-đun không được phép được cho phép, nhưng hạt nhân sẽ được đánh dấu là bị ô nhiễm và các mô-đun liên quan sẽ được đánh dấu là bị nhòe, được hiển thị với ký tự 'E'.

    Nếu điều này được bật (tức là "hạn chế"), chỉ các mô-đun có chữ ký hợp lệ có thể được xác minh bằng khóa chung trong quyền sở hữu của hạt nhân mới được tải. Tất cả các mô-đun khác sẽ tạo ra một lỗi.

    Bất kể cài đặt ở đây, nếu mô-đun có khối chữ ký không thể phân tích cú pháp, nó sẽ bị loại khỏi tầm tay.

  2. "Tự động ký tất cả các mô-đun" (CONFIG_MODULE_SIG_ALL)

    Nếu điều này được bật thì các mô-đun sẽ được tự động ký trong giai đoạn mô-đun cài đặt. Nếu điều này bị tắt, thì các mô-đun phải được ký thủ công bằng cách sử dụng:

    scripts/sign-file
    
  3. "Những thuật toán băm nào nên được ký kết với?"

    Điều này trình bày một lựa chọn trong đó thuật toán băm mà giai đoạn cài đặt sẽ ký các mô-đun với:

    CONFIG_MODULE_SIG_SHA1      "Sign modules with SHA-1"
    CONFIG_MODULE_SIG_SHA224    "Sign modules with SHA-224"
    CONFIG_MODULE_SIG_SHA256    "Sign modules with SHA-256"
    CONFIG_MODULE_SIG_SHA384    "Sign modules with SHA-384"
    CONFIG_MODULE_SIG_SHA512    "Sign modules with SHA-512"
    

    Thuật toán được chọn ở đây cũng sẽ được tích hợp vào kernel (chứ không phải là một mô-đun) để các mô-đun được ký với thuật toán đó có thể được kiểm tra chữ ký của chúng mà không gây ra vòng lặp phụ thuộc.

  4. "Tên tệp hoặc PKCS # 11 URI của khóa ký mô-đun" (CONFIG_MODULE_SIG_KEY)

    Đặt tùy chọn này thành một cái gì đó không phải là "certs / sign_key.pem" mặc định của nó sẽ vô hiệu hóa việc tự động tạo các khóa ký và cho phép các mô-đun hạt nhân được ký bằng một khóa bạn chọn. Chuỗi được cung cấp phải xác định một tệp chứa cả khóa riêng và chứng chỉ X.509 tương ứng của nó ở dạng PEM hoặc - trên các hệ thống có OpenSSL Engine_pkcs11 hoạt động - URI PKCS # 11 như được xác định bởi RFC7512. Trong trường hợp sau, URI PKCS # 11 phải tham chiếu cả chứng chỉ và khóa riêng.

    Nếu tệp PEM chứa khóa riêng được mã hóa hoặc nếu mã thông báo PKCS # 11 yêu cầu mã PIN, thì mã này có thể được cung cấp tại thời điểm xây dựng bằng biến KBUILD_SIGN_PIN.

  5. "Các khóa X.509 bổ sung cho khóa hệ thống mặc định" (CONFIG_SYIUS_TRUSTED_KEYS)

    Tùy chọn này có thể được đặt thành tên tệp của tệp được mã hóa PEM có chứa các chứng chỉ bổ sung sẽ được bao gồm trong khóa hệ thống theo mặc định.

Lưu ý rằng việc cho phép ký mô-đun thêm một phụ thuộc vào các gói phát triển OpenSSL vào các quy trình xây dựng hạt nhân cho công cụ thực hiện việc ký.


TẠO KHÓA ĐĂNG KÝ

Cần có khóa mã hóa để tạo và kiểm tra chữ ký. Khóa riêng được sử dụng để tạo chữ ký và khóa chung tương ứng được sử dụng để kiểm tra. Khóa riêng chỉ cần trong quá trình xây dựng, sau đó có thể xóa hoặc lưu trữ an toàn. Khóa công khai được tích hợp vào kernel để có thể sử dụng nó để kiểm tra chữ ký khi các mô-đun được tải.

Trong điều kiện bình thường, khi CONFIG_MODULE_SIG_KEY không thay đổi so với mặc định của nó, việc xây dựng kernel sẽ tự động tạo ra một cặp khóa mới bằng cách sử dụng openssl nếu không tồn tại trong tệp:

certs/signing_key.pem

trong quá trình xây dựng vmlinux (phần công khai của khóa cần được xây dựng thành vmlinux) bằng cách sử dụng các tham số trong:

certs/x509.genkey

tập tin (cũng được tạo ra nếu nó chưa tồn tại).

Chúng tôi khuyên bạn nên cung cấp tệp x509.genkey của riêng bạn.

Đáng chú ý nhất, trong tệp x509.genkey, phần req_distinguished_name nên được thay đổi từ mặc định:

[ req_distinguished_name ]
#O = Unspecified company
CN = Build time autogenerated kernel key
#emailAddress = unspecified.user@unspecified.company

Kích thước khóa RSA được tạo cũng có thể được đặt bằng:

[ req ]
default_bits = 4096

Cũng có thể tự tạo các tệp riêng tư / công khai bằng cách sử dụng tệp cấu hình tạo khóa x509.genkey trong nút gốc của cây nguồn Linux và lệnh openssl. Sau đây là một ví dụ để tạo các tệp khóa công khai / riêng tư:

openssl req -new -nodes -utf8 -sha256 -days 36500 -batch -x509 \
   -config x509.genkey -outform PEM -out kernel_key.pem \
   -keyout kernel_key.pem

Tên đường dẫn đầy đủ cho tệp kernel_key.pem kết quả sau đó có thể được chỉ định trong tùy chọn CONFIG_MODULE_SIG_KEY, và chứng chỉ và khóa trong đó sẽ được sử dụng thay cho khóa ghép tự động.


KHÓA CÔNG CỘNG TẠI KernEL

Nhân chứa một vòng các khóa công khai có thể được xem bằng root. Họ đang ở trong một khóa gọi là ".system_keyring" có thể được nhìn thấy bởi:

[root@deneb ~]# cat /proc/keys
...
223c7853 I------     1 perm 1f030000     0     0 keyring   .system_keyring: 1
302d2d52 I------     1 perm 1f010000     0     0 asymmetri Fedora kernel signing key: d69a84e6bce3d216b979e9505b3e3ef9a7118079: X509.RSA a7118079 []
...

Ngoài khóa công khai được tạo riêng cho việc ký mô-đun, các chứng chỉ tin cậy bổ sung có thể được cung cấp trong tệp được mã hóa PEM được tham chiếu bởi tùy chọn cấu hình CONFIG_SYIUS_TRUSTED_KEYS.

Hơn nữa, mã kiến ​​trúc có thể lấy các khóa công khai từ một cửa hàng phần cứng và thêm chúng vào (ví dụ từ cơ sở dữ liệu khóa UEFI).

Cuối cùng, có thể thêm các khóa công khai bổ sung bằng cách thực hiện:

keyctl padd asymmetric "" [.system_keyring-ID] <[key-file]

ví dụ:

keyctl padd asymmetric "" 0x223c7853 <my_public_key.x509

Tuy nhiên, lưu ý rằng hạt nhân sẽ chỉ cho phép các khóa được thêm vào .system_keyring nếu trình bao bọc X.509 của khóa mới được ký hợp lệ bởi một khóa đã tồn tại trong .system_keyring tại thời điểm khóa được thêm vào.


MÔ HÌNH ĐĂNG KÝ MANUALLY

Để ký một mô-đun theo cách thủ công, hãy sử dụng công cụ tập lệnh / tập tin đăng nhập có sẵn trong cây nguồn Linux. Kịch bản yêu cầu 4 đối số:

1.  The hash algorithm (e.g., sha256)
2.  The private key filename or PKCS#11 URI
3.  The public key filename
4.  The kernel module to be signed

Sau đây là một ví dụ để ký một mô-đun hạt nhân:

scripts/sign-file sha512 kernel-signkey.priv \
    kernel-signkey.x509 module.ko

Thuật toán băm được sử dụng không phải phù hợp với thuật toán được cấu hình, nhưng nếu không, bạn nên đảm bảo rằng thuật toán băm được tích hợp vào kernel hoặc có thể được tải mà không cần chính nó.

Nếu khóa riêng yêu cầu mật khẩu hoặc mã PIN, nó có thể được cung cấp trong biến môi trường $ KBUILD_SIGN_PIN.


CÁC MÔ HÌNH VÀ DẤU HIỆU

Một mô-đun đã ký có chữ ký số được thêm vào cuối. Chuỗi "~ Chữ ký mô-đun được nối thêm ~." ở cuối tập tin của mô-đun xác nhận rằng có chữ ký nhưng nó không xác nhận rằng chữ ký đó là hợp lệ!

Các mô-đun đã ký là BRITTLE vì chữ ký nằm ngoài vùng chứa ELF đã xác định. Do đó, chúng KHÔNG THỂ bị tước bỏ khi chữ ký được tính và đính kèm. Lưu ý toàn bộ mô-đun là tải trọng đã ký, bao gồm bất kỳ và tất cả thông tin gỡ lỗi có tại thời điểm ký.


LOADING MODULES ĐĂNG KÝ

Các mô-đun được tải với insmod, modprobe, init_module () hoặc finit_module (), chính xác như đối với các mô-đun không dấu vì không xử lý được thực hiện trong không gian người dùng. Việc kiểm tra chữ ký là tất cả được thực hiện trong kernel.


CÁC KÝ HIỆU KHÔNG CÓ GIÁ TRỊ VÀ CÁC PHƯƠNG THỨC KHÔNG ĐƯỢC KÝ

Nếu CONFIG_MODULE_SIG_FORCE được bật hoặc execcemodulesig = 1 được cung cấp trên dòng lệnh kernel, kernel sẽ chỉ tải các mô-đun được ký hợp lệ mà nó có khóa chung. Nếu không, nó cũng sẽ tải các mô-đun không dấu. Bất kỳ mô-đun nào mà kernel có khóa, nhưng chứng tỏ có sự không phù hợp chữ ký sẽ không được phép tải.

Bất kỳ mô-đun nào có chữ ký không thể nhìn thấy sẽ bị từ chối.


QUẢN TRỊ / BẢO VỆ KHÓA RIÊNG TƯ

Vì khóa riêng được sử dụng để ký các mô-đun, vi-rút và phần mềm độc hại có thể sử dụng khóa riêng để ký các mô-đun và thỏa hiệp hệ điều hành. Khóa riêng phải được hủy hoặc di chuyển đến một vị trí an toàn và không được giữ trong nút gốc của cây nguồn kernel.


Cảm ơn nhưng, tôi đã hoàn toàn nhìn thấy văn bản này trước đây. Vấn đề tôi gặp phải là mặc dù tôi có thể ký vào tệp của mình, tôi không thể tải tệp được vì: "kernel của anh ấy sẽ chỉ cho phép các khóa được thêm vào .system_keyring nếu trình bao bọc X.509 của khóa mới được ký hợp lệ bởi một khóa đã tồn tại trong .system_keyring tại thời điểm khóa được thêm vào. "
Toàn năngEntity

Tôi đã thấy điều này nhiều lần nhưng nó không giúp được gì. Có một lỗi trong Ubuntu mà ảnh hưởng đến tất cả các bo mạch chủ mà không hỗ trợ UEFI: bugs.launchpad.net/ubuntu/+source/linux-lts-xenial/+bug/1656670
musbach

0

Chỉnh sửa ./include/generated/autoconf.hvà thay đổi dòng

define CONFIG_MODULE_SIG 1

đến

define CONFIG_MODULE_SIG 0
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.