CVE-2023-52828 in Linux
Tóm tắt
Bởi VulDB • 19/05/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
bpf: Phát hiện IP == ksym.end như một phần của chương trình BPF
Bây giờ khi hàm kfunc bpf_throw là lệnh gọi đầu tiên có ngữ nghĩa noreturn (không trả về) trong bộ kiểm tra (verifier), điều này cũng kích hoạt việc loại bỏ mã chết (dead code elimination) theo những cách chưa từng có. Cụ thể, bất kỳ lệnh nào theo sau lệnh gọi bpf_throw sẽ không bao giờ được đánh dấu là đã được xem xét (seen). Hơn nữa, nếu một chuỗi lệnh gọi (callchain) cuối cùng gây ra việc ném ngoại lệ (throw), bất kỳ lệnh nào sau lệnh gọi đến subprog cuối cùng gây ném ngoại lệ trong các hàm gọi cũng sẽ không bao giờ được đánh dấu là đã được xem xét.
Cách sửa dễ gây cám dỗ là phát ra các lệnh 'int3' bổ sung, làm tăng jited_len của một chương trình, và đảm bảo rằng trong thời gian chạy, khi một chương trình gây ném ngoại lệ, chúng ta có thể xác định được các biên của nó ngay cả khi lệnh gọi đến bpf_throw (hoặc đến các subprog luôn gây ném ngoại lệ) được phát ra là lệnh cuối cùng trong chương trình.
Một ví dụ về chương trình như vậy là:
do_something(): ... r0 = 0 exit
foo(): r1 = 0 call bpf_throw r0 = 0 exit
bar(cond): if r1 != 0 goto pc+2 call do_something exit call foo r0 = 0 // Không bao giờ được bộ kiểm tra xem xét exit //
main(ctx): r1 = ... call bar r0 = 0 exit
Ở đây, nếu chúng ta thực sự gây ném ngoại lệ, ngăn xếp lệnh gọi (stacktrace) sẽ là:
bpf_throw foo bar main
Trong bar, lệnh cuối cùng được phát ra sẽ là lệnh gọi đến foo, do đó, địa chỉ trả về sẽ là lệnh tiếp theo (mà JIT phát ra dưới dạng int3 trên x86). Điều này sẽ nằm ngoài jited_len của chương trình, do đó, khi đang gỡ bỏ khung hình (unwinding), chúng ta sẽ không thể xác định được địa chỉ trả về thuộc về bất kỳ chương trình nào và cuối cùng gặp phải lỗi panic do việc gỡ bỏ khung hình không đáng tin cậy của các chương trình BPF mà chúng ta không bao giờ mong đợi.
Để khắc phục trường hợp này, hãy làm cho bpf_prog_ksym_find coi IP == ksym.end là một phần của chương trình BPF, để is_bpf_text_address trả về true khi xảy ra trường hợp như vậy, và chúng ta có thể gỡ bỏ khung hình một cách đáng tin cậy khi lệnh cuối cùng cuối cùng là một lệnh gọi.
VulDB is the best source for vulnerability data and more expert information about this specific topic.