Bản sửa lỗi phát ban dẫn đến bản sửa lỗi không hoàn chỉnh cho lỗ hổng Spectre trong nhân Linux

Các nhà phát triển của dự án Grsecurity đã chia sẻ một câu chuyện cảnh báo chứng minh việc loại bỏ bất cẩn các cảnh báo của trình biên dịch có thể dẫn đến các lỗ hổng trong mã như thế nào. Vào cuối tháng XNUMX, đối với nhân Linux, một bản sửa lỗi đã được đề xuất cho một phương thức khai thác lỗ hổng Spectre mới thông qua lệnh gọi hệ thống ptrace.

Trong quá trình kiểm tra bản vá, các nhà phát triển nhận thấy rằng khi xây dựng, trình biên dịch sẽ hiển thị cảnh báo về việc trộn mã và định nghĩa (cấu trúc được xác định sau mã với việc gán giá trị cho một biến hiện có):

chỉ số int = n;
if (n < HBP_NUM) { index = array_index_nospec(index, HBP_NUM); cấu trúc perf_event *bp = thread->ptrace_bps[index];

Linus chấp nhận sự sửa chữa đến chi nhánh chính của bạn, từ bỏ khỏi cảnh báo bằng cách gói định nghĩa biến trong khối if:

if (n < HBP_NUM) { int index = array_index_nospec(n, HBP_NUM); cấu trúc perf_event *bp = thread->ptrace_bps[index];

Vào tháng 4.4, bản sửa lỗi cũng đã được chuyển sang các nhánh kernel ổn định 4.9, 4.14, 4.19, 5.2 và XNUMX. Những người bảo trì ổn định cũng gặp phải cảnh báo và thay vì kiểm tra xem nó đã được sửa trong nhánh chính của Linus hay chưa, họ đã tự vá nó. Vấn đề là họ, không cần suy nghĩ nhiều, chỉ di chuyển định nghĩa cấu trúc, do đó lệnh gọi đến array_index_nospec, trực tiếp cung cấp khả năng bảo vệ chống lại lỗ hổng, không còn được sử dụng trong định nghĩa cấu trúc và thay vì biến "chỉ mục", biến "n" luôn được sử dụng:

chỉ số int = n;
if (n < HBP_NUM ){ struct perf_event *bp = thread->ptrace_bps[index];
chỉ số = mảng_index_nospec(chỉ số, HBP_NUM);

Nguồn: opennet.ru

Thêm một lời nhận xét