Telerik Web UI là bộ công cụ phát triển giao diện người dùng mạnh mẽ do Telerik (nay là một phần của Progress Software) cung cấp, được thiết kế dành riêng cho các ứng dụng web ASP.NET và được ứng dụng rộng rãi. Tuy nhiên, từ năm 2014, thư viện này liên tục bị phát hiện các lỗ hổng bảo mật nghiêm trọng, khiến hệ thống dễ bị tấn công và có nguy cơ bị hacker chiếm quyền kiểm soát. Thông qua những chia sẻ ở bài viết này, mình sẽ phân tích chi tiết các lỗ hổng bảo mật trên Telerik Web UI có mã CVE-2017-9248, CVE-2017-11317, CVE-2017-11357 và CVE-2019-18935, đồng thời đưa ra các giải pháp khắc phục cụ thể để bảo vệ hệ thống của bạn.
Quá trình phát triển của RadAsyncUpload
RadAsyncUpload là một thành phần (control) trong Telerik UI for ASP.NET AJAX được thiết kế để hỗ trợ việc tải file lên máy chủ thông qua web một cách bất đồng bộ (asynchronous). Với RadAsyncUpload người dùng có thể tải file lên mà không cần phải tải lại toàn bộ trang web từ đó mà gia tăng, cải thiện trải nghiệm người dùng đáng kể. Tuy nhiên, sự tiện lợi đến từ RadAsyncUpload phát sinh một vài lỗ hổng ảnh hưởng đến hệ thống người dùng đáng kể như:
- CVE-2014-2217: Đây là lỗ hổng cũ trong RadAsyncUpload, cho phép hacker tải file lên máy chủ mà không có giới hạn, vì không kiểm soát được đường dẫn khi xử lý các yêu cầu POST. Telerik đã cố gắng khắc phục bằng cách mã hóa dữ liệu tải file lên (rauPostData) để ngăn kẻ tấn công can thiệp vào thông tin nhạy cảm như thư mục đích trên máy chủ.
- CVE-2017-11317: Theo thời gian, rauPostData không còn đủ bảo mật và hacker đã có thể phá được mã phần bảo vệ này, chúng vẫn có thể thay đổi cấu hình để tải file lên bất kỳ thư mục nào có quyền ghi và sinh ra lỗ hổng CVE-2017-11317.
- CVE-2019-18935 – Lỗ hổng thực thi mã từ xa: Không chỉ dừng lại ở việc tải các file kém an toàn lên hệ thống, các hacker đã có thể thay đổi kiểu đối tượng trong dữ liệu này cho phép họ truy cập và kiểm soát hệ thống ở bất kỳ đâu, lợi dụng một đối tượng đặc biệt gọi là gadget để thực thi mã độc trên máy chủ.
Lỗ hổng CVE-2017-9248 (Cryptographic Weakness)
CVE-2017-9248 là một lỗ hổng bảo mật liên quan đến yếu điểm mã hóa trong module Text Editor của Telerik UI for ASP.NET AJAX. Tính năng File Manager trong module này cho phép người dùng tải file lên máy chủ để chèn vào bài viết. Khi người dùng chọn loại file cần chèn (như hình ảnh hoặc tài liệu), một hộp thoại sẽ được tải thông qua URL có dạng như:
/Telerik.Web.UI.DialogHandler.aspx?DialogName=DocumentManager&dp=XXX
Trong đó, tham số dp=XXX là một đối tượng đã được serialize (tuần tự hóa), chứa các thông tin cấu hình như nơi lưu trữ file trên máy chủ và các loại file được phép tải lên.
Mặc dù Telerik đã sử dụng cơ chế mã hóa XOR với một giá trị bí mật (Telerik.Web.UI.DialogParametersEncryptionKey/MachineKey) để bảo vệ đối tượng dp, các phiên bản trước R2 2017 SP1 có lỗ hổng cho phép hacker có thể sử dụng brute force để dò ra giá trị khóa này. Một khi hacker tìm được khóa mã hóa, họ có thể giả mạo tham số XXX với cấu hình tùy chỉnh, từ đó tải file lên máy chủ mà không bị giới hạn định dạng hoặc vị trí lưu trữ.
Cách phát hiện
- Kiểm tra URL: Xác định xem máy chủ có đường dẫn kết thúc bằng /Telerik.Web.UI.DialogHandler.aspx hoặc DialogHandler.aspx hay không.
- Kiểm tra website: Mở mã nguồn trang web bằng cách nhấn chuột phải chọn View page source hoặc bấm Ctrl+U, sau đó tìm kiếm từ khóa Telerik.Web.UI để xác định trang web có sử dụng thư viện Telerik hay không.
- Kiểm tra phiên bản: Xem xét phiên bản Telerik UI đang sử dụng và so sánh với các phiên bản từ 2013.1.220 đến 2017.2.503 có nguy cơ bị ảnh hưởng thông qua mã nguồn.
- Kiểm tra Handler: Gửi yêu cầu tới /Telerik.Web.UI.DialogHandler.aspx. Nếu trả về thông báo “Loading the dialog…”, thì có thể lỗ hổng tồn tại.
Khai thác
Fuzzing tham số dp: Khi kiểm tra tham số dp, có thể nhận được các thông báo lỗi liên quan đến độ dài không hợp lệ hoặc ký tự không hợp lệ trong chuỗi base64. Nếu gặp lỗi thứ ba (chuỗi base64 được giải mã nhưng không thể xử lý), có khả năng cao là mã hóa xor đã được giải mã thành công.
Xác định key qua brute force:
- Ký tự đầu tiên của key: Thử tất cả các ký tự có thể có trong key (hex, ASCII,…) và mã hóa tham số dp, sau đó gửi request tới máy chủ. Nếu nhận được thông báo lỗi thứ ba, ký tự hiện tại chính là key[0] của máy chủ.
- Các ký tự tiếp theo: Tiếp tục brute force từng ký tự trong key, kết hợp với chuỗi base64 để tạo ra dp và gửi request. Sau đó, xem cách Telerik xử lý yêu cầu upload file từ hộp thoại.
Khai thác tải file: Sau khi dò được key bí mật, kẻ tấn công có thể chỉnh sửa các thuộc tính như SearchPatterns (đặt thành *.* để cho phép tải file có bất kỳ phần mở rộng nào) và UploadPaths, ViewPaths để chỉ định nơi lưu trữ file.
Tóm tắt quy trình:
- Brute force để tìm key bí mật của máy chủ.
- Giả mạo đối tượng dp để chỉ định các thuộc tính theo mục đích tấn công, như cho phép tải file không giới hạn định dạng.
- Mã hóa dp bằng key đã dò được và gửi request tải file lên máy chủ. Sau đó, kẻ tấn công có thể tải file độc hại lên server.
Khắc phục
Để khắc phục lỗ hổng bảo mật CVE-2017-9248, có thể thực hiện 5 bước sau đây:
1. Cập nhật bản vá bảo mật:
- Cần cập nhật bản vá bảo mật cho các phiên bản Telerik UI từ Q1 2013 (2013.1.220) đến R2 2017 SP1 (2017.2.503). Những bản vá này chứa các cập nhật nhằm khắc phục lỗ hổng CVE-2017-9248.
- Ngoài ra, các phiên bản từ Q1 2011 (2011.1.315) đến Q3 2012 SP2 (2012.3.1308) cũng cần được cập nhật bản vá bảo mật tương ứng để đảm bảo rằng lỗ hổng đã được khắc phục.
2. Nâng cấp phiên bản Telerik UI: Để đảm bảo việc khắc phục lỗ hổng một cách triệt để và tối ưu nhất, nên nâng cấp lên phiên bản R2 2017 SP1 (2017.2.621) hoặc các phiên bản mới hơn. Các phiên bản sau này đã được kiểm tra và sửa lỗi để đảm bảo rằng các lỗ hổng bảo mật không còn tồn tại.
3. Cấu hình khóa mã hóa: Tạo khóa mã hóa duy nhất cho DialogParameterEncryptionKey và MachineKey trong web.config.
4. Loại bỏ Handler không cần thiết: Xóa Telerik.Web.UI.SpellCheckHandler.ashx và Telerik.Web.UI.DialogHandler.aspx trong file cấu hình.
- SharePoint 2010: C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\wpresources\RadEditorSharePoint\6.x.x.0__1f131a624888eeed\Resources
- SharePoint 2013: C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\wpresources\RadEditorSharePoint\7.x.x.0__1f131a624888eeed\Resources
- SharePoint 2016: C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\wpresources\RadEditorSharePoint\7.x.x.0__1f131a624888eeed\Resources
5. Bảo mật URL: Redirect các URL liên quan đến Telerik để trả về trang thông báo lỗi nếu bị hacker truy cập.
Lỗ hổng CVE-2017-11317, CVE-2017-11357
CVE-2017-11317 là lỗ hổng trong RadAsyncUpload, do hardcoded key và unrestricted-file-upload. Nguyên nhân chính gây ra lỗ hổng này là do sử dụng khóa mã hóa mặc định yếu, có tên PrivateKeyForEncryptionOfRadAsyncUploadConfiguration. Nếu khóa này không được thay đổi, kẻ tấn công có thể lợi dụng nó để tạo các yêu cầu tải file lên thông qua đường dẫn /Telerik.Web.Ui.WebResource.axd?type=rau.
Hacker có thể gửi dữ liệu rauPostData đã được mã hóa với thông tin thay đổi, như biến TempTargetFolder, để chỉ định thư mục đích cho file tải lên. Điều này cho phép họ lưu trữ file độc hại vào bất kỳ thư mục nào mà máy chủ có quyền ghi, gây rủi ro lớn cho hệ thống. Để khắc phục, cần thay đổi khóa mặc định và áp dụng các bản vá bảo mật từ Telerik.
Cách phát hiện
Bước 1: Xác định website có sử dụng thư viện Telerik UI
Trước tiên, cần kiểm tra xem website có đang sử dụng thư viện Telerik UI hay không bằng cách tìm kiếm các đường dẫn kết thúc bằng /Telerik.Web.UI.WebResource.axd?type=rau. Nếu đường dẫn này thì có thể trang web của bạn đang sử dụng thư viện Telerik UI.
Bước 2: Kiểm tra nội dung cảnh báo
Sau khi xác định website có sử dụng Telerik UI, bạn cần tiếp tục kiểm tra xem trên các trang của website có hiển thị thông báo sau hay không: “RadAsyncUpload handler is registered successfully, however, it may not be accessed directly.” Thông báo này cho thấy handler RadAsyncUpload đã được đăng ký thành công, đồng thời ám chỉ rằng có thể tồn tại lỗ hổng bảo mật liên quan đến việc tải file.
Bước 3: Kiểm tra phiên bản Telerik UI
Bước tiếp theo là xác định phiên bản Telerik UI mà website đang sử dụng, bạn cần đối chiếu với danh sách các phiên bản đã được công bố là có chứa lỗ hổng. Danh sách này đã được công bố bởi nhà phát triển Telerik UI, bạn có thể được tìm thấy từ mã nguồn hoặc thông tin bảo mật. Nếu phiên bản đang sử dụng nằm trong danh sách này, website có thể đang bị ảnh hưởng bởi lỗ hổng bảo mật.
Network Error(401): Error transferring https://api.imgur.com/3/upload.xml?title=Ksnip Screenshot&description=Screenshot uploaded via Ksnip – server replied: Internal Server Error/
Khai thác lỗ hổng CVE-2017-11317 và CVE-2017-11357
Để khai thác hai lỗ hổng bảo mật CVE-2017-11317 và CVE-2017-11357, cần tuân thủ các bước cụ thể nhằm tận dụng lỗ hổng liên quan đến việc tải file không an toàn và truy cập trực tiếp vào các đối tượng không an toàn. Lỗ hổng CVE-2017-11317 liên quan đến khả năng tải file không giới hạn thông qua mã hóa yếu, trong khi lỗ hổng CVE-2017-11357 cho phép truy cập đối tượng trực tiếp không an toàn.
Bước 1: Kiểm tra request tải file
Bắt đầu bằng việc kiểm tra các yêu cầu tải file lên từ máy khách (file upload request) để xem liệu có xuất hiện tham số rauPostData hay không. Tham số này là dữ liệu quan trọng chứa các thông tin liên quan đến quá trình tải file lên trên server.
Bước 2: Giải mã tham số rauPostData
Sau khi xác định được tham số rauPostData, bước tiếp theo là giải mã giá trị của tham số này. Việc giải mã sẽ cung cấp các thông tin quan trọng, bao gồm trường TempTargetFolder, chỉ ra đường dẫn tới thư mục tạm thời trên server, nơi các file tải lên sẽ được lưu trữ.
Bước 3: Khai thác lỗ hổng
Để khai thác lỗ hổng, ta cần thực hiện một yêu cầu POST tới server với tham số rauPostData đã được chỉnh sửa. Trong đó:
- TempTargetFolder: Được đặt về thư mục gốc của server bằng cách xóa phần đường dẫn \App_Data\RadUploadTemp.
- UploadID: Đặt thành sbox.aspx.
- Nội dung file tải lên sẽ là một webshell ASP.NET.
Sau khi yêu cầu POST được gửi thành công, ta truy cập vào đường dẫn của webshell trên server để xác nhận rằng webshell đã được tải lên và thực thi, cho phép kẻ tấn công có quyền điều khiển server từ xa.
Khắc phục
Để khắc phục và đảm bảo an toàn cho ứng dụng khỏi lỗ hổng CVE-2017-11317 và CVE-2017-11357 cần cập nhật bản vá cho các phiên bản Telerik UI từ Q1 2011 (2011.1.315) đến R2 2017 SP1 (2017.2.621) để khắc phục lỗ hổng này. Để đảm bảo an toàn tối đa, nên nâng cấp lên phiên bản R2 2017 SP2 (2017.2.711) hoặc các phiên bản mới hơn. Phiên bản này đã tích hợp các bản vá bảo mật quan trọng, giúp loại bỏ hoàn toàn các rủi ro liên quan đến hai lỗ hổng trên.
Lỗ hổng CVE-2019-18935
CVE-2019-18935 là lỗ hổng cho phép hacker thực thi mã độc từ xa (RCE – Remote Code Execution) trên máy chủ do quá trình giải tuần tự hóa (deserialization) không an toàn của dữ liệu rauPostData. Khi dữ liệu được giải mã bằng phương thức .NET JavaScriptSerializer.Deserialize(), hacker có thể thay thế đối tượng hợp lệ Telerik.Web.UI.AsyncUploadConfiguration bằng một đối tượng độc hại (gadget). Điều này cho phép kẻ tấn công lợi dụng gửi yêu cầu POST, tải lên một file DLL qua lỗ hổng tải file không giới hạn và thực thi mã thông qua System.Configuration.Install.AssemblyInstaller.
Nhóm Dịch vụ bảo mật được quản lý (MSS) tại Bishop Fox đã phát hiện và khai thác thành công các trường hợp mà hệ thống sử dụng Telerik UI và tiếp xúc với internet bị ảnh hưởng bởi lỗ hổng này. Sau đó, Telerik đã phản hồi bằng cách phát hành khuyến cáo bảo mật liên quan đến lỗ hổng CVE-2019-18935 nhằm chia sẻ thông tin về mức độ nghiêm trọng của lỗ hổng, đồng thời khuyến khích người dùng bị ảnh hưởng nhanh chóng vá lỗi và cấu hình phần mềm an toàn.
Cách phát hiện
Bước 1: Kiểm tra xem website có sử dụng Telerik UI bằng cách tìm các đường dẫn chứa /Telerik.Web.UI.WebResource.axd? và tham số rauPostData.
Bước 2: Kiểm tra xem có thông báo “RadAsyncUpload handler is registered successfully, however, it may not be accessed directly.” trên trang web không.
Bước 3: Xác định phiên bản Telerik UI đang dùng và so sánh với các phiên bản trước R3 2019 SP1 để xem có nằm trong danh sách chứa lỗ hổng hay không.
Khai thác CVE-2019-18935
Bước 1: Biên dịch mã nguồn để kiểm tra lỗ hổng
Đầu tiên, bạn cần tạo một mã nguồn đơn giản với mục đích khiến ứng dụng web sleep trong vòng 10 giây. Mã này sẽ được biên dịch thành một file mixed mode assembly dưới dạng file DLL. File này sẽ giúp bạn kiểm tra xem server có bị ảnh hưởng bởi lỗ hổng deserialization không an toàn hay không.
Bước 2: Upload file DLL lên web server
Tiến hành upload file DLL đã biên dịch lên server, tương tự như cách khai thác lỗ hổng CVE-2017-11317. Việc upload được thực hiện thông qua chức năng tải file (file upload) của ứng dụng web, trong đó rauPostData sẽ chứa thông tin về file DLL này.
Bước 3: Gửi request kiểm tra lỗ hổng
Tiếp theo, gửi một request thứ hai có tham số rauPostData đã được mã hóa, trong đó:
- type được đặt thành System.Configuration.Install.AssemblyInstaller.
- Path trỏ tới đường dẫn của file DLL đã upload lên server ở bước trước.
Nếu server mất hơn 10 giây để phản hồi, điều đó cho thấy ứng dụng web đã thực hiện lệnh sleep(10) trong file DLL, xác nhận rằng lỗ hổng deserialization tồn tại và có thể bị khai thác.
Bước 4: Khai thác Remote Code Execution (RCE)
Sau khi xác nhận lỗ hổng, bạn có thể thay thế mã sleep bằng một file DLL khác chứa mã để tạo reverse shell. Khi file này được tải lên và thực thi, nó sẽ cho phép bạn chiếm quyền điều khiển máy chủ thông qua việc thực thi mã từ xa (RCE), hoàn tất cuộc tấn công.
Khắc phục
Để khắc phục lỗ hổng CVE-2019-18935 và đảm bảo an toàn cho ứng dụng, bạn cần thực hiện nâng cấp thư viện Telerik UI lên phiên bản R3 2019 SP1 hoặc các phiên bản mới hơn. Các phiên bản này đã được vá để khắc phục lỗ hổng bảo mật nghiêm trọng liên quan đến việc deserialization không an toàn, giúp ngăn chặn các cuộc tấn công thực thi mã từ xa (Remote Code Execution – RCE).
Lời kết
Nhìn lại, các lỗ hổng bảo mật nghiêm trọng trên Telerik Web UI bao gồm CVE-2017-9248, CVE-2017-11317, CVE-2017-11357 và CVE-2019-18935, đều tiềm ẩn nguy cơ bảo mật nghiêm trọng, có thể dẫn đến tấn công Remote Code Execution (RCE). Để bảo vệ hệ thống, quản trị viên cần nhanh chóng cập nhật các bản vá, cấu hình khóa mã hóa đúng cách, và loại bỏ các handler không cần thiết, đảm bảo an toàn cho hệ thống trước những mối đe dọa tiềm tàng. Mong rằng sau những chia sẻ của mình thì bạn đã hiểu hơn và có kinh nghiệm khắc phục cũng như là bảo vệ hệ thống của mình. Nếu có bất cứ vấn đề gì cần hỗ trợ, hãy để lại bình luận phía bên dưới để mình cũng như là đội ngũ kỹ thuật của Vietnix có thể giúp bạn. Chúc bạn thành công!