-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
feat(claude): add native request cloaking for non-claude-code clients #868
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
integrate claude-cloak functionality to disguise api requests: - add CloakConfig with mode (auto/always/never) and strict-mode options - generate fake user_id in claude code format (user_[hex]_account__session_[uuid]) - inject claude code system prompt (configurable strict mode) - obfuscate sensitive words with zero-width characters - auto-detect claude code clients via user-agent 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <[email protected]>
Summary of ChangesHello @maorinn, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request introduces a new "Claude-Cloak" feature designed to make API requests from non-Claude Code clients appear as if they originate from the official Claude Code CLI. This is achieved through a set of configurable mechanisms including dynamic user ID generation, intelligent system prompt injection, and sensitive word obfuscation, all managed by a new Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request introduces a request cloaking feature to disguise API requests as originating from the official Claude Code CLI. The implementation is well-structured, with new configuration options and dedicated files for obfuscation and utility functions. I've identified a few issues that should be addressed. There's a significant bug causing CountTokens to be inconsistent with Execute/ExecuteStream, a data loss issue in the system prompt injection logic, and a potential security vulnerability in the random user ID generation. I've also noted some dead code that can be removed. Addressing these points will help ensure the feature is robust and correct.
| system.ForEach(func(_, part gjson.Result) bool { | ||
| if part.Get("type").String() == "text" { | ||
| claudeCodeInstructions, _ = sjson.SetRaw(claudeCodeInstructions, "-1", part.Raw) | ||
| } | ||
| return true | ||
| }) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When prepending the Claude Code system prompt, the current logic only preserves existing system prompt blocks of type: "text". Any other content block types, such as images, will be dropped from the request. This can lead to data loss and incorrect model behavior. To fix this, all parts of the original system prompt should be preserved, regardless of their type.
system.ForEach(func(_, part gjson.Result) bool {
claudeCodeInstructions, _ = sjson.SetRaw(claudeCodeInstructions, "-1", part.Raw)
return true
})|
|
||
| // applyCloaking applies cloaking transformations to the payload based on config and client. | ||
| // Cloaking includes: system prompt injection, fake user ID, and sensitive word obfuscation. | ||
| func applyCloaking(ctx context.Context, cfg *config.Config, auth *cliproxyauth.Auth, payload []byte, model string) []byte { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While Execute and ExecuteStream have been updated to use this new applyCloaking function, the CountTokens function in this file still uses the old checkSystemInstructions logic. This will lead to CountTokens returning an incorrect token count for requests that are subject to cloaking, as the system prompt modifications will not be accounted for consistently. To ensure correctness, CountTokens should also be updated to use applyCloaking.
| // Format: user_[64-hex-chars]_account__session_[UUID-v4] | ||
| func generateFakeUserID() string { | ||
| hexBytes := make([]byte, 32) | ||
| _, _ = rand.Read(hexBytes) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The error returned by rand.Read is currently ignored. If rand.Read fails (e.g., due to the OS entropy source being unavailable), the hexBytes slice will contain all zeros, resulting in a predictable, non-random user ID. This is a security risk. Since a failure here is a critical problem, the program should panic to prevent insecure operation.
if _, err := rand.Read(hexBytes); err != nil {
// rand.Read failing is a catastrophic failure of the OS's entropy source.
// The program cannot continue securely, so we panic.
panic("crypto/rand: failed to read random bytes for fake user ID: " + err.Error())
}| // isClaudeCodeClient checks if the User-Agent indicates a Claude Code client. | ||
| func isClaudeCodeClient(userAgent string) bool { | ||
| return strings.HasPrefix(userAgent, "claude-cli") | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
…auto-update, request timeout, multi-candidate, auth persistence Applied features from upstream PRs: - PR router-for-me#878: Usage statistics persistence (SetPersistPath, LoadStatistics, SaveStatistics) - PR router-for-me#877: Codex plan type credential filename handling - PR router-for-me#868: Claude request cloaking utilities (obfuscation, fake user IDs) - PR router-for-me#715: Auto-update command for self-updating binary - PR router-for-me#860: Configurable request timeout with RequestTimeout config - PR router-for-me#879: Gemini multi-candidate support (n param -> candidateCount) - PR router-for-me#869: Auth token persistence for non-Google OAuth providers Fixed build issues: - Added applyPayloadConfig wrapper function - Added originalTranslated computation in claude/antigravity/codex executors - Fixed model registry hook methods - Removed duplicate SanitizeFunctionName - Fixed gemini_schema placeholder logic for nested object properties Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Summary
Integrate Claude-Cloak functionality to natively disguise API requests as originating from the official Claude Code CLI, when the client is not Claude Code.
Features
claude-api-keywithmode(auto/always/never) andstrict-modeoptionsuser_[64-hex]_account__session_[uuid])strict-mode: false(default): prepend to user system messagesstrict-mode: true: strip all user system messages, keep only Claude Code promptConfiguration Example
Behavior
Test plan
🤖 Generated with Claude Code