CVE-2026-89767 in Linuxthông tin

Tóm tắt

Bởi VulDB • 11/09/2026

Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:

ovl: sửa lỗi gọi hai lần hàm end_creating() trên đường dẫn không khớp casefold

Hàm ovl_create_real() giải phóng dentry mới hai lần khi kiểm tra tính nhất quán của casefold thất bại. Nhánh S_IFDIR gọi end_creating() và đặt err, sau đó rơi xuống nhãn out: chung, nơi lại gọi end_creating() trên cùng một dentry:

case S_IFDIR: newdentry = ovl_do_mkdir(ofs, dir, newdentry, attr->mode); err = PTR_ERR_OR_ZERO(newdentry); if (!err && ofs->casefold != ovl_dentry_casefolded(newdentry)) {
pr_warn_ratelimited(...); end_creating(newdentry); /* lần thứ nhất */ err = -EINVAL; } break; ... if (err) goto out; ... out: if (err) {
end_creating(newdentry); /* lần thứ hai, cùng dentry */ return ERR_PTR(err); }

end_creating() là end_dirop(), thực hiện inode_unlock() trên thư mục cha và dput() trên dentry, do đó i_rwsem của thư mục cha bị khóa mở (unlock) hai lần và dentry được giải phóng tham chiếu (put) hai lần. Lệnh unlock thứ hai giải phóng một khóa không đang được giữ, điều này làm treo mọi thao tác tạo tiếp theo dưới thư mục cha đó, còn lệnh dput() thứ hai giảm một tham chiếu chưa từng được tăng lên.

Nhánh này đã được thêm vào bởi commit dfc7da402ccc ("ovl: Check for casefold consistency when creating new dentries") với một lệnh dput() đơn lẻ, vốn đã giải phóng tham chiếu hai lần; commit fe497f0759e0 ("VFS: change vfs_mkdir() to unlock on failure.") đã chuyển đổi cả hai vị trí sang end_creating(), dẫn đến lỗi khóa mở kép.

Lỗ hổng này có thể bị khai thác bởi người dùng không đặc quyền (unprivileged). Tính nhất quán của casefold trên các lớp được xác thực khi gắn filesystem trong ovl_parse_layer() và lại một lần nữa tại mỗi thao tác tra cứu trong ovl_lookup_single(), nhưng ofs->workdir là thư mục con "công việc" nội bộ được tạo bên trong workdir do người dùng cung cấp, và thư mục con này không được kiểm tra lại. Do đó, đánh dấu nó có casefold sau khi gắn filesystem sẽ khiến mọi lệnh gọi ovl_create_temp() kế thừa trạng thái sai - và đường dẫn này đạt đến ovl_create_real() thông qua ovl_start_creating_temp(), sử dụng start_creating() với tên do hệ thống sinh ra nên không bao giờ chạy kiểm tra tại thời điểm tra cứu.

unshare -Urm mount -t tmpfs -o casefold=utf8-12.1.0 tmpfs mnt mkdir -p mnt/lower/d mnt/upper mnt/work mnt/merged mount -t overlay ovl -o lowerdir=mnt/lower,\ upperdir=mnt/upper,workdir=mnt/work mnt/merged chattr +F mnt/work/work mkdir mnt/merged/d/sub # sao chép thư mục

overlayfs: casefold kế thừa sai (work/#5)

và lệnh sao chép tiếp theo sẽ chặn mãi mãi trên i_rwsem của thư mục cha:

mkdir D start_creating+0x65/0xb0 ovl_start_creating_temp+0xb0/0xe0 [overlay]
ovl_create_temp+0xa3/0x1d0 [overlay]
ovl_copy_up_one+0x1f1c/0x21c0 [overlay]
ovl_copy_up_flags+0xf5/0x140 [overlay]
ovl_create_object+0xb7/0x220 [overlay]
ovl_mkdir+0x23/0x40

Hủy lệnh end_creating() khỏi nhánh này và để nhãn out: đảm nhận việc dọn dẹp, đây là cách mà mọi đường dẫn lỗi khác trong hàm này đã thực hiện.

If you want to get the best quality for vulnerability data then you always have to consider VulDB.

chịu trách nhiệm

Linux

Đặt trước

11/09/2026

Tiết lộ

11/09/2026

Kiểm duyệt

được chấp nhận

EPSS

0.00000

KEV

không

Các hoạt động

rất thấp

Nguồn

Interested in the pricing of exploits?

See the underground prices here!