-
br-m
<rucknium> MRL meeting in this room in two hours.
-
br-m
<rucknium> Meeting time!
monero-project/meta #1466
-
br-m
<vtnerd> hi
-
br-m
<rucknium> 1. Greetings
-
br-m
<jberman> waves
-
rbrunner
Hello
-
MarkoPohlo
Hi
-
plowsof
hi
-
br-m
<jpk68:matrix.org> Hello
-
br-m
<jeffro256> Howdy
-
br-m
<gingeropolous> howdy doo
-
br-m
<rucknium> 2. Updates. What is everyone working on?
-
br-m
<sgp_> Hello
-
br-m
<rucknium> me: Analyzing defenses against Shi et al. (2026) "Are Unreachable Nodes Truly Safe? Fully Eclipsing Monero’s P2P Network!" (
arxiv.org/pdf/2609.10260)
-
br-m
<jeffro256> me: The version compatability testing framework, prepping beta v3 stressnet, working through FCMP++/Carrot bug reports
-
br-m
<jberman> me: we released beta stressnet v3, and I opened all PR's for Phase 3 of the FCMP++ integration audit which includes all code necessary to verify FCMP++ txs at consensus to prevent inflation. Here is the final consensus verification integration PR:
monero-project/monero #11440
-
br-m
<vtnerd> me: some lws bugs, going to finish updating the ssl patch today, and then making sure all of the lws+lwsf fcmp++ changes are ready
-
plowsof
a look at the monero network. as i host 3 seed nodes a small window of unreachable nodes are found - from this an estimation of the entire network is made which gets better over time.
observer.monerodevs.org
-
br-m
<gingeropolous> me: native mining in monerosim evolving into selfish mining experiments and mitigations, and trying to build a stressnet data capture apparatus.
-
plowsof
an active peer list poisoning is observed coming from Peg Tech
-
br-m
<jpk68:matrix.org> Me: finishing up the I2P SAM integration work
-
br-m
-
br-m
<jberman> On upstream FCMP++ integration, repeating from above I opened all PR's for Phase 3 of the FCMP++ integration audit which includes all code necessary to verify FCMP++ txs at consensus to prevent inflation. Here is the final consensus verification integration PR:
monero-project/monero #11440
-
br-m
<jberman> Next I'll write up a draft to include in a request for quotes on audit phases 2 & 3, as proposed by @sgp_:monero.social last week
-
br-m
<jeffro256> Is tobtoht back yet?
-
br-m
<jeffro256> Still waiting on mx25519 issues to resolve as a prereq to carrot_core.
-
br-m
<jberman> To be clear, phase 2 integration PR's have already been merged. Phase 3 PR's are now open for review as linked above. It's my opinion we can proceed with reviews (and merges) today in parallel to the audits
-
MarkoPohlo
Is the request for quotes process (audit phases 2 & 3) currently live and if so, how does participation in that normally look like?
-
br-m
<vtnerd> I think the mx25519 pr is ready, was there something else?
-
br-m
<jeffro256> Licensing
-
br-m
<jberman> MarkoPohlo: It's not currently live. We ( @sgp_:monero.social ) sends out emails to different firms with information on scope and requests a quote, then we discuss quotes received in here and settle on a candidate
-
br-m
<sgp_> MarkoPohlo: no it is not yet live. Sign up for the RFQ newsletter here to be notified:
listmonk.magicgrants.org/subscription/form
-
MarkoPohlo
Appreciate the explanation, we (Runtime Verification) would love the chance to participate in the process.
-
br-m
<sgp_> You are welcome to, and I am excited to receive your proposal
-
br-m
<jberman> On Research audit items: Least Authority privately shared their final report on helioselene (still looking it over internally), and is also the firm we're slated to kick off the 2nd round of audits on the cirtcuit and gadgets impl & 1st round on fcmp-plus-plus lib
-
br-m
<jberman> UkoeHB is rebasing the FCMP++ & Carrot multisig impl onto the latest fcmp++-stage development branch. That's a major feature item on the TODO list
-
br-m
<jberman> I'd say our likely biggest bottleneck going forward is getting code merged upstream. So, requesting reviews on the FCMP++ integration PR's linked here to get that going:
monero-project/monero #11440
-
br-m
<jberman> that's all from me
-
br-m
<rucknium> Thank you. Anything else on this topic from anyone?
-
br-m
<rucknium> (stressnet is next)
-
br-m
-
br-m
<jeffro256> Beta v3 is released!
-
br-m
<jberman> you can download the software to participate here:
github.com/seraphis-migration/monero/releases
-
br-m
<jeffro256> v17 fork is at height 3102800
-
br-m
<gingeropolous> im trying to organize data capture and measurement effort
-
br-m
<gingeropolous>
seraphis-migration/monero #495 - please comment
-
br-m
<rucknium> How much is the bot borrowing from my
github.com/Rucknium/monerod-monitor ? :D
-
br-m
<gingeropolous> i didn't point it at it. But that just seems to be for an individual's node?
-
br-m
<rucknium> Isn't your prpoposal also for an individual's node?
-
br-m
<gingeropolous> yes, but it will push data to a central data collector, and log the generation of txs from the spam generator (on the MRC), etc.
-
br-m
<rucknium> Anyway, not very important. I notice the issue says that the data will be in an R-compatible format. That's good. Well, most data formats are R-compatible because there are packages to read everything.
-
br-m
<rucknium> The UI part of my monitor is very slow. I'm not happy about that.
-
br-m
<rucknium> Anything more on stressnet?
-
br-m
<jberman> nothing from me
-
br-m
<jeffro256> I'm done
-
br-m
<rucknium> 5. Relative locks with FCMP++ (
monero-project/research-lab #161).
-
br-m
<rucknium> Any discussion of this item?
-
br-m
<rucknium> Should I take this item off the agenda until someone brings it up again?
-
br-m
<jberman> sure
-
br-m
<rucknium> 6. Shi et al. (2026) "Are Unreachable Nodes Truly Safe? Fully Eclipsing Monero’s P2P Network!" (
arxiv.org/pdf/2609.10260)
-
br-m
<rucknium> I have some graphs for you! AFAIK, IRC side can get links to images. Let me know if IRC can't see the images and I will post them somewhere on the web.
-
br-m
<rucknium> I've run monerosim simulations. They are 26 hour runs. 1,200 honest monerodnodes and 1,000 adversary "nodes" (actually just lightweight py-levin processes). I set the "burn in" time to 14 hours so honest nodes have time to find each other and fill their peer lists. Then the adversary attacks for 12 hours. All the honest nodes are reachable except for one, the "target" unreachable node.
-
br-m
<rucknium> In theory, all unreachable nodes should be affected the same way. We just don't have more because running more nodes will start to exhaust machine RAM.
-
br-m
<rucknium> One simulation has all honest nodes running the v0.18.5.1-release. The other has them running v0.18.5.1-release, modified by my proposed patch:
gist.github.com/Rucknium/fd57fd99fc9bc985d671a6ce96cc668e
-
br-m
<rucknium> I will explain the purpose of the patch after a few graphs. First, the big result.
-
br-m
<rucknium> By the way, this is preliminary findings. I will need to double-check everything to make sure there are no issues.
-
br-m
-
plowsof
DataHoarders bridge is working , IRC can see the images
-
br-m
<rucknium> This graph shows that the adversary can nearly eclipse the unreachable node running the unmodified v0.18.5.1, occupying 11 of 12 outbound connections. My proposed patch defeats the attack.
-
br-m
<rucknium> Thanks for checking, plowsof
-
br-m
<rucknium> How does the attack work? First, the adversary peers poison the white_list of the reachable nodes.
-
br-m
-
br-m
<rucknium> When the attack launches in the status quo network (top plot), the adversary peers push the honest peers out of the reachable nodes' white lists because there are only 1,000 slots in the white list.
-
br-m
<rucknium> When a new peer is inserted into the white-list that would take it beyond its size limit, the honest node drops the "oldest"-seen peer from the white_list
-
br-m
<rucknium> On the bottom you see that no honest peers are dropped. I will come back to that.
-
br-m
<rucknium> The honest reachable nodes then infect the unreachable nodes' peer lists. Unreachable nodes get their peer lists from reachable nodes. So the unreachable nodes keep asking the reachable nodes for their now-poisoned whitelists.
-
br-m
-
br-m
<rucknium> In the top plot there you'll see that by the end of the simulation, the honest unreachable nodes still have a majority of their white_list occupied by honest reachable peers. So why do they get eclipsed?
-
br-m
<rucknium> IMHO, it's a product of some "interesting" design decisions in the connection selection logic.
-
br-m
<rucknium> Those decisions are why just increasing the white_list size limit is not enough.
-
br-m
<rucknium> The next image has a violin plot (
en.wikipedia.org/wiki/Violin_plot). It's a distribution density plot turned on its side.
-
br-m
-
br-m
<rucknium> This shows from where nodes are selecting their next connection. Every 101 seconds, a node will drop one of theour outbound connections and choose one to replace it.
-
br-m
<rucknium> There's a lot going on in this graph.
-
br-m
<rucknium> The top part shows the position, ordered by last_seen where the node selects its next connection from the white_list
-
br-m
<rucknium> The vertical axis is in log scale
-
br-m
<vtnerd> doesn’t this diff you sent change the bootstrap process? or I guess the idea is just wait until the graylist housekeeping runs?
-
br-m
<rucknium> Usually, the node selects from very recently-seen peers as its next connection.
-
br-m
<vtnerd> because theres now a bias towards whitelist, which I guess is needed given your results
-
plowsof
Peg Tech are currently flooding gray lists (800~ips with many ports totalling 4k~ entries circulating. its a proxy network known for facilitating ddos attacks (
qurium.org/alerts/denial-of-service…ced-to-yet-another-proxy-provider-2)
-
br-m
<rucknium> Exactly.
-
br-m
<rucknium> ^ Look carefully at the slope of the honest.peers line in the two scenarios. The honest nodes' white_lists fill more slowly with my patch. > <@rucknium>
mrelay.p2pool.observer/m/monero.social/XfXqdmLKCYkFSqJrBLglvfhJ.png (white_list_reachable.png)
-
br-m
<rucknium> AFAIK, there are three ways a peer gets into the white_list:
-
br-m
<rucknium> 1. A reachable node connects to me
-
br-m
<rucknium> 2. I perform gray_list housekeeping (promotes a reachable node to the white_list, but doesn't establish a connection)
-
br-m
<rucknium> 3. Directly promotes a peer from gray_list to white list when selecting from gray_list for the next connection.
-
br-m
<rucknium> My patch reduces the probability that (3) happens, so the white_list filling is slower, but not too slow IMHO.
-
br-m
<jeffro256> Does the patch touch the quadratic probability distribution used to pick very recent white list peers ?
-
br-m
<rucknium> The status quo logic first tries to connect to a gray list peer. If there are 3 failures, then it tried the white list up to three times.
-
br-m
<rucknium> @jeffro256: Yes. It gets rid of it
-
br-m
<rucknium> "Mister Chesterton, tear down this fence."
-
br-m
<jeffro256> Cool, I always thought that it was a bad idea
-
br-m
<jeffro256> Even without active attackers, it felt centalizing
-
br-m
<jeffro256> But I never deep dived into it
-
rbrunner
That survived the last peer selection code update, from me and Rucknium :)
-
rbrunner
Maybe now its days are numbered
-
br-m
<rucknium> My patch simplified the logic a lot. It eliminates the "quadratic" recent distribution and does not have a split logic flow when the node has greater than or less than 8 outbound connections.
-
br-m
<rucknium> I didn't want to touch that logic in the /24 subnet deduplication PR because of the Chesterton Fence logic. But it's a clear danger now.
-
plowsof
peer list spammers are being tracked currently at
observer.monerodevs.org
-
br-m
<rucknium> Biasing your connection selection to pull from the gray list gives the adversary an advantage because the gray list can be dominated and manipulated by adversaries more easily than the white list.
-
br-m
<rucknium> So I decided to first pull from the white list instead
-
br-m
<rucknium> And selecting only recently-seen peers from the white list makes it difficult to get out of the clutches of an adversary if you find yourself there.
-
br-m
-
br-m
<rucknium> This is that same graph, but with the proposed defense patch. Almost no draws from the gray list. And the draws from the white list are spread uniformly (note the log vertical scale on the top plot).
-
br-m
<rucknium> I don't have these graphs for the unreachable node because monerosim didn't save the info. (need to fix that). But the logic is there.
-
br-m
<gingeropolous> blargh
-
br-m
-
br-m
<rucknium> 1. Increase the white_list limit to 10,000 so adversary peers cannot push out honest peers
-
br-m
<rucknium> 2. Try to draw from the white_list first instead of the gray_list
-
br-m
<rucknium> 3. When drawing from the white_list, select in a uniform random manner from the whole white_list instead of just recently-seen peers.
-
br-m
<rucknium> 10,000 is arbitrary, but I have an idea of how to decide a not-arbitrary limit. Not sure if it makes sense to go into that detail here.
-
br-m
<rucknium> IMHO, the Nyx eclipse attack is a serious concern. I would support putting a defense patch into the next monerod release.
-
br-m
<rucknium> More defenses can be put in there, but just these changes mostly defeat the attack.
-
br-m
<rucknium> Discussion? Questions?
-
br-m
<jeffro256> If we could get a ground truth value for the number of reachable nodes IRL, I think setting the whitelist limit to approximately that value would make the most sense. But that's just me spit balling > <@rucknium> 10,000 is arbitrary, but I have an idea of how to decide a not-arbitrary limit. Not sure if it makes sense to go into that detail here.
-
br-m
<rucknium> By the way, I tried subsets of the reforms in monerosim, but I needed all three to get the proper defense.
-
br-m
<vtnerd> my only concern is that this doesn’t distribute the load properly, because it no longer aggressively selects from graylist. otoh, there’s already a routine to move nodes into whitelist
-
rbrunner
No question, but just have to say I admire your work
-
br-m
<vtnerd> the recently seen bias is likely a good change
-
plowsof
ive observed 4-3k reachable the past few days
-
br-m
<rucknium> Thanks. Couldn't have done it without @gingeropolous:monero.social 's work on monerosim. Or Shi et al. for raising the issue.
-
rbrunner
Yes, it's really nice how sometimes everything flows together nicely
-
br-m
<rucknium> @vtnerd:monero.social: IMHO, it would be a good idea to mathematically formalize the peerlist system. Once formalized, one could try to prove that the system has some properties. Hopefully, good security properies.
-
rbrunner
Doesn't this diminish the importance of the grey list quite a bit?
-
br-m
<rucknium> There is a flow of addresses around the network, from reachable to unreachable, from new to old. How does that happen? It could be formalized IMHO.
-
br-m
<jeffro256> Have you looked into simulating new attacker models for which the proposed defense would do worse?
-
br-m
<rucknium> Yes, but graylist is where "There be dragons"
-
rbrunner
I see.
-
br-m
<rucknium> @jeffro256:monero.social: No. The weakness in the analysis is that the attacker's strategy is the same for both scenarios.
-
br-m
<rucknium> But some of Shi et al.'s suggestions were incorporated into my defense.
-
br-m
<rucknium> Since at least early last year, the Shi et al. research team has suggested that white list limit be raised.
-
br-m
<rucknium> Graylist should be untrusted because nothing there is verified (potential addresses there are put into the white_list when verified). And adversaries can push up to 250 new addresses there per Levin handshake.
-
br-m
<rucknium> By "verified" I mean check that there is actually a reachable node at that address:port.
-
br-m
<vtnerd> yeah Im liking the change more. that flipped logic to pull from graylist is funky. wish we had someone to describe the reasoning (assuming there was any)
-
br-m
<vtnerd> presumably it was done to prevent concentration amongst a small number of peers, but the other logic to prefer recently connected suggests against that
-
br-m
<rucknium> When rburnner and I looked at it last year, it was interesting to me that the logic pulled in two different directions with respect to "recent" peers. I thought maybe it was OK like it is, because it was "balanced".
-
br-m
<rucknium> But in the end it was vulnerable.
-
br-m
<rucknium> I'm going to ping @boog900:monero.social in case he wants to comment.
-
br-m
<rucknium> My next step is to make a PR with the patch and the analysis I explained here. The full patch will remove dead logic, too.
-
br-m
-
br-m
<vtnerd> I believe the original logic was to attempt one whitelist, then grey each time
-
br-m
<vtnerd> whereas this add the while loop
-
br-m
<vtnerd> the original code may have been worse actually
-
br-m
<rucknium> Anything else on this topic for now?
-
br-m
<rucknium> We can end the meeting here. Thanks everyone.
-
br-m
<ofrnxmr> Thanks ruck