Lỗ hổng “SpringShell”

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.

Chi tiết lỗ hổng

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/ROOTfilename 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.

Các cấu hình bị ảnh hưởng

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.175.2.0 đến 5.2.19 và các phiên bản cũ hơn.

Các cuộc tấn công thực tế (Attacks in the Wild)

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.

Giảm thiểu rủi ro và phát hiện (Mitigation and Detection)

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

Kết Luận

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ế.

CÔNG TY CỔ PHẦN DỊCH VỤ CÔNG NGHỆ DATECH

  • Đị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