← index

Many connections to bitproject.io nodes?

An archive of bnoc.xyz · view original topic →

Gregory Sanders · #1 ·

edit (@b10c): the title was originally “/Satoshi:29.1.0(dont-spam-me-bro)/ nodes?”.

Noticed these connections on both my outbound and inbound direction on various nodes: “/Satoshi:29.1.0(dont-spam-me-bro)/”

They appear to behave fairly normally, relaying 0-fee TRUC transactions in a package (precluding stock Knots 29.1), but I don’t know anything else about them.

https://blockchair.com/bitcoin/nodes reports 1200 of these

I couldn’t find any results with google-fu on github.

Let me know if there’s any information I can gather. Would like to know who’s propping these up.

Gregory Sanders · #2 ·

oh. 3 for 3 looking these up

edit for clarity (@b10c): whois mentions bitprojects.io (which is known from Antoine Poinsot - Misbehaving nodes investigation). Seems like they are back, now with a custom user agent. Marking this as solved.

b10c · #3 ·

I noticed I have two of my outbound slots of len (demo.peer.observer) connected to them. instagibbs mentioned to me he has 3 of his outbound slots connected to them on one of his nodes. This is worrying, as filling outbound slots should be hard to avoid eclipse attacks.

ASMap would help for this.

b10c · #4 ·

The last time I saw dont-spam-me-bro connecting to me was on 2024-10-24. They now appear as /Satoshi:29.2.0(not-your-file-server)/Knots:20251010/.

Gregory Sanders · #5 · · in reply to #4


back, in knots form

b10c · #6 · · in reply to #4

Doing IBD on a fresh node, I see 4 connections to /Satoshi:29.2.0(not-your-file-server)/Knots:20251010/ nodes. Let’s see if they remain after IBD..


$ bitcoin-cli -netinfo 3
Bitcoin Core client v30.0.0 - server 70016/Satoshi:30.0.0/ - services nwcl2

↔   type   net   serv  v  mping   ping send recv  txn  blk  hb addrp addrl  age id version
out  block  ipv4   nwl2  1     19   7465    1    1    *    0         .         24  8 70016/Satoshi:29.2.0(not-your-file-server)/Knots:20251010/
out   full  ipv4   nwl2  2     22     50    1    1         0      1027         24  3 70016/Satoshi:29.1.0/
out   full  ipv4   nwl2  2     27    511    1    0         0      1008         24  0 70016/Satoshi:29.2.0(not-your-file-server)/Knots:20251010/
out   full  ipv4   nwl2  2     59   2039    0    0         0      1006         24  6 70016/Satoshi:29.2.0(not-your-file-server)/Knots:20251010/
out   full  ipv4    nwl  1     78     90    0    0         0      1028         24  4 70016/Satoshi:25.0.0/
out   full  ipv4   nwl2  2     81   7772    0    1         0      1006         24  7 70016/Satoshi:29.2.0(not-your-file-server)/Knots:20251010/
out   full  ipv4   nwl2  2    105   1195    0    0         0      1027         24  2 70016/Satoshi:27.1.0/
out   full  ipv4   nwl2  2    109   2033    1    0         0      1038         24  1 70016/Satoshi:28.0.0/
out  block  ipv4   nwl2  1    128    948    0    0    *    0         .         23  9 70016/Satoshi:29.0.0/
out   full  ipv4    nwl  1    156    156    1    0         0      1023         24  5 70015/Satoshi:0.20.0/
ms     ms  sec  sec  min  min                  min

ipv4    ipv6   total   block

in          0       0       0
out        10       0      10       2
total      10       0      10

edit: that node is not running with ASMap enabled.

Antoine Poinsot · #7 · · in reply to #6

I’m not sure ASMap would be a substantial improvement over the current /16 mechanism. There is 10 peers to choose from 10k /16’s available. That’s roughly a (n / 10_000)^10 probability to connect to an attacker controlling n /16’s.

That said, it seems that it’s not what happens in practice. The Bitprojects guy controls only 12 /16’s. That a node would pick any of those 12 for 4 of its slots if it has heard about all /16’s available is essentially null. Could it be that somehow he found a way to bias DNS seeds towards his nodes, such as a node joining the network does not hear about many more /16’s than his?

Gregory Sanders · #8 · · in reply to #7

Should we expect this effect to dissipate as a node has longer running time?

b10c · #9 ·

I’ve set up some data collection on the number of outbound connections I have to the bitproject IPs (also inbound, but don’t seem to have gotten any inbounds from them).

Currently, three of my nodes have two of their outbounds to bitprojects:

b10c · #10 · · in reply to #9

Seeing three out-bounds from alice to bitprojects and four from paul (which is a new newly set up node).

Antoine Poinsot · #11 · · in reply to #7

Or maybe his addresses get rumoured a lot more? If the addresses a node will return to a GETADDR are randomly sampled among all known addresses, instead of first sampling by /16, then it seems that his nodes would be overly represented.

Martin Zumsande · #12 ·

We don’t sample based on /16 - we sample based on address (and abort/get another sample if another outbound is from the same range). For example, if we have an addrman with 99 addresses from /16 range A and 1 address from /16 range B, we’ll pick an addr from A for our first peer with 99% probability.

So controlling a large number of addresses from a given /16 range does increase chances of being picked even if other nodes will only make one connection to that range.

Gregory Sanders · #13 ·

FWIW they don’t seem to be advertising with the custom subver anymore. Also they’re having major latency issues.

Antoine Poinsot · #14 · · in reply to #12

I discussed this with a few people out of band, but just to share here this explains why we are seeing so many peers connect to the Bitprojects guy. My previous assumption on how this logic works:

Was incorrect, as Martin explained above. So it seems that if he was controlling just a few more /16’s, as well as a few thousands more “node” IPs then he would have a decent chance of eclipsing a node.

I find it surprising that AddrMan doesn’t work the way i expected it to, because it would make the probability of controlling all of a node’s outbound connections decrease exponentially in the number of connection slots. As far as i understand (and what i got from a quick discussion at the office) this is due to architectural limitations in AddrMan’s implementation. I’ve started looking into what it would take to implement what i suggest.

Gregory Sanders · #15 · · in reply to #14

This seems quite problematic and defeats almost any gains asmap affords?

Fabian Jahr · #16 · · in reply to #15

So it seems that if he was controlling just a few more /16’s, as well as a few thousands more “node” IPs

FWIW, getting control of a /16 and all its IPs costs millions of USD. But using IPv6 should make this much easier to scale.

This seems quite problematic and defeats almost any gains asmap affords?

Why would it defeat all the gains? You can easily get hundreds of IPs across 13 different /16 on AWS or any other larger hoster. Getting many ASNs and making hundreds of IPs available through them is a much higher bar. Also, there are less than 100k ASNs in use in global routing and getting a large number of them without a legitimate use-case would a considerable bureaucratic hurdle.

Antoine Poinsot · #17 · · in reply to #16

The issue is that with the current peer selection algorithm you don’t need a large number of them, just as many as we make outbound connections by default, or slightly more. The bitprojects guy already controls 12 /24’s spread across /16 boundaries and 3 or 4 AS’s. It does not seem completely unrealistic to me that he would be able to spin up a large number of (maybe fake) nodes in more than 10 net groups (either /16’s or AS’s).

Fabian Jahr · #18 · · in reply to #17

you don’t need a large number of them

more than 10 net groups

And I am saying that 10 is a large number for ASNs at least relatively speaking. There are 2^96 /32s in IPV6 almost all available to use if you just put down a little bit of money.

b10c · #19 ·

An updated screenshot of my dashboard:

b10c · #20 ·

A lot less outbound connections to bitprojects at the moment but they seem to be still active.

Antoine Poinsot · #21 ·

Looks like they have now switched to “signal” for BIP 110 in their subver. :man_facepalming:

Will Clark · #22 · · in reply to #21

Looks like they have now switched to “signal” for BIP 110 in their subver. :man_facepalming:

These (sybil) nodes make up 92% of the “good” BIP110 nodes my bitcoin seed/crawler knows about: Bitcoin DNS Seeder Analysis

b10c · #23 ·

On 2026-03-24 at around 9:20 UTC one of my nodes made five outbound connections to bitprojects nodes. It didn’t have any before. These connections are still active.

I have logs for this, so I can investigate a bit (when I find the time to do so) why exactly this happened.

edit: I had a brief look at the logs. It turns out the node had a brief network disconnect due to datacenter maintaince, lost all it’s peers, and when it came back, it choose to open 5 outbound connection to bitprojects…

Joe Bp · #24 · · in reply to #23

greetings all, i’m the guy that was running this

update: all of these nodes are now shut down and will not return – intended outcome has been reached, proved the point, and it seems like everyone who needs to understand the severity/risk does see it now.

lmk any questions.

btw this entire infra I stood up cost about $2k/mo

Joe Bp · #25 · · in reply to #24

Last stats before everything was shut down:

=== Inbound TCP/8333 (bitcoin) Connection and Network Stats ===
Total unique destination IPs: 3042
Total unique destination /24 subnets: 12
Total destination subnets sharing /16 boundary: 0
Total ASNs: 3 <<< BTW this defeats asmap in current state
Total subnets advertised per ASN: 4
Total inbound connections: 80526
Total unique source IPs: 35127
=== Source IP Connection Thresholds ===
Source IPs with 8+ connections: 653
Source IPs with 10+ connections: 433
Source IPs with 12+ connections: 307
Source IPs with 16+ connections: 178
Source IPs with 32+ connections: 38
Source IPs with 64+ connections: 14
Source IPs with 512+ connections: 0
Source IPs with 2048+ connections: 0

b10c · #26 ·

I tend to agree. Thanks.

Since Bitcoin Core nodes make by default 8 outbound-full-relay and 2 block-relay-only connections, I’m assuming every source with more than 10 connections is either a custom client trying to mass-connect to all IPs or multiple Bitcoin Core nodes making connections from the same host / IP.

This still leaves us with 220 nodes potentially making 8+ connections to you. The highest I’ve seen personally is 6 connections to bitprojects for a short while, which is still worrying.

Joe Bp · #27 ·

Yeah this is why I split out these connection counts in this way. There were dozens of subnets and single IPs that spun up hundreds or thousands of connections, so I automated null routing those sources once crossing the 1024 threshold.

so at any point in time I believe there were hundreds of nodes that -only- connected to me, and that doesn’t sound good.

when the infra ran uninterrupted for 60+ days these single source counts were double or higher.

I should not be able to do something like this for $2k/mo.

Joe Bp · #28 · · in reply to #18

@fjahr ASNs are incredibly easy to justify approval for from the RIRs, and cost about $500 each for the higher numbers if buying, less if the RIR is assigning them. Getting dozens of them is easy. Even easier if an attacker is willing to spin up multiple legal entities and set up org accounts w/ the RIRs.

Separately on the IP side, renting/leasing IP space in /24 blocks costs about $0.30-0.40/mo per IP when rented from a third party/non carrier. Even less cost when you’re willing to rent poor reputation IPs, which bitcoin does not care about.

I intend to spin up some ways to pull down the full BGP routing table via API (will also put the code on github, pulls from FRR, can be spun up on cloud providers that support BGP), I think it would be useful to query the full AS path of a given node and use that for warnings. In the case of what I stood up, all of the ASNs and subnets shared common AS path ASNs.

b10c · #29 ·

Linking to Steep increase in inbound connections on 2026-03-31 at 00:12 UTC here. Seems like @bitprojects shutting down the nodes caused a lot of nodes to look for new outbound peers at the same time.

Antoine Poinsot · #30 ·

Related to this topic, I opened an issue on the Bitcoin Core repository back in December about updating our peer selection algorithm to be more robust against an attacker “simply” spinning up a high number of nodes across a small number of net groups.

If there is renewed interest in addressing these concerns, i would welcome some feedback there.