Site icon TAPIT

Chuỗi bài viết đề tài “Giải pháp bảo mật cho thiết bị Datalogger” (P5)

Tại thiết bị Datalogger, mỗi khi vi điều khiển khởi động, chương trình bộ nạp khởi động sẽ được thực thi. Nguy cơ tấn công vào bộ khởi động của thiết bị Datalogger nói chung và các thiết bị Nhúng/IoTs nói riêng là rất cao. Kẻ tấn công thường xâm nhập vào Chương trình bộ nạp khởi động nhằm truy cập vào dữ liệu chương trình. Qua đó, có thể sửa đổi dữ liệu, thay đổi chế độ khởi động, thay đổi địa chỉ khởi động để truy cập ứng dụng người dùng và kiểm soát thiết bị qua bộ nạp khởi động, cổng gỡ lỗi hoặc chương trình được kẻ tấn công đưa vào RAM. Rủi ro cao nhất có thể xảy ra là kẻ tấn công có thể toàn quyền truy cập nội dung của vi điều khiển trên thiết bị. 

Tại bài viết này, chúng ta sẽ tìm hiểu về Giải pháp bảo mật Quá trình khởi động của thiết bị. 

Các bạn tham khảo nội dung các phần trước của chuỗi bài viết:

? Phần 1: Tổng quan vấn đề bảo mật trên các hệ thống IoT. Xem tại đây.

? Phần 2: Đề xuất giải pháp bảo mật cho thiết bị Datalogger. Xem tại đây.

? Phần 3: Giải pháp 1 – Bảo vệ chương trình ứng dụng và dữ liệu tại thiết bị. Xem tại đây.

? Phần 4. Giải pháp 2 – Bảo vệ khi giao tiếp cổng vật lý. Xem tại đây.

Phần 5. Giải pháp 3 – Bảo mật Quá trình khởi động của thiết bị

1. Thuật toán sử dụng 

a. Giới thiệu về mật mã học

Mật mã học là một lĩnh vực liên quan đến các phương pháp toán học nhằm đảm bảo an toàn thông tin, cụ thể là trong thông tin liên lạc. Mật mã học gắn liền với quá trình mã hóa và giải mã. 

Trong bài báo “Overview of Cryptography” [1], các thuộc tính được yêu cầu trong mật mã học bao gồm:  

Một số thuật toán thường được sử dụng trong mật mã học như: mật mã khóa đối xứng, mật mã khóa bất đối xứng, hàm băm,…

b. Mật mã khóa đối xứng

Mật mã khóa đối xứng (hay Mã hóa đối xứng) là thuật toán sử dụng chung một khóa trong quá trình mã hóa, giải mã dữ liệu trên kênh truyền và đảm bảo thuộc tính bí mật và xác thực trong mật mã học. Vì vậy, khóa phải được chia sẻ cho cả bên truyền và bên nhận, khóa phải được giữ bí mật tuyệt đối, nên được gọi là khóa bí mật (còn gọi là khóa riêng tư). Mức độ bảo mật của các hệ thống mật mã khóa đối xứng sẽ phụ thuộc vào độ khó trong việc suy đoán ngẫu nhiên ra khóa đối xứng theo hình thức tấn công brute force. Thông thường, các khóa có độ dài tới 256-bit có thể được xem là có độ bảo mật cao tuyệt đối, có khả năng chống lại được hình thức tấn công brute force từ các máy tính lượng tử. Một số thuật toán mật mã khóa đối xứng phổ biến thường được sử dụng như AES, TDES, DES, RC4,…

Hình 1. Mô phỏng về Mật mã khóa đối xứng (Nguồn: st.com)

Cơ chế hoạt động của các thuật toán mật mã khóa đối xứng bao gồm các bước: (1) Bên truyền và bên nhận sẽ chia sẻ khóa bí mật sử dụng chung của hai bên; (2) Bên truyền sử dụng khóa bí mật cùng với thuật toán mã hóa để mã hóa dữ liệu; (3) Bên nhận sử dụng khóa chung với thuật toán giải mã để giải mã dữ liệu thành dạng rõ ràng. 

Ưu điểm của mật mã khóa đối xứng là quy trình mã hóa và giải mã nhanh, phù hợp cho dữ liệu thông tin lớn. Bên cạnh đó, một số nhược điểm đáng chú ý như: cần kênh thông tin mật để chia sẻ khóa bí mật giữa các bên ở lần đầu tiên trao đổi thông tin, dữ liệu; nếu khóa bị đánh cắp bởi kẻ tấn công thì mọi dữ liệu đều có thể bị đánh cắp; để đảm bảo trao đổi thông tin an toàn cho một nhóm nhiều người gồm n thành viên, tổng số lượng khóa cần sẽ là n(n-1)/2, số lượng khóa quá nhiều và khó khăn cho việc quản lý; từ đó sẽ khó ứng dụng trong các hệ thống mở. Để khắc phục những nhược điểm trên, mật mã khóa bất đối xứng ra đời.

c. Mật mã khóa bất đối xứng 

Mật mã khóa bất đối xứng (hay Mật mã khóa công khai) là thuật toán sử dụng hai khóa để mã hóa và giải mã dữ liệu, bao gồm khóa công khai và khóa bí mật; đảm bảo thuộc tính bí mật và xác thực trong mật mã học. Khóa công khai là khóa được chia sẻ giữa các bên liên lạc và thường được sử dụng để mã hóa dữ liệu. Khóa bí mật là khóa được giữ riêng tư giữa các bên và thường được sử dụng để giải mã dữ liệu. Rất khó để thu được khóa bí mật nếu bạn đang giữ khóa công khai. Nghĩa là một người nào đó có thể tự do gửi khóa công khai ra bên ngoài theo các kênh không an toàn, nhưng họ vẫn có thể chắc chắn chỉ họ mới có thể giải mã các dữ liệu đã mã hóa đó. Thuật toán mật mã khóa bất đối xứng phổ biến thường được sử dụng là RSA.

Hình 2. Mô phỏng về Mật mã khóa bất đối xứng (Nguồn: st.com)

Cơ chế hoạt động của các thuật toán mật mã khóa đối xứng bao gồm các bước: (1) Người gửi (A) sẽ nhận khóa công khai của người nhận (B) qua kênh truyền không bí mật; (2) Người gửi (A) sử dụng khóa công khai của (B) để mã hóa dữ liệu muốn gửi đi; (3) Người nhận (B) nhận được dữ liệu và thực hiện giải mã bằng khóa riêng tư của mình. 

Ưu điểm của mật mã khóa bất đối xứng là:

Bên cạnh những ưu điểm mạnh kể trên, một nhược điểm còn tồn tại của Mật mã khóa bất đối xứng là chưa có kênh an toàn để chia sẻ khóa công khai, từ đó có khả năng bị tấn công bởi dạng tấn công người đứng giữa. Tấn công người đứng giữa là những kẻ tấn công lợi dụng việc phân phối khóa công khai, họ đứng ở giữa hai bên trao đổi để nhận các gói tin, sau đó thực hiện giải mã, thay đổi dữ liệu và mã hóa với khóa công khai rồi tiếp tục gửi đến nơi nhận và không bị phát hiện. 

d. Mật mã hàm băm

Băm là quá trình chuyển đổi đầu vào gồm các chữ cái và ký tự có kích thước không cố định để tạo đầu ra có kích thước cố định thường được gọi là giá trị băm, mã băm, hash hay digest. Quá trình này được thực hiện bằng cách sử dụng các công thức toán học như các hàm băm. 

Thông thường, các thuật toán băm được thiết kế như các hàm băm chỉ hoạt động theo một chiều. Nghĩa là nếu chúng ta có giá trị đầu ra và biết được thuật toán băm sử dụng là gì, chúng ta cũng không thể nào tính toán và suy ra được dữ liệu đầu vào là gì. Đây là tính chất vô cùng quan trọng của hàm băm, với việc tính toán để tìm dữ liệu đầu vào càng cao thì tính bảo mật của thuật toán băm càng cao. Các hàm băm khác nhau sẽ tạo ra các kết quả đầu ra có kích thước khác nhau, nhưng kích thước của các kết quả đầu ra có thể nhận được luôn cố định và không đổi. Ví dụ, thuật toán SHA-256 chỉ có thể tạo ra các kết quả đầu ra có kích thước 256 bit, trong khi thuật toán SHA-1 sẽ luôn tạo ra một kết quả đại diện có kích thước 160-bit. Thuật toán mật mã hàm băm thường được sử dụng như MD5, SHA-1, SHA-256, SHA-512,…

Mật mã hàm băm là hàm băm triển khai các kỹ thuật mã hóa. Mật mã hàm băm cần đáp ứng được các tiêu chí sau:

Mật mã hàm băm mang thuộc tính toàn vẹn của bảo mật. Cụ thể hơn, với các dữ liệu đầu vào khác nhau, qua thuật toán băm sẽ tạo ra các kết quả đầu ra khác nhau và các kết quả này không có liên hệ gì với nhau để kẻ tấn công có thể tìm kiếm được thông tin trong đó. Ví dụ với bảng 1, có thể thấy rằng, với một thay đổi nhỏ như thay đổi chữ cái đầu tiên, thuật toán lại sinh ra một giá trị băm hoàn toàn khác với giá trị ban đầu. Kết hợp với tiêu chí chống xung đột của mật mã hàm băm, điều này khẳng định rằng, khi dữ liệu bị thay đổi như thế nào, chắc chắn kết quả băm sinh ra từ thuật toán mật mã băm sẽ khác nhau, nhờ vậy mà hệ thống sử dụng hàm băm luôn luôn phát hiện được sự thay đổi của dữ liệu.

Bảng 1. Ví dụ về dữ liệu đầu vào và đầu ra của thuật toán băm SHA-256

SHA-256
Đầu vào Đầu ra (256 bits)
Secure.tapit 7ea7776c4a48e43e3ee6107759c49148f5b3491c1f97f334ede6fd582817071f
secure.tapit ec6028e3b1e96405ea630e1ba67e2d678eff003adccb9dcdaf82cab7d9d08796

Một số trường hợp thường sử dụng thuật toán băm như: chữ ký số, mã xác thực thông điệp và các hình thức xác thực khác như xác thực mật khẩu. 

2. Gói thư viện mật mã của STM32

Gói thư viện mật mã STM32 được xây dựng và phát triển bởi đội ngũ kỹ thuật của hãng ST. Gói thư viện bao gồm hầu hết tất cả các thuật toán yêu cầu trong bảo mật như thuật toán mã hóa, thuật toán băm, thuật toán xác thực tin nhắn và thuật toán chữ ký số, nhằm cho phép các nhà phát triển với dòng ST đáp ứng được các yêu cầu bảo mật chương trình phần mềm như tính bí mật, tính toàn vẹn, tính xác thực. Gói thư viện này được thiết kế và biên dịch để chạy trên các vi điều khiển hãng ST với lõi ARM Cortex-M. 

Tại đề tài này, gói thư viện mật mã của hãng ST được sử dụng để hỗ trợ cho việc triển khai giải pháp bảo mật quá trình khởi động của thiết bị và giải pháp bảo mật cập nhật chương trình từ xa. 

Hình 4. Các thuật toán mà gói thư viện mật mã hỗ trợ

3. Bảo mật quá trình khởi động

a. Quá trình khởi động là gì?

Mỗi khi thiết bị được cấp nguồn, hoặc khi người dùng nhấn nút khởi động lại trên thiết bị hoặc trong một số trường hợp hoạt động của chương trình như khi chương trình ứng dụng phát hiện có phiên bản cập nhật mới thì vi điều khiển sẽ được yêu cầu thực hiện khởi động lại. Quá trình khởi động được diễn ra tại bộ nạp khởi động của thiết bị, thường bắt đầu ở vị trí bắt đầu của bộ nhớ Flash. Chương trình tại bộ nạp khởi động là một chương trình độc lập, tách biệt với chương trình ứng dụng thực thi các chức năng chính của thiết bị. 

Các bạn tham khảo bài viết Quá trình khởi động của vi điều khiển lõi ARM Cortex M để nắm rõ hơn về quá trình này.

Tại thiết bị Datalogger, mỗi khi vi điều khiển khởi động, chương trình bộ nạp khởi động sẽ được thực thi, thông qua các biến liên kết, bộ nạp khởi động sẽ lựa chọn thực thi Chương trình OTA hay Chương trình ứng dụng cho lần khởi động này. 

Hình 5. Vị trí chương trình Bộ nạp khởi động trong bộ nhớ Flash

Kẻ tấn công thường xâm nhập vào Chương trình bộ nạp khởi động nhằm truy cập vào dữ liệu chương trình. Qua đó, có thể sửa đổi dữ liệu, thay đổi chế độ khởi động, thay đổi địa chỉ khởi động để truy cập ứng dụng người dùng và kiểm soát thiết bị qua bộ nạp khởi động, cổng gỡ lỗi hoặc chương trình được kẻ tấn công đưa vào RAM. Rủi ro cao nhất có thể xảy ra là kẻ tấn công có thể toàn quyền truy cập nội dung của vi điều khiển trên thiết bị. 

b. Bảo mật quá trình khởi động là gì?

Nguy cơ tấn công vào bộ khởi động của thiết bị Datalogger nói chung và các thiết bị Nhúng/IoTs nói riêng là rất cao, nên việc bảo mật quá trình khởi động khỏi những kẻ tấn công là một mục tiêu cần được ưu tiên để triển khai thực hiện. Vai trò chính của chương trình bảo mật quá trình khởi động là xác minh chương trình ứng dụng trước khi khởi chạy. Theo tài liệu “Introduction to STM32 microcontrollers security” của hãng ST, bảo mật khởi động cần đảm bảo hai thuộc tính: tính toàn vẹn và tính xác thực của chương trình ứng dụng. Trong đó:

Bảo mật quá trình khởi động cần được đảm bảo một số tiêu chí sau:

Dựa trên các tiêu chí về khởi động an toàn. Các bước triển khai bảo mật cho bộ nạp khởi động được thực hiện như sau:

  1. Xây dựng một bộ nạp khởi động với điểm vào duy nhất
  2. Bảo vệ cho chương trình ở bộ nạp khởi động bất biến, không thể đọc, ghi , xoá hay sửa đổi
  3. Tạo một quy trình xác thực cho bộ nạp khởi động bằng việc so sánh giá trị băm và chữ ký của chương trình ứng dụng trước khi thực thi.

Hình 6. Quá trình thực hiện Khởi động an toàn

4. Triển khai giải pháp bảo mật quá trình khởi động

a. Xây dựng một bộ nạp khởi động với Unique Entry Point

Với dòng vi điều khiển STM32 lõi ARM Cortex-M, bộ nạp khởi động có thể khởi động từ ba vùng nhớ khác nhau: bộ nhớ Flash người dùng, bộ nạp khởi động mặc định của hệ thống và bộ nhớ RAM. Bộ nạp khởi động được chúng tôi lựa chọn sử dụng và kết hợp giải pháp bảo mật là bộ nạp khởi động được lưu ở bộ nhớ Flash. Khác với bộ nạp khởi động có sẵn ở hệ thống, bộ nạp khởi động ở bộ nhớ Flash có thể được người dùng xây dựng và phát triển tùy vào nhu cầu người sử dụng. Mục tiêu của việc xây dựng bộ nạp khởi động với Unique Entry Point nhằm đảm bảo không có bất cứ ai có thể thay đổi chế độ khởi động, địa chỉ khởi động với mục đích kiểm soát thiết bị.  

Vi điều khiển STM32F303RCT6 mà thiết bị Datalogger đang sử dụng có thể làm được điều này bằng cách áp dụng bảo vệ đọc cấp độ 2 vào thiết bị. 

Hình 7. Thiết lập chọn đầu vào duy nhất sau khi thiết bị khởi động lại

b. Bảo vệ cho chương trình ở bộ nạp khởi động bất biến

Chương trình bộ nạp ngoài việc chứa các khóa phục vụ cho việc xác minh trong quá trình xác thực thì còn chứa các đoạn mã chương trình quan trọng có ảnh hưởng trực tiếp tới chương trình chính. Triển khai bảo vệ đọc cấp độ và và bảo vệ ghi ở vùng nhớ chứa bộ nạp khởi động làm cho chương trình bộ nạp khởi động trở nên bất biến- không thể ghi, đọc, sửa đổi. Vì vậy ngoài việc sử dụng bảo vệ đọc cấp 2 cho toàn thiết bị (trong đó có bộ nạp khởi động), vùng nhớ chứa bộ nạp khởi động phải được thiết lập bảo vệ ghi bộ nhớ Flash.

Bản chất của việc cấu hình chế độ bảo vệ đọc và bảo vệ ghi là việc thiết lập giá trị của Option bytes trong vi điều khiển. Cụ thể, Option bytes là tập hợp các byte được dùng để cấu hình các chế độ bảo vệ đọc/ghi (read/write protection), mức độ BOR, watchdog phần mềm/phần cứng và reset lại MCU nếu thiết bị ở chế độ Standby hoặc Stop mode. Chương trình thuật toán kết hợp bảo vệ đọc và bảo vệ ghi được đề cập tại mục 3.3.3. 

c. Tạo một quy trình xác thực chương trình ứng dụng tại bộ nạp khởi động

Tại bước này, chúng tôi sử dụng gói thư viện mã hóa STM32 (X-CUBE- CRYPTOLIB) bao gồm tất cả các thuật toán bảo mật chính để mã hóa, băm, xác thực tin nhắn và ký kỹ thuật số, cho phép các nhà phát triển đáp ứng các yêu cầu ứng dụng đối với bất kỳ sự kết hợp nào về tính toàn vẹn, bảo mật, nhận dạng/xác thực. Hầu hết các thuật toán được sử dụng trong thư viện đều được chứng nhận theo chương trình xác thực thuật toán mật mã của Hoa Kỳ (CAVP) [2]. 

Ngoài ra, chúng tôi sử dụng công cụ Host Tool [3] của hãng ST để thực hiện việc tính toán giá trị băm, tạo cặp khóa và kết hợp các loại dữ liệu để sinh ra một tệp chương trình ứng dụng hoàn chỉnh. Quá trình xác thực cho bộ nạp được chia thành hai quy trình: Quy trình tạo chương trình ứng dụng và Quy trình xác minh chương trình.

Tại giải pháp này, chúng tôi đề cập đến một thuật ngữ là Dữ liệu Meta. Dữ liệu Meta được đặt ngay trước vị trí của mỗi chương trình ứng dụng. Dữ liệu Meta mang các thông tin nhằm xác thực chương trình ứng dụng có đúng là chương trình mà người dùng mong muốn. Kích thước của dữ liệu Meta là 128 Byteyte, bao gồm các thành phần: Firmware magic là loại dữ liệu không đổi, được sử dụng để xác minh dữ liệu chương trình ứng dụng, Firmware size là kích thước của chương trình ứng dụng, Firmware version là phiên bản chương trình ứng dụng, Firmware tag lưu giá trị băm của chương trình ứng dụng, Reserved là vùng dữ liệu trống để người dùng có thể thêm các thông tin về chương trình, Meta tag chứa giá trị băm của một số dữ liệu Meta, Meta signature chứa chữ ký của dữ liệu Meta.

Hình 8. Cấu trúc thành phần của dữ liệu Meta 

Hình 9. Quy trình tạo chương trình ứng dụng

Hình 10. Tạo khóa bằng công cụ Host tool

Hình 11. Host tool tạo một số thành phần dữ liệu Meta data và Meta data hash

Hình 12. Host tool ký lên Meta data hash tạo dữ liệu Meta data signature

Hình 13. Dữ liệu Meta và chữ ký được lưu tại đầu chương trình ứng dụng

Hình 14. Quy trình xác minh chương trình ứng dụng tại khởi động an toàn

Trong bài viết này, mình tiếp tục hướng dẫn các bạn các bước triển khai của giải pháp bảo mật thứ 3 – Bảo mật Quá trình khởi động của thiết bị. Các bạn nhớ đón chờ Giải pháp thứ 4 – Giải pháp bảo mật cập nhật chương trình từ xa trong phần tiếp theo nhé!

Chúc các bạn thành công!

Nguyễn Thùy Nhiên – Đề tài Capstone Project tại TAPIT

Tìm hiểu thêm:
Tổng hợp hướng dẫn Internet of Things với NodeMCU ESP8266 và ESP32
Tổng hợp các bài hướng dẫn Lập trình vi điều khiển STM32
[HỌC ONLINE: LẬP TRÌNH VI ĐIỀU KHIỂN STM32, VI XỬ LÝ ARM CORTEX – M]
Fanpage TAPIT: TAPIT – AIoT Learning