frontpage.
newsnewestaskshowjobs

Made with ♥ by @iamnishanth

Open Source @Github

fp.

Show HN: Aroma: Every TCP Proxy Is Detectable with RTT Fingerprinting

https://github.com/Sakura-sx/Aroma
46•Sakura-sx•4d ago•24 comments

Show HN: Evidex – AI Clinical Search (RAG over PubMed/OpenAlex and SOAP Notes)

https://www.getevidex.com
27•amber_raza•5h ago•13 comments

Show HN: See what readers who loved your favorite book/author also loved to read

https://shepherd.com/bboy/2025
106•bwb•10h ago•24 comments

Show HN: Vibe coding a bookshelf with Claude Code

https://balajmarius.com/writings/vibe-coding-a-bookshelf-with-claude-code/
246•balajmarius•9h ago•186 comments

Show HN: Per-instance TSP Solver with No Pre-training (1.66% gap on d1291)

12•jivaprime•8h ago•2 comments

Show HN: Spacelist, a TUI for Aerospace window manager

https://github.com/magicmark/spacelist
33•markl42•2d ago•6 comments

Show HN: Agtrace – top and tail -f for AI coding agent sessions

https://github.com/lanegrid/agtrace
2•zawakin•1h ago•0 comments

Show HN: My not-for-profit search engine with no ads, no AI, & all DDG bangs

https://nilch.org
178•UnmappedStack•17h ago•67 comments

Show HN: Z80-μLM, a 'Conversational AI' That Fits in 40KB

https://github.com/HarryR/z80ai
460•quesomaster9000•16h ago•101 comments

Show HN: A solar system simulation in the browser

https://luna.watermelonson.com/
5•watermelonson•5h ago•0 comments

Show HN: Zs3 – S3 server in ~1K lines of Zig, 250KB binary, zero dependencies

https://github.com/Lulzx/zs3
15•lulzx•7h ago•0 comments

Show HN: I built an "ilovepdf" for CSV files (and I called it ILoveCSV)

https://ilovecsv.net/
2•vinserello•3h ago•0 comments

Show HN: Superset – Terminal to run 10 parallel coding agents

https://superset.sh/
49•avipeltz•6d ago•42 comments

Show HN: Neko.js, a recreation of the first virtual pet

https://louisabraham.github.io/nekojs/
2•Labo333•4h ago•0 comments

Show HN: UpDown – Simple website uptime monitoring

https://updown.fly.dev/
3•ejncman•4h ago•0 comments

Show HN: MiddleViewer – A native macOS app for technical interview feedbacks

https://middleviewer.in
3•madhav_gaba•6h ago•0 comments

Show HN: Meter – Scrape sites and keep content in sync automatically (no LLM)

https://www.meter.sh/
4•mckinnonr•7h ago•0 comments

Show HN: Mysti – Claude, Codex, and Gemini debate your code, then synthesize

https://github.com/DeepMyst/Mysti
211•bahaAbunojaim•6d ago•176 comments

Show HN: I built a real-time IoT monitor bridging ESP8266, Go, and Next.js

https://synx-alpha.vercel.app
2•dapoadedire•8h ago•0 comments

Show HN: Kuack – Run Kubernetes jobs in visitor browsers

https://github.com/kuack-io/kuack
5•kuack•8h ago•0 comments

Show HN: LoongArch Userspace Emulator

https://github.com/libriscv/libloong
24•fwsgonzo•5d ago•9 comments

Show HN: Matchstick Puzzle Game in the Browser

https://matchmath.pages.dev/
10•prettyblocks•17h ago•2 comments

Show HN: Ez FFmpeg – Video editing in plain English

http://npmjs.com/package/ezff
411•josharsh•2d ago•194 comments

Show HN: Xcc700: Self-hosting mini C compiler for ESP32 (Xtensa) in 700 lines

https://github.com/valdanylchuk/xcc700
152•isitcontent•3d ago•36 comments

Show HN: Phantas – A browser-based binaural strobe engine (Web Audio API)

https://phantas.io
27•AphantaZach•1d ago•8 comments

Show HN: Witr – Explain why a process is running on your Linux system

https://github.com/pranshuparmar/witr
505•pranshuparmar•3d ago•98 comments

Show HN: Golazo – Live soccer updates in your terminal

https://github.com/0xjuanma/golazo
8•rocajuanma•23h ago•2 comments

Show HN: The Lobste.rs invitation tree, visualized

https://alexjacobs08.github.io/lobsters-graph/
4•tacoooooooo•6h ago•1 comments

Show HN: I Built a Tool to Turn YouTube into Structured Courses

https://www.disclass.com
9•yunbiao•20h ago•0 comments

Show HN: Awaaz – revolutionary public opinion app for understanding society

https://awaaz.app
4•shauryatusk•14h ago•0 comments
Open in hackernews

Show HN: Aroma: Every TCP Proxy Is Detectable with RTT Fingerprinting

https://github.com/Sakura-sx/Aroma
46•Sakura-sx•4d ago
TL;DR explanation (go to https://github.com/Sakura-sx/Aroma?tab=readme-ov-file#tldr-e... if you want the formatted version)

This is done by measuring the minimum TCP RTT (client.socket.tcpi_min_rtt) seen and the smoothed TCP RTT (client.socket.tcpi_rtt). I am getting this data by using Fastly Custom VCL, they get this data from the Linux kernel (struct tcp_info -> tcpi_min_rtt and tcpi_rtt). I am using Fastly for the Demo since they have PoPs all around the world and they expose TCP socket data to me.

The score is calculated by doing tcpi_min_rtt/tcpi_rtt. It's simple but it's what worked best for this with the data Fastly gives me. Based on my testing, 1-0.7 is normal, 0.7-0.3 is normal if the connection is somewhat unstable (WiFi, mobile data, satellite...), 0.3-0.1 is low and may be a proxy, anything lower than 0.1 is flagged as TCP proxy by the current code.

Comments

Sakura-sx•2h ago
Also, something I haven't included on the README is that apart from testing with Tor, WARP and some other proxies. I did some testing with the free one-week trial of Brightdata's residential proxies, and it does detect them too!!!
KomoD•2h ago
curl -x http://xxxxx:xxxxx@geo.iproyal.com:11202 -L https://aroma.global.ssl.fastly.net/

<html><body><h1>You don't seem to be using a TCP Proxy!</h1><p>(If you are using a VPN or any other kind of proxy that is not a TCP Proxy, this will not detect it)</p></body></html>

Sakura-sx•2h ago
That's strange, could you try with "https://aroma.global.ssl.fastly.net/score"?
agentifysh•2h ago
so will this detect residential proxies? how is that being done, I am getting hammered and its all legitimate normal ISP traffic.
Sakura-sx•1h ago
It's done by checking the difference between the initial TCP RTT and the subsequent TCP RTTs, both of which can be retrieved from the Linux Kernel easily without the need for PCAPing. There is more info about how it is done on the README
JDye•1h ago
To answer your first question, in my tests its around 50% of requests making it through.
Sakura-sx•1h ago
Are you using a proxy? If you aren't that would be concerning, since false positives are way worse than false negatives.

If you are then it means the score is sometimes a bit lower and sometimes a bit higher than 0.1, which is the threshold for getting blocked.

If you want to know the exact score, you can check https://aroma.global.ssl.fastly.net/score

It's set at a low threshold since I want to avoid blocking regular users at all costs, I think the detection can be improved a lot by using more data and not a single division to calculate the score, in this case it's a somewhat simple PoC.

Thanks for taking the time to test it, I really appreciate it!

JDye•58m ago
I'm testing using our residential proxies.

It's a super cool tool, I've been wondering about an open source tool doing this since reading about the technique in one of Nikolai Tschacher's blog posts years ago (https://incolumitas.com/pages/about/).

There's a few ways to work around this, but I think it's one of the best signals available to detect low-effort/common proxy providers.

Sakura-sx•43m ago
Oh I haven't seen that before, it's really cool, thank you for showing me that!

I want to clarify that the approaches are a bit different, they use IP intelligence too and this approach doesn't use any kind of websockets, which is a really good idea, and I have to admit I didn't think of that, but sadly it's not really possible to do it with Fastly.

Another big difference is that this could work with any TCP application, not only HTTP, and if you do it with HTTP/S you can know if it's a proxy or not on a request basis and totally passively, without adding any delay or changing the code of the app.

But yeah, it's a really cool demo, thanks again!

soldthat•1h ago
Neat demo. The unsettling part is how little signal you actually need: big CDNs and fraud teams already run much richer timing models than a simple min_rtt / rtt ratio. You can’t spoof away the speed of light, only add latency or jitter, and that itself becomes a fingerprint once you have enough traffic and a few global PoPs to compare from. So this doesn’t magically break L3 VPNs, but anyone relying on “just stick a TCP proxy in front and I’m anonymous/in-region” has been living with a pretty outdated threat model.
Sakura-sx•1h ago
Thank you! There are other ways of detecting L3 VPNs, but I wanted to start with proxies since they do most of the damage.
ericpauley•1h ago
Every TCP proxy (that doesn't thwart this) is detectable :)

Countermeasure: pick some min-RTT >= the actual client RTT (you can do this as a TCP proxy by measuring client ping). Measure server RTT and artificially delay responses to be >= min-RTT. This will require an added delay during the handshake and ACKs, but no added delay for the response payloads.

Counter-countermeasure: the above may lead to TCP message types that don't make sense given a traditional TCP client state machine (e.g., delayed ACK would bundle ACK and PUSH but the system shows separate/simultaneous ACK and PUSH packets. Counter-counter-countermeasure is left to the reader.

Sakura-sx•1h ago
I think you could also compare with TLS handshake timings, delay for client hello among other things. And you could also compare it with HTTP RTT, not to mention that you can do TCP fingerprinting and compare it with the TLS and HTTP fingerprint of the browser, you can also measure the IP TTL and ping, among many other things... What I mean is that there are a ton of things that can be done on both sides, but any company with enough people working at this and enough servers will surely make something miles away from my proof of concept, and they also have a lot of traffic to know what's baseline data and what isn't.

It's a complex but fun world we live in hehe

Bender•1h ago
I like this. I could see this being extra useful for people not using CDN's if they could easily plug it into nginx, haproxy and such. Currently for proxies I look for the proxy headers and also use a list of known proxy IP's but that is obviously nowhere near as complete as what you built. It might also be interesting to test assorted configurations of SSH forwards and MitM TLS caching proxies such as Squid SSL Bump.
Sakura-sx•1h ago
I guess for this to work best you'd build your own CDN and have as many servers as possible. I have always dreamed of an Open Source CDN managed by a nonprofit and dedicated to offering CDN services for free or for a reasonable cost.

If you did the timings by comparing to other protocols, like TLS or HTTP you could do this with a single server, but that's a bit more complex than doing it on the same protocol since you have to account for more stuff, but it could be done, at the end of the day, my idea with Aroma was mostly to prove that it's possible, thanks for the feedback btw!

vlovich123•1h ago
This feels like something that’s a neat claim and will work against simple setups, but less accurate for more complicated scenarios (eg Tor). Then you’re really just relying on how accurate your knowledge of the proxies are.

Also, the readme has slightly incorrect logic I think:

> According to Special Relativity, information cannot travel faster than the speed of light. Therefore, if the round trip time (RTT) is 4ms, it's physically impossible for them to be farther than 2 light milliseconds away, which is approximately 600 kilometers.

It calls out the 33% for fiber but ignores that there’s not a straightline path between two points on the network and there could be wireless, cable, and DSL links somewhere on that hop.

Also, the controlled variable here is latency, not distance. Thus you can always increase latency through buffering and therefor you could be made to appear further than you are. And that buffering need not even be intentional - your perceived distance estimate will vary based upon queuing delays in intermediary depending on time of day (itself a fingerprint if you incorporate time-aware measurements, but a source of error if you don’t).

Fingerprinting is hard and I dislike the framing that it’s absolutely impossible to mask or that there’s not false positive and false negative error rates with the fingerprint.

Sakura-sx•1h ago
About the straightline path I did think of that but apparently I forgot to address it when writing the README :p

The point I was trying to make is that if the RTT is low enough you can know the connection is being made from close, it's an upper bound, and making some assumptions you can get it lower, so it's not a way of knowing the exact distance but rather the max distance the connection can be made from. If someone is in Spain but they can't be more than 400km from Australia, something went terribly wrong somewhere hehe

In hindsight I think the issue with my explanation is that I was trying to explain the differences when fingerprinting two different protocols, but ended up going for a TCP-only approach since Fastly wouldn't expose to me the data I needed for the TLS and HTTP RTT. But in theory fingerprinting with protocol RTT difference where one protocol is proxied and the other is impossible to bypass, but this is only the theory.

I think I will edit the README in the future since I don't like how it turned out too much. Thanks for the feedback!

By the way, it detects Tor, I tested it ;D

kees99•1h ago
Very clever, I like it.

When deployed on a popular server, one bit of "IP intelligence" this detector itself can gather is keep database of lowest-seen RTT per given source IP, maybe with some filtering - to cut out "faster-than-light" datapoints, gracefully update when actual network topology changes, etc.

That would establish a baseline, and from there, additional end-to-end RTT should become much more visible.

Sakura-sx•1h ago
First of all, thanks!

I imagine any big CDN implementing something like this could keep a database of all of this, combined with the old kind of IP intelligence and collecting not only RTT on other protocols like TLS, HTTP, IP (aka ping, and traceroutes too), TCP fingerprint, TLS fingerprint, HTTP fingerprint...

And with algorithms that combine and compare all these data points, I think very accurate models of the proxy could be made. And for things like credit card fraud this could be quite useful.

moreati•56m ago
Why would one want this? Are there particular situation(s) that it's desirable to detect a TCP proxy? Does presence of a TCP proxy indicate some adverserial behaviour? E.g. surveillance, censorship, a particular attack?
userbinator•11m ago
Surveillance, on the part of those who want to do this fingerprinting.
viraptor•49m ago
Just in case someone tries to use it to make some kind of judgement about the traffic - there's a whole world behind legit or enforced proxies. Especially corporate environments will often tunnel all the traffic for compliance and audit reasons.
Sakura-sx•31m ago
Yes, it's important to keep this in mind, thanks for your comment!
Rasbora•44m ago
This is the core concept of how proxies are detected via services like https://layer3intel.com/tripwire or https://spur.us/monocle/

The difference in min TCP RTT and min RTT to respond to a websocket payload is a dead giveaway that there's a middlebox terminating TCP somewhere along the path. You can bypass this by sourcing your request within 30ms of wherever TCP is being terminated, anything under that threshold could be caused by regular noise and isn't a reliable fingerprint. Due to how many gateway's there are between you and a residential proxy exit node this makes fingerprinting them extremely easy.

I expect it won't be long until someone deploys the first proxy service that handles the initial CONNECT payload in the kernel before offloading packet forwarding to an eBPF script that will proxy packets between hosts at layer 3, making this fingerprinting technique obsolete. The cat and mouse game continues.