Làm thế nào để mã hóa Marshmallow hoạt động kỹ thuật?


14

Tôi vừa cài đặt Marshmallow trên Nexus 5 thông qua bản cập nhật được đẩy. Tôi bối rối về cách mã hóa hoạt động. Tôi có kiến ​​thức kỹ thuật tốt về mã hóa trên máy tính. Tôi muốn có được kiến ​​thức tương tự về Android 6.

Sau đây là những gì tôi đã làm và làm thế nào tôi bị nhầm lẫn. Sau khi khôi phục cài đặt gốc, tôi thiết lập mã PIN sau đó mã hóa thiết bị. Khi khởi động, nó hỏi tôi mã PIN, dự kiến. Sau đó tôi đã xóa mã PIN và khởi động lại thiết bị. Nó không yêu cầu bất kỳ mã PIN nào khi khởi động nhưng thiết bị vẫn báo cáo là được mã hóa trong menu cài đặt. Cái sau là điều khiến tôi bối rối vì tôi mong mã PIN sẽ mở khóa khóa giải mã.

Câu hỏi:

  • Trong trường hợp mã hóa không có mã PIN, khóa giải mã đến từ đâu? Tôi giả sử nó được lưu trữ trên một con chip tương tự như TPM, điều này có đúng không? Nếu vậy điều gì ngăn cản tin tặc yêu cầu khóa này từ chip? Nó có kiểm tra băm của phần sụn không? Còn gì nữa không? Chi tiết kỹ thuật sẽ được nhiều đánh giá cao.
  • Trong trường hợp mã hóa bằng mã PIN, mã PIN có được sử dụng làm mã thông báo bổ sung để truy cập khóa giải mã không? Hoặc quá trình giải mã hoạt động chính xác như thể không có mã PIN.

TL; DL trả lời:

Khóa giải mã được mở khóa với tất cả những điều sau đây:

  • PIN (hoặc mật khẩu, v.v.) hoặc mật khẩu mặc định nếu không có
  • TEE (trình tạo chữ ký được hỗ trợ bằng phần cứng sử dụng các khóa không thể giải nén)
  • Một loại muối (có sẵn nhưng ngăn chặn các cuộc tấn công bảng cầu vồng)

Cảm ơn. Mặc dù nó áp dụng cho Lollipop nhưng đây là câu trả lời đúng theo như tôi biết. Tôi nghĩ rằng có sự khác biệt giữa M và L vì tôi không nhớ có thể thiết lập mã hóa không mật khẩu trên L hoặc có thể xóa mã PIN của mình sau khi mã hóa.
marcv81

Câu trả lời:


15

Tôi đang trích dẫn từ Hướng dẫn sử dụng Android ở đây , nhưng:

GHI CHÚ:

Nguồn tôi đã sử dụng không liên quan trực tiếp đến Marshmallow nhưng có liên quan đến Lollipop và cao hơn.

TL: DR

Bây giờ tôi sẽ chỉ giải quyết các câu hỏi của OP. Chi tiết kỹ thuật sẽ làm theo.

  1. Khóa mã hóa mặc định đến từ nguồn phần cứng (chip tương tự TPM) và mật khẩu mặc định của AOSP được xác định như default_passwordtrong cryptfs.ctệp nguồn, xem bên dưới.

  2. Có, không chỉ mặc định, mà bất kỳ mật khẩu nào cũng được tạo thành khóa và được lưu trữ trên chip giống như TPM, được gọi là TEE (viết tắt của "Môi trường thực thi tin cậy", xem bên dưới để biết thêm chi tiết).

  3. Một hacker có quyền truy cập UART / JTAG vào các chip trên SoC của thiết bị về mặt kỹ thuật có thể truy cập vào khóa TEE hoặc một hạt nhân tùy chỉnh có thể rò rỉ thông tin này cho tin tặc. Một số cơ quan 3 chữ cái trong các lý thuyết âm mưu có thể hợp tác với OEM để có được những hạt nhân không an toàn này được sử dụng trong các thiết bị sản xuất, nhưng tôi sẽ không đặt nhiều cửa hàng bởi nó. Một lần nữa, xem phần cuối của câu trả lời này để biết thêm chi tiết.

Điều duy nhất ngăn chặn tin tặc truy cập vào khóa là số lượng nỗ lực cần thiết để làm điều đó.

  1. Việc kiểm tra hàm băm (kiểm tra) phần sụn (được gọi là "Khởi động được xác minh" của Google) trên thực tế được thực hiện trên và trên Lollipop theo mặc định (và có sẵn từ JellyBean 4.3 trở đi), bằng mô-đun hạt nhân được gọi dm-verity. Tuy nhiên, điều này là độc lập với tình trạng mã hóa.

Nguồn: Hướng dẫn bảo mật AOSP tại đây .

  1. Về quy trình liên quan đến giải mã hệ thống bằng mật khẩu tùy chỉnh, xem bên dưới. Tôi sẽ chỉ nói với bạn ở đây rằng mật khẩu người dùng có liên quan đến cả việc tạo và sử dụng khóa mã hóa.

Tổng quat

Khi khởi động lần đầu tiên, thiết bị sẽ tạo một khóa chính 128 bit được tạo ngẫu nhiên và sau đó băm nó bằng mật khẩu mặc định và muối được lưu trữ. Mật khẩu mặc định là: "default_password" Tuy nhiên, hàm băm kết quả cũng được ký thông qua TEE (chẳng hạn như TrustZone), sử dụng hàm băm của chữ ký để mã hóa khóa chính.

Bạn có thể tìm thấy mật khẩu mặc định được xác định trong tệp cryptfs.c của Dự án nguồn mở Android .

Khi người dùng đặt mã PIN / mật khẩu hoặc mật khẩu trên thiết bị, chỉ có khóa 128 bit được mã hóa lại và lưu trữ. (ví dụ: thay đổi mã PIN / pass / mẫu của người dùng KHÔNG gây ra mã hóa lại phân vùng userdata.)

Bắt đầu một thiết bị được mã hóa với mã hóa mặc định

Đây là những gì xảy ra khi bạn khởi động một thiết bị được mã hóa không có mật khẩu. Vì các thiết bị Android 5.0 được mã hóa trong lần khởi động đầu tiên, nên không có mật khẩu được đặt và do đó đây là trạng thái mã hóa mặc định.

  1. Phát hiện mã hóa / dữ liệu không có mật khẩu

Phát hiện thiết bị Android được mã hóa vì / dữ liệu không thể được gắn và một trong các cờ encryptablehoặc forceencryptđược đặt.

voldđặt vold.decryptđể trigger_default_encryption, mà bắt đầu các defaultcryptodịch vụ. trigger_default_encryptionkiểm tra loại mã hóa để xem / dữ liệu được mã hóa có hoặc không có mật khẩu.

  1. Giải mã / dữ liệu

Tạo dm-cryptthiết bị qua thiết bị khối để thiết bị sẵn sàng sử dụng.

  1. Gắn kết / dữ liệu

voldsau đó gắn kết phân vùng thực / dữ liệu được giải mã và sau đó chuẩn bị phân vùng mới. Nó đặt tài sản vold.post_fs_data_doneđể 0rồi đặt vold.decryptvào trigger_post_fs_data. Điều này gây ra init.rcchạy nópost-fs-data lệnh . Họ sẽ tạo bất kỳ thư mục hoặc liên kết cần thiết và sau đó được đặt vold.post_fs_data_donethành 1.

Khi voldnhìn thấy 1 trong thuộc tính đó, nó đặt thuộc tính vold.decryptthành : trigger_restart_framework. Điều này gây ra init.rcbắt đầu dịch vụ trong lớp mainmột lần nữa và cũng bắt đầu dịch vụ trong lớp late_start lần đầu tiên kể từ khi khởi động.

  1. Khung bắt đầu

Bây giờ khung khởi động tất cả các dịch vụ của nó bằng cách sử dụng dữ liệu / giải mã và hệ thống đã sẵn sàng để sử dụng.

Bắt đầu một thiết bị được mã hóa mà không cần mã hóa mặc định

Đây là những gì xảy ra khi bạn khởi động một thiết bị được mã hóa có mật khẩu được đặt. Mật khẩu của thiết bị có thể là mã pin, mẫu hoặc mật khẩu.

  1. Phát hiện thiết bị được mã hóa bằng mật khẩu

Phát hiện thiết bị Android được mã hóa vì cờ ro.crypto.state = "encrypted"

voldđặt vold.decryptthành trigger_restart_min_frameworkvì / dữ liệu được mã hóa bằng mật khẩu.

  1. Núi tmpfs

initđặt năm thuộc tính để lưu các tùy chọn gắn kết ban đầu được cung cấp cho / dữ liệu với các tham số được truyền từ init.rc. voldsử dụng các thuộc tính này để thiết lập ánh xạ tiền điện tử:

ro.crypto.fs_type

ro.crypto.fs_real_blkdev

ro.crypto.fs_mnt_point

ro.crypto.fs_options

ro.crypto.fs_flags (Số hex 8 chữ số ASCII có trước 0x)

  1. Bắt đầu khung để nhắc mật khẩu

Khung khởi động và thấy rằng vold.decryptđược đặt thành trigger_restart_min_framework. Điều này nói với khung rằng nó đang khởi động trên tmpfs /datađĩa và nó cần lấy mật khẩu người dùng.

Tuy nhiên, trước tiên, nó cần đảm bảo rằng đĩa đã được mã hóa chính xác. Nó gửi lệnh cryptfs cryptocompleteđến vold. voldtrả về 0 nếu mã hóa được hoàn thành thành công, -1 khi lỗi nội bộ hoặc -2 nếu mã hóa không được hoàn thành thành công. voldxác định điều này bằng cách tìm trong siêu dữ liệu tiền điện tử choCRYPTO_ENCRYPTION_IN_PROGRESS cờ. Nếu được đặt, quá trình mã hóa bị gián đoạn và không có dữ liệu có thể sử dụng được trên thiết bị.

Nếu voldtrả về lỗi, giao diện người dùng sẽ hiển thị thông báo cho người dùng để khởi động lại và khôi phục cài đặt gốc cho thiết bị và cung cấp cho người dùng một nút để nhấn để làm như vậy.

  1. Giải mã dữ liệu bằng mật khẩu

Khi cryptfs cryptocompletethành công, khung hiển thị giao diện người dùng yêu cầu mật khẩu đĩa. UI kiểm tra mật khẩu bằng cách gửi lệnh cryptfs checkpwđến vold. Nếu mật khẩu là chính xác (được xác định bằng cách gắn thành công giải mã /datatại một vị trí tạm thời, sau đó ngắt kết nối nó), vold lưu tên của thiết bị chặn được giải mã trong thuộc tính ro.crypto.fs_crypto_blkdevvà trả về trạng thái 0 cho UI. Nếu mật khẩu không chính xác, nó sẽ trả về -1 cho UI.

  1. Dừng khung

Giao diện người dùng đưa ra một đồ họa khởi động tiền điện tử và sau đó gọi vold bằng lệnh cryptfs restart. voldbộ tài sản vold.decryptđể trigger_reset_main, gây ra init.rcđể làm class_reset main. Điều này dừng tất cả các dịch vụ trong mainlớp, cho phép tmpfs /datakhông bị ngắt kết nối.

  1. Gắn kết / dữ liệu

voldsau đó gắn kết /dataphân vùng thực được giải mã và chuẩn bị phân vùng mới (có thể chưa bao giờ được chuẩn bị nếu nó được mã hóa với tùy chọn xóa, không được hỗ trợ trong bản phát hành đầu tiên). Nó đặt tài sản vold.post_fs_data_doneđể 0rồi đặt vold.decryptvào trigger_post_fs_data. Điều này gây ra init.rcđể chạy nó post-fs-data commands. Họ sẽ tạo bất kỳ thư mục hoặc liên kết cần thiết và sau đó được đặt vold.post_fs_data_donethành 1. Khi voldnhìn thấy 1trong tài sản đó, nó đặt thuộc tính vold.decryptcho trigger_restart_framework. Điều này gây ra init.rcbắt đầu dịch vụ trong lớp mainmột lần nữa và cũng bắt đầu dịch vụ trong lớp late_startlần đầu tiên kể từ khi khởi động.

  1. Bắt đầu khuôn khổ đầy đủ

Bây giờ khung khởi động tất cả các dịch vụ của nó bằng cách sử dụng hệ thống tệp được giải mã / dữ liệu và hệ thống đã sẵn sàng để sử dụng.

Lưu trữ khóa được mã hóa

Khóa được mã hóa được lưu trữ trong siêu dữ liệu tiền điện tử. Việc sao lưu phần cứng được thực hiện bằng cách sử dụng khả năng ký của Môi trường thực thi tin cậy (TEE). Trước đây, chúng tôi đã mã hóa khóa chính bằng một khóa được tạo bằng cách áp dụng scryptcho mật khẩu của người dùng và muối được lưu trữ.

Để làm cho khóa trở nên linh hoạt trước các cuộc tấn công ngoài hộp, chúng tôi mở rộng thuật toán này bằng cách ký khóa kết quả bằng khóa TEE được lưu trữ. Chữ ký kết quả sau đó được biến thành một khóa có độ dài phù hợp bằng một ứng dụng nữa scrypt. Khóa này sau đó được sử dụng để mã hóa và giải mã khóa chính. Để lưu trữ khóa này:

  1. Tạo khóa mã hóa đĩa 16 byte ngẫu nhiên (DEK) và muối 16 byte.
  2. Áp dụng scryptcho mật khẩu người dùng và muối để tạo khóa trung gian 32 byte 1 (IK1).
  3. Pad IK1 có byte bằng 0 với kích thước của khóa riêng bị ràng buộc bởi phần cứng (HBK). Cụ thể, chúng tôi đệm là: 00 || IK1 | | 00..00; một byte 0, 32 IK1 byte, 223 byte 0.
  4. Ký tên đệm IK1 với HBK để tạo IK2 256 byte.
  5. Ứng dụng scrypt cho IK2 và muối (cùng muối với bước 2) để tạo IK3 32 byte.
  6. Sử dụng 16 byte đầu tiên của IK3 là KEK và 16 byte cuối cùng là IV.
  7. Mã hóa DEK bằng AES_CBC, với khóa KEK và vectơ khởi tạo IV.

Android N thì sao? Các đồng nghiệp đã đưa ra giả định rằng mã hóa là Android 7 yếu hơn vì sự khởi đầu của thiết bị không được bảo vệ như trước và do đó kẻ tấn công có thể dễ dàng hơn trước, bạn có nghĩ điều này là đúng không?
David

@David nằm ngoài phạm vi của câu hỏi này, vui lòng hỏi một câu hỏi khác về Android Nougat.
Tamoghna Chowdhury


Làm thế nào tôi có thể giải mã phân vùng DATA trong chế độ phục hồi? thông qua init.recovery. <ro.hardware> .rc
Benny

@Benny xin hỏi một câu hỏi thích hợp về điều đó
Tamoghna Chowdhury
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.