ProxyBridge 4.1.0-Beta Kernel Driver #210
Replies: 4 comments 2 replies
ProxyBridge eBPF for Windows — Final Testing SummaryExecutive summaryI completed the eBPF proof-of-concept investigation on Windows 10. The PoC successfully demonstrated:
The PoC did not provide transparent UDP response delivery. The UDP relay successfully forwarded the request to the original server and received the response, but the client observed the relay endpoint as the response source: This is not a test-harness error. It is an architectural limitation of the current design. The user-mode relay returns the datagram through a socket bound to For that reason, I consider the eBPF investigation complete. Extending the PoC further would effectively require implementing a custom WFP driver path, which is already the architectural direction of ProxyBridge 4.1.0-Beta. Test environment
Final tested TCP relay artifacts: Confirmed results
TCP proxy resultThe initial TCP relay implementation queried On the tested Windows 10 provider this failed with: The query was changed to use:
The final runtime evidence confirmed: The TCP payload test then passed. UDP resultThe final UDP test confirmed: The payload returned successfully, but the client saw: The reverse path in the current relay uses a normal
A complete transparent solution would require:
Important limitationsThe following conclusions must not be drawn from this test phase:
The precise conclusion is narrower:
Harness and lifecycle defects fixed during testingThe investigation also found and fixed several test and lifecycle problems:
These issues are separate from the final UDP architectural limitation. My assessment and decisionBased on the completed tests, my assessment is that the eBPF approach used in this PoC is not suitable for the required transparent UDP behavior. I therefore decided to conclude the eBPF investigation and move on to isolated testing of ProxyBridge 4.1.0-Beta and its custom WFP driver. In my view, the WFP beta is best tested in a clean VM clone rather than on top of the installed eBPF runtime, so that the results are not affected by the existing eBPF drivers, services, callouts, or configuration. The areas I consider most important for the beta test are:
Final conclusionThe eBPF PoC proved that process-aware routing and transparent TCP proxying are viable. It also identified the boundary of the current design:
In my view, extending the current user-mode UDP relay would duplicate work that belongs in a kernel-mode WFP implementation. I therefore consider testing the developer's WFP-based beta to be the appropriate next phase. |
Interim WFP beta testing result: full-path application rules can silently fail openThis is an interim result, not the final evaluation of ProxyBridge 4.1.0-Beta. Testing is still in progress. During the current testing, a confirmed application-path matching defect was found. It affects full-path BLOCK rules and is also likely to affect full-path PROXY rules. This does not prevent all remaining testing, but results must distinguish between the normal full-path configuration and a controlled basename workaround. The full-path BLOCK/PROXY branch of the matrix was paused at the first security-relevant failure. Other correctness work may continue with a basename selector where appropriate, while the full-path cases remain NO-GO until fixed and retested. Tested build and environmentTest topology: The deterministic client was a standalone Winsock x64 binary: Its local loopback validation passed 11/11 tests, including TCP/UDP IPv4/IPv6, connected and unconnected UDP, same-port TCP/UDP cases, held-flow rechecks and source-port reuse. Installation and lifecycle statusThe following stages passed before policy testing: The WFP snapshot showed the expected objects: The failure was therefore not caused by a missing provider, sublayer, filter or callout registration. Proxy backend validationThe built-in Proxy Test passed: The UDP relay address was successfully returned by the proxy. DIRECT controlsWith ProxyBridge disabled, the deterministic direct controls passed: With ProxyBridge running and an explicit DIRECT rule, the same three tests also passed. The VPS received and echoed every expected payload, and ProxyBridge Activity Log reported This established a working direct-path reference before testing BLOCK. Confirmed failure: full-path BLOCK rule leaks trafficThe rule was configured as: ProxyBridge reported: However, the actual network result was: Payload SHA-256: The response SHA-256 was identical. The VPS recorded both: for the same payload hash. The observed source was the established direct-path public address, which has been redacted. Therefore, although the Activity Log displayed This was not a timeout, logging ambiguity or harness classification issue. Cold-start persistence testThe VM was later fully restarted. After cold start: ProxyBridge startup reported: Thus the rule was persisted and one watched image was eventually sent to the driver. The next single TCP BLOCK test still leaked: Payload SHA-256: The VPS again recorded: for the exact payload. This excluded: Source/control-flow analysisThe exact source corresponding to the tested 4.1.0-Beta binary was not available. The public WFP source examined was: The public implementation contains the following control flow: A WFP The full selector pushed from the rule was: A full DOS path beginning with a drive letter is not a suffix of a kernel device path beginning with The separate This explains the apparently contradictory result: Actual BLOCK enforcement occurs later in the local relay, but only if the kernel connect-redirect gate first redirects the connection to that relay. Runtime discriminator: basename selectorTo test this hypothesis without modifying the product, only the Applications field was changed: All other rule fields remained unchanged: ProxyBridge reported: During the single targeted TCP test: This Client result: Payload SHA-256: The VPS log contained zero matching records: The empty match file had the standard empty-file SHA-256: The payload did not reach the endpoint. A/B result
This isolates the failure to the kernel watchlist matching gate. It is not caused by: Current conclusionThe runtime A/B result confirms the following behavior in the tested 4.1.0-Beta binary: The public 4.0.13-Beta source provides a control flow that precisely explains the observed 4.1.0-Beta behavior. Because the exact 4.1.0 source was unavailable, the exact source line in that binary is not independently proven, but the runtime cause and the full-path-versus-basename discriminator are confirmed. Security impactThe BLOCK case is formally runtime-confirmed. The same kernel watch gate is also used before PROXY handling. Therefore full-path PROXY rules may be vulnerable to the same silent direct bypass: The PROXY case has not yet been separately demonstrated at runtime, so it should currently be described as a strongly supported impact, not as a second formally proven test result. The Activity Log is not sufficient evidence of actual BLOCK or PROXY enforcement because it can show the result of the later user-mode rule evaluation even when the kernel redirect never occurred. Suggested minimal fixThe smallest safe change appears to be: This may intentionally over-capture processes sharing the same basename, but the relay can then perform the exact full-path check. Over-capture followed by exact user-mode evaluation is safer than a silent fail-open. An alternative is to normalize both paths into the same Windows namespace before comparison, but direct comparison between an unmodified DOS path and raw Required targeted regression testsBefore resuming the broader matrix, a fix candidate should pass: The full-path BLOCK/PROXY branch should remain stopped until these targeted tests pass. Other TCP/UDP/IPv4/IPv6 tests may continue under an explicitly documented basename workaround, but such results must not be presented as proof that ordinary full-path rules are working. Current project statusThis remains an interim result. Testing of PROXY, UDP, IPv6, issue #206, issue #209 and reconnect behavior can continue with a clearly documented basename workaround where the application selector is relevant. The ordinary full-path BLOCK and PROXY cases must be retested after the defect is fixed. Performance testing should still wait until the relevant correctness paths are stable. |
UDP source transparency issueDuring testing of the current WFP beta, I reproduced the same UDP transparency problem that was previously observed in the eBPF prototype. The outgoing UDP datagram is routed through SOCKS5 correctly, the remote endpoint receives it, and the response payload returns intact. However, the application sees the response as coming from ProxyBridge’s local UDP relay rather than from the original remote endpoint. The cause is that ProxyBridge preserves the original destination for forward routing, but on the reverse path it sends the decoded payload back to the application using a normal This affects both connected and unconnected UDP semantics and can break applications that validate or depend on the peer endpoint, including QUIC, voice communication, games, and other stateful UDP protocols. A possible first fix is to implement the documented WFP non-TCP redirect-record flow using If redirect records cannot restore the original source identity through the SOCKS5 relay topology, the fallback would be a kernel-level reverse-path rewrite or packet reinjection mechanism. Ordinary user-mode |
|
I have published the standalone ProxyBridge TestLab discussed earlier: https://github.com/dentatli/ProxyBridge-TestLab Commit-pinned snapshot used for this handoff: https://github.com/dentatli/ProxyBridge-TestLab/tree/ad8a9256cf5e0ef0f8a212cd2870115e6f729c18 The repository now contains:
Current Windows IPv4 diagnostic result:
Confirmed working:
Reproduced product defects:
IPv6 was not executed because the current environment has no native public IPv6 route. Advanced lifecycle, application, failure-injection and performance scenarios remain explicitly marked as not implemented rather than passed. The repository contains no ProxyBridge binaries, credentials, private keys or raw environment evidence. The setup documentation explains how to build the client, deploy the server endpoint, configure Please let me know whether you would prefer:
|
Uh oh!
There was an error while loading. Please reload this page.
ProxyBridge 4.1.0-Beta - Tester Release
This is an experimental tester build. It replaces the WinDivert packet-capture engine with a
custom Windows Filtering Platform (WFP) kernel driver (
ProxyBridgeDrv.sys). We are releasingit only to gather feedback and to evaluate whether ProxyBridge should move from WinDivert to its
own driver.
Download - ProxyBridge-4.1.0-Beta.zip
This release includes a kernel-mode driver that is still under test. Please understand what
that means before you install it:
privileges. A defect can bring down the entire machine with a BSOD (Blue Screen of Death),
not just close ProxyBridge.
work, or daily-driver system.
Wait for a stable, signed release instead.
What's new in 4.1.0-Beta
months. It is a test / proof-of-concept, not intended for production or real-world use yet.
packets, and has been aligned with ProxyBridge: same features - IPv4 + IPv6, TCP + UDP,
proxy / direct / block rules, domain rules, and full connection logging.
is a viable replacement for WinDivert.
How it works vs WinDivert
WinDivert works at the packet level: it pulls every network packet up into user mode, works out
which process and destination it belongs to, rewrites it, and re-injects it. The custom driver
works at the connection level using WFP: when a watched app opens a connection, the kernel
redirects that connection to ProxyBridge and hands over the process ID and the original destination
directly - no packets are copied or rewritten.
What stays the same for you: the behaviour you already know - proxy / direct / block rules,
IPv4 + IPv6, TCP + UDP, domain rules, and the full connection log. Only the capture mechanism
underneath changes; the WFP approach is closer to how tools like Proxifier work.
One difference you may notice: every connection now shows in the log - including apps talking to
localhost - so you can see and write rules for local traffic too. Only ProxyBridge's own
internal hops are hidden.
Driver signing status - why Test Mode is required
The driver is not EV code-signed. Windows requires an EV (Extended Validation) certificate
for kernel drivers, plus Microsoft attestation / WHQL submission and review, before a driver
will load normally.
Because this driver is still experimental and unverified, we have not EV-signed it or
submitted it for Microsoft verification. To load an unverified driver, Windows must be put into
Test Mode (test-signing).
Requirements
Steps to test
1. Enable Test Mode
On the test machine, in an elevated Command Prompt / PowerShell:
After the reboot you will see a "Test Mode" watermark in the bottom-right corner - that
confirms it is active.
2. Get the build
Copy the provided package to the test machine. It contains:
ProxyBridge.exe,ProxyBridgeCore.dll,ProxyBridge_CLI.exe,ProxyBridgeDrv.sys,ProxyBridgeDrv-test.cer(the driver's test certificate), and the installer.3. Trust the driver's test certificate
The driver is signed with a self-signed test certificate. Import it so Windows trusts it - in an
elevated PowerShell, from the folder with the files:
4. Install / run
Run
ProxyBridge.exeas Administrator directly.The app installs and starts the
ProxyBridgeDrvkernel service on demand.5. Verify the driver loaded
Expect
STATE : 4 RUNNING.6. Try it
Add a proxy, add a rule (e.g. a browser or
curl.exe→ Proxy), and confirm traffic routesthrough the proxy and appears in the connection log.
Reverting after testing
Then reboot. (The uninstaller also stops and removes the driver service.)
Feedback
Please report: whether the driver loaded, whether TCP / UDP / IPv6 proxying and logging worked,
and - most importantly - any instability, hangs, or BSODs, along with your Windows version and
what you were doing at the time.
This is a beta of experimental kernel code. Thank you for testing carefully, and only on a machine
you can afford to crash.
All reactions