CEO @CyStack
Nhóm nghiên cứu của CyStack đã liên tục giám sát các cuộc tấn công website qua lỗ hổng mới, bằng cách đó chúng tôi nhận thấy có ít nhất 4 lỗ hổng quan trọng đã được phát hiện trong năm qua. Phân tích cho thấy, trong năm vừa qua, số lượng các cuộc tấn công website chuyển đổi cấu trúc dữ liệu (tấn công Deserialization) đã tăng lên đến 300%, biến chúng thành một nguy cơ bảo mật nghiêm trọng đối với các ứng dụng web – đặc biệt trong làn sóng đào tiền ảo bất hợp pháp.
Mọi thứ càng trở nên tồi tệ hơn khi nhiều cuộc tấn công đã được đưa ra với mục đích cài đặt phần mềm độc hại khai thác tiền ảo trên các máy chủ web dễ bị tấn công, làm CPU hoạt động quá tải. Bài viết này sẽ giải thích những lỗ hổng chuyển đổi cấu trúc dữ liệu không an toàn là gì, cho thấy xu hướng ngày càng tăng của các cuộc tấn công khai thác những lỗ hổng này và kẻ tấn công làm gì để khai thác chúng (bao gồm cả các ví dụ tấn công thực tế).
“Serialization” là gì?
Đây là quá trình tuần tự chuyển đổi một đối tượng (Object). Ví dụ như một đối tượng Java (Java object), thành một định dạng có thể được gửi qua mạng, hoặc được lưu trữ trong bộ nhớ hoặc cơ sở dữ liệu. Mục đích của Serialization là để bảo vệ một đối tượng, có nghĩa là đối tượng sẽ tồn tại bên ngoài chương trình nơi mà nó được tạo ra.
Như vậy, bằng việc tìm hiểu cơ chế của Serialization, ta có thể suy ra cơ chế làm việc của Deserialization như sau: Deserialization (chuyển đổi cấu trúc dữ liệu ảo) là quá trình sẽ giúp chuyển đổi định dạng dãy byte liên tục trở lại thành một đối tượng “sống”.

Ví dụ, khi rút tiền từ máy ATM, thông tin của chủ tài khoản và hoạt động yêu cầu được lưu trữ trong một đối tượng nội bộ. Trước khi đối tượng này được gửi tới máy chủ chính, nó được tuần tự thực hiện (Serialization) chuyển dữ liệu từ dạng đối tượng thành dạng dãy byte và phê duyệt các hoạt động cần thiết. Máy chủ sau đó chuyển đổi cấu trúc dữ liệu từ dạng byte sang dạng đối tượng (Desertlization) để hoàn thành các hoạt động, phản hồi với người dùng.
Phân loại Serialization
Có rất nhiều loại Serialization có sẵn phụ thuộc vào đối tượng đang được tuần tự chuyển đổi và mục đích của chúng. Hầu như tất cả các ngôn ngữ lập trình hiện đại đều hỗ trợ Serialization. Trong Java, ví dụ một đối tượng được chuyển đổi thành dạng nhỏ gọn sử dụng luồng byte, và luồng byte sau đó có thể chuyển đổi ngược lại thành một bản sao của đối tượng đó.
Các loại Serialization khác bao gồm chuyển đổi một đối tượng thành một định dạng phân cấp như JSON hoặc XML. Ưu điểm của việc tuần tự hóa này là các đối tượng được tuần tự hóa có thể được đọc dưới dạng văn bản thuần, thay vì một luồng byte.
Các lỗ hổng do Deserialization trong ba tháng gần đây
Trong top 10 nguy cơ bảo mật hàng đầu năm 2017, việc kết nối không an toàn đứng ở vị trí thứ tám. Đây thực sự cũng là một câu hỏi lớn cho vấn đề an ninh mạng trong năm 2017 và năm nay.
Vào năm 2017, các lỗ hổng mới liên quan đến việc tuần tự hóa không an toàn, chủ yếu là ở Java, đã được công bố (xem hình 1).
TÊN | NGÀY PHÁT HIỆN | THÔNG TIN LỖ HỔNG |
CVE-2017-12149 | 01/08/2017 | Lỗ hổng trong máy chủ ứng dụng JBoss cho phép thực hiện mã tùy ý thông qua dữ liệu đã được tạo thủ công bởi vì HTTP Invoker không giới hạn các lớp mà nó thực hiện Deserialization |
CVE-2017-10271 | 21/06/2017 | Lỗ hổng trong Oracle WebLogic Server cho phép thực hiện mã tùy ý do không đủ bộ lọc dữ liệu đầu vào trong thành phần wls-wsat |
CVE-2017-9805 | 21/06/2017 | Plugin REST trong Apache Struts sử dụng XStreamHandler với một cá thể của XStream để Deserialization mà không có bất kỳ kiểu lọc nào, có thể dẫn đến việc thực hiện mã từ xa khi sắp sếp payload của XML. |
CVE-2017-7504 | 05/04/2017 | HTTPServerILServlet.java trong JMS cho phép kẻ tấn công từ xa thực hiện mã tùy ý thông qua dữ liệu đã được tạo thủ công bởi vì nó không hạn chế các lớp mà nó thực hiện Deserialization |
Hình 1: Mã lỗ hổng CVEs liên quan đến Deserialization không an toàn
Hình 2: Các cuộc tấn công Deserialization không an toàn trong suốt ba tháng vừa qua
Hầu hết những kẻ tấn công không sử dụng các vector tấn công nào khác ngoài hình thức tấn công Deserialization không an toàn. Chúng tôi nhận thấy rằng mỗi kẻ tấn công đều đang cố gắng khai thác các lỗ hổng khác nhau với lỗ hổng được đề cập ở trên là phổ biến nhất.
TÊN | HỆ THỐNG ẢNH HƯỞNG | CÔNG KHAI | NAME | HỆ ĐIỀU HÀNH ẢNH HƯỞNG | CÔNG KHAI |
CVE-2017-9844 | SAP NetWeaver |
yes | CVE-2016-2170 | Apache OFBiz | No |
CVE-2017-9830 | Code42 CrashPlan | No | CVE-2016-2003 | HP P9000, XP7 Command View Advanced Edition (CVAE) Suite | No |
CVE-2017-9805 | Apache Struts | Yes | CVE-2016-2000 | HP Asset Manager | No |
CVE-2017-7504 | Red Hat JBoss | yes | CVE-2016-1999 | HP Release Control | No |
CVE-2017-5878 | Apache OpenMeetings | Yes | CVE-2016-1998 | HP Service Manager | No |
CVE-2017-5645 | Apache Log4j | No | CVE-2016-1997 | HP Operations Orchestration | No |
CVE-2017-5641 | Apache BlazeDS | Yes | CVE-2016-1986 | HP Continuous Delivery Automation | No |
CVE-2017-5586 | OpenText Documentum D2 | yes | CVE-2016-1985 | HP Operations Manager | No |
CVE-2017-3159 | Apache Camel | Yes | CVE-2016-1487 | Lexmark Markvision Enterprise | No |
CVE-2017-3066 | Adobe ColdFusion | Yes | CVE-2016-1291 | Cisco Prime Infrastructure | Yes |
CVE-2017-2608 | Jenkins | Yes | CVE-2016-0958 | Adobe Experience Manager | No |
CVE-2017-12149 | Red Hat JBoss | yes | CVE-2016-0788 | Jenkins | Yes |
CVE-2017-11284 | Adobe ColdFusion | No | CVE-2016-0779 | Apache TomEE | No |
CVE-2017-11283 | Adobe ColdFusion | No | CVE-2016-0714 | Apache Tomcat | No |
CVE-2017-1000353 | CloudBees Jenkins | yes | CVE-2015-8765 | McAfee ePolicy Orchestrator | No |
CVE-2016-9606 | Resteasy | Yes | CVE-2015-8581 | Apache TomEE | No |
CVE-2016-9299 | Jenkins | yes | CVE-2015-8545 | NetApp | No |
CVE-2016-8749 | Jackson (JSON) | ||||
CVE-2016-8744 | Apache Brooklyn | Yes | CVE-2015-8238 | Unify OpenScape | No |
CVE-2016-8735 | Apache Tomcat JMX | yes | CVE-2015-8237 | Unify OpenScape | No |
CVE-2016-7462 | VMWare vRealize Operations | No | CVE-2015-8103 | Jenkins | Yes |
CVE-2016-6809 | Apache Tika | No | CVE-2015-7501 | Red Hat JBoss | Yes |
CVE-2016-5229 | Atlassian Bamboo | Yes | CVE-2015-7501 | Oracle Application Testing Suite | No |
CVE-2016-5004 | Apache Archiva | yes | CVE-2015-7450 | IBM Websphere | Yes |
CVE-2016-4385 | HP Network Automation | No | CVE-2015-7253 | Commvault Edge Server | Yes |
CVE-2016-4372 | HP iMC | No | CVE-2015-6934 | VMWare vCenter/vRealize | No |
CVE-2016-3642 | Solarwinds Virtualization Manager | yes | CVE-2015-6576 | Atlassian Bamboo | No |
CVE-2016-3461 | Oracle MySQL Enterprise Monitor | yes | CVE-2015-6555 | Symantec Endpoint Protection Manager | Yes |
CVE-2016-3427 | JMX | yes | CVE-2015-6420 | Cisco (various frameworks) | |
CVE-2016-3415 | Zimbra Collaboration | No | CVE-2015-5348 | Apache Camel | No |
CVE-2016-2510 | Red Hat JBoss BPM Suite | No | CVE-2015-5254 | Apache ActiveMQ | No |
CVE-2016-2173 | Spring AMPQ | No | CVE-2015-4852 | Oracle WebLogic | Yes |
CVE-2016-2170 | Apache OFBiz | No | CVE-2015-3253 | Jenkins | Yes |
CVE-2016-2003 | HP P9000, XP7 Command View Advanced Edition (CVAE) Suite | No | CVE-2012-4858 | IBM Congnos BI | No |
Hình 3: CVEs liên quan đến Deserialization không an toàn
Tấn công Deserialization vào website
Hầu hết các cuộc tấn công mà chúng ta thấy đều liên quan đến việc tuần tự hóa byte của các đối tượng Java. Ngoài ra, chúng ta đã thấy một số cuộc tấn công serialization đến XML và các định dạng khác (xem hình 4).
Hình 4: Phân bố các lỗ hổng trên các định dạng tuần tự khác nhau
Trong cuộc tấn công sau (xem hình 5), kẻ tấn công đang cố khai thác lỗ hổng CVE-2017-10271. Các payload được gửi trong định dạng của yêu cầu HTTP bằng cách sử dụng một đối tượng Java được tuần tự hóa thông qua XML đại diện. Vector tấn công chứa mảng java được nối tiếp vào một XML
Hình 5: Vector tấn công chứa mảng Java được tuần tự hóa vào một XML
Thực tế đây là một mảng Java có thể được nhìn thấy bởi cấu trúc phân cấp của các tham số, với hậu tố của “java / void / array / void / string”. Kẻ tấn công đang cố gắng chạy một tập lệnh bash trên máy chủ bị tấn công.
Tập lệnh bash này cố gắng gửi một yêu cầu HTTP sử dụng lệnh hệ điều hành “wget” sau đó tải về một tập lệnh trình báo được ngụy trang dưới dạng tệp hình ảnh (lưu ý phần mở rộng tệp jpg) và chạy nó. Có rất ít các ghi chú được thực hiện kiểm tra lệnh này:
- Sự tồn tại của lệnh shell và “wget” chỉ ra rằng payload này đang nhắm đến các hệ thống Linux
- Việc sử dụng một phần mở rộng tệp hình ảnh thường được thực hiện để tránh các điều kiện bảo mật
- Tham số “-q” đến “wget” là viết tắt của “quiet”, nghĩa là “wget” sẽ không có đầu ra cho giao diện điều khiển, do đó sẽ khó ghi nhận rằng yêu cầu đó được thực hiện. Một khi các tập lệnh tải về máy chủ bị nhiễm phần mềm độc hại khai thác tiền ảo, nó sẽ thực hiên quá trình đào tiền ảo Monero (một đồng tiền ảo tương tự như Bitcoin).
Mã Script tiếp theo (xem hình 6) cố gắng khai thác cùng một lỗ hổng, tuy nhiên thời gian này payload đang nhắm đến các máy chủ Windows bằng lệnh cmd.exe và Powershell để tải phần mềm độc hại và chạy nó.
Tấn công vector đang cố gắng lây nhiễm cho máy chủ Windows bằng phần mềm độc hại khai thác tiền ảo
Điều này chỉ ra rằng có hai phương pháp lây nhiễm khác nhau cho máy chủ Windows và Linux, mỗi hệ thống tương ứng với một tập lệnh riêng được chỉ định của nó.
Một ví dụ khác là payload sau (hình 7) rút ra từ cuộc tấn công Deserialization với một đối tượng được nối tiếp Java.
Mã hoá “xấu” là một sản phẩm của serialization trên Java, nơi mà đối tượng được đại diện trong luồng byte.
Tuy nhiên, có thể thấy một tập lệnh thuần văn bản được đánh dấu màu vàng. “$ {IFS}” là một biến định nghĩa một dấu cách trường nội bộ, trong trường hợp này nó chỉ là một biến cho dấu cách. Biến này có thể được sử dụng thay cho dấu cách để làm cho payload khó phát hiện hơn.
Cũng như trong các ví dụ trước, tập lệnh Bash nhắm mục tiêu các máy chủ Linux gửi một yêu cầu HTTP bằng cách sử dụng “wget” để tải xuống một công cụ đào tiền ảo (coin miner).
Các phương pháp tấn công khác
Mẫu số chung của các cuộc tấn công ở trên là kẻ tấn công website đang cố lây nhiễm phần mềm độc hại khai thác tiền ảo bằng cách sử dụng lỗ hổng Deserialization không an toàn. Tuy nhiên tấn công Deserialization không phải là phương pháp duy nhất để đạt được mục tiêu này.
Dưới đây, chúng ta sẽ thấy một ví dụ về một cuộc tấn công website khác, lần này tại header “Content-Type”.
Hình 8: Vector tấn công sử dụng lỗ hổng RCE của Apache Struts
Cuộc tấn công này cố gắng khai thác CVE-2017-5638, một lỗ hổng nổi tiếng của RCE liên quan đến Apache Struts đã được công bố vào tháng 3 năm 2017.
Khi được ghi nhận lần đầu, chúng ta không thấy dấu vết của những người khai thác tiền ảo trong các cuộc tấn công liên quan đến CVE này và phần lớn payload là các cuộc tấn công trinh sát.
Tuy nhiên, trong cuộc tấn công này, payload (đánh dấu màu vàng ở trên) rất giống với payload từ ví dụ trước sử dụng cùng một máy chủ từ xa và cùng một kịch bản chính xác, lây nhiễm vào máy chủ bằng phần mềm độc hại khai thác tiền ảo.
Phương pháp tấn công cũ này với một payload mới cho thấy một xu hướng mới trong lĩnh vực không gian mạng – những kẻ tấn công website cố gắng khai thác các lỗ hổng của RCE, mới và cũ, để biến các máy chủ dễ bị tổn thương thành những người khai thác tiền ảo và thu được một chỉ số ROI nhanh hơn cho “nỗ lực” của họ.
Lời khuyên
Với nhiều lỗ hổng mới liên quan đến Deserialization không an toàn đã được phát hiện trong năm nay và sự xuất hiện của nó trong danh sách các rủi ro bảo mật hàng đầu của OWASP, chúng tôi hi vọng các lỗ hổng liên quan sẽ được phát hiện đầy đủ vào cuối năm 2018. Trong thời gian chờ đợi, các tổ chức sử dụng các máy chủ bị ảnh hưởng được khuyên sử dụng bản vá mới nhất để giảm thiểu các lỗ hổng này.
Còn một lựa chọn thay thế cho bản vá lỗi bằng tay là dùng bản vá ảo. Bản vá ảo giúp bảo vệ các ứng dụng web khỏi các cuộc tấn công website, giảm số lượng điểm tiếp xúc và giảm chi phí của các bản vá lỗi khẩn cấp cũng như các chu kỳ khắc phục.
Xem thêm về các lỗ hổng khác tại bài viết: OWASP công bố top 10 rủi ro bảo mật ứng dụng