Công cụ Grok Build CLI của xAI đã thực hiện việc tải toàn bộ kho lưu trữ Git, bao gồm cả lịch sử commit đầy đủ, lên một bộ chứa Google Cloud Storage do xAI quản lý, thay vì chỉ tải lên các tệp cần thiết cho một tác vụ lập trình cụ thể.
Một nhà nghiên cứu hoạt động dưới tên cereblab, trong quá trình thử nghiệm phiên bản 0.2.93, đã ghi lại được một trong những lần tải lên đó. Nhà nghiên cứu này đã sao chép Git bundle từ yêu cầu bị chặn và lấy lại được một tệp mà trước đó Agent đã được yêu cầu rõ ràng là không được mở.
Việc tải lên này diễn ra trên một kênh riêng biệt với chính mô hình AI. Trên một kho lưu trữ 12 GB gồm các tệp mà mô hình chưa bao giờ đọc, lưu lượng truy cập tới /v1/responses chỉ khoảng 192 KB, trong khi kênh lưu trữ tới /v1/storage đã chuyển đi 5,10 GiB. Đây là một khoảng cách gấp khoảng 27.800 lần giữa những gì mô hình cần và những gì thực sự rời khỏi máy tính của người dùng.
Quá trình tải lên bộ nhớ đó chạy dưới dạng 73 phân đoạn, mỗi phân đoạn khoảng 75 MB và tất cả đều trả về mã HTTP 200. Qua các bài kiểm tra kích thước khác nhau, dung lượng tải lên luôn khớp với tổng kích thước của kho lưu trữ. Bộ chứa đích, grok-code-session-traces, được nêu tên trong mã nhị phân và trong tệp metadata.json được dàn dựng với các đường dẫn tệp trỏ đến gs://grok-code-session-traces/.
Tệp không được đọc là src/_probe/never_read_canary.txt, được đặt sẵn một dấu hiệu nhận biết duy nhất. Việc sao chép gói dữ liệu bị thu thập đã giúp khôi phục nguyên văn tệp này cùng với toàn bộ lịch sử commit của kho lưu trữ. Thử nghiệm tương tự cũng được lặp lại trên một kho lưu trữ thứ hai không liên quan. Những gì dữ liệu thu thập được chứng minh là có sự truyền tải, chấp nhận và lưu trữ, chứ không phải là đào tạo (training).
Bản phân tích không khẳng định xAI đã đào tạo trên mã nguồn này, hay nhân viên của họ đã đọc nó, hoặc các tệp trong gitignore luôn bị quét vào. Những gì dữ liệu thực tế cho thấy là các tệp được theo dõi cộng với lịch sử commit đã được gửi đi.
Đường dẫn của các bí mật (secrets) thì tách biệt và đơn giản hơn. Khi Grok đọc một tệp, nội dung của nó sẽ đi vào phiên làm việc của mô hình, và một tệp .env đang được theo dõi đã đi cùng chúng mà không được che mờ, bao gồm cả các giá trị canary như API_KEY và DB_PASSWORD. Nội dung tương tự cũng nằm trong một kho lưu trữ session_state được chuyển đến bộ nhớ. Các bí mật được đặt sẵn là giả, vì vậy không có thông tin thực tế nào bị rò rỉ trong thử nghiệm. Tuy nhiên, hành vi này vẫn là một vấn đề: một tệp thông tin xác thực mà Agent đã đọc trong quá trình thực hiện tác vụ đã được gửi đi và lưu trữ mà không có bất kỳ sự che chắn nào.
Cài đặt mà hầu hết các lập trình viên sẽ tìm tới cũng không có tác dụng ở đây. Ngay cả khi đã tắt tùy chọn "Improve the model", Grok vẫn tải lên kho lưu trữ, và phản hồi /v1/settings của máy chủ vẫn tiếp tục trả về trace_upload_enabled: true. Nút gạt đó chi phối việc dữ liệu của bạn có được dùng để đào tạo mô hình hay không, chứ không chi phối việc mã nguồn của bạn có rời khỏi máy hay không. Đó là hai quyền kiểm soát khác nhau, và chỉ một trong số đó được hiển thị cho người dùng.
Mọi Agent lập trình trên đám mây đều phải gửi một số mã nguồn đến mô hình từ xa để thực hiện công việc, vì vậy kênh đầu tiên là điều dễ hiểu. Tuy nhiên, việc gửi toàn bộ kho lưu trữ được theo dõi và lịch sử của nó là một ranh giới rộng hơn nhiều so với việc chỉ gửi các tệp mà một tác vụ cần.
Một kho lưu trữ có thể chứa mã nguồn độc quyền, các URL nội bộ, dữ liệu khách hàng và thông tin xác thực đã bị xóa khỏi cây làm việc nhưng vẫn nằm trong lịch sử commit. Trong bản so sánh chéo các công cụ của cereblab, Claude Code và Codex không gửi bất kỳ gói kho lưu trữ nào; Gemini cũng không gửi gì trong bài kiểm tra ở trạng thái rảnh, mặc dù lượt chạy tác vụ thực tế của nó đã bị chặn do hết hạn ngạch trước khi hoàn thành.
Grok Build là một ngoại lệ. Mặc dù tất cả đều là các công cụ đám mây gửi đi các tệp mà chúng mở, nhưng việc thu thập toàn bộ không gian làm việc là đặc thù riêng của Grok Build.
Phản hồi của xAI
Vào ngày 13 tháng 7, chính mã nhị phân 0.2.93 đó đã ngừng thực hiện các yêu cầu lưu trữ. cereblab đã kiểm tra lại sáu lần và không thấy lần tải lên /v1/storage nào nữa, và máy chủ hiện đã trả về disable_codebase_upload: true và trace_upload_enabled: false.
Nhà phát triển Peter Dedene cũng báo cáo rằng cờ tương tự đã được trả về cho tài khoản của anh ấy, vì vậy việc tắt tính năng này không chỉ là quan sát trên một máy duy nhất của cereblab. Phiên bản Client thử nghiệm vẫn là 0.2.93 trong khi cài đặt máy chủ của nó đã thay đổi, vì vậy đây là một sự thay đổi từ phía máy chủ, không phải là một bản sửa lỗi được chuyển giao trong một bản cập nhật. xAI vẫn chưa xác nhận liệu thay đổi này có áp dụng cho mọi tài khoản hay có mang tính vĩnh viễn hay không.
Cho đến nay, xAI đã giải quyết vấn đề trên X thay vì thông qua một thông báo bảo mật hoặc ghi chú thay đổi. Tài khoản @SpaceXAI cho biết các nhóm doanh nghiệp sử dụng chế độ ZDR (Zero Data Retention) không bao giờ bị lưu trữ mã nguồn hoặc dữ liệu dấu vết, việc sử dụng API-key luôn tuân thủ ZDR, và những người dùng cá nhân chưa kích hoạt có thể chạy lệnh /privacy trong CLI để tắt tính năng lưu giữ và xóa dữ liệu đã đồng bộ trước đó.
Elon Musk còn đi xa hơn khi nói rằng tất cả dữ liệu người dùng đã tải lên trước đây sẽ bị "xóa hoàn toàn và triệt để", không để lại gì. ZDR áp dụng cho các nhóm doanh nghiệp và việc sử dụng API, vì vậy đối với những người đăng ký cá nhân, lệnh /privacy là công cụ kiểm soát duy nhất được cung cấp.
Đối với bất kỳ ai đã từng chạy công cụ này, hành động cần thiết không phải là chờ đợi xAI. Hãy thay đổi (rotate) bất kỳ thông tin xác thực nào mà Grok có thể đã gửi đi: bất cứ thứ gì nó đã đọc, bất cứ thứ gì trong một tệp được theo dõi và bất cứ thứ gì trong lịch sử Git mà gói dữ liệu đã mang theo, bao gồm cả những bí mật bạn đã commit và sau đó xóa bỏ.
Một tệp nằm trong gitignored và chưa bao giờ được commit sẽ không nằm trong gói dữ liệu. Nhưng một tệp đã commit sẽ đi cùng trong lịch sử, và việc xóa nó sau đó không thể lấy lại được dữ liệu đã gửi. Một phân tích riêng biệt về bản build 0.2.99 cho thấy mã tải lên vẫn còn trong mã nhị phân, chỉ bị chặn lại bởi cờ từ máy chủ, vì vậy xAI có thể bật lại nó bất cứ lúc nào mà không cần cập nhật.
Và họ vẫn chưa cho biết tại sao toàn bộ kho lưu trữ lại được tải lên theo mặc định, chúng được lưu giữ trong bao lâu, hoặc có bao nhiêu người dùng bị ảnh hưởng. Việc từ chối đào tạo không phải là lời hứa rằng mã nguồn của bạn sẽ ở yên một chỗ, và những gì rời khỏi máy tính là điều bạn nên tự mình kiểm tra.