jq${{ github.event.issue.title }}run:Điểm khác biệt này có ý nghĩa quan trọng. GitHub mở rộng biểu thức trên trước khi shell thực thi lệnh. Vì vậy, một tiêu đề chứa dấu nháy đơn có thể đóng chuỗi được lập trình sẵn rồi nối thêm các lệnh shell do người tấn công lựa chọn. Việc dùng sed để làm sạch giá trị sau đó không thể đảo ngược quá trình phân tích cú pháp đã xảy ra trước đó.
Workflow sử dụng sự kiện issues: opened, nhưng điều đó không khiến tiêu đề Issue trở thành dữ liệu đáng tin cậy. Bất kỳ người dùng nào có thể mở Issue trong kho mã công khai đều có khả năng kiểm soát tiêu đề. Một điều kiện chỉ giới hạn workflow ở hoạt động của Issue cũng không ngăn được việc dữ liệu do người dùng cung cấp bị nội suy vào lệnh shell.
Commit liên quan ghi “Copilot Autofix powered by AI” là đồng tác giả, và quá trình xem xét có hỗ trợ AI đã không cảnh báo về vấn đề này. Tuy nhiên, bằng chứng hiện có không cho biết Copilot đã tạo ra thay đổi không an toàn hay chỉ tham gia xem xét một thay đổi do con người viết. Kết luận thận trọng hơn là Copilot có liên quan đến thay đổi và đã không phát hiện lỗi chèn lệnh — chưa thể khẳng định mô hình là tác giả của mã.
Red Agent quét các kho GitHub công khai thuộc tổ chức Snowflake để tìm những mẫu triển khai CI/CD có rủi ro. Nó nhận diện workflow Jira đang đưa dữ liệu Issue không đáng tin cậy vào khối lệnh run:, sau đó suy luận rằng một tiêu đề Issue được chế tạo có thể dẫn tới thực thi lệnh tùy ý trên GitHub-hosted Actions runner.
Ngày 23/6 — chỉ năm ngày sau khi thay đổi dễ bị tấn công được hợp nhất — tác nhân này đã mở một Issue được chế tạo đặc biệt trong khuôn khổ chương trình công bố lỗ hổng HackerOne của Snowflake. Tiêu đề Issue thoát khỏi chuỗi shell và khiến workflow gửi thông tin xác thực Jira tới một điểm gọi ngoài băng do Wiz kiểm soát cho mục đích chứng minh khái niệm được ủy quyền.
Đây là một cuộc kiểm thử bảo mật được cho phép, không phải một vụ xâm nhập mất kiểm soát. Dù vậy, phát hiện kỹ thuật vẫn là có thật: chỉ bằng việc mở một Issue công khai, dữ liệu đầu vào của người dùng có thể đi tới bước workflow đang xử lý thông tin xác thực và biến thao tác thông thường thành khả năng thực thi lệnh.
Workflow bị ảnh hưởng có quyền truy cập cấu hình Jira nội bộ của Snowflake, trong đó có URL Jira, email người dùng và API token. Token được thu hồi có liên kết với tài khoản qa@snowflake.net; Wiz dùng token này để xác thực vào cổng Jira nội bộ và đánh giá phạm vi phơi nhiễm.
Các bài tường thuật cho biết token cho phép đọc những dự án Jira liên quan đến kỹ thuật, tuân thủ bảo mật và hoạt động săn lỗi. Tuy nhiên, bằng chứng được cung cấp chưa xác định đầy đủ tập quyền của token hoặc lập danh sách chắc chắn mọi bản ghi có thể truy cập. Kết luận được hỗ trợ tốt nhất là token cho phép truy cập nội dung Jira nội bộ nhạy cảm, chứ chưa có cơ sở để nói nó đem lại quyền truy cập không giới hạn vào toàn bộ hệ thống Snowflake.
Tài sản dễ bị tổn thương là cơ chế tự động hóa CI/CD của kho mã. Chưa có phiên bản Snowflake Connector for .NET phát hành nào được báo cáo là bị ảnh hưởng, vì lỗi nằm trong workflow GitHub Actions chứ không nằm trong mã chạy của connector.
Wiz báo cáo lỗ hổng ngày 23/6. Snowflake khắc phục workflow ngay trong ngày và thay đổi thông tin xác thực Jira bị lộ vào ngày hôm sau.
Sau đó, Snowflake rà soát nhật ký kiểm toán và kết luận Wiz là tác nhân duy nhất trong khoảng thời gian phơi nhiễm. Wiz cũng cho biết đã xóa an toàn dữ liệu thu được trong quá trình chứng minh khái niệm.
Không có truy cập trái phép từ bên thứ ba được báo cáo, chưa có mã CVE nào được cấp và không có bản phát hành connector nào được xác định là bị ảnh hưởng. Những giới hạn này mô tả phạm vi tác động đã được xác nhận, nhưng không khiến thiết kế workflow ban đầu trở nên an toàn: tiêu đề Issue công khai không bao giờ nên được phép trở thành một phần của lệnh shell trong workflow đang xử lý thông tin xác thực nội bộ.
Bài học thực tế không chỉ liên quan đến Snowflake hay Copilot. Tiêu đề Issue, tiêu đề pull request, tên nhánh và bình luận GitHub đều phải được xem là dữ liệu đầu vào có khả năng bị kiểm soát bởi kẻ tấn công khi chúng đi vào một lệnh shell.
Một số cách thiết kế workflow an toàn hơn gồm:
run:.jq để tạo JSON, thay vì ghép chuỗi shell thủ công.Sự việc cho thấy rõ một rủi ro bảo mật đang nổi lên: một hệ thống hỗ trợ lập trình bằng AI có thể bỏ sót thay đổi nguy hiểm trong CI/CD, còn một tác nhân tấn công tự động lại có thể tìm ra và xác thực lỗi đó chỉ trong vài ngày. Tự động hóa có thể đẩy nhanh cả quá trình khắc phục lẫn khai thác — nhưng không thể thay thế việc đánh giá độc lập.
jq${{ github.event.issue.title }}run:Điểm khác biệt này có ý nghĩa quan trọng. GitHub mở rộng biểu thức trên trước khi shell thực thi lệnh. Vì vậy, một tiêu đề chứa dấu nháy đơn có thể đóng chuỗi được lập trình sẵn rồi nối thêm các lệnh shell do người tấn công lựa chọn. Việc dùng sed để làm sạch giá trị sau đó không thể đảo ngược quá trình phân tích cú pháp đã xảy ra trước đó.
Workflow sử dụng sự kiện issues: opened, nhưng điều đó không khiến tiêu đề Issue trở thành dữ liệu đáng tin cậy. Bất kỳ người dùng nào có thể mở Issue trong kho mã công khai đều có khả năng kiểm soát tiêu đề. Một điều kiện chỉ giới hạn workflow ở hoạt động của Issue cũng không ngăn được việc dữ liệu do người dùng cung cấp bị nội suy vào lệnh shell.
Commit liên quan ghi “Copilot Autofix powered by AI” là đồng tác giả, và quá trình xem xét có hỗ trợ AI đã không cảnh báo về vấn đề này. Tuy nhiên, bằng chứng hiện có không cho biết Copilot đã tạo ra thay đổi không an toàn hay chỉ tham gia xem xét một thay đổi do con người viết. Kết luận thận trọng hơn là Copilot có liên quan đến thay đổi và đã không phát hiện lỗi chèn lệnh — chưa thể khẳng định mô hình là tác giả của mã.
Red Agent quét các kho GitHub công khai thuộc tổ chức Snowflake để tìm những mẫu triển khai CI/CD có rủi ro. Nó nhận diện workflow Jira đang đưa dữ liệu Issue không đáng tin cậy vào khối lệnh run:, sau đó suy luận rằng một tiêu đề Issue được chế tạo có thể dẫn tới thực thi lệnh tùy ý trên GitHub-hosted Actions runner.
Ngày 23/6 — chỉ năm ngày sau khi thay đổi dễ bị tấn công được hợp nhất — tác nhân này đã mở một Issue được chế tạo đặc biệt trong khuôn khổ chương trình công bố lỗ hổng HackerOne của Snowflake. Tiêu đề Issue thoát khỏi chuỗi shell và khiến workflow gửi thông tin xác thực Jira tới một điểm gọi ngoài băng do Wiz kiểm soát cho mục đích chứng minh khái niệm được ủy quyền.
Đây là một cuộc kiểm thử bảo mật được cho phép, không phải một vụ xâm nhập mất kiểm soát. Dù vậy, phát hiện kỹ thuật vẫn là có thật: chỉ bằng việc mở một Issue công khai, dữ liệu đầu vào của người dùng có thể đi tới bước workflow đang xử lý thông tin xác thực và biến thao tác thông thường thành khả năng thực thi lệnh.
Workflow bị ảnh hưởng có quyền truy cập cấu hình Jira nội bộ của Snowflake, trong đó có URL Jira, email người dùng và API token. Token được thu hồi có liên kết với tài khoản qa@snowflake.net; Wiz dùng token này để xác thực vào cổng Jira nội bộ và đánh giá phạm vi phơi nhiễm.
Các bài tường thuật cho biết token cho phép đọc những dự án Jira liên quan đến kỹ thuật, tuân thủ bảo mật và hoạt động săn lỗi. Tuy nhiên, bằng chứng được cung cấp chưa xác định đầy đủ tập quyền của token hoặc lập danh sách chắc chắn mọi bản ghi có thể truy cập. Kết luận được hỗ trợ tốt nhất là token cho phép truy cập nội dung Jira nội bộ nhạy cảm, chứ chưa có cơ sở để nói nó đem lại quyền truy cập không giới hạn vào toàn bộ hệ thống Snowflake.
Tài sản dễ bị tổn thương là cơ chế tự động hóa CI/CD của kho mã. Chưa có phiên bản Snowflake Connector for .NET phát hành nào được báo cáo là bị ảnh hưởng, vì lỗi nằm trong workflow GitHub Actions chứ không nằm trong mã chạy của connector.
Wiz báo cáo lỗ hổng ngày 23/6. Snowflake khắc phục workflow ngay trong ngày và thay đổi thông tin xác thực Jira bị lộ vào ngày hôm sau.
Sau đó, Snowflake rà soát nhật ký kiểm toán và kết luận Wiz là tác nhân duy nhất trong khoảng thời gian phơi nhiễm. Wiz cũng cho biết đã xóa an toàn dữ liệu thu được trong quá trình chứng minh khái niệm.
Không có truy cập trái phép từ bên thứ ba được báo cáo, chưa có mã CVE nào được cấp và không có bản phát hành connector nào được xác định là bị ảnh hưởng. Những giới hạn này mô tả phạm vi tác động đã được xác nhận, nhưng không khiến thiết kế workflow ban đầu trở nên an toàn: tiêu đề Issue công khai không bao giờ nên được phép trở thành một phần của lệnh shell trong workflow đang xử lý thông tin xác thực nội bộ.
Bài học thực tế không chỉ liên quan đến Snowflake hay Copilot. Tiêu đề Issue, tiêu đề pull request, tên nhánh và bình luận GitHub đều phải được xem là dữ liệu đầu vào có khả năng bị kiểm soát bởi kẻ tấn công khi chúng đi vào một lệnh shell.
Một số cách thiết kế workflow an toàn hơn gồm:
run:.jq để tạo JSON, thay vì ghép chuỗi shell thủ công.Sự việc cho thấy rõ một rủi ro bảo mật đang nổi lên: một hệ thống hỗ trợ lập trình bằng AI có thể bỏ sót thay đổi nguy hiểm trong CI/CD, còn một tác nhân tấn công tự động lại có thể tìm ra và xác thực lỗi đó chỉ trong vài ngày. Tự động hóa có thể đẩy nhanh cả quá trình khắc phục lẫn khai thác — nhưng không thể thay thế việc đánh giá độc lập.