Tôi đã tìm hiểu trên mạng một chút kể từ lần đầu tiên tôi đăng câu hỏi này.
Theo người phát hiện ban đầu về lỗi, bash trước bản vá CVE-2014-6271 đã nhập một chức năng như:
foo=() {
code
}
bằng cách thay thế dấu bằng bằng một khoảng trắng và giải thích nó ... có nghĩa là có thể diễn giải vượt ra ngoài định nghĩa hàm.
Bản vá cho CVE-2014-6271 đã giới thiệu một chế độ đặc biệt của hàm parse_and_execute () để giới hạn đánh giá đối với định nghĩa hàm và không nằm ngoài nó.
Tuy nhiên, như được giải thích trong luồng này , biến môi trường được chế tạo đặc biệt của kiểm tra lỗ hổng CVE-2014-7169 được thiết kế để 1) nhầm lẫn trình phân tích cú pháp đến chết 2) để lại các mẩu tin lưu trữ trong bộ đệm 3) thay đổi hoàn toàn những gì lệnh bash ban đầu làm khi nó kết hợp với các mẩu tin lưu niệm đã có trong bộ đệm.
Vì vậy, để mổ xẻ biến môi trường:
X='() { (a)=>\'
- Trình phân tích cú pháp sẽ phân tích
() { (a)=>\
. Lưu ý rằng đó \
là một phần của chuỗi; nó không thoát khỏi dấu ngoặc đơn.
() {
- Trình phân tích cú pháp xác định đây là một định nghĩa hàm.
(a)=
- Điều này gây nhầm lẫn cho trình phân tích cú pháp đến chết.
>\
- Trình phân tích cú pháp để lại hai ký tự cuối cùng ngồi trong bộ đệm.
>\[NEWLINE]
- Tại một số điểm trước khi
sh
lệnh được chạy, một dòng mới được đặt trong bộ đệm.
>\[NEWLINE]echo date
- Khi
sh
được gọi (có lẽ là một liên kết tượng trưng cho bash trong trường hợp này), nó sẽ thêm các đối số lệnh của nó echo date
, vào các ký tự đã có trong bộ đệm.
>echo date
- Vì dòng mới được thoát, bash sẽ phân tích bộ đệm như
>echo date
, có tác dụng tương tự như date > echo
. Một tệp có tên echo
được tạo và thiết bị xuất chuẩn của date
lệnh được chuyển hướng vào nó.
; cat echo
- Lệnh thứ hai chỉ đơn giản hiển thị nội dung của tệp vừa tạo.