- Các thuật toán băm và HMAC mặc định của Python nay được thay thế bằng mã mật mã đã được kiểm chứng từ HACL*
- Khoảng 15.000 dòng mã C được tự động tích hợp từ HACL* vào codebase của Python
- Streaming API được thiết kế và kiểm chứng theo hướng tổng quát để có thể xử lý nhiều thuật toán khối khác nhau
- Ứng phó với các vấn đề kỹ thuật nâng cao như xử lý lỗi cấp phát bộ nhớ, khắc phục sự cố biên dịch AVX2, tối ưu hóa môi trường CI
- Nhờ sự hợp tác giữa cộng đồng Python và cộng đồng mật mã, dự án đồng thời đạt được cả tính bảo mật thực chất lẫn khả năng bảo trì
Python đưa mã kiểm chứng toàn diện vào các thuật toán mật mã
- Sau CVE-2022-37454 liên quan đến triển khai SHA3 xảy ra vào năm 2022, đã xuất hiện vấn đề cần chuyển hạ tầng băm của Python sang mã đã được kiểm chứng
- Trong suốt 2 năm rưỡi sau đó, Python đã thay thế hoàn toàn các thuật toán băm và HMAC tích hợp sẵn bằng các triển khai đã được kiểm chứng dựa trên HACL*
- Việc thay thế này diễn ra hoàn toàn minh bạch với người dùng, không có mất mát nào về mặt chức năng
- HACL* cũng triển khai thêm các tính năng dành cho Python: nhiều chế độ của Blake2, API hỗ trợ các biến thể Keccak của SHA3, tối ưu hóa streaming cho HMAC, v.v.
- Việc cập nhật phiên bản mới được tự động hóa bằng script, giúp dễ bảo trì
Hiểu về Streaming API
- Phần lớn các thuật toán mật mã là thuật toán khối, nghĩa là đầu vào phải được xử lý theo từng khối
- Trong môi trường sử dụng thực tế, rất khó cung cấp đầu vào đúng theo đơn vị khối, vì vậy cần có Streaming API
- Streaming API hoạt động bất kể độ dài đầu vào và cũng cho phép trích xuất kết quả trung gian
- Việc triển khai streaming đòi hỏi quản lý trạng thái phức tạp, và ở triển khai SHA3 trước đây đã từng tồn tại lỗ hổng bảo mật nghiêm trọng liên quan đến vấn đề này
- Mỗi thuật toán băm có cách xử lý khác nhau nên độ phức tạp tăng lên: ví dụ Blake2 không cho phép khối rỗng, HMAC có thể xóa khóa sau khi khởi tạo, v.v.
Kiểm chứng thuật toán streaming tổng quát
- Phương pháp được giới thiệu trong một bài báo năm 2021 là trừu tượng hóa các thuật toán khối, rồi định nghĩa một thuật toán streaming tổng quát ở phía trên
- Sau đó có thể áp dụng như một template cho từng thuật toán, nhờ đó tái sử dụng được
- Việc tổng quát hóa bao quát mọi điều kiện đặc biệt khác nhau:
- Có thể chỉ định độ dài đầu ra hay không (SHA3 vs Shake)
- Có cần đầu vào trước khi xử lý hay không (ví dụ: khối khóa của Blake2)
- Sự khác biệt trong cách xử lý khối cuối cùng
- Thông tin bổ sung cần giữ lại trong trạng thái nội bộ
- Cách sao chép trạng thái để trích xuất kết quả trung gian (stack vs heap)
- Chiến lược dùng API riêng cho từng thuật toán hay API theo họ thuật toán
Đảm bảo độ ổn định build để tích hợp vào Python
- CI của Python được kiểm chứng trên hơn 50 toolchain và kiến trúc, nên ngay cả lỗi nhỏ cũng dễ bị lộ ra
- Trong quá trình triển khai HMAC, đã phát sinh vấn đề về hỗ trợ lệnh AVX2:
- Một số compiler không thể xử lý header
immintrin.h nếu không có AVX2
- Để giải quyết, nhóm đã dùng mẫu struct trừu tượng trong C
- Do sự khác biệt giữa khái niệm trừu tượng hóa trong mã C sinh từ F* và struct của C, cần bổ sung khả năng phân tích mức độ hiển thị chính xác vào compiler
krml
Ứng phó với lỗi cấp phát bộ nhớ
- Mô hình F* trước đây về mặt lý thuyết đã có thể mô hình hóa lỗi bộ nhớ, nhưng đây là lần đầu tiên áp dụng trong thực tế
- Theo yêu cầu của Python, struct trạng thái, định nghĩa thuật toán và cấu trúc streaming đều được cải tiến để có thể truyền lỗi cấp phát
- Trong F*, điều này dùng kiểu
option, còn trong C thì được biên dịch thành tagged union
- Trong tương lai, có khả năng chuyển sang cờ lỗi runtime để giảm độ phức tạp
Tự động hóa cập nhật mã HACL*
- PR Python ban đầu dùng
sed để loại bỏ các định nghĩa header không cần thiết, chỉnh sửa đường dẫn, v.v.
- Sau khi độ ổn định của mã HACL* được xác nhận, phần
sed phức tạp này đã được loại bỏ và thay bằng một script đơn giản
- Với script này, bất kỳ ai cũng có thể dễ dàng cập nhật mã HACL* lên phiên bản mới nhất trong cây mã nguồn Python
Kết luận
- Mã mật mã đã được kiểm chứng đã được tích hợp thành công vào Python, một môi trường production tiêu biểu
- Đây là minh chứng rằng công nghệ này không chỉ dừng ở nghiên cứu học thuật mà còn thực tiễn và có thể bảo trì trong phần mềm thật
- Đây cũng là một ví dụ tốt về sự hợp tác giữa cộng đồng Python và các nhà phát triển HACL*, và có thể ảnh hưởng đến các dự án khác trong tương lai
2 bình luận
Như cũng đã được nhắc tới trong các ý kiến trên Hacker News, thật khó hiểu hệ sinh thái Python đã đạt được điều gì khiến người ta có thể nói rằng nó đã “vượt qua giai đoạn nghiên cứu học thuật để trở nên thực tiễn và có thể bảo trì trong phần mềm thực tế”.
Nếu điều họ muốn nói là đã tiến hành công việc trừu tượng hóa các thuật toán streaming đối với hạ tầng hash hiện có chưa được kiểm chứng, thì đây cũng chỉ là một kiểu chơi chữ “Pythonic” khác mà thôi.
Ý kiến trên Hacker News
Không nêu rõ phiên bản Python. Tìm hiểu thì thấy tính năng này dự kiến sẽ được đưa vào bản 3.14. Có lẽ phải đến tháng 10 mới thấy
Đã đưa thư viện C đã được kiểm chứng, được tạo từ F* của Microsoft, vào CPython và viết phần mở rộng C
Tò mò không biết liệu họ có mang hỗ trợ đầu ra “streaming” của SHAKE vào hay không
Các hệ mật mã hiện đại được dùng rộng rãi về thực tế là không thể phá vỡ, và các cuộc chiến tiền mã hóa của thập niên 90 giờ có vẻ đã khá lỗi thời. Tò mò liệu có ai có suy nghĩ gì về tác động của điều này đối với xã hội không
Tò mò không biết một framework kiểm chứng streaming tổng quát có thể tái sử dụng đến mức nào ngoài hàm băm mật mã
Tò mò không biết mọi thứ import mô-đun mật mã có cần kèm theo G++ hay thứ gì khác không, hay là nó được biên dịch vào ngay trong CPython
Không rành về mật mã. Tò mò điều này có ý nghĩa gì đối với Python
Tò mò không biết mức độ nào của quá trình phát triển đã được kiểm chứng, và nó bao gồm những gì
Số dòng code là một thước đo rất thiếu phù hợp. Đặc biệt là khi khoe những con số lớn trong bối cảnh code mật mã