Tác giả: Ẩn danh
Bài viết này giới thiệu phương pháp burn firmware cho bo mạch phát triển ESP32 trên máy tính Windows để tạo ra chữ ký phần cứng Jade-DIY.
Giới thiệu: Ngọc DIY
Về công cụ ký phần cứng Jade do Blockstream ra mắt, Mi Zeng đã cung cấp bài đánh giá chi tiết . Đánh giá này giới thiệu mô hình bảo mật của Jade hardware signature, cũng như một số tính năng bảo mật nổi bật.
Vì firmware của Jade hoàn toàn là mã nguồn mở nên chúng tôi có thể tạo ra một phần cứng ký có chức năng tương tự dựa trên phần cứng giống như phiên bản chính thức của Jade (sau đây chúng tôi sẽ gọi nó là "phiên bản chính thức của Jade" và "Jade-DIY" tương ứng").
Sau khi thử nghiệm, chúng tôi nhận thấy rằng mặc dù một số Jade-DIY về mặt chức năng không giống với phiên bản chính thức của Jade (một trong đó những lý do sẽ được thảo luận dưới đây: nền tảng phần cứng), nhưng về tính năng bảo mật, Jade-DIY giống như phiên bản chính thức. phiên bản Jade cũng vậy. Jade-DIY có đầy đủ các tính năng bảo mật của phiên bản chính thức của Jade (như “chip bảo mật ảo”, mã PIN tự xóa). Điều này mang lại cho Jade-DIY một sức hấp dẫn rất lớn vì người ký có thể được tạo ra bằng phần cứng khá rẻ.
Hơn nữa, Jade-DIY rất chắc chắn về các chức năng cơ bản và không hề thua kém các loại máy signature trên thị trường hiện nay.
Lựa chọn phần cứng
Trong kho lưu trữ GitHub của Jade, có một trang chuyên dụng giới thiệu phần cứng có thể được tạo ra thành máy ký Jade-DIY. Có hai khía cạnh mà độc giả cần chú ý: (1) liệu nó có được trang bị camera hay không, đây cũng là cơ sở để phân loại trang này; (2) USB VendorID và ProductID của bản thân phần cứng có phù hợp với hay không; phiên bản chính thức của Jade.
Cái sau xác định xem ví phần mềm có nhận ra đó là Jade hay không khi chúng ta sử dụng kết nối USB tạo ra Jade-DIY. Nếu không sẽ rắc rối hơn khi sử dụng. Tuy nhiên, về cơ bản, những phần cứng này hỗ trợ Bluetooth, vì vậy bạn luôn có thể sử dụng Bluetooth để kết nối với người ký (nếu người ký phần mềm hỗ trợ nó, chẳng hạn như Ví Bitcoin xanh di động). Ngoài ra, nếu chọn sử dụng phần cứng có trang bị camera thì bạn luôn có thể sử dụng tính năng tương tác Air-gapped (chủ yếu là quét mã QR) nên không phải lo lắng về vấn đề này nữa.
Hướng dẫn này chỉ dành cho phần cứng không có camera . Trong số các phần cứng này, USB VendorID và ProductID nhất quán với phiên bản bán lẻ chính thức của Jade (tên thương hiệu nằm trước khoảng trắng và model nằm sau khoảng trắng):
- Màn hình hiển thị LILYGO
- Lõi cơ bản M5Stack
- M5Stack CHÁY
Vì lý do kinh tế nên tác giả chọn T-Display. Vào thời điểm tác giả mua, giá bản thân nó chỉ là 65 nhân dân tệ. Bạn đọc lưu ý đừng nhầm lẫn với T-Display S3 khi mua hàng. Tác giả đã mua phiên bản có số Q125. Để thuận tiện sử dụng, bạn có thể mua hộp đựng riêng (12 nhân dân tệ). Người ta cho rằng phiên bản K164 có vỏ riêng cũng có thể tạo ra thành công.
Sau đây sẽ sử dụng T-Display làm ví dụ. Hai phần cứng còn lại sử dụng cùng chip với T-Display nên quá trình flash cũng tương tự.
Kết nối phần cứng
Đầu nối USB của T-Display là Type-C, độc giả nên chuẩn bị một cáp USB Type-C riêng. Sau khi kết nối T-Display, hãy quan sát xem nó có khởi động bình thường không. Trong trường hợp bình thường, đầu tiên nó sẽ hiển thị biểu tượng "LILYGO", sau đó thông báo cảnh báo "Không gắn được thẻ SD" sẽ xuất hiện.
Sau đó, mở "Trình quản lý thiết bị" của Windows và kiểm tra xem có mục "USB-Enhanced SERIAL CH9102 (COM3)" trong mục "Cổng (COM và LPT)" hay không. Nếu không, điều đó có nghĩa là kết nối không bình thường và cần cài đặt trình điều khiển . Sau khi tải xuống và cài đặt trình điều khiển, hãy thử kết nối lại.
Nếu bạn vẫn không thể kết nối sau khi cài đặt trình điều khiển, vui lòng thử thay cáp USB (một số cáp chỉ có chức năng cấp nguồn nhưng không có chức năng truyền dữ liệu).
Hai phần cứng M5Stack kể trên sử dụng chung chip USBT như T-Display nên kết nối có thể được xác minh theo cách tương tự.
Cài đặt công cụ phát triển
Để tải xuống các công cụ phát triển từ trang web ESP-IDF , vui lòng tải xuống "ESP-IDF v5.2.2 - Trình cài đặt ngoại tuyến". Sau khi mở trình cài đặt, tại trang chọn nội dung cài đặt, bạn nên: (1) Cài đặt "Powershell Support"; (2) Trong "Chip Targets", cài đặt ít nhất "ESP32" và "ESP32-S3". (Không được bỏ mục đầu tiên "Framework" và mục thứ hai "ESP-IDF 5.2").
Sau khi cài đặt, hãy thử nhấn dấu "+" trên thanh menu của cửa sổ PowerShell mới và chọn "ESP-IDF 5.2" để mở hoàn cảnh ESP-IDF. Nếu cửa sổ PowerShell của bạn không giống như hình, hãy thử sử dụng phương pháp khác (chẳng hạn như menu Bắt đầu
Tải mã nguồn Jade
Trước tiên, hãy đảm bảo bạn đã cài đặt phần mềm Git . Đây là công cụ kiểm soát phiên bản có thể được sử dụng để tải xuống mã nguồn của phần mềm mã nguồn mở.
Trong thư mục bạn chọn, hãy mở cửa sổ PowerShell, nhập lệnh sau và chạy:
git clone --recursive https://github.com/Blockstream/Jade.git
Dòng lệnh này sẽ tạo thư mục "Jade" mới và tải xuống mã nguồn Jade.
Tiếp theo là chương quan trọng nhất của hướng dẫn này.
Biên dịch và ghi firmware
Khi ghi chương trình cơ sở, bạn có thể chọn bật hoặc không bật "Khởi động an toàn". Chức năng của Secure Boot là đưa khóa chung vào thiết bị và yêu cầu phần sụn bị ghi phải có chữ ký của khóa chung. Nếu phần sụn bị cháy không có chữ ký hợp lệ, thiết bị sẽ từ chối khởi động. Đây là một biện pháp bảo mật hữu ích để ngăn chặn ai đó tiêm chương trình cơ sở có mã độc vào thiết bị của bạn. Hướng dẫn DIY trong kho mã nguồn Jade cũng khuyên bạn nên bật tính năng Khởi động an toàn. Do đó, hướng dẫn này cũng đặc biệt khuyên bạn nên bật chức năng Khởi động an toàn.
Chương "Đốt thử nghiệm" dưới đây sẽ giới thiệu quy trình ghi đĩa mà không bật Secure Boot như tên gọi, mục đích chủ yếu là để người đọc làm quen với quy trình flash. "Secure Burning" sẽ giới thiệu quy trình ghi đĩa để kích hoạt Secure Boot.
Lưu ý rằng thao tác bật Khởi động an toàn được mô tả ở đây là không thể đảo ngược và sau khi đã bật thì không thể hủy được. Điều đó có nghĩa là, nếu bạn muốn cập nhật chương trình cơ sở của thiết bị trong tương lai, bạn phải sử dụng cùng một private key để ký chương trình cơ sở mới trước khi flash nó. Nếu bạn mất private key của chương trình cơ sở đã ký này, bạn sẽ không thể cập nhật chương trình cơ sở cho thiết bị này nữa.
Chuẩn bị trước
Python3 trong CMD
Trước khi bắt đầu ghi đĩa, bạn hãy mở "Dấu nhắc lệnh (CMD)" của máy tính, nhập python3
và nhấn Enter để thực thi. Nếu nó được nhận dạng và thực thi chính xác, bạn sẽ thấy thông tin như thế này trong cửa sổ:
Python 3.12.3 (tags/v3.12.3:f6650f9, Apr 9 2024, 14:05:25) [MSC v.1938 64 bit (AMD64)] on win32Type "help", "copyright", "credits" or "license" for more information.>>>
Nếu chương trình phản hồi bằng cách mở Windows Store, điều đó có nghĩa là CMD không thể xác định và thực thi chính xác phiên bản python tương ứng khi nhận được lệnh "python3", điều này sẽ gây ra lỗi trong quá trình biên dịch tiếp theo. Lỗi này phải được sửa. Một cách lạ nhưng hiệu quả là sao chép "python.exe" trong thư mục Python của bạn, dán nó vào cùng thư mục đó, sau đó đổi tên bản sao thành "python3.exe".
Lời nhắc này được đưa ra vì lỗi biên dịch do lỗi này xảy ra trên hai máy tính Windows được tác giả sử dụng (hệ thống này lần lượt là Win10 và Win11).
Thư mục đang chạy của hoàn cảnh chạy ESP-IDF
Mở hoàn cảnh chạy "ESP-IDF 5.2" trong bất kỳ thư mục nào; sau khi mở, nó sẽ tự động chạy sê-ri cài đặt hoàn cảnh để đảm bảo rằng chúng ta có thể sử dụng các chức năng của ESP-IDF. Sau khi chạy thành công sẽ xuất ra sê-ri thông tin, cuối cùng là:
Go to the project directory and run: idf.py build
Hoàn cảnh chạy ban đầu của ESP-IDF là thư mục cài đặt của nó, ví dụ: ~\Espressif\frameworks\esp-idf-v5.2.2
. Chúng ta cần sử dụng lệnh cd
để chuyển sang thư mục "Jade". Giả sử rằng địa chỉ thư mục "Jade" của bạn là D:\esp\Jade
, sau đó nhập vào hoàn cảnh chạy ESP-IDF:
cd D:\esp\Jade
Cuối cùng, phần đầu của hoàn cảnh thời gian chạy của bạn sẽ trông như thế này: PS D:\esp\Jade>
.
OpenSSL
Để tạo private key đủ an toàn để ký chương trình cơ sở, hãy cài đặt phần mềm OpenSSL .
Đốt thử nghiệm
Nhập lệnh sau vào hoàn cảnh thời gian chạy ESP-IDF nằm trong thư mục "Jade":
cp configs/sdkconfig_display_ttgo_tdisplay.defaults sdkconfig.defaults
Chức năng của dòng lệnh này là sao chép tệp cấu hình từ thư mục "configs" sang thư mục "Jade". Tất nhiên, tệp cấu hình cần sao chép tùy thuộc vào thiết bị. Tệp cấu hình được cung cấp ở đây là tệp cấu hình của T-Display.
Nếu phần cứng bạn đang sử dụng là "M5Stack Basic Core", lệnh cần được đổi thành:
cp configs/sdkconfig_display_m5blackgray.defaults sdkconfig.defaults
Sau đó, chạy lệnh sau:
idf.py buildidf.py flash monitor
Dòng lệnh đầu tiên sẽ biên dịch mã nguồn trong thư mục thành phần sụn có thể được ghi vào T-Display và dòng thứ hai sẽ thực sự ghi mã đó và khởi động lại T-Display sau khi flash thành công.
Trên đây là quá trình flash thử nghiệm. Bạn có thể chơi với nó và xem các chức năng của Jade-DIY.
Nếu bạn gặp lỗi trong quá trình flash và T-Display không thể bật bình thường hoặc không thể kết nối với máy tính, bạn có thể thử thao tác được mô tả trên trang này : thử ngắt kết nối cáp trước, sau đó nhấn và giữ ba nút trên thân máy bay cùng một lúc, sau đó khởi động lại Kết nối với máy tính.
Đốt an toàn
Tạo tập tin cấu hình
Nhập lệnh sau vào hoàn cảnh thời gian chạy ESP-IDF nằm trong thư mục "Jade":
./tools/mkdefaults.py ./configs/sdkconfig_display_ttgo_tdisplay.defaults NDEBUG SECURE
Sau khi chạy, hãy kiểm tra xem có ba tệp sdkconfig
, sdkconfig.defaults
và sdkconfig.defaults.orig
trong thư mục "Jade" hay không.
Sử dụng "Notepad" để mở tệp sdkconfig.defaults
và tìm trong đó dòng sau:
CONFIG_SECURE_BOOT=yCONFIG_ESP32_REV_MIN_3=y
Nếu những dòng này bị thiếu hoặc thiếu ba tệp trên, vui lòng chạy lại lệnh trên.
Tạo private key cho phần sụn đã ký
Sau đó, chạy lệnh sau trong hoàn cảnh thời gian chạy ESP-IDF và sử dụng phần mềm OpenSSL để tạo private key để ký chương trình cơ sở:
openssl genrsa -out ../jade-diy-v2.pem 3072
Dòng này sẽ tạo private key private keyjade-diy-v2.pem
trong thư mục mẹ của thư mục "Jade", khóa này sẽ được sử dụng trong chữ ký của phần sụn.
Bạn có thể sử dụng tên tệp khác hoặc chỉ định thư mục khác. Nhưng điều này yêu cầu bạn phải quay lại và sửa đổi địa chỉ tương đối trong dòng CONFIG_SECURE_BOOT_SIGNING_KEY=
trong tệp sdkconfig.defaults
. Từ góc độ thuận tiện và bảo mật, bạn có thể tạo private key theo lệnh trên; sau khi hoàn tất quá trình ghi, hãy di chuyển private key riêng đến một nơi tương đối ẩn khác trong tương lai, khi bạn cần nâng cấp chương trình cơ sở trong tương lai, hãy đặt private key; trở lại vị trí ban đầu của nó. Ký phần sụn và ghi nó.
Tạo bootloader và firmware
Chạy lệnh sau trong hoàn cảnh thời gian chạy ESP-IDF:
idf.py bootloaderidf.py build
Dòng đầu tiên tạo bootloader. Chương trình này chịu trách nhiệm thực hiện các chức năng của Secure Boot. Dòng thứ hai tạo phần sụn thực hiện chức năng thực tế.
Khi chạy dòng lệnh đầu tiên, chương trình có thể không chạy thành công do SDKCONFIG_DEFAULTS '~/Jade/sdkconfig.defaults.tmp' does not exist
. Lúc này, bạn thường chỉ cần chạy lại lệnh trong phần " Tạo tệp cấu hình " ở trên để tạo tệp sdkconfig.defaults.tmp
được yêu cầu.
Viết bộ nạp khởi động
Sau khi bật Secure Boot, ESP-IDF sẽ không tự động flash bootloader nữa nên chúng ta cần flash thủ công.
Chạy lệnh này trong hoàn cảnh thời gian chạy ESP-IDF:
esptool.py write_flash --erase-all 0x1000 ./build/bootloader/bootloader.bin
Ở đây, --erase-all
có nghĩa là xóa tất cả nội dung của bộ nhớ flash (nếu bạn đã thử ghi thử nghiệm trước đó, bạn có thể cần thẻ này); và 0x1000
sau đây biểu thị vị trí ghi bộ nhớ flash, theo sau là The. vị trí tập tin của bộ nạp khởi động sẽ được ghi.
Vị trí ghi hợp lý có thể khác nhau tùy theo thiết bị. Nếu bạn không sử dụng T-Display, vui lòng đọc kỹ nội dung xuất hiện trên màn hình trong quá trình chạy lệnh idf.py bootloader
Nó sẽ nhắc bạn: Secure boot enabled...
( Secure boot được kích hoạt nên chương trình khởi động sẽ không tự động bị burn); bên dưới là dòng lệnh có thể thực thi được, bao gồm các từ python.exe
và esptool.py
. Bạn có thể sao chép dòng lệnh này để thay thế dòng lệnh trên hoặc bạn có thể tìm các ký tự bắt đầu bằng 0x
trong dòng lệnh này, cho biết địa chỉ bộ nhớ flash, thay thế 0x1000
trong lệnh trên và thực thi.
Nếu bạn không thể chạy lệnh này, có thể bạn đã cài đặt esptool
chưa đúng cách. Bạn có thể thử chạy pip install esptool
để giải quyết vấn đề.
Viết chương trình cơ sở
Chạy lệnh sau trong hoàn cảnh thời gian chạy ESP-IDF:
idf.py flashidf.py monitor
Khi chạy dòng thứ 2, nếu chạy lâu không kết thúc, bạn có thể nhấn đồng thời phím “Ctrl” và “]” trên bàn phím để tự động kết thúc. Xem liệu T-Display (hiện tại nên được gọi là "Jade-DIY") có thể khởi động bình thường hay không. Bạn có thể thử nhấn nút đặt lại ở phía trên thiết bị.
Đốt cháy an toàn, hoàn tất!
Cập nhật chương trình cơ sở
Kết nối Jade-DIY, trong hoàn cảnh chạy ESP-IDF trong thư mục "Jade", chạy python jade_ota.py --noagent
để cập nhật chương trình cơ sở. Quá trình này có thể yêu cầu cài đặt một số phụ thuộc python, hãy sử dụng pip install
để giải quyết.
Hiện tại, phiên bản firmware mới nhất có sẵn cho T-Display là 1.0.31
, bị tụt hậu so với phiên bản firmware chính thức của Jade.
Hướng dẫn vận hành
- Có ba nút trên thân T-Display. Khi vận hành Jade-DIY, nút trên cùng của thân máy bay là nút "đặt lại"; nhấn riêng hai nút trên thân máy để di chuyển con trỏ trên màn hình khi xác nhận lựa chọn, nhấn hai nút cùng lúc; .
- Khi khởi tạo Jade-DIY ("Setup Jade"), Jade-DIY sẽ yêu cầu bạn đặt mã PIN số gồm 6 chữ số. Mã PIN này cực kỳ quan trọng về mặt bảo mật. Tuy nhiên, khi bạn muốn mở khóa và sử dụng Jade-DIY, trước tiên bạn phải sử dụng ví phần mềm thích hợp để kích hoạt Jade-DIY trước khi có thể nhập mã PIN và mở khóa.
- Các ví phần mềm như vậy bao gồm: máy tính để bàn: Ví Sparrow , Ví Electrum trên thiết bị di động: Ví xanh . Jade-DIY có thể được kết nối với máy tính qua USB và với điện thoại di động qua Bluetooth. Chức năng Bluetooth của Jade-DIY bị tắt theo mặc định và cần được bật thủ công.
- Sau khi kết nối với ví phần mềm, trải nghiệm của người dùng không khác nhiều so với những người ký phần cứng thông thường. Khi một giao dịch cần được ký kết, chi tiết của giao dịch sẽ được hiển thị trên màn hình.
- Sau khi mở khóa Jade-DIY, bạn có thể đặt "Mã PIN Tự xóa" trong "Mã PIN Duerase". Sau khi thiết lập, khi nhập mã PIN này khi mở khóa, tất cả nội dung của thiết bị (bao gồm cả từ hạt giống crypto) sẽ bị xóa.
- Jade-DIY có chức năng của hầu hết những người ký chỉ dùng bitcoin, bao gồm chữ ký đơn và chữ ký đa chữ ký.
phân tích bảo mật
Mô hình bảo mật của Jade-DIY trông như thế nào?
Trong hướng dẫn này, tác giả giới thiệu quy trình flash khi bật Secure Boot; Secure Boot là một biện pháp bảo mật rất quan trọng có thể giải quyết rủi ro Jade-DIY bị tiêm firmware độc hại. Rủi ro này là có thật. Hiện tại, hầu hết tất cả các nhà ký phần cứng đều cung cấp khía cạnh bảo vệ này (chẳng hạn như Keystone, cũng xác minh xem chương trình cơ sở có được ký khi nâng cấp chương trình cơ sở hay không).
Sau khi áp dụng Secure Boot, sau khi thử nghiệm, chúng tôi cho rằng độ bảo mật của Jade-DIY giống như phiên bản chính thức của Jade. Vậy phiên bản chính thức của Jade an toàn đến mức nào?
Như đã đề cập trong bài đánh giá Mi Zeng đề cập ở đầu bài, Jade sử dụng thiết kế “chip bảo mật ảo” để giải quyết sự đánh đổi giữa “ chip bảo mật và mã nguồn mở ”: Trong quá trình crypto lưu trữ từ hạt giống, Jade sử dụng khóa của máy chủ từ xa (cùng với mã PIN cục bộ crypto từ hạt giống). Trong quá trình mở khóa Jade, chỉ bằng cách cung cấp mã PIN đã đặt, ví phần mềm thích ứng mới có thể giao tiếp với máy chủ từ xa và lấy được khóa. (Đây là lý do tại sao khi sử dụng các từ hạt giống đã lưu của chính nó, nó phải hoạt động với ví phần mềm được điều chỉnh).
Do đó, độ bảo mật của chế độ này cao hơn so với trình ký phần cứng hoàn toàn không sử dụng chip bảo mật và không có thiết kế bổ sung (chẳng hạn như phiên bản trước của trình ký Trezor).
Tuy nhiên, so với những người ký sử dụng chip bảo mật và được trang bị cơ chế tự hủy (tự hủy sau khi tháo, tự hủy sau khi nhập mã PIN không hợp lệ một số lần nhất định) thì khả năng xử lý của Jade kém hơn một chút. với các cuộc tấn công vật lý sau khi thiết bị bị chiếm quyền điều khiển.
Nhìn chung, Jade-DIY cung cấp khả năng bảo mật khá tốt với chi phí tương đối thấp cũng như các tính năng đủ mạnh.
Phong trào mã nguồn mở muôn năm!
Lời cảm ơn
Tôi xin cảm ơn Mi Zeng vì chỉ dẫn và thảo luận hữu ích của anh ấy trong quá trình viết bài này. Tất nhiên, tôi chịu trách nhiệm về mọi sai sót trong bài viết.