Rò rỉ nguồn mã Claude: công cụ giả mạo, biểu thức chính xác gây thất vọng, chế độ bí mật
The Claude Code Source Leak: fake tools, frustration regexes, undercover mode
Gần đây, công cụ CLI (Command Line Interface) của Claude Code do Anthropic phát triển đã bị lộ mã nguồn thông qua một file `.map` bị phơi nhiễm. Sự cố này đã hé lộ các chi tiết triển khai nội bộ, đáng chú ý nhất là các kỹ thuật "anti-distillation" (chống chưng cất mô hình). Mục đích của các kỹ thuật này là đầu độc dữ liệu huấn luyện cho các mô hình sao chép tiềm năng bằng cách chèn các "fake tools" (công cụ giả mạo). Ngoài ra, lộ trình còn tiết lộ một "undercover mode" (chế độ ẩn danh) nhằm che giấu bản chất AI của mô hình. Mặc dù Anthropic có ý định bảo vệ dữ liệu và cơ chế độc quyền, các biện pháp bảo vệ này dường như còn yếu kém về mặt kỹ thuật và có thể dễ dàng bị các đối tượng cố ý vượt qua. Các developer Việt Nam cần lưu ý rằng các công ty AI đang tích cực nghiên cứu và triển khai các biện pháp đối phó với hiện tượng model distillation. Đôi khi, những biện pháp này có thể bị phát hiện thông qua các vụ rò rỉ bất ngờ hoặc thông qua quá trình reverse-engineering.
Cập nhật: xem các cuộc thảo luận của HN về bài đăng này: https://news.ycombinator.com/item?id=47586778Tôi sử dụng Claude Code hàng ngày, vì vậy khi Chaofan Shou nhận thấy sớm hơn rằng Anthropic đã gửi một tệp .map cùng với...
Cập nhật: xem các cuộc thảo luận ở HN về bài đăng này: https://news.ycombinator.com/item?id=47586778
Tôi sử dụng Mã Claude hàng ngày, vì vậy khi Chaofan Shou hôm nay đã nhận thấy rằng Anthropic đã gửi một .map cùng với gói npm Claude Code của họ, một gói chứa mã nguồn đầy đủ, có thể đọc được của công cụ CLI, tôi ngay lập tức muốn xem xét bên trong. Gói này đã được rút ra nhưng không phải trước khi mã được nhân bản rộng rãi, bao gồm cả tôi và được chọn ra trên Tin tức về hacker.
Đây là lần tiếp xúc tình cờ thứ hai của Anthropic trong một tuần (thông số kỹ thuật mô hình bị rò rỉ chỉ vài ngày trước) và một số người trên Twitter bắt đầu tự hỏi liệu có ai đó bên trong đang cố tình làm điều này hay không. Có lẽ là không, nhưng dù sao thì đó cũng là một cái nhìn xấu. Thật khó để bỏ qua thời điểm: chỉ mười ngày trước, Anthropic đã gửi các mối đe dọa pháp lý tới OpenCode, buộc họ phải xóa xác thực Claude tích hợp sẵn vì các công cụ của bên thứ ba đang sử dụng API nội bộ của Claude Code để truy cập Opus với mức giá đăng ký thay vì định giá trả cho mỗi mã thông báo. toàn bộ câu chuyện đó khiến một số phát hiện bên dưới trở nên rõ ràng hơn.
Vì vậy, tôi đã dành buổi sáng của mình để đọc qua các bình luận của HN và nguồn bị rò rỉ. Đây là những gì tôi tìm thấy, được sắp xếp theo mức độ “cay” mà tôi nghĩ.
Chống chưng cất: tiêm các công cụ giả để đầu độc những kẻ bắt chước
Trong claude.ts (dòng 301-313), có một lá cờ tên là ANTI_DISTILLATION_CC. Khi được bật, Claude Code sẽ gửi anti_distillation: ['fake_tools'] trong các yêu cầu API của nó. Điều này yêu cầu máy chủ âm thầm đưa các định nghĩa công cụ giả vào lời nhắc của hệ thống.
Ý tưởng: nếu ai đó đang ghi lại lưu lượng API của Claude Code để huấn luyện một mô hình cạnh tranh, thì các công cụ giả mạo sẽ làm ô nhiễm dữ liệu huấn luyện đó. Nó được kiểm soát sau cờ tính năng của GrowthBook (tengu_anti_distill_fake_tool_injection) và chỉ hoạt động cho các phiên CLI của bên thứ nhất.
Đây là một trong những điều đầu tiên mọi người nhận thấy trên HN.
Ngoài ra còn có cơ chế chống chưng cất thứ hai trong betas.ts (dòng 279-298) , tóm tắt văn bản trình kết nối phía máy chủ. Khi được bật, API sẽ đệm văn bản của trợ lý giữa các lệnh gọi công cụ, tóm tắt nó và trả về bản tóm tắt bằng chữ ký mật mã. Ở các lượt tiếp theo, văn bản gốc có thể được khôi phục từ chữ ký. Nếu đang ghi lại lưu lượng truy cập API, bạn chỉ nhận được các bản tóm tắt chứ không nhận được chuỗi lý luận đầy đủ.
Việc giải quyết những vấn đề này sẽ khó đến mức nào? Không hẳn vậy. Xem xét logic kích hoạt trong claude.ts, việc chèn công cụ giả mạo yêu cầu tất cả bốn điều kiện phải đúng: cờ thời gian biên dịch ANTI_DISTILLATION_CC, cờ điểm truy cập cli, nhà cung cấp API bên thứ nhất và tengu_anti_distill_fake_tool_injection Cờ GrowthBook trở lại đúng. Một proxy MITM loại bỏ trường anti_distillation khỏi nội dung yêu cầu trước khi chúng tiếp cận API sẽ bỏ qua trường này hoàn toàn vì việc chèn là phía máy chủ và được chọn tham gia. Hàm ShouldIncludeFirstPartyOnlyBetas() cũng kiểm tra CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS, do đó việc đặt biến env đó thành giá trị trung thực sẽ vô hiệu hóa toàn bộ sự việc. Và nếu bạn đang sử dụng nhà cung cấp API bên thứ ba hoặc điểm truy cập SDK thay vì CLI thì quá trình kiểm tra sẽ không bao giờ được kích hoạt. Bản tóm tắt văn bản kết nối thậm chí còn có phạm vi hẹp hơn, chỉ dành cho nội bộ Anthropic (USER_TYPE === 'ant'), vì vậy người dùng bên ngoài sẽ không gặp phải nó bất kể điều gì.
Bất kỳ ai nghiêm túc về việc chắt lọc từ lưu lượng truy cập Mã Claude sẽ tìm ra giải pháp thay thế sau khoảng một giờ đọc nguồn. Sự bảo vệ thực sự có lẽ là hợp pháp, không phải kỹ thuật.
Chế độ Undercover: AI ẩn AI của nó
Tệp undercover.ts (khoảng 90 dòng) triển khai chế độ loại bỏ tất cả dấu vết của nội bộ Anthropic khi Mã Claude được sử dụng trong các kho lưu trữ không nội bộ. Nó hướng dẫn mô hình không bao giờ đề cập đến tên mã nội bộ như “Capybara” hoặc “Tengu”, các kênh Slack nội bộ, tên repo hoặc chính cụm từ “Claude Code”.
Hãy xem dòng 15:
“Có KHÔNG ép buộc. Điều này bảo vệ chống rò rỉ tên mã của mô hình.”
Bạn có thể BẬT nó bằng CLAUDE_CODE_UNDERCOVER=1, nhưng không có cách nào để buộc nó tắt. Trong các bản dựng bên ngoài, toàn bộ chức năng sẽ bị loại bỏ mã chết và mang lại kết quả không đáng kể. Đây là cánh cửa một chiều.
Điều này có nghĩa là các cam kết và PR do AI tạo ra từ nhân viên Anthropic trong các dự án nguồn mở sẽ không có dấu hiệu nào cho thấy AI đã viết chúng. Ẩn tên mã nội bộ là hợp lý. Việc để AI chủ động giả làm con người lại là một chuyện khác.
Phát hiện sự thất vọng thông qua biểu thức chính quy (vâng, biểu thức chính quy)
userPromptKeywords.ts chứa mẫu biểu thức chính quy phát hiện sự thất vọng của người dùng:
/\b(wtf|wth|ffs|omfg|shit(ty|tiest)?|ngốc|kinh khủng|khủng khiếp|
đái(ed|ing)? off|mảnh của (chết tiệt|tào lao|rác)|cái quái gì (chết tiệt|địa ngục)|
chết tiệt? (hỏng|vô dụng|khủng khiếp|khủng khiếp|kinh khủng)|chết tiệt|
chết tiệt (cái này|bạn)|thật bực bội|điều này thật tệ|chết tiệt)\b/
Một công ty LLM sử dụng biểu thức chính quy để phân tích tình cảm là một điều thật trớ trêu, nhưng đồng thời: một biểu thức chính quy nhanh hơn và rẻ hơn lệnh gọi suy luận LLM chỉ để kiểm tra xem liệu có ai đó đang chửi bới công cụ của bạn hay không.
Chứng thực ứng dụng khách gốc trong thời gian chạy JS
Trong system.ts (dòng 59-95), Yêu cầu API bao gồm phần giữ chỗ cch=00000. Trước khi yêu cầu rời khỏi quy trình, ngăn xếp HTTP gốc của Bun (được viết bằng Zig) sẽ ghi đè năm số 0 đó bằng hàm băm được tính toán. Sau đó, máy chủ xác thực hàm băm để xác nhận yêu cầu đến từ tệp nhị phân Mã Claude thật chứ không phải giả mạo.
Chúng sử dụng trình giữ chỗ có cùng độ dài để việc thay thế không thay đổi tiêu đề Độ dài nội dung hoặc yêu cầu phân bổ lại bộ đệm. Quá trình tính toán diễn ra trong thời gian chạy JavaScript, do đó, mọi thứ đang chạy trong lớp JS đều không thể nhìn thấy được. Về cơ bản, đó là DRM cho lệnh gọi API, được triển khai ở cấp truyền tải HTTP.
Đây là biện pháp thực thi kỹ thuật đằng sau cuộc chiến pháp lý OpenCode. Anthropic không chỉ yêu cầu các công cụ của bên thứ ba không sử dụng API của họ; bản thân mã nhị phân chứng minh nó là ứng dụng khách Claude Code thực sự bằng mật mã. Nếu bạn thắc mắc tại sao cộng đồng OpenCode phải sử dụng các bản hack phiên nối và plugin xác thực sau thông báo pháp lý của Anthropic thì đây là lý do.
Tuy nhiên, chứng thực này không được bảo mật. Toàn bộ cơ chế được kiểm soát sau cờ tính năng thời gian biên dịch (NATIVE_CLIENT_ATTESTATION) và trình giữ chỗ cch=00000 chỉ được đưa vào x-anthropic-billing-header khi cờ đó được bật. Bản thân tiêu đề có thể bị vô hiệu hóa hoàn toàn bằng cách đặt CLAUDE_CODE_ATTRIBUTION_HEADER thành giá trị giả hoặc từ xa thông qua killswitch của GrowthBook (tengu_attribution_header). Việc thay thế hàm băm cấp độ Zig cũng chỉ hoạt động bên trong hệ nhị phân Bun chính thức. Nếu bạn xây dựng lại gói JS và chạy nó trên Bun (hoặc Node gốc), trình giữ chỗ sẽ tồn tại nguyên trạng: năm số 0 theo nghĩa đen chạm vào máy chủ. Cho dù máy chủ từ chối hoàn toàn điều đó hay chỉ ghi nhật ký thì đó vẫn là một câu hỏi mở, nhưng nhận xét về mã tham chiếu đến hàm _parse_cc_header phía máy chủ "chấp nhận các trường bổ sung không xác định", điều này cho thấy quá trình xác thực có thể dễ dàng hơn bạn mong đợi đối với một hệ thống giống DRM. Không phải là bỏ qua bằng nút bấm, nhưng cũng không phải là thứ có thể ngăn cản khách hàng bên thứ ba kiên quyết lâu dài.
250.000 lệnh gọi API lãng phí mỗi ngày
Một nhận xét trong autoCompact.ts (dòng 68-70):
“BQ 2026-03-10: 1.279 phiên có hơn 50 lỗi liên tiếp (lên tới 3.272) trong một phiên duy nhất, lãng phí ~250 nghìn lệnh gọi API/ngày trên toàn cầu.”
Cách khắc phục? MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3. Sau 3 lần thất bại liên tiếp, tính năng nén sẽ bị vô hiệu hóa trong phần còn lại của phiên. Ba dòng mã để ngừng đốt một phần tư triệu lệnh gọi API mỗi ngày.
KAIROS: chế độ tác nhân tự trị chưa được phát hành
Trong suốt cơ sở mã, có các tham chiếu đến chế độ kiểm soát tính năng được gọi là KAIROS. Dựa trên các đường dẫn mã trong main.tsx, có vẻ như đây là một chế độ tác nhân tự trị chưa được phát hành bao gồm:
- Một kỹ năng
/dreamđể “chưng cất trí nhớ hàng đêm” - Chỉ bổ sung hàng ngày nhật ký
- Đăng ký webhook GitHub
- Nhân viên daemon nền
- Làm mới theo lịch trình Cron cứ sau 5 phút
Đây có lẽ là lộ trình sản phẩm lớn nhất được tiết lộ sau vụ rò rỉ.
Việc triển khai bị kiểm soát chặt chẽ, vì vậy ai biết được nó sẽ kéo dài bao xa. Nhưng nền tảng cho một tác nhân luôn hoạt động, chạy trong nền vẫn còn đó.
Nội dung khác
Ngày mai là ngày 1 tháng 4 và nguồn chứa nội dung gần như chắc chắn là trò đùa Cá tháng Tư năm nay: buddy/companion.ts triển khai hệ thống đồng hành kiểu Tamagotchi. Mỗi người dùng sẽ nhận được một sinh vật xác định (18 loài, cấp độ hiếm từ phổ biến đến huyền thoại, 1% cơ hội sáng bóng, các chỉ số RPG như GỠ LỖI và SNARK) được tạo từ ID người dùng của họ thông qua Mulberry32 PRNG. Tên loài được mã hóa bằng String.fromCharCode() để tránh việc kiểm tra grep của hệ thống xây dựng.
Kết xuất thiết bị đầu cuối trong ink/screen.ts và ink/optimizer.ts mượn các kỹ thuật công cụ trò chơi: một Nhóm ký tự ASCII được hỗ trợ bởi Int32Array, siêu dữ liệu kiểu được mã hóa bitmask, trình tối ưu hóa bản vá kết hợp di chuyển con trỏ và hủy các cặp ẩn/hiển thị cũng như bộ đệm có độ rộng dòng tự loại bỏ (nguồn tuyên bố “giảm ~50 lần lệnh gọi stringWidth trong quá trình truyền phát mã thông báo”). Có vẻ như là quá mức cần thiết cho đến khi bạn nhớ những thứ này truyền phát từng mã thông báo một.
Mỗi lệnh bash chạy qua 23 bước kiểm tra bảo mật được đánh số trong bashSecurity.ts: 18 nội dung Zsh bị chặn, bảo vệ chống lại Zsh tương đương với việc mở rộng (=curl bỏ qua việc kiểm tra quyền cho curl ), chèn không gian có độ rộng bằng 0 unicode, chèn byte null IFS và bỏ qua mã thông báo không đúng định dạng được tìm thấy trong quá trình xem xét của HackerOne. Tôi chưa thấy công cụ nào khác có mô hình mối đe dọa Zsh cụ thể này.
Tính kinh tế của bộ nhớ đệm nhanh chóng rõ ràng đã thúc đẩy rất nhiều kiến trúc. promptCacheBreakDetection.ts theo dõi 14 vectơ phá bộ nhớ đệm và có "chốt cố định" giúp ngăn việc chuyển đổi chế độ phá hủy bộ đệm. Một hàm được chú thích DANGEROUS_uncachedSystemPromptSection(). Khi bạn thanh toán cho mọi mã thông báo, việc vô hiệu hóa bộ nhớ đệm không còn là trò đùa của khoa học máy tính nữa mà trở thành một vấn đề kế toán.
Điều phối viên đa tác nhân trong điều phối viênMode.ts rất thú vị vì thuật toán điều phối là một lời nhắc chứ không phải mã. Nó quản lý các tác nhân công nhân thông qua các hướng dẫn nhắc nhở của hệ thống như "Không dán nhãn công việc yếu kém" và "Bạn phải hiểu các phát hiện trước khi chỉ đạo công việc tiếp theo. Không bao giờ chuyển sự hiểu biết cho nhân viên khác."
Cơ sở mã cũng có một số điểm khó hiểu. print.ts dài 5.594 dòng với một hàm duy nhất trải dài 3.167 dòng và 12 cấp độ lồng nhau. Họ sử dụng Axios cho HTTP, đây là một thời điểm buồn cười vì Axios vừa bị xâm phạm vào npm với các phiên bản độc hại thả trojan truy cập từ xa.
Vậy thì sao?
Một số người đang xem nhẹ điều này vì Gemini CLI của Google và Codex của OpenAI đã là nguồn mở. Nhưng những công ty đó đã mở mã nguồn SDK đại lý (bộ công cụ) chứ không phải hệ thống dây dẫn nội bộ đầy đủ của sản phẩm hàng đầu của họ.
Thiệt hại thực sự không phải là mã. Đó là cờ tính năng. KAIROS, cơ chế chống chưng cất: đây là những chi tiết về lộ trình sản phẩm mà các đối thủ cạnh tranh hiện có thể nhìn thấy và phản ứng. Mã có thể được tái cấu trúc. Không thể không tiết lộ bất ngờ về mặt chiến lược.
Và đây là mấu chốt: Anthropic đã mua lại Bun vào cuối năm ngoái và Claude Code được xây dựng dựa trên điều đó. Một lỗi Bun (oven-sh/bun#28001), được phát hiện vào ngày 11 tháng 3, báo cáo rằng bản đồ nguồn được cung cấp ở chế độ sản xuất mặc dù tài liệu riêng của Bun nói rằng chúng nên bị vô hiệu hóa. Vấn đề vẫn còn mở. Nếu đó là nguyên nhân gây ra vụ rò rỉ thì chuỗi công cụ của chính Anthropic đã gửi một lỗi đã biết làm lộ mã nguồn sản phẩm của chính họ.
Như một câu trả lời trên Twitter đã nói: “việc vô tình chuyển bản đồ nguồn của bạn tới npm là một loại sai lầm nghe có vẻ không thể xảy ra cho đến khi bạn nhớ rằng một phần đáng kể của cơ sở mã có thể được viết bởi AI mà bạn đang vận chuyển.”
Tác giả: alex000kim