Một file ZIP có thể chứa nhiều thư mục hồ sơ hữu ích, nhưng tên từng entry do bên gửi kiểm soát. Giải nén ZIP an toàn cần bảo đảm mỗi file chỉ được ghi vào vùng được phép. Kiểm phần mở rộng của file ZIP ngoài cùng không chứng minh nội dung bên trong sẽ ở đúng chỗ.
Rủi ro nằm ở đường dẫn sau khi ghép
CodeQL mô tả Zip Slip là tình huống quá trình giải nén dùng tên entry không tin cậy để ghi file ngoài thư mục dự kiến. Kiểm đích đã chuẩn hóa và ranh giới thư mục là kiểm soát quan trọng; so sánh tiền tố chuỗi đơn giản có thể nhầm những thư mục chỉ giống tên. Cách triển khai phải theo API đường dẫn và hệ điều hành thực tế.
Đường dẫn tuyệt đối, thành phần đi lên thư mục, liên kết và hành vi ghi đè cần có chính sách riêng. Không dùng tên archive hay tên khách hàng làm quyền ghi lên hệ thống. Vùng nhận tạm nên tách khỏi mã ứng dụng và vùng public; tài khoản giải nén chỉ có quyền cần thiết trong vùng đó.
Phiếu quyết định cho từng entry
| Điểm kiểm | Kết quả được nhận | Khi chưa đạt |
|---|---|---|
| Đích chuẩn hóa | Nằm trong root được phép | Từ chối archive hoặc cách ly theo chính sách |
| Loại entry | File/thư mục được hỗ trợ | Không tự đi theo liên kết |
| Tài nguyên | Trong quota kích thước, số file, độ sâu | Dừng có biên nhận |
| Ghi đè | Quy tắc trùng tên đã chốt | Không thay file cũ im lặng |

Ví dụ giả định: hồ sơ có tên hợp lệ nhưng sai đích
Một đối tác gửi gói “ho-so.zip”. Bên trong có một entry mà sau chuẩn hóa sẽ nằm ngoài vùng nhận tạm. Hệ thống không thử “sửa hộ” đường dẫn rồi tiếp tục import như thể hồ sơ đầy đủ. Biên nhận nên nêu gói bị từ chối hoặc cách ly, lý do và những file chưa được xử lý. Không hiển thị đường dẫn nội bộ hoặc nội dung nhạy cảm cho người không có quyền.
Dung lượng nén nhỏ chưa nói lên chi phí xử lý
Ngoài ranh giới đường dẫn, cần giới hạn tài nguyên sau giải nén: tổng byte thực ghi, số entry, độ sâu thư mục, thời gian và chính sách archive lồng nhau. Đây là yêu cầu thiết kế bổ sung, không phải bảo đảm do một phép kiểm Zip Slip cung cấp. Khi dừng giữa chừng, vùng tạm phải được thu dọn có kiểm soát; không để một hồ sơ giải nén nửa chừng bị nhận là đã import xong.
Ca nghiệm thu nên gồm tên trùng, đường dẫn không được phép, quota bị vượt và file không đọc được. Dùng dữ liệu giả lập trong môi trường được cấp quyền, không thử ghi ra ngoài hệ thống production. Bài viết không khẳng định đã chạy các ca này.
Tách nhận file với chấp nhận dữ liệu
Giải nén thành công chỉ đưa file vào vùng tiếp nhận. Kiểm định nội dung, ánh xạ hồ sơ và duyệt import vẫn là bước riêng. Với website nhận tài liệu khách hàng, xem thêm kiểm soát upload hồ sơ RFQ; bài đó không thay thế kiểm đường dẫn từng entry trong archive.
Khi làm rõ phạm vi import hồ sơ cho phần mềm, hãy chốt trước danh sách định dạng được nhận và biên nhận từ chối. Cho phép ZIP là thêm một quy trình xử lý, không chỉ thêm đuôi file vào biểu mẫu.
Nguồn tham khảo và giới hạn
CodeQL: Arbitrary file access during archive extraction (Zip Slip) (đọc ngày 13/10/2026). Các biểu mẫu và tình huống trong bài là hướng dẫn biên tập hoặc ví dụ giả định; không phải kết quả kiểm thử, dữ liệu khách hàng hay cam kết năng lực đã triển khai. Cách áp dụng cần đối chiếu nền tảng và quyền thực tế.

