Kiểm tra lỗ hổng Shellshock được cập nhật cho CVE-2014-7169 hoạt động như thế nào?


11

Tôi hiểu bài kiểm tra gốc cho CVE-2014-6271, đó là:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

Nhưng tôi bối rối trước bài kiểm tra cập nhật và đầu ra tương ứng cho CVE-2014-7169:

$ env X='() { (a)=>\' sh -c "echo date"; cat echo
sh: X: line 1: syntax error near unexpected token `='
sh: X: line 1: `'
sh: error importing function definition for `X'
Thu 25 Sep 2014 08:50:18 BST

Ai đó có thể giải thích ngắn gọn những gì đang xảy ra ở đây và làm thế nào nó bỏ qua bản vá cho CVE-2014-6271?


Câu trả lời:


13

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 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 shlệ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 datelệ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.


2

Nó không cung cấp cho bạn một đầu ra sạch đẹp, nhưng nó chứng minh lỗi.

Không có lỗi, biến môi trường Xnên được bỏ qua, bash sẽ chạy echo datevà cat nên phàn nàn rằng không có tệp nào được gọi là echo. Ví dụ, xem xét cách hành xử của dash:

me@myserver$ rm -f echo && env -i  X='() { (a)=>\' dash -c 'echo date'; cat echo
date
cat: echo: No such file or directory

Tôi sẽ không lặp lại đầu ra mà bạn hiển thị trong câu hỏi của bạn và tôi sẽ không giả vờ hiểu cách thức hoạt động của nó, nhưng bash đang chạy datevà đưa đầu ra vào một tệp có tên là 'echo'. Bạn có thể chơi với các lựa chọn thay thế để datethuyết phục bản thân rằng điều này có thể sử dụng được và nguy hiểm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.