Clang đề xuất chế độ Hardening Mode để tăng cường bảo mật C/C++, nhưng cộng đồng tranh luận về những thay đổi phá vỡ tương thích

Nhóm Cộng đồng BigGo
Clang đề xuất chế độ Hardening Mode để tăng cường bảo mật C/C++, nhưng cộng đồng tranh luận về những thay đổi phá vỡ tương thích

Nhóm phát triển trình biên dịch Clang đã công bố một đề xuất đầy tham vọng cho chế độ hardening mới được thiết kế để cải thiện tính an toàn và bảo mật trong các chương trình C và C++. Sáng kiến này nhằm mục đích thống nhất các cơ chế bảo mật rải rác thành một tính năng duy nhất, dễ sử dụng có thể tự động kích hoạt các biện pháp bảo vệ khác nhau như kiểm tra ranh giới, bảo vệ stack và chẩn đoán nâng cao.

Đề xuất này được đưa ra vào thời điểm mà các mối quan ngại về an toàn trong C và C++ đã đạt đến điểm bùng nổ, với các cơ quan chính phủ và các nhà lãnh đạo ngành công nghiệp đang thúc đẩy các thực hành lập trình an toàn hơn. Mặc dù Clang đã cung cấp nhiều tính năng bảo mật, nhưng chúng hiện đang được phân tán qua các flag, macro và cài đặt khác nhau mà nhiều nhà phát triển thấy khó điều hướng.

Các tính năng được đề xuất cho Chế độ Tăng cường Bảo mật:

  • Cờ cảnh báo: -Wall, -Wextra, -Wshadow, -Wunused
  • Tùy chọn sanitizer: -fsanitize=address, -fstack-protector-strong
  • Macro bảo mật: __FORTIFY_SOURCE, _GLIBCXX_ASSERTIONS
  • Bảo vệ cấp máy: retpoline, LVI/LFence
  • Các biện pháp bảo mật định danh Unicode
  • Đặc tả tiêu chuẩn ngôn ngữ bắt buộc

Cộng đồng tranh luận về sự đánh đổi giữa hiệu suất và bảo mật

Cuộc thảo luận đã thu hút sự quan tâm đáng kể xung quanh các tác động hiệu suất của các biện pháp hardening như vậy. Những phát triển gần đây trong kiểm tra ranh giới cho thấy kết quả đầy hứa hẹn, với một số triển khai đạt được overhead thấp đến 0.3% cho việc kiểm tra ranh giới thư viện chuẩn. Điều này thể hiện một cải tiến lớn so với các giả định trước đây rằng những biện pháp bảo vệ như vậy sẽ quá tốn kém cho việc sử dụng trong sản xuất.

Tuy nhiên, cộng đồng vẫn chia rẽ về các phương pháp triển khai. Một số nhà phát triển chỉ ra các giải pháp hiện có như Valgrind để phát hiện lỗi bộ nhớ, mặc dù những công cụ này đi kèm với các hình phạt hiệu suất đáng kể - thường tăng thời gian chạy lên 10 đến 30 lần. Chế độ hardening được đề xuất nhằm mục đích cung cấp một giải pháp trung gian với sự bảo vệ có ý nghĩa ở chi phí hiệu suất có thể chấp nhận được.

Điểm chuẩn hiệu suất:

  • Chi phí kiểm tra giới hạn: Thấp nhất chỉ 0,3% đối với các thao tác thư viện chuẩn
  • Kiểm tra bộ nhớ Valgrind: Tăng thời gian chạy lên 10-30 lần
  • Kiểm tra giới hạn ở chế độ debug: Đã có sẵn trong MSVC và Clang với Microsoft STL

Những thay đổi phá vỡ tương thích gây tranh cãi

Có lẽ khía cạnh gây tranh cãi nhất của đề xuất là lập trường của nhóm về khả năng tương thích ngược. RFC nêu rõ rằng việc code bị phá vỡ giữa các bản phát hành trình biên dịch sẽ là một tính năng, không phải là lỗi trong chế độ hardening. Cách tiếp cận này đã tạo ra cuộc tranh luận gay gắt trong cộng đồng.

Code hiện tại đang hoạt động là code hiện tại đang hoạt động, tôi không quan tâm nếu nó trông đáng ngờ đối với tính năng trình biên dịch ngẫu nhiên của một người ngẫu nhiên nào đó.

Tình cảm này phản ánh những mối quan ngại rộng lớn hơn về sự nhấn mạnh truyền thống của cộng đồng C++ về khả năng tương thích ngược. Nhiều người duy trì gói và người dùng doanh nghiệp lo lắng về những tác động thực tế của cách tiếp cận như vậy, sợ rằng nó có thể tạo ra gánh nặng bảo trì và buộc các tổ chức phải duy trì nhiều phiên bản trình biên dịch.

Các tùy chọn triển khai đang được xem xét

Nhóm Clang đã phác thảo một số phương pháp tiềm năng để triển khai chế độ hardening. Những phương pháp này bao gồm từ các tệp cấu hình có thể được gửi kèm với trình biên dịch, đến các chế độ driver mới, các flag trực giao cho các khía cạnh bảo mật khác nhau, hoặc một flag toàn diện duy nhất. Mỗi phương pháp đều có những sự đánh đổi khác nhau về mặt khả năng sử dụng, tính linh hoạt và tích hợp với các hệ thống build hiện có.

Đề xuất cũng đề cập đến khả năng tương thích với chế độ -fhardened hiện có của GCC trong khi nhấn mạnh rằng việc triển khai của Clang có thể khác biệt trong các hành vi cụ thể. Cách tiếp cận thực dụng này thừa nhận rằng khả năng tương thích hoàn hảo giữa các trình biên dịch thường không thực tế trong khi vẫn hướng tới các mục tiêu bảo mật chung.

Các Phương Pháp Triển Khai Đang Được Xem Xét:

  • Tệp Cấu Hình: Đi kèm cấu hình tăng cường bảo mật với Clang , kích hoạt thông qua -config=hardened
  • Chế Độ Driver: Tạo driver biên dịch "tăng cường bảo mật" riêng biệt
  • Cờ Trực Giao: Các cờ riêng biệt cho tùy chọn ngôn ngữ, chẩn đoán và sanitizer
  • Cờ Đơn: Cờ thống nhất (ví dụ: -fhardened) kiểm soát tất cả các khía cạnh tăng cường bảo mật

Các tính năng bảo mật ngoài kiểm tra ranh giới

Chế độ hardening sẽ bao gồm nhiều hơn chỉ là an toàn bộ nhớ. Đề xuất bao gồm các điều khoản để giải quyết các lỗ hổng định danh Unicode cho phép các cuộc tấn công homoglyph, nơi các ký tự tương tự về mặt thị giác có thể được sử dụng để tạo code lừa đảo. Những cuộc tấn công như vậy khai thác các ký tự Unicode trông giống hệt các chữ cái ASCII nhưng có ý nghĩa khác nhau đối với trình biên dịch.

Ngoài ra, chế độ này có thể kích hoạt các flag cảnh báo khác nhau, sanitizer, cơ chế bảo vệ stack và các macro tập trung vào bảo mật như __FORTIFY_SOURCE_GLIBCXX_ASSERTIONS. Cách tiếp cận toàn diện này nhằm mục đích tạo ra một môi trường phát triển ưu tiên bảo mật mà không yêu cầu các nhà phát triển phải cấu hình thủ công hàng chục cài đặt riêng lẻ.

Nhìn về tương lai

Nhóm Clang hiện đang tìm kiếm phản hồi từ cộng đồng về hướng đi cấp cao trước khi tiến hành các kế hoạch triển khai chi tiết. Sự thành công của sáng kiến này có thể ảnh hưởng đáng kể đến cách phát triển C và C++ tiến hóa để đáp ứng các yêu cầu bảo mật ngày càng tăng, có khả năng thiết lập các tiêu chuẩn mới cho việc hardening chương trình được hỗ trợ bởi trình biên dịch trên toàn hệ sinh thái.

Tham khảo: [RFC] Hardening mode for the compiler