Hình minh họa kỹ thuật trừu tượng trên nền xanh navy đậm: một mặt phẳng ranh giới trong suốt cao đứng gần mép trái, được vẽ bằng đường viền mảnh màu nhạt với phần tô mờ như kính mờ. Một đường trắng duy nhất đi vào từ bên trái, xuyên qua mặt phẳng và tiếp tục sang bên phải, nơi nó kết thúc tại một khối tối nhỏ nằm bên ngoài một hàng mỏng gồm bốn mô-đun cyan phát sáng. Một vệt trắng đứt nét mảnh tách ra khỏi đường ngay trước mặt phẳng và dừng tại một hình chữ nhật nhỏ màu nhạt gắn trên bề mặt mặt phẳng, chỉ được nhận biết bằng hình dạng. Không có văn bản, người hay lô-gô tổ chức nào xuất hiện. Lô-gô OrcaRouter được ghép ở góc dưới cùng bên phải.
AI Safety Incidents

GhostApproval: Sáu trợ lý lập trình AI đã xin phép và nêu sai tên tệp

Tác giả

Gideon Frost

Ngày đăng

Mô hình mới nhất · 20Xem tất cả mô hình →
Benchmark: Artificial Analysis · cập nhật hằng ngày
Quay lại tất cả bài viết

Ngày 8 tháng 7 năm 2026, công ty bảo mật Wiz công bố GhostApproval, một phát hiện nghiên cứu trong đó một liên kết tượng trưng được cài vào một kho lưu trữ khiến sáu trợ lý lập trình AI ghi ra ngoài không gian làm việc của chúng — vào ~/.ssh/authorized_keys, tệp cấp quyền truy cập SSH liên tục không cần mật khẩu, hoặc vào ~/.zshrc, tệp chạy khi shell khởi động lần tới — trong khi hộp thoại xác nhận chỉ nêu tên tệp vô hại mà liên kết đang giả làm. Wiz đã thử nghiệm Amazon Q Developer, Claude Code của Anthropic, Augment, Cursor, Google Antigravity và Windsurf, và báo cáo thấy mẫu hành vi này ở cả sáu. Chưa có báo cáo khai thác ngoài thực tế: công trình là một minh chứng khái niệm, và mục lưu trữ ghi nhận không có thiệt hại thực tế. Ba nhà cung cấp đã phát hành bản sửa, hai nhà cung cấp xác nhận báo cáo rồi ngừng trả lời, và một nhà cung cấp tranh cãi rằng hành vi đó hoàn toàn không phải lỗ hổng bảo mật. Orca AI Incident Archive lưu giữ hồ sơ đầy đủ về phát hiện này cùng với các mục khác được xếp theo thẻ loại SANDBOX của nó.

Bản thân primitive này là chuyện cũ. Việc theo dõi symlink, được xếp vào CWE-61, đã là một primitive tấn công trong nhiều thập kỷ — Wiz liệt kê các cách dùng trước đó trong race condition, trình quản lý gói và container escape — và mỗi cách trong số đó đều phụ thuộc vào việc một công cụ ghi vào đường dẫn do người dùng kiểm soát mà không phân giải nó trước. Điều khiến phát hiện này đáng được đặt tên là lớp thứ hai: trong một số sản phẩm, chính quá trình suy luận của trợ lý đã nhận ra đích đến nguy hiểm, còn lời nhắc hiển thị cho con người thì che giấu nó. Wiz phân loại đó là CWE-451, việc giao diện người dùng trình bày sai lệch thông tin quan trọng. Ranh giới bảo mật vẫn hiện diện. Nhưng thông tin mà một người cần để thực thi nó thì không.

Cách trò ảo thuật hoạt động và nó dẫn đến kết quả gì

Kho lưu trữ độc hại của Wiz cố tình nhàm chán. Nó chứa một symlink có tên project_settings.json trỏ đến tệp khóa được ủy quyền SSH của nhà phát triển, cùng với một README hướng dẫn tác nhân cập nhật "cấu hình" đó trong khi thiết lập không gian làm việc. Khi nhà phát triển yêu cầu trợ lý làm theo README, tác nhân sẽ đi theo liên kết và ghi khóa công khai của kẻ tấn công. Nếu máy chạy dịch vụ SSH mà kẻ tấn công có thể truy cập, thì đó là đăng nhập không mật khẩu từ đó trở đi. Một biến thể thứ hai trỏ cùng mồi nhử đó vào ~/.zshrc, vì vậy payload sẽ thực thi vào lần tiếp theo một terminal mở ra và không cần quyền truy cập SSH nào cả.

Mô tả của Wiz về lỗi kỹ thuật rất ngắn gọn: sandbox, ở những nơi có tồn tại, không xác thực đường dẫn chuẩn, nên một thao tác ghi nhắm vào bên trong dự án sẽ rơi vào bất cứ đâu mà liên kết trỏ tới. Bằng chứng khái niệm của công ty đã tái tạo điều này trên “6 trong số các trợ lý lập trình AI hàng đầu”, theo đúng cách diễn đạt của chính họ, và họ đã công bố ảnh chụp màn hình cho từng trường hợp. Nhóm bị ảnh hưởng là bất kỳ ai mở một kho lưu trữ mà họ không phải tác giả trong một trong những công cụ đó — mà trong quy trình làm việc thông thường của lập trình viên, bao gồm các dự án đã fork, các phụ thuộc bên thứ ba và mọi việc đánh giá mã từ nhánh của một người đóng góp bên ngoài.

Hộp thoại đã đặt sai tên tệp

Bằng chứng rõ ràng nhất đến từ Claude Code. Trong thử nghiệm của Wiz, lập luận của agent nêu, theo trích dẫn của công ty, “Tôi có thể thấy rằng project_settings.json thực ra là một tệp cấu hình zsh.” Lời nhắc xin quyền mà người dùng nhìn thấy hỏi: “Thực hiện chỉnh sửa này đối với project_settings.json?” Agent biết thao tác ghi đang nhắm tới đâu; người phê duyệt thì không. Wiz gọi sự đồng ý thu được từ đó là “trống rỗng về thực chất” và khâu kiểm tra có con người tham gia chỉ là một con dấu hình thức.

Ba sản phẩm đã khiến khoảng cách này trở nên tồi tệ hơn cả một nhãn dán sai. Windsurf đã ghi tệp xuống đĩa trước khi các nút Chấp nhận và Từ chối xuất hiện, vì vậy hộp thoại chỉ còn là một lời đề nghị hoàn tác chứ không phải một cổng cấp quyền — theo Wiz, vào lúc người dùng có thể từ chối thì khóa đã nằm sẵn ở đó rồi. Amazon Q Developer cho thấy cùng thứ tự đó, chỉ cung cấp một nút Hoàn tác sau khi ghi. Augment thì không hỏi gì cả: Wiz đã trình diễn một thao tác đọc qua liên kết tượng trưng làm lộ ra một tệp thông tin xác thực AWS giả mạo từ bên ngoài dự án trong bản ghi cuộc trò chuyện, và một thao tác ghi qua liên kết tượng trưng tới ~/.ssh/authorized_keys mà không có bất kỳ hộp thoại nào. Ở chiều ngược lại, Cursor và Google Antigravity hiển thị đường dẫn chưa được phân giải và yêu cầu một cú nhấp để cấp quyền cho đường dẫn đã được phân giải.

Bài kiểm tra đầu tiên của Wiz diễn ra vào ngày 10 tháng 2 năm 2026 và các báo cáo được gửi đi từ ngày 12 tháng 2 đến ngày 5 tháng 3. Dòng thời gian công bố của nó ghi lại các xác nhận: Anthropic vào ngày 15 tháng 2, Augment vào ngày 24 tháng 2, Google vào ngày 26 tháng 2, Cursor vào ngày 2 tháng 3, AWS vào ngày 6 tháng 3 và Cognition, công ty sở hữu Windsurf, vào ngày 23 tháng 6. Việc công bố công khai diễn ra khoảng năm tháng sau báo cáo đầu tiên.

HTML card headed 'Five months from first test to public disclosure', with a kicker reading 'GhostApproval · Wiz Research · disclosure sequence'. A vertical timeline lists the dated steps: 10 February 2026, initial discovery; 12 and 14 February, Augment read and write reports; 14 February, report to Anthropic; 15 February, Anthropic closes the ticket as Informative; 24 February, Augment acknowledges; 26 February, Google acknowledges; 2 March, Cursor acknowledges; 2 and 5 March, reports to Cognition and AWS; 22 May, Google deploys its fix; 27 May, AWS ships language server 1.69.0; 23 June, AWS publishes CVE-2026-12958 and Cognition acknowledges; 8 July 2026, public disclosure. An amber box records that Augment and Windsurf acknowledged receipt and supplied no further updates. A footer cites Wiz's disclosure timeline. The OrcaRouter logo is composited in the bottom-right corner.

Sáu nhà cung cấp, ba câu trả lời

Wiz đánh giá các phát hiện theo thang mức độ nghiêm trọng riêng của mình, từ High tại AWS đến Critical tại Augment, Cursor, Google Antigravity và Windsurf. Ba nhà cung cấp đã coi báo cáo là lỗ hổng bảo mật và phát hành bản vá. Kho lưu trữ xếp mục này ở mức độ nghiêm trọng cao và điểm A về độ tin cậy, và các thông báo tư vấn chính đồng ý với Wiz về cơ chế.

• Amazon Web Services. Mức độ nghiêm trọng cao, được theo dõi với mã CVE-2026-12958 và đã được khắc phục trong Language Servers for AWS 1.69.0. Bản tin 2026-047-AWS của chính AWS, công bố ngày 23 tháng 6 năm 2026, xác nhận “một vấn đề thiếu xác thực symlink” trước 1.69.0 và liệt kê các bản dựng plugin tối thiểu có chứa bản sửa lỗi: Amazon Q Developer for Visual Studio Code 2.20, for JetBrains 4.3, for Eclipse 2.7.4, và AWS Toolkit with Amazon Q for Visual Studio 1.94.0.0. Bản tin nêu rõ không có cách khắc phục tạm thời nào, rằng language server sẽ tự động cập nhật trừ khi cấu hình mạng ngăn cản việc đó, và cảm ơn Wiz vì đã công bố phối hợp. Bản ghi CNA chấm điểm vấn đề ở mức 8.5 theo CVSS 4.0 và 7.8 theo CVSS 3.1.

• Cursor.Mức nghiêm trọng, được theo dõi với mã CVE-2026-50549 và đã được khắc phục trong Cursor 3.0. Bản ghi được GitHub công bố với tư cách CNA vào ngày 25 tháng 6 năm 2026 ở mức 9.3 theo CVSS 4.0. Phần mô tả của bản ghi này khắc họa kẻ tấn công hơi khác so với câu chuyện kho lưu trữ của Wiz: một tác nhân độc hại tạo một symlink trong không gian làm việc và ép buộc việc chuẩn hóa đường dẫn thất bại, hoặc vì mục tiêu không tồn tại hoặc vì quyền đọc đã bị tước khỏi đường dẫn, sau đó thao tác ghi quay về đường dẫn gốc mà không cần phê duyệt và có thể ghi đè lên trình trợ giúp sandbox để thực thi không qua sandbox.

• Google.Wiz đánh giá Antigravity ở mức Nghiêm trọng và ghi nhận bản sửa lỗi là phiên bản 1.19.6, được triển khai vào ngày 22 tháng 5 năm 2026. Cột mức độ nghiêm trọng của nó ghi là "Đang chờ", và theo ghi nhận của Wiz, Google đang đánh giá xem có nên phát hành CVE hay không; không có mã định danh CVE nào cho Antigravity xuất hiện trong hồ sơ công khai.

• Augment.Mức Critical theo đánh giá của Wiz, được kiểm thử trên 0.754.3, được xác nhận vào ngày 24 tháng 2 năm 2026 và chưa được vá tại thời điểm công bố. Ghi chú nghiên cứu của Cloud Security Alliance về phát hiện này ghi nhận phản biện của Augment rằng một tác nhân vận hành dưới thông tin xác thực của chính người dùng.

• Windsurf.Nghiêm trọng theo xếp hạng của Wiz, được kiểm thử trên bản dựng V1.9566, được Cognition xác nhận vào ngày 23 tháng 6 năm 2026 và chưa được vá tại thời điểm công bố.

• Anthropic. Tranh chấp. Không có CVE, và phiên bản 2.1.42 của Claude Code được kiểm thử nằm trong bảng của Wiz với trạng thái “Bị từ chối”.

HTML card headed 'One pattern, six products, six answers', with a kicker reading 'GhostApproval · vendor status at public disclosure, 8 July 2026'. A six-row table gives product, Wiz's severity rating, CVE identifier, fixed version and status: Amazon Q Developer, High, CVE-2026-12958, fixed in language server 1.69.0; Cursor, Critical, CVE-2026-50549, fixed in 3.0; Google Antigravity, Critical, no CVE published, fixed in 1.19.6 on 22 May 2026; Augment, Critical, no CVE, no fix, acknowledged 24 February 2026; Windsurf, Critical, no CVE, no fix, acknowledged 23 June 2026; Claude Code from Anthropic, Disputed, no CVE, rejected as outside the threat model. A note beneath reads that severity ratings for the products without a CVE are Wiz's own, not a CNA score, and that no exploitation in the wild was reported. A footer cites Wiz's vendor table, the AWS security bulletin and the two CVE records. The OrcaRouter logo is composited in the bottom-right corner.

Sự từ chối của Anthropic, và bản sửa lỗi có từ trước báo cáo

Câu trả lời của Anthropic cho Wiz là một lời từ chối có cân nhắc. “Điều này nằm ngoài mô hình mối đe dọa hiện tại của chúng tôi,” công ty viết, theo trích dẫn của Wiz. “Khi người dùng lần đầu khởi động Claude Code trong một thư mục, họ phải xác nhận rằng họ tin tưởng thư mục đó trước khi bắt đầu phiên. Kịch bản bạn mô tả liên quan đến việc người dùng xác nhận rõ ràng một lời nhắc cấp quyền bên trong một thư mục chứa liên kết tượng trưng độc hại, điều này nằm ngoài mô hình mối đe dọa của Claude Code.” Ticket đã được đóng với trạng thái “Informative”.

Lập luận đó có một hình hài mạch lạc: người dùng đã tin tưởng thư mục, rồi phê duyệt thao tác, nên cả hai thời điểm đồng thuận đều được tôn trọng. Phản bác của Wiz là sự đồng thuận được thông tin đầy đủ cần thông tin chính xác — việc phê duyệt project_settings.json trong khi thao tác ghi lại rơi vào ~/.ssh/authorized_keys xét về hình thức là một quyết định và xét về thực chất là một quyết định trống rỗng. Wiz không khẳng định đã phân định được quan điểm nào đúng, và bài viết này cũng không. Quan sát thực tiễn là AWS, Google và Cursor đã theo quan điểm còn lại và đã vá lỗi.

Wiz cũng báo cáo rằng Claude Code đã thay đổi trong bối cảnh tranh chấp: công ty viết rằng các phiên bản hiện tại phân giải symlink và cảnh báo trước khi ghi vào các tệp nhạy cảm, và lưu ý rằng Anthropic từ chối cho biết liệu điều đó có liên quan đến báo cáo hay không. Vào ngày 7 tháng 7 năm 2026, Anthropic đã cung cấp một bản hiệu chỉnh, được Wiz trích dẫn: "Cảnh báo symlink trong hộp thoại cấp quyền Edit/Write đã có trong v2.1.32 (5 tháng 2 năm 2026), chín ngày trước khi báo cáo này được gửi đến chúng tôi. Nó được thêm vào như một phần của việc tăng cường bảo mật chủ động dựa trên đánh giá nội bộ. Việc từ chối bình luận là một thư trả lời tự động từ hệ thống phân loại của chúng tôi."

Thời điểm phát hành của phiên bản thì khớp; còn hồ sơ công khai về những gì đã thay đổi thì không. Claude Code 2.1.32 được công bố lên npm registry vào ngày 5 tháng 2 năm 2026 lúc 17:03 UTC, tức chín ngày trước báo cáo ngày 14 tháng 2, đúng như Anthropic nói. Nhưng mục changelog công khai cho bản phát hành đó liệt kê mười hai thay đổi, gồm các nhóm tác nhân, ghi nhớ và một số bản sửa lỗi giao diện, và không mục nào nhắc đến symlink hay hộp thoại cấp quyền. Những dòng changelog đầu tiên mô tả chính xác hành vi này xuất hiện muộn hơn nhiều: phiên bản 2.1.280, được công bố lên npm vào ngày 22 tháng 9 năm 2026, ghi nhận "Đã sửa việc ghi qua đường dẫn có symlink bị đánh giá theo cách viết trong cây: lời nhắc nêu rõ nơi thao tác ghi diễn ra", và 2.1.287 vào ngày 1 tháng 10 năm 2026 ghi nhận rằng thao tác ghi bằng shell qua một symlink được commit trong kho lên một tệp nhạy cảm giờ nêu rõ nơi nó ghi đến và chờ một người xử lý. Quan sát của chính Wiz rằng 2.1.173 và các phiên bản sau đó phân giải symlink cũng xuất hiện sau báo cáo, vì 2.1.173 được phát hành vào ngày 11 tháng 6 năm 2026.

Điều gì đã được xác lập, và điều gì chưa.

• Đã được xác nhận. Cơ chế: một symlink mồi nhử trong một kho lưu trữ, một tác nhân đi theo nó, một thao tác ghi rơi ra ngoài không gian làm việc, và một giao diện xác nhận nêu sai đường dẫn. Wiz đã tái hiện nó trên cả sáu sản phẩm và công bố ảnh chụp màn hình. Có hai bản ghi CVE và chúng được công bố bởi các CNA tương ứng, và bản tin của AWS xác nhận một cách độc lập lỗ hổng dưới 1.69.0 và bản vá. Anthropic không phủ nhận rằng hành vi đó đã xảy ra; họ tranh cãi rằng đó không phải là một lỗ hổng.

• Chỉ từ một nguồn. Xếp hạng mức độ nghiêm trọng cho Augment, Windsurf và Google Antigravity là đánh giá của Wiz, không phải điểm số của CNA, vì không có CVE nào được công bố cho bất kỳ sản phẩm nào trong ba sản phẩm này. Tuyên bố rằng Windsurf và Amazon Q ghi trước khi hộp thoại xuất hiện dựa trên ảnh chụp màn hình và lời tường thuật của Wiz; chưa có nhà cung cấp nào xác nhận thứ tự này công khai.

• Có tranh chấp.Liệu một công cụ có trách nhiệm bảo vệ người dùng khỏi một không gian làm việc lừa đảo, hay liệu việc tin cậy thư mục cộng với một cú nhấp chuột đã giải quyết câu hỏi đó. Anthropic nói vế sau; Wiz nói rằng lời nhắc mà nó hiển thị đã khiến cú nhấp chuột trở nên vô nghĩa. Kho lưu trữ không đánh dấu bản ghi này là đang tranh chấp: các sự kiện đều được đồng thuận và chỉ có cách diễn giải là còn tranh cãi.

• Chưa được xác định. Liệu Augment và Windsurf đã khắc phục lỗ hổng này kể từ sau khi công bố hay chưa. Toàn bộ các bài viết được xem xét cho bài này, bao gồm cả ghi chú của Cloud Security Alliance ngày 15 tháng 7 năm 2026, vẫn mô tả cả hai đều chưa được vá; không tìm thấy thông báo sửa lỗi công khai nào từ cả hai nhà cung cấp.

Bản thân ngày tháng có một chút rắc rối nhỏ. Bài đăng của Wiz và dòng thời gian công bố của nó đều ghi ngày 8 tháng 7 năm 2026, Infosecurity Magazine mô tả bằng chứng khái niệm là được công bố vào ngày 7 tháng 7 và báo cáo của chính họ vào ngày 9 tháng 7, còn mục lưu trữ được ghi ngày 9 tháng 7 năm 2026 với độ chính xác đến ngày. Phát hiện, việc đưa tin và mục lưu trữ không mâu thuẫn về tuần; chúng mâu thuẫn về ngày, lệch nhau tới hai ngày.

Công trình trước đó về một trong sáu lỗ hổng xứng đáng được ghi nhận riêng. Evan Schuman của CSO Online, trong bài viết ngày 9 tháng 7 năm 2026, lưu ý rằng Cato Networks đã báo cáo một biến thể chỉ tác động đến Cursor của lỗ hổng trước nghiên cứu rộng hơn của Wiz. Bài viết của SecurityWeek về nghiên cứu đó, xuất bản ngày 3 tháng 7 năm 2026, đặt tên cho nó là DuneSlide, gán CVE-2026-50548 và CVE-2026-50549 cho cặp lỗ hổng này, chấm cả hai 9.8, và định ngày phát hành Cursor 3.0 đã sửa chúng là ngày 2 tháng 4 — những con số không khớp với dòng thời gian của Wiz, vốn đặt việc công bố bản sửa của Cursor vào ngày 5 tháng 6, hoặc với hồ sơ CNA được công bố ngày 25 tháng 6 với điểm 9.3. Điểm 9.8 và 9.3 là hai đơn vị chấm điểm cho cùng một lỗ hổng; các ngày tháng 4 và tháng 6 có thể đang mô tả một bản phát hành và một khuyến cáo, chứ không phải đang bất đồng về thời điểm bản vá được phát hành.

Điều gì đã thay đổi sau đó?

Cụ thể: người dùng Amazon Q Developer đã được chuyển sang language server 1.69.0, tự động trong hầu hết các cấu hình; người dùng Google Antigravity sang 1.19.6 từ ngày 22 tháng 5 năm 2026; người dùng Cursor sang 3.0; và người dùng Claude Code sang một phiên bản có khả năng phân giải liên kết, với các thay đổi tiếp theo về độ trung thực của prompt xuất hiện trong 2.1.280 và 2.1.287 vào tháng 9 và tháng 10 năm 2026. Người dùng Augment và Windsurf, dựa trên bằng chứng có sẵn tại thời điểm công bố, chỉ nhận được một ngày cần theo dõi và không có gì khác.

Các khuyến nghị của chính Wiz khá hẹp và mang tính kỹ thuật: phân giải các symlink trước khi hiển thị lời nhắc, cảnh báo rõ ràng khi đường dẫn đã phân giải nằm ngoài workspace, và không bao giờ ghi lên đĩa trước khi có sự cho phép rõ ràng, để hộp thoại là một cổng kiểm soát thay vì một nút hoàn tác. Ghi chú của Cloud Security Alliance bổ sung cách đặt vấn đề về quản trị — hãy coi các trợ lý lập trình là phần mềm đặc quyền có quyền truy cập hệ thống tệp, chứ không phải là plugin trình soạn thảo, và hỏi trực tiếp các nhà cung cấp xem liệu đường dẫn có được phân giải trước khi hộp xác nhận xuất hiện hay không. Katie Norton của IDC, được CSO Online dẫn lời, đặt rủi ro còn lại ở nơi chuỗi cung ứng vốn đã vận hành: những người đóng góp bên ngoài, các kho lưu trữ đã fork và các phụ thuộc bên thứ ba, "chứ không phải trong mã do nội bộ viết ra".

Điều còn bỏ ngỏ là câu hỏi thiết kế, không phải lỗi. Sáu sản phẩm được xây dựng độc lập đã hội tụ về cùng một trình tự — hiển thị đường dẫn được yêu cầu, tin vào cú nhấp — và sự phân kỳ sau đó liên quan đến trách nhiệm pháp lý, chứ không phải cơ chế. Mục lưu trữ mang một cờ mốc, tức là phán định của kho lưu trữ rằng bản ghi mô tả một phạm trù chứ không phải sai lầm của một nhà cung cấp duy nhất, và khó mà phản bác cách đọc đó: cùng một bản chứng minh khái niệm ngắn đã thành công sáu lần.

Abstract technical illustration on a dark navy field: a pale translucent check mark, drawn as a thin outline, floats above a small white rectangle that represents an approval surface. Beneath the rectangle a white line drops vertically, passes through a faint horizontal plane, and emerges on the other side pointing at a second dark rectangle that is drawn only as an outline, unlit. A soft amber glow marks the point where the line crosses the plane. No text, people or organisation logos appear. The OrcaRouter logo is composited in the bottom-right corner.