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

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ị

Tại thiết bị Datalogger, bộ nhớ Flash là một trong những mục tiêu có nguy cơ bị tấn công cao. Đây là bộ nhớ chính để người dùng sử dụng lưu trữ chương trình ứng dụng và các dữ liệu. Tại nghiên cứu này, chúng ta quan tâm đến việc bảo vệ bộ nhớ Flash qua hai phương thức là bảo vệ đọc và bảo vệ ghi.

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.

1. Bảo vệ đọc bộ nhớ Flash

Bảo vệ đọc (tên tiếng anh là ReaDout Protection, viết tắt là RDP) bộ nhớ Flash cho phép mã chương trình nhúng được bảo vệ, chống việc sao chép (copy), kỹ thuật đảo ngược (reverse engineering), kết xuất (dumping), sử dụng công cụ gỡ lỗi (debug tools) hoặc chèn mã (code injection). Người dùng cần thiết lập bảo vệ đọc sau quá trình biên dịch và tải mã nhị phân vào bộ nhớ Flash của vi điều khiển.

RDP có thể được thiết lập ở 3 mức độ (0,1 và 2) được định nghĩa như sau:

  • Mức 0: đây là mức RDP mặc định. Bộ nhớ Flash được mở hoàn toàn, không có biện pháp bảo vệ nào trong chế độ cấu hình này, RDP mức 0 chỉ thích hợp trong quá trình phát triển và gỡ lỗi.
  • Mức 1: cấm truy cập bộ nhớ Flash (hình thức đọc, xóa, nạp chương trình) hoặc truy cập SRAM2 thông qua các tính năng gỡ lỗi (chẳng hạn như Serial-Wire hoặc JTAG). Trong các trường hợp trên, bất kỳ yêu cầu đọc nào đến vùng được bảo vệ đều tạo ra lỗi bus. Tuy nhiên, khi khởi động từ bộ nhớ Flash, việc truy cập vào bộ nhớ Flash và SRAM (từ mã chương trình) được cho phép. Mức 1 có thể hồi quy về mức 0. 
  • Mức 2: Khi RDP Mức 2 được kích hoạt, tất cả các biện pháp bảo vệ được cung cấp trong Mức 1 đều hoạt động và MCU hoàn toàn được bảo vệ. Byte tùy chọn RDP và tất cả các byte tùy chọn khác đều bị đóng băng và không thể sửa đổi được nữa. Mức 2 RDP không thể hồi quy về mức 1 hay mức 0.

Hình 1. Ví dụ về các mức độ bảo vệ đọc RDP (Dòng STM32L4) (Nguồn: st.com)

2.  Bảo vệ ghi bộ nhớ Flash

Giải pháp bảo vệ ghi (tên tiếng Anh là WRite Protection, viết tắt là WRP) được sử dụng để bảo vệ nội dung của vùng nhớ khỏi việc xóa hoặc thay đổi nội dung. Ví dụ về một trường hợp sử dụng, bảo vệ ghi có thể được đặt trên page hoặc sector của bộ nhớ Flash để ngăn chặn sự thay đổi của dữ liệu bộ nhớ trong quá trình cập nhật chương trình firmware hoặc dữ liệu. WRP cũng được đặt theo mặc định trên vùng bộ nhớ không sử dụng để ngăn chặn việc chèn các phần mềm độc hại. 

WRP là phương pháp cần được sử dụng. Phương pháp này sẽ bảo vệ bộ nhớ khi diễn ra các hoạt động ghi dữ liệu hay cập nhật chương trình ứng dụng. 

3.  Triển khai bảo mật chương trình ứng dụng và dữ liệu tại thiết bị

Tại nghiên cứu này, chúng ta quan tâm đến việc bảo mật chương trình ứng dụng và dữ liệu qua hai phương thức là bảo vệ đọc và bảo vệ ghi bộ nhớ Flash. Có hai cách để thực thi hai phương thức này: (1) Sử dụng thuật toán bảo vệ đọc và bảo vệ ghi bộ nhớ Flash; (2) Sử dụng công cụ phần mềm STM32Programmer để thiết lập bảo vệ trên các Option byte. Chi tiết hơn về hai cách thực hiện này:

  • Cách 1: Sử dụng thuật toán bảo vệ đọc và 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. Người dùng có thể đọc, thay đổi các giá trị của Option byte qua thanh ghi FLASH_OBR. Các hàm chức năng Write Protection in Flash( ) và Readout Protection in Flash( ) sẽ thay đổi các giá trị bit tương ứng với chức năng của chúng tại Option byte.

Hình 2. Thuật toán kết hợp bảo vệ đọc và bảo vệ ghi bộ nhớ Flash

  • Cách 2: Sử dụng công cụ phần mềm STM32Programmer để thiết lập bảo vệ trên các Option byte. Cùng phân tích theo các bước:
    • Bước 1: Kết nối thiết bị Datalogger với laptop hoặc máy tính có cài đặt phần mềm STM32Programmer qua cổng COM sử dụng dây cáp USB
    • Bước 2: Nhấn vào nút Connect, sau đó chọn tab Options Bytes để kiểm tra và thiết lập các cấu hình bảo vệ.

Hình 3. Sử dụng công cụ để kiểm tra cấu hình Option byte

  • Bước 3: Tại cửa sổ Read Out Protection, người dùng có thể lựa chọn 3 mức độ bảo mật: 
    • Mức AA tương ứng mức 0: không có biện pháp bảo mật nào
    • Mức BB tương ứng mức 1: cấm truy cập bộ nhớ flash
    • Mức CC tương ứng mức 2: tất cả các biện pháp bảo mật được kích hoạt

Hình 4. Thiết lập bảo vệ đọc mức AA (mức 1)

  • Bước 4: Tại cửa sổ Write Protection, người dùng thiết lập bảo vệ ghi cho từng trang trong bộ nhớ với mỗi trang chiếm 4KB.

Hình 5. Thiết lập bảo vệ ghi

Trong quá trình thử nghiệm, hai cách để thiết lập bảo vệ chương trình và dữ liệu tại bộ nhớ đều được kiểm nghiệm thành công. Nhưng khi tích hợp lại giải pháp này với chương trình ứng dụng, cách sử dụng thuật toán (cách 1) được ưu tiên trong tích hợp. Cách sử dụng công cụ để thiết lập (cách 2) không được lựa chọn vì cách này yêu cầu người dùng trực tiếp phải kết nối thiết bị với máy tính một cách thủ công và phức tạp hơn.

4. Kết quả triển khai

Sử dụng phần mềm STM32CubeProgrammer để phân tích quá trình. Sau khi kết nối thiết bị với máy tính, người dùng có thể đọc được dữ liệu được lưu trữ trong bộ nhớ.

Hình 6. Dữ liệu tại bộ nhớ Flash

Sau khi thực hiện cấu hình bảo vệ đọc và bảo vệ ghi thành công, cửa sổ Memory & File edition xuất hiện cảnh báo Data read failed và người dùng không thể đọc và thay đổi dữ liệu tại Flash.

Hình 7. Lỗi do không thể xóa, ghi, sửa đổi dữ liệu trong bộ nhớ Flash 

Tổng kết lại, qua bài viết này, mình đã hướng dẫn các bạn triển khai giải pháp bảo vệ đầu tiên –  Bảo vệ chương trình ứng dụng và dữ liệu tại thiết bị. Các bạn nhớ đón chờ phần 4 – Giải pháp bảo vệ khi giao tiếp cổng vật lý 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:
Fanpage TAPIT: TAPIT – AIoT Learning