Các lỗ hổng và khai thác
Các lỗ hổng là những khiếm khuyết trong phần mềm vi phạm các giả định bảo mật của nó; khai thác là nghệ thuật biến một khiếm khuyết như vậy thành hành vi do kẻ tấn công kiểm soát, từ rò rỉ dữ liệu đến thực thi mã hoàn chỉnh.
Definition
Lỗ hổng là một điểm yếu trong hệ thống mà kẻ tấn công có thể sử dụng để vi phạm chính sách bảo mật của nó; khai thác là một kỹ thuật hoặc chương trình lợi dụng một lỗ hổng cụ thể để đạt được các hiệu ứng trái phép.
Scope
Chủ đề này bao gồm các lớp lỗ hổng chính — lỗi hỏng bộ nhớ (tràn bộ đệm, sử dụng sau khi giải phóng), tấn công tiêm, lỗi số nguyên và lỗi logic — và các kỹ thuật để khai thác chúng, bao gồm chiếm quyền điều khiển luồng và lập trình hướng trả về. Nó cũng bao gồm các biện pháp giảm thiểu làm tăng chi phí khai thác (ASLR, DEP/NX, stack canaries, kiểm soát luồng toàn vẹn). Nó không bao gồm các thực hành phát triển an toàn và các lỗ hổng dành riêng cho web, được xử lý trong các chủ đề liên quan.
Core questions
- Những loại khiếm khuyết phần mềm nào tạo ra các lỗ hổng có thể khai thác?
- Làm thế nào một lỗi hỏng bộ nhớ được biến thành quyền kiểm soát một chương trình?
- Lập trình hướng trả về là gì và tại sao nó đánh bại các biện pháp phòng thủ đơn giản?
- Các biện pháp giảm thiểu như ASLR, DEP và stack canaries nâng cao rào cản khai thác như thế nào?
- Tại sao 'cuộc chạy đua vũ trang' giữa khai thác và giảm thiểu vẫn tiếp diễn?
Key concepts
- tràn bộ đệm
- sử dụng sau khi giải phóng
- tràn số nguyên
- tấn công tiêm
- chiếm quyền điều khiển luồng
- lập trình hướng trả về
- shellcode
- ASLR, DEP/NX, stack canaries
- kiểm soát luồng toàn vẹn
Key theories
- Chiếm quyền điều khiển luồng
- Nhiều khai thác làm hỏng một con trỏ mã (chẳng hạn như địa chỉ trả về hoặc con trỏ hàm) để chuyển hướng thực thi đến mã do kẻ tấn công chọn, ví dụ điển hình là tràn bộ đệm ngăn xếp ghi đè địa chỉ trả về đã lưu.
- Các biện pháp giảm thiểu và cuộc chạy đua vũ trang khai thác
- Các biện pháp phòng thủ như bộ nhớ không thể thực thi, ngẫu nhiên hóa bố cục không gian địa chỉ, stack canaries và kiểm soát luồng toàn vẹn đều chặn một lớp kỹ thuật, thúc đẩy các cuộc tấn công mới (lập trình hướng trả về, rò rỉ thông tin) trong một sự leo thang liên tục.
Mechanisms
Một tràn ngăn xếp cổ điển ghi đè qua giới hạn của bộ đệm, ghi đè địa chỉ trả về đã lưu để khi hàm trả về, quá trình thực thi nhảy đến shellcode do kẻ tấn công cung cấp. Các biện pháp giảm thiểu đã phá vỡ điều này: bộ nhớ không thể thực thi (DEP/NX) đã ngăn chặn việc chạy mã được tiêm, thúc đẩy lập trình hướng trả về bằng cách xâu chuỗi các đoạn mã hiện có; ngẫu nhiên hóa bố cục không gian địa chỉ đã ẩn các địa chỉ mục tiêu, thúc đẩy các nguyên thủy rò rỉ thông tin để đánh bại nó. Kiểm soát luồng toàn vẹn và các ngôn ngữ an toàn bộ nhớ nhằm mục đích đóng hoàn toàn các lớp này.
Clinical relevance
Các lỗ hổng có thể khai thác là nguyên liệu thô của các cuộc tấn công thực tế: các lỗi an toàn bộ nhớ chiếm phần lớn các lỗ hổng nghiêm trọng trong các trình duyệt và hệ điều hành lớn, các khai thác zero-day được mua, bán và sử dụng trong hoạt động gián điệp và tội phạm, và lĩnh vực này thúc đẩy kỹ thuật phòng thủ, tiết lộ có trách nhiệm, tiền thưởng lỗi và thúc đẩy các ngôn ngữ an toàn bộ nhớ như Rust.
Evidence & guidelines
Các lớp lỗ hổng được phân loại trong CWE của MITRE và được theo dõi riêng lẻ dưới dạng CVE với điểm mức độ nghiêm trọng CVSS. Các nghiên cứu từ các nhà cung cấp lớn (Microsoft, Google) báo cáo rằng khoảng 70% các lỗ hổng nghiêm trọng bắt nguồn từ việc không an toàn bộ nhớ, thúc đẩy hướng dẫn về các ngôn ngữ an toàn bộ nhớ và việc triển khai các biện pháp giảm thiểu (ASLR, CFI) theo mặc định trong các nền tảng hiện đại.
History
Khai thác đã thu hút sự chú ý của công chúng với tràn bộ đệm của sâu Morris năm 1988 và được hệ thống hóa bởi 'Smashing the Stack for Fun and Profit' của Aleph One năm 1996. Mỗi biện pháp phòng thủ đều gây ra một phản ứng: DEP dẫn đến return-into-libc và lập trình hướng trả về của Shacham (2007); ASLR dẫn đến các phương pháp bỏ qua dựa trên rò rỉ. Cuộc khảo sát 'Eternal War in Memory' năm 2013 đã định hình cuộc chạy đua vũ trang đang diễn ra, tiếp tục thúc đẩy cả các biện pháp giảm thiểu mới và việc áp dụng các ngôn ngữ an toàn bộ nhớ.
Key figures
- Elias Levy (Aleph One)
- Hovav Shacham
- Dawn Song
- Ross Anderson
- Halvar Flake
Related topics
Seminal works
- aleph1996
- szekeres2013
- anderson2020
Frequently asked questions
- Lỗ hổng zero-day là gì?
- Zero-day là một lỗ hổng không được những người bảo vệ phần mềm biết đến (và chưa được vá) tại thời điểm nó bị khai thác, khiến họ không có thời gian để chuẩn bị. Những khiếm khuyết như vậy đặc biệt có giá trị đối với kẻ tấn công vì chưa có bản vá hoặc chữ ký nào tồn tại.
- Tại sao các ngôn ngữ an toàn bộ nhớ được thúc đẩy như một giải pháp?
- Các ngôn ngữ an toàn bộ nhớ (như Rust) ngăn chặn toàn bộ các lớp lỗi — tràn bộ đệm, sử dụng sau khi giải phóng — tại thời điểm biên dịch hoặc chạy, loại bỏ nguồn gốc phổ biến nhất của các lỗ hổng nghiêm trọng thay vì chỉ làm cho mỗi lỗ hổng khó khai thác hơn.