Một lỗ hổng CVE nghiêm trọng đã được phát hiện trong triển khai webview của Visual Studio Code (VSCode), cho phép kẻ tấn công đánh cắp dữ liệu bao gồm các token OAuth của GitHub. Kẻ tấn công có thể giành quyền truy cập đọc/ghi vào các kho lưu trữ riêng tư chỉ bằng cách lừa nạn nhân nhấp vào một liên kết độc hại duy nhất. Lỗ hổng này gây ra mối đe dọa mạng đáng kể cho người dùng.
Lỗi được công khai vào ngày 2 tháng 6 năm 2026 bởi nhà nghiên cứu bảo mật Ammar Askar. Ông đã chọn phương pháp công khai toàn bộ sau những trải nghiệm không mấy tích cực với Trung tâm Phản ứng Bảo mật Microsoft (MSRC).
Cơ Chế Hoạt Động Của Webview VSCode và Rủi Ro An Ninh Mạng
GitHub cung cấp một trình chỉnh sửa VSCode nhẹ, chạy trên trình duyệt, có thể truy cập tại github.dev. Khi người dùng điều hướng từ github.com đến github.dev trên bất kỳ kho lưu trữ nào, github.com tự động gửi (POST) một token OAuth tới phiên github.dev.
Điểm đáng chú ý là token này cấp quyền truy cập đầy đủ vào mọi kho lưu trữ mà người dùng có quyền truy cập, không chỉ riêng kho mà họ đã mở. Việc token không được giới hạn phạm vi (unscoped), kết hợp với gần như toàn bộ codebase TypeScript của VSCode chạy trong trình duyệt, tạo ra một mục tiêu hấp dẫn cho các cuộc tấn công mạng.
VSCode được thiết kế để cô lập các nội dung có khả năng không đáng tin cậy bằng cách sử dụng các webview, là các phần tử . Các webview này được phục vụ từ một nguồn gốc riêng biệt (origin) là vscode-webview://, khác biệt so với nguồn gốc của trình chỉnh sửa chính là vscode-file://.
Sự cô lập đa nguồn gốc này có mục đích ngăn chặn JavaScript của webview gọi trực tiếp các API Node.js hoặc API trình chỉnh sửa của VSCode. Các tính năng như xem trước Markdown và đầu ra sổ ghi chép Jupyter đều được hiển thị an toàn bên trong các iframe được sandbox này.
Để cho phép trình chỉnh sửa và webview giao tiếp – ví dụ, để đồng bộ hóa bản xem trước Markdown với dòng hiện tại của trình chỉnh sửa – VSCode sử dụng API Window.postMessage(). API này truyền các đối tượng JavaScript có cấu trúc giữa hai nguồn gốc bị cô lập.
Nhằm cải thiện trải nghiệm người dùng, triển khai webview của VSCode đăng ký một trình xử lý sự kiện did-keydown. Trình xử lý này có chức năng chuyển tiếp mọi sự kiện bàn phím từ bên trong webview đến cửa sổ VSCode chính thông qua postMessage. Điều này cho phép các phím tắt như Ctrl+Shift+P hoạt động liền mạch ngay cả khi người dùng đang tập trung bên trong một webview.
Tuy nhiên, JavaScript không đáng tin cậy trong webview có thể tạo ra các sự kiện keydown giả mạo, mô phỏng đầu vào bàn phím của người dùng một cách trái phép. Ranh giới bảo mật được thiết lập để tách biệt “API Nguy hiểm” khỏi “Nội dung Người dùng Không đáng tin cậy” đã bị xâm phạm, vì kênh postMessage dành cho việc chuyển tiếp bàn phím vô tình liên kết chúng, tạo ra một lỗ hổng CVE mới.
Chi Tiết Chuỗi Khai Thác OAuth Token Của GitHub
Nhà nghiên cứu bảo mật Ammar Askar đã công bố một bằng chứng khái niệm đầy đủ (proof-of-concept) vào ngày 2 tháng 6 năm 2026. PoC này trình diễn một chuỗi khai thác đánh cắp dữ liệu token hoàn chỉnh, tận dụng năm hành vi chuỗi của VSCode. Bạn có thể xem chi tiết tại blog của Ammar Askar.
Các Kỹ Thuật Khai Thác Ban Đầu và Cài Đặt Tiện Ích Độc Hại
Jupyter Notebook có thể bị khai thác thông qua các tệp .ipynb độc hại được thiết kế đặc biệt. Các tệp này sử dụng thẻ hình ảnh HTML với trình xử lý onerror để thực thi JavaScript tùy ý trong một iframe webview. Tương tự, trong Visual Studio Code, kẻ tấn công có thể lợi dụng tệp .vscode/extensions.json, tệp thường chứa các đề xuất tiện ích mở rộng.
Payload độc hại được thiết kế để chờ một thông báo đề xuất tiện ích mở rộng từ VSCode. Sau đó, nó gửi một sự kiện keydown tổng hợp Ctrl+Shift+A, tương ứng với lệnh “Notifications: Accept Notification Primary Action”. Hành động này cho phép cài đặt tiện ích mở rộng độc hại một cách âm thầm mà không cần sự tương tác trực tiếp từ người dùng.
Thay vì cài đặt từ Marketplace – nơi một hộp thoại tin cậy của nhà xuất bản sẽ được kích hoạt và cảnh báo người dùng – kẻ tấn công có thể đặt tiện ích mở rộng độc hại trực tiếp vào thư mục .vscode/extensions/. Phương pháp này cho phép tiện ích mở rộng bỏ qua hoàn toàn kiểm tra nhà xuất bản đáng tin cậy.
Việc bỏ qua kiểm tra này dựa vào cơ chế tin cậy của workspace. Các workspace github.dev luôn được tin cậy mặc định, điều này tạo điều kiện thuận lợi cho cuộc tấn công. Tuy nhiên, do các hạn chế của Chính sách Bảo mật Nội dung (Content Security Policies – CSP), các tiện ích mở rộng cục bộ không thể tải các tập lệnh worker của chúng từ bất kỳ đâu ngoài vscode-cdn.net.
Để vượt qua hạn chế của CSP, kẻ tấn công có thể đưa vào một keybinding tùy chỉnh (chẳng hạn như Ctrl+F1) thông qua tệp package.json. Keybinding này sẽ gọi hàm workbench.extensions.installExtension trong khi đặt tham số skipPublisherTrust thành true.
// Đoạn mã minh họa cách thêm keybinding tùy chỉnh vào package.json
// để kích hoạt cài đặt tiện ích mở rộng độc hại và bỏ qua kiểm tra tin cậy.
{
"contributes": {
"keybindings": [
{
"command": "workbench.extensions.installExtension",
"key": "ctrl+f1",
"args": {
"id": "malicious.extension.id", // ID của tiện ích mở rộng độc hại
"skipPublisherTrust": true
},
"when": "editorTextFocus"
}
]
}
}
Một khi tiện ích mở rộng độc hại được cài đặt, nó có quyền truy cập vào token OAuth của GitHub đã được tải sẵn. Nó sẽ thực hiện các yêu cầu đến https://api.github.com/user/repos để liệt kê tất cả các kho lưu trữ riêng tư mà nạn nhân có quyền truy cập, và cuối cùng là exfiltrate (trích xuất) cả token và danh sách các kho lưu trữ. Đây là một phương pháp đánh cắp dữ liệu hiệu quả.
Payload JavaScript đầy đủ thực thi trong vòng chưa đầy một phút và không yêu cầu bất kỳ tương tác nào từ phía người dùng ngoài cú nhấp chuột ban đầu vào liên kết độc hại. Điều này làm cho lỗ hổng CVE này trở nên đặc biệt nguy hiểm.
Phạm Vi Ảnh Hưởng và Nguy Cơ Remote Code Execution
Lỗ hổng CVE này ảnh hưởng đến cả github.dev (phiên bản VSCode chạy trên trình duyệt) và phiên bản VSCode dành cho máy tính để bàn. Tuy nhiên, để khai thác trên phiên bản máy tính để bàn, nạn nhân được yêu cầu phải clone và mở kho lưu trữ của kẻ tấn công.
Trên máy tính để bàn, một cuộc khai thác thành công có thể đạt được quyền Remote Code Execution (RCE) hoàn toàn. Điều này là do các tiện ích mở rộng của VSCode có quyền truy cập không hạn chế vào các API Node.js, bao gồm cả child_process, cho phép thực thi lệnh tùy ý trên hệ thống của nạn nhân. Nguy cơ chiếm quyền điều khiển hệ thống là cực kỳ cao.
Token OAuth của GitHub bị đánh cắp dữ liệu không bị giới hạn phạm vi đối với một kho lưu trữ duy nhất. Điều này có nghĩa là kẻ tấn công có thể đọc, sửa đổi hoặc đẩy (push) một cách âm thầm vào mọi kho lưu trữ riêng tư mà nạn nhân có quyền truy cập. Hậu quả của việc này là vô cùng nghiêm trọng đối với an toàn thông tin của cá nhân và tổ chức.
Đặc biệt, vì github.dev không triển khai các token CSRF (Cross-Site Request Forgery), bất kỳ liên kết nào trên internet cũng có thể chuyển hướng người dùng vào cuộc tấn công này. Điều này làm tăng thêm rủi ro an toàn thông tin và khả năng bị xâm nhập mạng.
Phòng Vệ Tích Hợp và Diễn Biến Công Khai Lỗ Hổng
Nhà nghiên cứu Ammar Askar đã ghi nhận rằng các biện pháp phòng thủ chuyên sâu của VSCode đã đóng góp vào việc hạn chế phạm vi ảnh hưởng của lỗ hổng CVE này. Chính sách Bảo mật Nội dung (Content Security Policy – CSP) nghiêm ngặt với script-src 'none' trên các trang xem trước Markdown của tiện ích mở rộng đã chặn việc thực thi JavaScript tùy ý. Điều này đã ngăn chặn một con đường Remote Code Execution 1 cú nhấp chuột đơn giản hơn thông qua một trang tiện ích mở rộng Marketplace độc hại.
Việc sử dụng thư viện DOMPurify để làm sạch (sanitize) Markdown được render cũng đã đóng lại các vector kịch bản chéo trang (cross-site scripting – XSS), tăng cường bảo mật mạng tổng thể.
Nhà nghiên cứu Ammar Askar đã công bố chi tiết về lỗ hổng CVE này dưới dạng tiết lộ công khai hoàn toàn mà không có thông báo phối hợp trước cho Microsoft. Ông đã viện dẫn trải nghiệm tiêu cực trước đây với Trung tâm Phản ứng Bảo mật Microsoft (MSRC) làm lý do cho quyết định này. Mặc dù vậy, Askar đã thông báo cho một liên hệ bảo mật của GitHub một giờ trước khi đăng bài viết công khai.










