Quyền truy cập thường không bị cản trở tại các cổng vật lý của thiết bị. Đặc biệt khi kết hợp với các lỗ hổng bảo mật khác, có thể cho phép kẻ tấn công thực hiện nhiều cuộc tấn công khác nhau. Các cổng cần được bảo vệ để đảm bảo an toàn cho thiết bị. Tại phần 4 của chuỗi bài viết, mình sẽ phân tích về giải pháp bảo vệ khi giao tiếp cổng vật lý.
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ý
1. Giới thiệu cổng vật lý
Cổng vật lý tại thiết bị là những cổng đầu vào có khả năng được truy cập, đánh cắp và sửa đổi dữ liệu bao gồm: cổng debug chương trình SWD/JTAG và cổng cấu hình Serial.
- Cổng debug chương trình SWD/JTAG: là giao diện gỡ lỗi giúp người lập trình tăng khả năng giao tiếp, xây dựng và làm việc với các chương trình trên thiết bị. Với thiết bị Datalogger, cổng debug chương trình được sử dụng là cổng SWD.
- Cổng cấu hình Serial: được sử dụng để cấu hình các thông số như tên thiết bị, ID thiết bị, đường dẫn truy cập Server hệ thống, mật khẩu truy cập Server hệ thống, đường dẫn tải tệp chương trình ứng dụng cập nhật. Tại Datalogger, cổng thực hiện cấu hình cho các thông số thiết bị là cổng UART.
Ngoài ra, thiết bị còn có các cổng đọc dữ liệu khi giao tiếp với cảm biến qua giao thức RS-232 và RS-485, thường được sử dụng trong giai đoạn phát triển sản phẩm, tại quá trình thử nghiệm, chạy gỡ lỗi. Với quyền truy cập cổng vật lý trực tiếp vào thiết bị, kẻ tấn công có thể sử dụng cáp nối để kết nối cổng trên thiết bị với máy tính xách tay để thu thập dữ liệu hay sửa đổi dữ liệu.
Một số phương pháp bảo vệ thiết bị khỏi truy cập cổng vật lý như:
- Vô hiệu hoặc loại bỏ hoàn toàn các cổng giao tiếp không cần thiết
- Đảm bảo mật khẩu mặc định của quản trị viên đã được thay đổi
- Đảm bảo quyền truy cập được bảo vệ thông qua quá trình xác thực bằng mật khẩu phức tạp
- Thiết kế thiết bị sao cho khó bị tháo rời hoặc yêu cầu các công cụ đặc biệt. Ví dụ một số thiết bị được thiết kế sẽ tự phá hủy khi bị tháo rời không đúng cách
- Giới hạn khả năng quản trị và quyền được truy cập trên các thiết bị
2. Bảo vệ cổng debug chương trình SWD
Tại tài liệu “Introduction to STM32 microcontrollers security” được cung cấp bởi hãng ST, phương pháp được đề xuất nhằm bảo vệ cổng debug chương trình SWD là phương pháp bảo vệ đọc bộ nhớ đã được đề cập tại mục 3.3.1 và quá trình triển khai được đề cập tại mục 3.3.3.
Thiết bị cần được thiết lập bảo vệ đọc ở mức độ 2 để đảm bảo rằng bất kì ai có ý định chống phá đều không thể truy cập và chỉnh sửa được dữ liệu bên trong thiết bị. Có hai cách thức triển khai thiết lập bảo vệ đọc mức độ 2: sử dụng chương trình thuật toán; sử dụng công cụ phần mềm STM32Programmer để thiết lập bảo vệ trên các Option byte (tham khảo tại phần 3).
3. Bảo vệ cổng cấu hình UART
Tại đề tài này, chúng tôi sử dụng hai phương pháp để áp dụng: (1) Đảm bảo mật khẩu mặc định của quản trị viên đã được thay đổi; (2) Đảm bảo quyền truy cập được bảo vệ thông qua quá trình xác thực bằng mật khẩu phức tạp. Các bước thực hiện bảo vệ giao tiếp cổng cấu hình UART:
- Bước 1: Khi có dữ liệu bất kỳ gửi vào cổng cấu hình UART. Thiết bị kiểm tra mật khẩu mặc định của thiết bị đã được thay đổi chưa. Nếu chưa thay đổi, đến bước 2; nếu đã thay đổi, đến bước 4.
- Bước 2: Yêu cầu thông báo cập nhật mật khẩu. Tạo giá trị băm từ mật khẩu mới của người dùng. Yêu cầu nhập mật khẩu một lần nữa và tính giá trị băm.
- Bước 3: So sánh hai giá trị băm từ hai lần nhập mật khẩu, nếu giống nhau thì lưu giá trị băm thay thế cho mật khẩu cũ, nếu không giống nhau thì thông báo việc cập nhật mật khẩu thất bại.
- Bước 4: Yêu cầu nhập mật khẩu để đăng nhập. Tạo giá trị băm từ mật khẩu người dùng nhập với giá trị băm đã được lưu trong bộ nhớ. Nếu giống nhau, việc đăng nhập thành công, người dùng có thể thực hiện thay đổi các thông số cấu hình của thiết bị; nếu khác nhau thì việc đăng nhập thất bại.
Hình 1. Sơ đồ Use Case quá trình thực hiện bảo vệ giao tiếp cổng cấu hình UART
Để cấu hình được các thông số của thiết bị, người dùng cần sử dụng được bảng cú pháp dưới đây. Với mỗi câu lệnh bao gồm các ký tự kết thúc câu “\r\n”.
Bảng 1. Bảng cú pháp câu lệnh thực hiện cấu hình cổng UART
STT | Cú pháp câu lệnh | Mô tả |
1 | CFG+DEVPASS | Nhập mật khẩu để truy cập cổng cấu hình |
2 | CFG+DEVNAME | Cấu hình tên của thiết bị theo từng dự án (Ví dụ: TTQTMT), nhằm hỗ trợ việc cập nhật chương trình từ xa. |
3 | CFG+DEVID | Cấu hình mã ID của thiết bị, ID được sử dụng để phân biệt các thiết bị trong hệ thống, hỗ trợ cho việc quản lý hệ thống nhiều thiết bị. (Ví dụ: 01, 02, 03, …, 30) |
4 | CFG+FTPUSER | Cấu hình tên người dùng đăng nhập của hệ thống Server |
5 | CFG+FTPPASS | Cấu hình mật khẩu người dùng đăng nhập của hệ thống Server |
6 | CFG+FTPURL | Cấu hình đường dẫn truy cập hệ thống máy chủ bằng giao thức FTPS (Ví dụ: 103.97.125.226 hoặc secure.tapit.vn) |
7 | CFG+FTPPATH | Cấu hình đường dẫn truy cập vào các thư mục, tệp chứa dữ liệu hay chương trình ứng dụng để tải các tệp tin trong ứng dụng cập nhật chương trình từ xa (Ví dụ: /public_html/firmware) |
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ệ thứ hai – Bảo vệ khi giao tiếp cổng vật lý tại thiết bị. Các bạn nhớ đón chờ phần 5 – Giải pháp bảo mật quá trình khởi động của thiết bị.
Chúc các bạn thành công!
Nguyễn Thùy Nhiên – Đề tài Capstone Project tại TAPIT