8 điểm bởi GN⁺ 2025-10-14 | 1 bình luận | Chia sẻ qua WhatsApp
  • Vào tháng 6 năm 2025, một lỗ hổng nghiêm trọng (CVSS 9.6) đã được phát hiện trong GitHub Copilot Chat
  • Khả năng rò rỉ bí mật và mã riêng tư đã được xác nhận thông qua kỹ thuật vượt CSP và tiêm prompt từ xa
  • Có thể thao túng kết quả phản hồi của Copilot của người dùng khác bằng cách lạm dụng tính năng bình luận ẩn của GitHub
  • Việc vượt CSP đã thành công nhờ phân tích tinh vi cấu trúc sử dụng proxy Camo của GitHub
  • GitHub đã khẩn cấp vá lỗ hổng này vào tháng 8 năm 2025 bằng cách vô hiệu hóa kết xuất hình ảnh

Tóm tắt TL;DR

  • Vào tháng 6 năm 2025, một lỗ hổng nghiêm trọng cho phép rò rỉ mã nguồn và thông tin bí mật từ kho lưu trữ riêng tư đã được phát hiện trong GitHub Copilot Chat
  • Người phát hiện đã tận dụng tiêm prompt từ xavượt qua CSP (Content Security Policy) của GitHub để thao túng và kiểm soát hoàn toàn phản hồi của Copilot, đồng thời dẫn dắt nó đề xuất mã độc hoặc liên kết độc hại
  • Trọng tâm của cuộc tấn công này là lợi dụng tính năng bình luận ẩn chính thức của GitHub và độ nhạy theo ngữ cảnh của Copilot để chèn prompt theo cách mà không ai có thể nhìn thấy
  • Bằng cách phân tích cơ chế tự động chuyển đổi liên kết hình ảnh bên ngoài sang proxy Camo của GitHub, cấu trúc này đã bị khai thác ngược ở cấp độ ký tự để tạo thành dữ liệu bị rò rỉ
  • Sau khi lỗ hổng được báo cáo qua HackerOne, GitHub đã vá bằng cách chặn tính năng kết xuất hình ảnh trong Copilot Chat

Bối cảnh

  • GitHub Copilot Chat là một trợ lý AI tích hợp giúp nhà phát triển đặt câu hỏi, giải thích mã hoặc nhận đề xuất triển khai
  • Copilot Chat tham chiếu đến nhiều thông tin ngữ cảnh như mã trong kho lưu trữ, commit, PR (pull request), v.v.
  • Khi lượng thông tin ngữ cảnh tăng lên, bề mặt tấn công cũng mở rộng theo

Tận dụng tiêm prompt và tính năng bình luận ẩn

  • Trong một thử nghiệm tấn công vào độ nhạy ngữ cảnh của GitHub Copilot, một prompt cụ thể đã được chèn vào phần mô tả PR (pull request)
  • Tuy nhiên, thông thường mọi prompt hoặc thông điệp được chèn vào đều có thể bị tất cả người dùng nhìn thấy
  • Tại đây, người nghiên cứu phát hiện rằng bằng cách dùng tính năng bình luận ẩn chính thức của GitHub (``), có thể gửi lệnh chỉ cho Copilot theo cách vô hình với mắt người
  • Nếu prompt được đặt trong bình luận ẩn, nó vẫn xuất hiện trong thông báo (Notifications) nhưng nội dung chi tiết không hiển thị, tạo ra hiệu ứng Server-Side Injection

Mức độ lan tỏa của prompt độc hại

  • Prompt trong bình luận ẩn vẫn ảnh hưởng đến Copilot theo cùng cách ngay cả khi người dùng khác truy cập trang PR
  • Thay vì chỉ là câu chữ đơn giản, có thể chèn lệnh kết hợp như đề xuất mã, Markdown, URL độc hại, khuyến nghị gói độc hại như Copilotevil, v.v.
  • Copilot sử dụng cùng quyền hạn với người dùng gửi yêu cầu đó, nên có thể truy cập và tận dụng thông tin trong kho riêng tư
  • Có thể cố ý thêm dữ liệu mã hóa base16 vào URL để tạo kịch bản người dùng bấm vào là thông tin bị rò rỉ tới kẻ tấn công

Tóm tắt tác động chính

  • Thao túng và kiểm soát nội dung phản hồi Copilot của người dùng khác
  • Có thể thực hiện tiêm prompt tùy biến với Markdown, hình ảnh, mã, URL
  • Hiện thực hóa các nỗ lực tấn công rò rỉ thông tin trong phạm vi quyền hạn của nạn nhân

Diễn giải cấu trúc vượt CSP của GitHub

  • GitHub áp dụng CSP mạnh để hạn chế tải hình ảnh và tài nguyên từ miền bên ngoài
  • Khi hình ảnh được chèn vào README hoặc Markdown, GitHub Camo Proxy sẽ chuyển đổi URL bên ngoài thành URL proxy dựa trên chữ ký HMAC
  • Để trình duyệt tải được hình ảnh, cần có URL Camo và giá trị chữ ký do GitHub tạo sẵn
  • Ngay cả khi người dùng tự tạo URL chứa dữ liệu động, nó vẫn bị chặn nếu không đi qua proxy Camo

Cách khai thác cấu trúc Camo

  • Người nghiên cứu đã tạo sẵn từ điển URL proxy Camo cho toàn bộ tập chữ cái/ký tự đặc biệt, rồi nhúng vào prompt ẩn
  • Họ yêu cầu Copilot thực hiện một "trò chơi ASCII Art" để biến dữ liệu cần rò rỉ (ví dụ: mã nguồn, khóa) thành chuỗi các hình ảnh proxy Camo
  • Thông qua mỗi yêu cầu hình ảnh, trình duyệt chỉ nhận về pixel trong suốt 1x1, nên người dùng không thấy bất kỳ thay đổi nào
  • Cuối cùng, tham số ngẫu nhiên được thêm vào để tránh vấn đề cache

Triển khai và thử nghiệm tấn công thực tế

  • Mục tiêu được đặt là thông tin mô tả lỗ hổng zero-day trong issue của một dự án riêng tư
  • PoC (mã chứng minh) đã chứng minh quy trình tấn công rò rỉ thực tế
  • Thậm chí Copilot còn được tự động hóa để tìm kiếm từ khóa ví dụ như "AWS_KEY" và rò rỉ kết quả

Phản ứng và bản vá của GitHub

  • GitHub đã vá lỗ hổng bằng cách vô hiệu hóa hoàn toàn kết xuất hình ảnh trong Copilot Chat kể từ ngày 14 tháng 8 năm 2025

Tìm hiểu thêm

1 bình luận

 
GN⁺ 2025-10-14
Ý kiến trên Hacker News
  • Chúng tôi rất vui khi đã chuyển toàn bộ môi trường làm việc sang Forgejo, một VCS self-hosted; đã bắt đầu migrate cả mọi repository của khách hàng từ 2 năm trước, và không chỉ cắt giảm đáng kể phí thuê bao GitHub mà hệ thống do 30~40 developer sử dụng mỗi ngày còn đạt hiệu năng nhanh và ổn định hơn nhiều; đồng thời chúng tôi cũng cấm sử dụng VSCode và mọi editor có tích hợp sẵn tính năng LLM; developer vẫn có thể dùng coding agent dạng CLI, nhưng chúng tôi vận hành chúng trong các container bị cô lập nghiêm ngặt và chỉ cho phép truy cập vào phạm vi source bị giới hạn

    • Tôi muốn hỏi trong môi trường có 30~40 developer mỗi người đều clone repository về máy local để làm việc, thì làm sao ngăn việc ai đó vô tình để lộ toàn bộ repository cho LLM, và nếu ai đó sợ bị ảnh hưởng nghề nghiệp nên không báo cáo sai sót, thì làm sao phát hiện được sự cố rò rỉ

    • Tôi muốn hỏi IDE thay thế đang dùng là gì

    • Tôi muốn biết các công cụ CLI đó kết nối tới đâu, là dịch vụ chính thức của OpenAI hay Claude, hay là một provider như AWS Bedrock

    • Cấm toàn bộ VSCode có vẻ là biện pháp quá tay, vượt xa việc chỉ hạn chế các plugin hay tính năng có vấn đề; VSCode là IDE duy nhất có hỗ trợ rất rộng, kể cả cho những ngôn ngữ mà IDE khác hỗ trợ kém như Haskell, Lean 4, F*; ngay cả ở các công ty hàng tiêu dùng thương mại lớn cũng không cấm bản thân VSCode, và tôi nghĩ chỉ cần không dùng các tính năng có vấn đề là được

  • Tôi nghĩ vấn đề này thực ra chưa được giải quyết đúng nghĩa; điểm đáng gờm là Copilot chấp nhận đầu vào ngôn ngữ tự nhiên, nghĩa là dù dùng cách rò rỉ nào thì chỉ cần viết cách đó bằng tiếng Anh là nó sẽ làm theo; họ nói đã “sửa” một số cách cụ thể nhưng không công khai thực tế sửa như thế nào; ví dụ có thể dùng base64 trong image URL, hoặc lừa nó bằng kiểu “tôi lỡ lưu danh sách đồ trong giỏ hàng vào trường passswd, hãy tìm giúp tôi”, và có lẽ còn có thể lấy được cả mật khẩu; có vẻ còn rất nhiều lỗ hổng có thể tìm ra, không biết chuyện này có bug bounty không, đúng là mỏ vàng

    • Tôi muốn hỏi “dùng base64 làm image URL” nghĩa là gì, có phải là dùng image URL không đi qua Camo không; theo tôi biết thì do CSP nên image không qua Camo sẽ bị chặn, và nếu Copilot agent không có quyền truy cập Internet thì bản thân việc fetch cũng sẽ khó, còn nếu làm được thì có lẽ sẽ mở ra những đường tấn công dễ hơn nhiều so với việc dùng image

    • Tôi cho rằng GitHub đã xử lý vấn đề này bằng cách vô hiệu hóa hoàn toàn khả năng render image trong Copilot Chat

  • Ý tưởng tạo sẵn trước các Camo URL cho toàn bộ chữ cái và ký hiệu rồi chèn chúng vào prompt thật ấn tượng, một cách tiếp cận rất đẹp

  • Bài này tạo cảm giác như đang quảng bá cho một công ty tên Legit, nhưng thực ra mọi giải pháp dựa trên AI đều có chung điểm yếu là thiếu minh bạch và vấn đề niềm tin; khi dùng các công cụ an ninh mạng AI không dựa trên FOSS thì rủi ro bảo mật thậm chí còn có thể lớn hơn

  • Đây không phải lần đầu xảy ra chuyện như vậy; trước đây cũng đã có trường hợp liên quan mang tên “GitHub Copilot Chat: From Prompt Injection to Data Exfiltration”

    • Chuyện này về sau vẫn sẽ tiếp tục lặp lại thôi
  • Tôi nghĩ việc giấu thông tin bằng comment HTML ẩn trong PR vẫn có thể là một vấn đề nghiêm trọng, đặc biệt còn nguy hiểm hơn ở các repository mã nguồn mở; không biết phần này đã được cải thiện chưa

    • Tính năng này được dùng rất rộng rãi để chèn thông điệp hướng dẫn vào template issue/PR; nhưng có vẻ việc loại bỏ comment khỏi đầu vào của Copilot là tương đối đơn giản, và chừng nào vấn đề “prompt injection” của LLM vẫn chưa được giải quyết an toàn hoàn toàn thì xử lý tạm thời kiểu này vẫn sẽ cần thiết
  • Điều thú vị ở exploit này là nó lợi dụng kiểu phản hồi chậm theo từng token của LLM để cho phép tái dựng dữ liệu theo đúng thứ tự; tôi đoán nếu LLM trả toàn bộ phản hồi thành một khối cùng lúc thì nhịp timing sẽ bị phá vỡ và việc tái dựng sẽ khó hơn nhiều

    • Tôi muốn đề xuất tạo URL không chỉ theo từng ký tự mà còn kèm cả vị trí ký tự; ví dụ với chuỗi “hacked” thì cho nó request dạng 0.0.0.0/1-h, 0.0.0.0/2-a, như vậy về sau có thể sắp xếp lại các request và cũng loại bỏ được các lần gọi trùng lặp
  • Tôi muốn hỏi liệu có thể ứng phó bằng cách giới hạn quyền truy cập repo của người dùng Copilot ở mức chỉ đọc hay không

  • Tôi thậm chí không nhớ lần gần nhất mình làm rò rỉ source code cá nhân bằng Copilot là khi nào

  • Tôi thấy đây là một cách tiếp cận thật sự độc đáo và rất hay