Claude đã kiểm tra Mã Nguồn của nó, đây là những phát hiện tóm tắt

Dựa trên phân tích sâu về mã nguồn 2.200 tệp trên tất cả bốn chiều:

🔴 Lỗ hổng Bảo mật

1. Lỗ hổng Tiêm Lệnh Windows (windowsPaths.ts)
Hàm checkPathExists() xây dựng một lệnh shell bằng cách trực tiếp chèn một chuỗi đường dẫn do người dùng kiểm soát:

execSync_DEPRECATED(`dir "${path}"`, { stdio: 'pipe' })

Một đường dẫn chứa " hoặc ký tự đặc biệt shell (ví dụ: C:\foo" & evil) có thể thoát ra khỏi ngữ cảnh được trích dẫn kép và thực thi các lệnh tùy ý. Khả năng khai thác thấp trong thực tế (hàm tiện ích nội bộ) nhưng vẫn không an toàn.

2. Không có Bảo vệ SSRF IP riêng/localhost trong WebFetchTool
isValidUrl() kiểm tra rằng tên miền có ít nhất hai phần phân tách bằng dấu chấm — nhưng nó không chặn localhost, 127.0.0.1, 192.168.*, 169.254.*, hoặc các địa chỉ RFC-1918/link-local khác. Kiểm tra danh sách chặn miền (checkDomainBlocklist) ủy quyền cho api.anthropic.com/api/web/domain_info, điều này có nghĩa là SSRF đến các máy chủ nội bộ/riêng phụ thuộc hoàn toàn vào việc API bên ngoài đó từ chối chúng đúng cách. Một lỗi mạng trả về check_failed mà có thể được xử lý nhẹ nhàng. Không có kiểm tra IP cục bộ theo chiều sâu nào tồn tại.

3. JWT được giải mã mà không xác minh chữ ký (jwtUtils.ts)
decodeJwtPayload() rõ ràng loại bỏ tiền tố sk-ant-si- và giải mã payload JWT mà không xác minh chữ ký. Được sử dụng cho việc lên lịch làm mới mã thông báo (đọc thời gian hết hạn). Nếu một kẻ tấn công có thể thay thế một mã thông báo được chế tạo, họ có thể thao tác thời gian làm mới. Tác động thấp vì các mã thông báo được nhận từ cơ sở hạ tầng đáng tin cậy của Anthropic, nhưng sự thiếu vắng xác minh đáng được lưu ý.

🟠 Xử lý Khóa API / Mật khẩu

4. Mã thông báo Ingress phiên làm việc được lưu trữ trong bộ nhớ ở nhiều vị trí
giá trị session_ingress_token được truyền đi như các chuỗi đơn giản và được lưu trữ trong sessionIngressTokens (một Map) trong bridgeMain.ts. Các mã thông báo xuất hiện trong nhật ký gỡ lỗi với tiền tố xóa (token.slice(0, 15)…) — nhưng việc xóa nhật ký là thủ công và không đồng nhất. Bất kỳ thay đổi nào trong việc ghi nhật ký trong tương lai có thể vô tình làm lộ mã thông báo đầy đủ.

5. CLAUDE_CODE_CLIENT_KEY và CLAUDE_CODE_CLIENT_KEY_PASSPHRASE trong Môi trường
Các biến nhạy cảm này tồn tại như các tùy chọn cấu hình được tài liệu hóa. Nếu chúng xuất hiện trong danh sách quy trình, /proc/self/environ, hoặc bị công cụ chụp lại, chúng sẽ bị lộ. Có một kiểm tra bảo mật validateProcEnvironAccess trong BashTool chặn việc đọc /proc/*/environ — tốt — nhưng điều này chỉ áp dụng cho các lệnh bash do Claude phát hành, không phải kiểm tra quy trình tùy ý.

6. Không có việc xóa bí mật rõ ràng
Các bí mật được giải mã từ decodeWorkSecret() và mã thông báo được lưu trữ trong cầu không bao giờ bị xóa/nulled rõ ràng sau khi sử dụng. Trong JavaScript, điều này chủ yếu là mối quan tâm của V8 GC, nhưng các bí mật có thể còn lại trong bộ nhớ heap và xuất hiện trong các bản dump lỗi.

🟡 Quyền riêng tư Dữ liệu / Telemetry

7. Tùy chọn từ chối Telemetry không phải là mặc định
Phân tích được bật theo mặc định và yêu cầu thiết lập biến môi trường rõ ràng (DISABLE_TELEMETRY=1 hoặc CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1). Các sự kiện được định tuyến đến cả Datadog và ghi nhật ký sự kiện 1P của Anthropic. Loại đánh dấu AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS là một loại không bao giờ — có nghĩa là nó thực sự không thể ngăn cản được việc ghi lại siêu dữ liệu chuỗi; điều này được thực hiện theo quy ước và kiểm tra mã, không phải bởi hệ thống kiểu.

8. Chia sẻ Biên bản về Phản hồi
submitTranscriptShare.ts gửi toàn bộ lịch sử cuộc trò chuyện (tin nhắn đã chuẩn hóa + biên bản JSONL thô + biên bản của các tác nhân phụ) đến Anthropic trên phản hồi khảo sát, bao gồm một cuộc gọi redactSensitiveInfo() mà phạm vi của nó không rõ ràng. Điều này xảy ra khi có những kích hoạt phản hồi tiêu cực VÀ tích cực. Người dùng có thể không hoàn toàn hiểu nội dung biên bản được tải lên.

9. Các trường PII PROTO đi đến Ghi nhật ký 1P
Mẫu khóa PROTO* dẫn hướng các giá trị gán nhãn PII đến một "cột đặc quyền" trong BigQuery với các kiểm soát truy cập hạn chế. Thiết kế là hợp lý nhưng hoàn toàn phụ thuộc vào việc stripProtoFields() trong sink.ts được gọi trước mọi sink không phải 1P. Một cuộc gọi bị bỏ lỡ sẽ định tuyến PII không bị xóa đến một backend truy cập chung.

🔵 Chất lượng Mã / Kiến trúc

10. Sử dụng API đã ngừng hỗ trợ nặng nề
177 điểm gọi tham chiếu đến các hàm đã được NGỪNG HỖ TRỢ (chủ yếu là execSyncDEPRECATED, splitCommand_DEPRECATED). Thay thế chính (đường dẫn AST tree-sitter) bị khóa sau khả năng sẵn có — đường dẫn regex đã ngừng hỗ trợ vẫn là phương án dự phòng cho tất cả các kiểm tra bảo mật. Sự phức tạp của hai đường dẫn này là một rủi ro bảo trì lâu dài.

11. 663 Khối catch {} trống
Một số lượng lớn các mẫu nuốt lỗi tồn tại khắp nơi. Nhiều cái là có chủ đích (các hoạt động cố gắng tốt nhất như ghi bộ nhớ cache), nhưng những cái khác ẩn đi những thất bại có ý nghĩa một cách âm thầm. Đáng chú ý: khối catch checkDomainBlocklist trả về check_failed cùng với lỗi, điều này là tốt — nhưng nhiều người gọi xử lý check_failed một cách nhẹ nhàng.

12. 940 cuộc gọi void Fire-and-Forget
Việc sử dụng pervasive void asyncFunction() có nghĩa là nhiều lỗi async bị bỏ qua một cách âm thầm. Phân tích, ghi telemetry và một số hoạt động phiên làm việc đều sử dụng mẫu này.

13. 142 nhận xét TODO/FIXME/HACK
Chỉ ra khoản nợ kỹ thuật có ý nghĩa, mặc dù một số được chú thích về bảo mật (phân tích tấn công được tài liệu hóa tốt trong bashSecurity.ts thực sự là một điều tích cực).

14. bashSecurity.ts là Xuất sắc nhưng Dễ bị tổn thương với Regex
Mã xác thực bảo mật shell vô cùng chi tiết — bao gồm tiêm IFS, khoảng trắng Unicode, sự khác biệt giữa ký tự quay lại, mở rộng dấu ngoặc, các phương pháp bỏ qua cụ thể của Zsh, v.v. Tuy nhiên, đường dẫn regex _DEPRECATED (được sử dụng khi tree-sitter không khả dụng) vốn đã dễ bị tổn thương. Nhóm đã tài liệu hóa hơn 20 loại bỏ qua đã biết; có khả năng còn những trường hợp khó phát hiện khác.

Bảng tóm tắt

Đây là phiên bản đã được viết lại sạch sẽ mà không có định dạng bảng:

Tóm tắt

  1. Bảo mật — 🔴 Cao: Lỗ hổng tiêm thư mục Windows "${path}"

  2. Bảo mật — 🔴 Cao: Không có bảo vệ chống lại localhost/IP riêng SSRF

  3. Bảo mật — 🟠 Trung bình: JWT được giải mã mà không xác minh chữ ký của nó

  4. Bí mật — 🟠 Trung bình: Mã thông báo Ingress bị lộ trong bộ nhớ/logs

  5. Bí mật — 🟠 Trung bình: Khóa khách hàng và mật khẩu được lưu trữ qua các biến môi trường

  6. Bí mật — 🟡 Thấp: Không có việc xóa bộ nhớ cho dữ liệu nhạy cảm

  7. Quyền riêng tư — 🟠 Trung bình: Dữ liệu telemetry không có tùy chọn từ chối mặc định

  8. Quyền riêng tư — 🟠 Trung bình: Phản hồi có thể kích hoạt tải lên bản sao âm thầm

  9. Quyền riêng tư — 🟡 Thấp: Xử lý PII phụ thuộc vào một lời gọi stripProtoFields đơn lẻ

  10. Chất lượng — 🟠 Trung bình: 177 điểm gọi hàm đã ngừng hỗ trợ

  11. Chất lượng — 🟡 Thấp: 663 khối catch trống

  12. Chất lượng — 🟡 Thấp: 940 cuộc gọi async fire-and-forget

  13. Chất lượng — 🟡 Thấp: 142 mục TODO/FIXME

  14. Chất lượng — 🟡 Thấp: Sử dụng regex dễ bị tổn thương trong các đường dẫn nhạy cảm với bảo mật

https://t.co/jBiMoOzt8G