Tin tức Hướng dẫn kỹ thuật CÔNG TY CỔ PHẦN DỊCH VỤ CÔNG NGHỆ DATECH
Danh sách nội dung [Ẩn]
Lỗ hổng “SpringShell”

Vào ngày 30 tháng 3 năm 2022, một nhà nghiên cứu bảo mật ẩn danh đã công bố một mã khai thác proof-of-concept (PoC) cho lỗ hổng thực thi mã từ xa (Remote Code Execution – RCE) trong Spring Framework dành cho Java. Ngay từ đầu, lỗ hổng này đã dẫn tới nhiều suy đoán rằng nó có thể trở thành “Log4Shell” tiếp theo. Mặc dù các PoC khai thác đã xác nhận lỗ hổng này tồn tại, do các điều kiện cần thiết để thực hiện tấn công, chúng tôi tin rằng lỗ hổng này — dù nghiêm trọng — sẽ không có mức độ lan rộng tương đương Log4Shell.
Lỗ hổng này xuất phát từ khả năng data binding của Spring Framework. Data binding cho phép tạo mới hoặc chỉnh sửa các object Java từ các tham số được truyền vào trong HTTP request. Tính năng này giúp đơn giản hóa quá trình phát triển ứng dụng web, nhưng đồng thời cũng là nền tảng của nhiều lỗ hổng trước đây. Loại lỗ hổng này xảy ra khi attacker có thể bind dữ liệu vào các object Java vốn không nên bị chỉnh sửa từ bên ngoài. Tài liệu chính thức của Spring cũng đã khuyến nghị rõ ràng rằng các lập trình viên nên chủ động giới hạn những object nào có thể bị thao tác thông qua data binding.
Để hiểu rõ cách hoạt động của lỗ hổng này, chúng ta sẽ xem xét một public proof-of-concept exploit được công bố bởi LunaSec. Mã khai thác này sửa đổi một object Java trong Tomcat webserver chịu trách nhiệm quản lý logging của ứng dụng và cài đặt một webshell có khả năng thực thi mã từ xa tùy ý (arbitrary remote code execution). Cuộc tấn công sẽ chèn các giá trị sau vào object logging:

Hình 1. Các giá trị sẽ được chèn vào logging object
Các giá trị này đại diện cho vị trí log file do attacker chỉ định, cũng như chuỗi định dạng (format string) được sử dụng để ghi log. Bằng cách đặt directory thành webapps/ROOT và filename thành shell, request tiếp theo sẽ sửa đổi Tomcat logger để ghi dữ liệu vào file: webapps/ROOT/shell.jsp và sử dụng chuỗi định dạng được định nghĩa trong log_pattern.

Hình 2. Request ban đầu
Sau khi loại bỏ cơ chế mã hóa an toàn cho HTML (HTML-safe encoding), chúng ta có thể thấy chuỗi định dạng (format string) mới có nội dung như sau:

Hình 3. Chuỗi định dạng log mới
Bước tiếp theo là buộc webserver ghi chuỗi định dạng này vào vị trí đã đề cập phía trên, bằng cách chèn các giá trị sau vào thay cho: %{prefix}i, %{c}i, %{suffix}i.

Hình 4. Các tham số được sử dụng trong chuỗi định dạng
Việc cài đặt webshell được thực hiện thông qua một HTTP request thứ hai:

Hình 5. Request thứ hai dùng để cài đặt webshell
Sau khi hoàn tất, file: webapps/ROOT/shell.jsp sẽ chứa nội dung sau (đã được định dạng lại để dễ đọc hơn):

Hình 6. Webshell sau khi được cài đặt
Đoạn mã Java trong Java Server Page (JSP) này sẽ thực thi mã tùy ý (arbitrary code execution) được gửi thông qua tham số cmd trong HTTP GET request tới: https:///shell.jsp và hiển thị kết quả đầu ra trực tiếp.
Theo trang thông tin lỗ hổng chính thức của Spring, các cuộc tấn công đã được xác nhận yêu cầu ứng dụng web có cấu hình như sau:
Chạy trên JDK 9 hoặc cao hơn.
Sử dụng Apache Tomcat làm Servlet container.
Ứng dụng được đóng gói dưới dạng WAR truyền thống và triển khai trên một instance Tomcat độc lập (standalone Tomcat instance).
Các triển khai Spring Boot thông thường sử dụng embedded Servlet container hoặc reactive web server sẽ không bị ảnh hưởng.
Có dependency: spring-webmvc hoặc spring-webflux
Sử dụng các phiên bản Spring Framework: 5.3.0 đến 5.3.17, 5.2.0 đến 5.2.19 và các phiên bản cũ hơn.
Juniper Threat Labs bắt đầu ghi nhận các nỗ lực khai thác lỗ hổng này ngoài thực tế (in-the-wild exploitation attempts) kể từ ngày 3 tháng 4. Hiện tại vẫn chưa xác định được có bao nhiêu ứng dụng có khả năng bị ảnh hưởng bởi kiểu tấn công này.
Các ứng dụng bị ảnh hưởng cần ngay lập tức cập nhật lên phiên bản mới nhất của cả Spring Framework và Apache Tomcat Webserver vì các phiên bản mới đã bao gồm bản vá và các cơ chế giảm thiểu bổ sung cho lỗ hổng này. Các cuộc tấn công khai thác lỗ hổng trên có thể được phát hiện thông qua signature IDP của Juniper: HTTP:CTS:VMWR-SPRING-CORE-RCE
SpringShell là một lỗ hổng RCE nghiêm trọng trong Spring Framework, cho phép attacker thực thi mã tùy ý trên hệ thống mục tiêu thông qua cơ chế data binding bị khai thác sai cách. Mặc dù phạm vi ảnh hưởng thực tế không rộng như Log4Shell, lỗ hổng này vẫn đặc biệt nguy hiểm đối với các hệ thống sử dụng cấu hình dễ bị tác động như Tomcat standalone và ứng dụng đóng gói dạng WAR truyền thống.
Việc cập nhật Spring Framework và Apache Tomcat lên phiên bản mới nhất, kết hợp cùng các cơ chế giám sát và phát hiện tấn công phù hợp, là yếu tố quan trọng giúp giảm thiểu rủi ro và bảo vệ hệ thống trước các nỗ lực khai thác ngoài thực tế.
Địa chỉ: Số 23E4 KĐT Cầu Diễn, Tổ 7, Phú Diễn, Bắc Từ Liêm, Hà Nội
Điện thoại: 0243 201 2368
Hotline: 098 115 6699
Email: info@datech.vn
Website: https://datech.vn