Lỗ hổng Shellshock Bash được tìm thấy như thế nào?


19

Vì lỗi này ảnh hưởng đến rất nhiều nền tảng, chúng tôi có thể học được điều gì đó từ quá trình tìm thấy lỗ hổng này: đó là khoảnh khắc εὕρηκα (eureka) hay kết quả của kiểm tra bảo mật?

Vì chúng tôi biết Stéphane đã tìm thấy lỗi Shellshock và những người khác cũng có thể biết quá trình này, chúng tôi sẽ quan tâm đến câu chuyện về cách anh ta đến tìm lỗi.


5
Liên quan: câu trả lời của anh ấy cho lỗi "Shellshock (CVE-2014-6271 / 7169) được giới thiệu khi nào và bản vá khắc phục hoàn toàn lỗi này là gì?".
Cristian Ciupitu

Câu hỏi này dường như lạc đề vì đó là về quá trình suy nghĩ của một người cụ thể và không phải là bất kỳ vấn đề * nix cụ thể nào.
terdon

@Anthon tại sao điều này phải là về Linux? Tại sao phê duyệt một chỉnh sửa mang lại ý kiến ​​của ai đó như thể đó là OP?
muru

@muru Tôi thấy đây là một cải tiến, may mắn thay, phải mất nhiều hơn một người để phê duyệt một chỉnh sửa được đề xuất. Nhưng tôi phải thừa nhận rằng tôi đã bỏ lỡ rằng câu hỏi đã bị đóng, nếu không tôi có thể không để lại Linux, Unix, tôi không quan tâm lắm, nếu không chúng tôi cũng cần BSD, v.v. trong tiêu đề của trang web.
Anthon

1
Đừng cho rằng tôi đã đọc từng câu hỏi trên trang này. Xem thread.gmane.org/gmane.comp.security.oss.general/14177/ cho một câu trả lời ngắn.
Stéphane Chazelas

Câu trả lời:


23

Để trấn an một vài người, tôi đã không tìm thấy lỗi bằng cách quan sát các khai thác, tôi không có lý do gì để tin rằng nó đã bị khai thác trước khi được tiết lộ (mặc dù dĩ nhiên tôi không thể loại trừ được). Tôi cũng không tìm thấy nó bằng cách xem bashmã của nó.

Tôi không thể nói rằng tôi nhớ chính xác những suy nghĩ của tôi tại thời điểm đó.

Điều đó ít nhiều đến từ một số phản ánh về một số hành vi của một số phần mềm tôi thấy nguy hiểm (các hành vi, không phải phần mềm). Loại hành vi khiến bạn suy nghĩ: điều đó không có vẻ là một ý tưởng tốt .

Trong trường hợp này, tôi đã phản ánh về cấu hình chung của ssh cho phép truyền các biến môi trường không được xác nhận từ máy khách với điều kiện tên của chúng bắt đầu bằng LC_. Ý tưởng là để mọi người có thể tiếp tục sử dụng ngôn ngữ của chính họ khi sshđi vào các máy khác. Một ý tưởng tốt cho đến khi bạn bắt đầu xem xét việc xử lý nội địa hóa phức tạp như thế nào, đặc biệt là khi UTF-8 được đưa vào phương trình (và xem nó được xử lý tệ như thế nào bởi nhiều ứng dụng).

Trở lại vào tháng 7 năm 2014, tôi đã báo cáo một lỗ hổng trong việc xử lý nội địa hóa glibc kết hợp với sshd cấu hình đó và hai hành vi nguy hiểm khác của trình bashbao cho phép kẻ tấn công (xác thực) tấn công vào máy chủ git miễn là chúng có thể tải lên các tệp ở đó và bashđược sử dụng là vỏ đăng nhập của người dùng git unix (CVE-2014-0485).

Tôi đã nghĩ rằng có lẽ đó là một ý tưởng tồi khi sử dụng bashlàm vỏ đăng nhập của người dùng cung cấp dịch vụ qua ssh, vì nó khá phức tạp (khi tất cả những gì bạn cần chỉ là phân tích một dòng lệnh rất đơn giản) và đã thừa hưởng hầu hết các lỗi sai của ksh. Vì tôi đã xác định được một vài vấn đề bashkhi sử dụng trong bối cảnh đó (để giải thích ssh ForceCommands), tôi đã tự hỏi liệu có khả năng nào hơn ở đó không.

AcceptEnv LC_*cho phép bất kỳ biến nào có tên bắt đầu LC_và tôi có một hồi ức mơ hồ rằng các bash hàm xuất (một tính năng nguy hiểm mặc dù có tính năng hữu ích tại thời điểm đó) đang sử dụng các biến môi trường có tên giống như vậy myfunction()và tự hỏi liệu có gì thú vị để xem ở đó không.

Tôi đã định loại bỏ nó rằng điều tồi tệ nhất mà người ta có thể làm là xác định lại một lệnh được gọi là LC_something không thực sự là vấn đề vì chúng không phải là tên lệnh hiện có, nhưng sau đó tôi bắt đầu tự hỏi làm thế nào bash nhập các biến môi trường đó.

Điều gì xảy ra nếu các biến được gọi là LC_foo;echo test; f()ví dụ? Vì vậy, tôi quyết định có một cái nhìn gần hơn.

A:

$ env -i bash -c 'zzz() { :;}; export -f zzz; env'
[...]
zzz=() {  :
}

tiết lộ rằng hồi ức của tôi đã sai ở chỗ các biến không được gọi myfunction()nhưng myfunction(và đó là giá trị bắt đầu bằng ()).

Và một bài kiểm tra nhanh:

$ env 'true;echo test; f=() { :;}' bash -c :
test
bash: error importing function definition for `true;echo test; f'

xác nhận sự nghi ngờ của tôi rằng tên biến không được khử trùng và mã được đánh giá khi khởi động .

Tệ hơn, tệ hơn rất nhiều, giá trị cũng không được khử trùng:

$ env 'foo=() { :;}; echo test' bash -c :
test

Điều đó có nghĩa là bất kỳ biến môi trường nào cũng có thể là một vectơ.

Đó là khi tôi nhận ra mức độ của vấn đề, đã xác nhận rằng nó cũng có thể khai thác qua HTTP ( HTTP_xxx/ QUERYSTRING... env vars), những cái khác như dịch vụ xử lý thư, sau này là DHCP (và có thể là một danh sách dài) và báo cáo nó (một cách cẩn thận) .


4
Đọc thú vị! Mặc dù các ý kiến ​​về các câu hỏi cho thấy rõ rằng điều này có thể hơi lạc đề đối với trang web này, tôi nghĩ rằng một lượng nhỏ Q / A: s như thế này (với các câu trả lời được viết tốt và rõ ràng như thế này) thực sự là một tài sản cho trang web!
Johan E
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.