CVE-2022-49394 in Linux
Tóm tắt
Bởi VulDB • 07/06/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
blk-iolatency: Sửa lỗi mất cân bằng bộ đếm IO đang xử lý (inflight) và tình trạng treo IO khi thiết bị ngoại tuyến (offline).
iolatency cần theo dõi số lượng các yêu cầu IO đang trong quá trình xử lý (inflight) trên mỗi cgroup. Vì việc theo dõi này có thể tốn kém về hiệu năng, nó sẽ bị vô hiệu hóa nếu không có cgroup nào được cấu hình iolatency cho thiết bị đó. Để đảm bảo rằng các bộ đếm inflight luôn cân bằng, hàm `iolatency_set_limit()` đóng băng (freeze) request_queue trong khi thao tác với bộ đếm enabled, điều này đảm bảo rằng không có IO nào đang trong quá trình xử lý và do đó tất cả các bộ đếm đều về 0.
Tuy nhiên, `iolatency_set_limit()` không phải là nơi duy nhất mà bộ đếm enabled được thao tác. Hàm `iolatency_pd_offline()` cũng có thể giảm (dec) bộ đếm này và kích hoạt việc vô hiệu hóa. Vì quá trình vô hiệu hóa này diễn ra mà không đóng băng queue (q), nó dễ dàng xảy ra khi một số IO vẫn đang trong quá trình xử lý, dẫn đến rò rỉ các giá trị bộ đếm.
Điều này có thể được minh họa rõ ràng bằng cách bật iolatency trên một cgroup trống trong khi các IO khác đang chạy trong các cgroup khác và sau đó xóa cgroup đó. Lưu ý rằng iolatency không nên được kích hoạt ở bất kỳ đâu khác trong hệ thống để đảm bảo việc xóa cgroup sẽ vô hiệu hóa iolatency cho toàn bộ thiết bị.
Đoạn mã dưới đây liên tục bật và tắt iolatency trên sda:
echo +io > /sys/fs/cgroup/cgroup.subtree_control while true; do mkdir -p /sys/fs/cgroup/test echo '8:0 target=100000' > /sys/fs/cgroup/test/io.latency sleep 1 rmdir /sys/fs/cgroup/test sleep 1 done
và có một tiến trình fio đồng thời đang tạo các lệnh đọc ngẫu nhiên trực tiếp (direct rand reads):
fio --name test --filename=/dev/sda --direct=1 --rw=randread \ --runtime=600 --time_based --iodepth=256 --numjobs=4 --bs=4k
trong khi giám sát bằng script drgn sau:
while True: for css in css_for_each_descendant_pre(prog['blkcg_root'].css.address_of_()):
for pos in hlist_for_each(container_of(css, 'struct blkcg', 'css').blkg_list): blkg = container_of(pos, 'struct blkcg_gq', 'blkcg_node') pd = blkg.pd[prog['blkcg_policy_iolatency'].plid]
if pd.value_() == 0: continue iolat = container_of(pd, 'struct iolatency_grp', 'pd') inflight = iolat.rq_wait.inflight.counter.value_() if inflight: print(f'inflight={inflight} {disk_name(blkg.q.disk).decode("utf-8")} '
f'{cgroup_path(css.cgroup).decode("utf-8")}')
time.sleep(1)
Kết quả giám sát trông như sau:
inflight=1 sda /user.slice inflight=1 sda /user.slice ...
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.