Các nhà phát triển Fil-C tranh luận về thách thức triển khai vfork() và hỗ trợ mã assembly mật mã học

Nhóm Cộng đồng BigGo
Các nhà phát triển Fil-C tranh luận về thách thức triển khai vfork() và hỗ trợ mã assembly mật mã học

Cộng đồng ngôn ngữ lập trình Fil-C đang tích cực thảo luận về hai thách thức triển khai lớn có thể tác động đáng kể đến việc áp dụng ngôn ngữ này trong môi trường sản xuất. Những cuộc thảo luận này tập trung vào việc hỗ trợ system call vfork() để tạo tiến trình nhanh hơn và kích hoạt mã assembly mật mã học thời gian không đổi.

Bài toán hiệu suất vfork()

Một cuộc tranh luận sôi nổi đã nổ ra xung quanh việc triển khai hỗ trợ vfork() trong Fil-C . Không giống như system call fork() truyền thống, vfork() cung cấp việc tạo tiến trình nhanh hơn nhiều bằng cách chia sẻ bộ nhớ giữa tiến trình cha và con cho đến khi tiến trình con gọi exec() hoặc exit(). Lợi thế về hiệu suất này trở nên quan trọng đối với các ứng dụng có dung lượng bộ nhớ lớn, chẳng hạn như các trình quản lý tài nguyên và bộ khởi chạy song song cần tạo ra hàng chục hoặc hàng trăm tiến trình.

Thách thức nằm ở các yêu cầu an toàn nghiêm ngặt của vfork(). Tiến trình con chỉ có thể thực hiện các thao tác async-signal-safe, và bất kỳ vi phạm nào đối với các quy tắc này có thể làm hỏng trạng thái bộ nhớ của tiến trình cha. Người tạo ra Fil-C thừa nhận sự phức tạp này, lưu ý rằng việc triển khai các kiểm tra an toàn phù hợp sẽ yêu cầu những sửa đổi rộng rãi trong toàn bộ hệ thống runtime. Rủi ro gây ra các lỗi ổn định và an toàn khiến đây trở thành một tính năng có chi phí cao, rủi ro cao bất chấp những lợi ích hiệu suất rõ ràng.

Lưu ý: vfork() là một system call Unix tạo ra một tiến trình mới mà không sao chép bộ nhớ của tiến trình cha, làm cho nó nhanh hơn nhưng hạn chế hơn so với fork().

Các Thách Thức Kỹ Thuật Chính:

  • Triển Khai vfork(): Đòi hỏi các kiểm tra an toàn thời gian chạy mở rộng và có nguy cơ hỏng bộ nhớ
  • Tích Hợp Assembly: Cần phát triển FFI cho các quy ước gọi hàm độc đáo của Fil-C
  • Hỗ Trợ Mã Hóa: Thiết yếu cho các ứng dụng bảo mật sản xuất yêu cầu thực thi thời gian không đổi
  • Tác Động Hiệu Suất: vfork() cung cấp tăng tốc đáng kể cho các ứng dụng nặng về tiến trình
  • Đảm Bảo An Toàn: Cả hai tính năng đều phải duy trì các cam kết an toàn bộ nhớ của Fil-C

Tích hợp mã Assembly mật mã học

Một cuộc thảo luận quan trọng khác tập trung vào việc hỗ trợ mã assembly được tối ưu hóa thủ công, đặc biệt là cho các thao tác mật mã học yêu cầu thực thi thời gian không đổi. Khả năng này rất cần thiết cho các ứng dụng bảo mật sản xuất, vì các biến thể thời gian trong mã mật mã học có thể làm rò rỉ thông tin nhạy cảm về khóa hoặc dữ liệu văn bản gốc.

Cộng đồng coi đây là một rào cản quan trọng đối với việc áp dụng. Nhiều nhà phát triển bày tỏ rằng họ sẽ không xem xét sử dụng Fil-C trong sản xuất nếu không có khả năng chạy các triển khai assembly thời gian không đổi của OpenSSL . Thách thức bao gồm việc tạo ra một giao diện hàm ngoại (FFI) cho phép mã assembly hoạt động với các quy ước gọi hàm độc đáo và hệ thống quản lý bộ nhớ của Fil-C trong khi vẫn duy trì các đảm bảo an toàn.

Tôi thực sự muốn có thể chạy OpenSSH bằng Fil-C và tôi thực sự không muốn phải lo lắng về việc mã crypto được viết bằng C không có thời gian không đổi.

Giải pháp kỹ thuật và cách giải quyết tạm thời

Một số giải pháp tiềm năng đã được đề xuất cho cả hai thách thức. Đối với vfork(), các lựa chọn thay thế như posix_spawn() có thể cung cấp lợi ích hiệu suất tương tự với các đảm bảo an toàn tốt hơn. Đối với mã mật mã học, các nhà phát triển đề xuất bao quanh các hàm assembly bằng các lệnh gọi exit/enter đặc biệt, tương tự như cách Fil-C xử lý các system call.

Cách tiếp cận hứa hẹn nhất cho việc hỗ trợ assembly bao gồm việc chuyển đổi mã assembly hiện có để chèn các lệnh an toàn bổ sung mà không thay đổi hành vi thuật toán cốt lõi. Điều này sẽ bảo toàn các thuộc tính thời gian không đổi trong khi đảm bảo an toàn bộ nhớ theo các quy tắc của Fil-C .

Các Giải pháp Thay thế và Tạm thời Hiện tại:

  • Đối với vfork(): Sử dụng posix_spawn() hoặc tối ưu hóa triển khai fork() hiện có
  • Đối với Assembly: Hỗ trợ assembly nội tuyến tĩnh có sẵn, assembly ngoại tuyến cần FFI
  • Đối với Crypto: Chuyển đổi mã assembly với các hướng dẫn an toàn bổ sung
  • Ưu tiên Phát triển: Được phân loại là các tính năng có mức độ khẩn cấp trung bình, rủi ro cao

Mối quan ngại về sự sẵn sàng sản xuất

Những cuộc thảo luận này làm nổi bật khoảng cách giữa khả năng hiện tại của Fil-C và các yêu cầu sản xuất. Trong khi ngôn ngữ này cho thấy tiềm năng cho lập trình hệ thống an toàn bộ nhớ, việc thiếu các tính năng này hạn chế khả năng ứng dụng của nó trong các môi trường quan trọng về bảo mật nơi cả hiệu suất và mật mã học thời gian không đổi đều cần thiết.

Nhóm phát triển nhận ra những hạn chế này nhưng ưu tiên chúng là các mục có mức độ khẩn cấp trung bình so với các tính năng ngôn ngữ cốt lõi khác. Sự phức tạp của việc triển khai các tính năng này một cách an toàn có nghĩa là chúng có thể không xuất hiện trong thời gian tới, có khả năng làm chậm việc áp dụng doanh nghiệp của lựa chọn thay thế C an toàn bộ nhớ sáng tạo này.

Lưu ý: Mật mã học thời gian không đổi đề cập đến các triển khai mất cùng một khoảng thời gian bất kể giá trị đầu vào, ngăn chặn các cuộc tấn công dựa trên thời gian.

Tham khảo: Safepoints and Fil-C