klzgrad/naiveproxy — an open-source project — sits at 9.6k GitHub stars. Make a fortune quietly
Snapshot summary built from the project's own GitHub metadata — there's no written TopGit review yet. The page will update automatically when a full review is published.
WHY NO REVIEW YET
TopGit writes full reviews for the most-starred, most-requested repositories. This page is a snapshot until then — see the READ ME tab for the original README in full.
NaïveProxy uses Chromium's network stack to camouflage traffic with strong censorship resistence and low detectablility. Reusing Chrome's stack also ensures best practices in performance and security.
The following traffic attacks are mitigated by using Chromium's network stack:
Website fingerprinting / traffic classification: mitigated by traffic multiplexing in HTTP/2 and parroting preambles.
TLS parameter fingerprinting: defeated by reusing Chrome's network stack.
Active probing: defeated by application fronting, i.e. hiding proxy servers behind a commonly used frontend server with application-layer routing.
Length-based traffic analysis: mitigated by padding and fragmentation.
NaïveProxy uses Chromium's network stack to parrot traffic between regular Chrome browsers and standard frontend servers.
The frontend server can be any well-known reverse proxy that is able to route HTTP/2 traffic based on HTTP authorization headers, preventing active probing of proxy existence. Known ones include Caddy with its forwardproxy plugin and HAProxy.
The Naïve server here works as a forward proxy and a packet length padding layer. Caddy forwardproxy is also a forward proxy but it lacks a padding layer. A fork adds the NaïveProxy padding layer to forwardproxy, combining both in one.
Download NaïveProxy
Download here. Supported platforms include: Windows, Android (with Exclave, husi, NekoBox), Linux, Mac OS, and OpenWrt (support status).
Users should always use the latest version to keep signatures identical to Chrome.
Build from source: Please see .github/workflows/build.yml.
Server setup
The following describes the naïve fork of Caddy forwardproxy setup.
Download here or build from source:
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
~/go/bin/xcaddy build --with github.com/caddyserver/forwardproxy=github.com/klzgrad/forwardproxy@naive
Example Caddyfile (replace user and pass accordingly):
{
order forward_proxy before file_server
log {
exclude http.log.error # Avoid logging user activity
}
}
:443, example.com {
tls [email protected]
encode
forward_proxy {
basic_auth user pass
hide_ip
hide_via
probe_resistance
}
file_server {
root /var/www/html
}
}
:443 must appear first for this Caddyfile to work. See Caddyfile docs for customizing TLS certificates. For more advanced usage consider using JSON for Caddy 2's config.
Or quic://user:[email protected], if it works better. See also parameter usage and performance tuning.
Third-party integration
v2rayN, GUI client
Notes for downstream
Do not use the master branch to track updates, as it rebases from a new root commit for every new Chrome release. Use stable releases and the associated tags to track new versions, where short release notes are also provided.
Padding protocol, an informal specification
The design of this padding protocol opts for low overhead and easier implementation, in the belief that proliferation of expendable, improvised circumvention protocol designs is a better logistical impediment to censorship research than sophisicated designs.
Proxy payload padding
NaïveProxy proxies bidirectional streams through HTTP/2 (or HTTP/3) CONNECT tunnels. The bidirectional streams operate in a sequence of reads and writes of data. The first kFirstPaddings (8) reads and writes in a bidirectional stream after the stream is established are padded in this format:
padding_size is a random integer uniformally distributed in [0, kMaxPaddingSize] (kMaxPaddingSize: 255). original_data_size cannot be greater than 65535, or it has to be split into several reads or writes.
kFirstPaddings is chosen to be 8 to flatten the packet length distribution spikes formed from common initial handshakes:
Common server initial sequence: 1. TLS ServerHello, ChangeCipherSpec, ...; 2. TLS Certificate, ...; 3. H2 SETTINGS; 4. H2 WINDOW_UPDATE; 5. H2 SETTINGS ACK; 6. H2 HEADERS 200 OK.
Further reads and writes after kFirstPaddings are unpadded to avoid performance overhead. Also later packet lengths are usually considered less informative.
H2 RST_STREAM frame padding
In experiments, NaïveProxy tends to send too many RST_STREAM frames per session, an uncommon behavior from regular browsers. To solve this, an END_STREAM DATA frame padded with total length distributed in [48, 72] is prepended to the RST_STREAM frame so it looks like a HEADERS frame. The server often replies to this with a WINDOW_UPDATE because padding is accounted in flow control. Whether this results in a new uncommon behavior is still unclear.
H2 HEADERS frame padding
The CONNECT request and response frames are too short and too uncommon. To make its length similar to realistic HEADERS frames, a padding header is filled with a sequence of symbols that are not Huffman coded and are pseudo-random enough to avoid being indexed. The length of the padding sequence is randomly distributed in [16, 32] (request) or [30, 62] (response).
Opt-in of padding protocol
NaïveProxy clients should interoperate with any regular HTTP/2 proxies unaware of this padding protocol. NaïveProxy servers (i.e. any proxy server capable of the this padding protocol) should interoperate with any regular HTTP/2 clients (e.g. regular browsers) unaware of this padding protocol.
NaïveProxy servers and clients determines whether the counterpart is capable of this padding protocol by the presence of the padding header in the CONNECT request and response respectively. The padding procotol is enabled only if the padding header exists.
The first CONNECT request to a server cannot use "Fast Open" to send payload before response, because the server's padding capability has not been determined from the first response and it's unknown whether to send padded or unpadded payload for Fast Open.
Changes from Chromium upstream
Minimize source code and build size (0.3% of the original)
Disable exceptions and RTTI, except on Mac and Android.
Support OpenWrt builds
(Android, Linux) Use the builtin verifier instead of the system verifier (drop dependency of NSS on Linux) and read the system trust store from (following Go's behavior in crypto/x509/root_unix.go and crypto/x509/root_linux.go):
No homepage URL was recorded for klzgrad/naiveproxy in TopGit's last sync. The README tab above frequently contains screenshots and demo links, or check the repository description on GitHub.
Does klzgrad/naiveproxy have any tags?
TopGit's last sync did not record any GitHub topics for klzgrad/naiveproxy. GitHub topics appear in the right sidebar of a repository page; that's the authoritative place to check.
How active is development on klzgrad/naiveproxy?
The most recent commit recorded on klzgrad/naiveproxy was 17 days ago, based on the GitHub push timestamp. The repository has 1.0k forks — one of the better signals of community interest.
How many stars does klzgrad/naiveproxy have?
klzgrad/naiveproxy has 9.6k GitHub stars — refresh the page for the live number, or check github.com/klzgrad/naiveproxy. TopGit mirrors GitHub's count but does not claim minute-by-minute accuracy.
What language is klzgrad/naiveproxy written in?
klzgrad/naiveproxy is written primarily in C++. GitHub's language field is based on the largest share of bytes in the default branch.
What license does klzgrad/naiveproxy use?
klzgrad/naiveproxy is released under the BSD-3-Clause license. Always verify the LICENSE file directly on GitHub for the authoritative terms — license strings can be edited out of sync with a project's actual stance.
Where do I read more about klzgrad/naiveproxy?
This TopGit page is a snapshot — the READ ME tab shows the project's own README content (links stripped, images preserved). The GitHub repository at github.com/klzgrad/naiveproxy is the definitive source.
Read full README in the tab above.
Curious whether naiveproxy is right for you?
Let ChatGPT, Claude, or Perplexity look into it — click below and see what AI actually says about naiveproxy.