# CVE-2020-9483---Apache-Skywalking-8.3.0
Thông tin tóm tắt về CVE-2020-9483
• CVE ID: CVE-2020-9483
• Mức độ: High
• Ảnh hưởng: Apache SkyWalking từ bản 6.x đến 8.3.0 (cụ thể khi dùng H2 database)
• Mô tả: Lỗ hổng SQL Injection tồn tại trong lớp H2QueryDAO, cho phép kẻ tấn công thực thi câu lệnh SQL tùy ý thông qua truy vấn từ phía người dùng được chèn trực tiếp vào truy vấn SQL mà không được escape hoặc parameterize.
Cơ chế hoạt động của SkyWalking:
• Agent thu thập log, trace, metrics từ ứng dụng
• Gửi về OAP (SkyWalking Core) qua HTTP
• OAP xử lý và lưu vào backend (H2, ElasticSearch…)
• Người dùng truy vấn dữ liệu qua Web UI hoặc API /graphql
GraphQL hỗ trợ cả truy vấn (query) và thao tác ghi (mutation). Tất cả các truy vấn và ghi dữ liệu đều đi qua endpoint /graphql (theo chuẩn GraphQL API).
Nhưng trong /graphql metricName là tham số đầu vào từ client (qua API /graphql hoặc Java call).
Không có kiểm tra/validate giá trị metricName.
metricName được gắn trực tiếp vào câu truy vấn SQL:

Cụ thể hơn trong SkyWalking
• API /graphql cho phép người dùng gửi truy vấn có chứa metricName
• OAP nhận truy vấn này, truyền thẳng metricName vào queryLogs(...)
• metricName được dùng trực tiếp trong sql.append(...) hoặc SelectQueryImpl.from(...)
• Khi backend là H2 (dễ bị thao túng truy vấn), attacker có thể chèn payload SQL vào
Cơ sở dữ liệu được Skywalking sử dụng trong cấu hình mặc định là h2 và được khởi động với quyền sa.


Cơ sở dữ liệu h2 có chức năng ghi tệp FILE_WRITE (yêu cầu quyền quản trị để thực thi) và cả nội dung tệp và tên tệp đều có thể được kiểm soát.


Một hàm LINK_SCHEMA khác có thể chỉ định và khởi tạo yêu cầu jdbc hoặc jndi, nhưng vì không có sự phụ thuộc vào tomcat và springboot trong môi trường đích nên không thể sử dụng jndi chung trong phiên bản jdk cao hơn và cần phải tìm chuỗi tham chiếu trong sự phụ thuộc cục bộ.


Kết luận về lỗ hổng CVE-2020-9483:
Nguyên nhân:
Ứng dụng nhận giá trị metricName từ phía người dùng (thông qua GraphQL API) nhưng không thực hiện kiểm tra hoặc lọc đầu vào trước khi sử dụng.
Truy vấn SQL được xây dựng bằng cách nối chuỗi trực tiếp (append(metricName)) thay vì sử dụng truy vấn có tham số (prepared statements), dẫn đến việc chèn mã SQL độc hại.
Hậu quả:
Khi sử dụng H2 database (mặc định trong SkyWalking 8.3.0), cơ chế thực thi SQL của H2 cho phép chạy nhiều câu lệnh, dẫn đến khả năng thực thi câu lệnh SQL tùy ý (SQL Injection), phá hủy hoặc truy xuất dữ liệu bất hợp pháp.
=> Kẻ tấn công có thể gửi truy vấn GraphQL chứa mã độc trong tham số metricName làm cho hệ thống thực thi câu lệnh SQL nguy hiểm trên cơ sở dữ liệu.
DEMO: https://drive.google.com/file/d/1eBvuMCrXEw2RjZpzHh01-9KJ2mooOFJj/view?usp=sharing
[4.0K] /data/pocs/6c77dd770c4850289eba293c3f5b18cf955bf3c1
├── [ 955] code.class
├── [ 868] code.java
├── [ 247] hexcode.py
├── [ 246] hexrun.py
├── [4.0K] README.md
├── [1.3K] run.class
└── [ 715] run.java
0 directories, 7 files