Skip to content

Build1 publisher2 min readPublished

Radicle's node-to-node transport moves private repository objects in the clear

Two flaws disclosed on September 23rd let anyone on the network path read repository objects in transit, and let a connecting peer claim a Node ID it does not own. Radicle tells users to treat anything already sent as leaked.

The Engineer · Build desk

Illustration accompanying Radicle's node-to-node transport moves private repository objects in the clear

What happened

  • Radicle told users on September 23rd to stop using private repositories over its peer-to-peer network, disclosing two vulnerabilities that affect every released version.
  • The disclosure says node-to-node traffic is sent without encryption, so anyone able to observe the network path between two nodes can read the data in transit.
  • Radicle says repository contents are still authenticated through Git objects and Signed References, and that the flaws do not let an attacker forge code or identities.

Compiled by The EngineerSomething wrong?How this is made

Why it matters

  • cost Every credential, key or token committed unencrypted to a private repository that was ever sent to another node needs rotating, and stopping the node does not retrieve the copies other peers already fetched.
  • constraint The usual tunnel answer does not close this. Radicle says VPNs, Tor and I2P do not repair peer authentication, and Maninakis offers his own tunnel only as protection for one hop.
  • decision Operators who changed a node's default seeding policy to allow have to reach for rad block <RID>, because Radicle says rad unseed is less reliable on those nodes.
  • precedent Fixing confidentiality means swapping the custom Noise protocol for iroh, and by runtimewire's account that upgrade divides nodes that take it from nodes that do not.

Konstantinos Maninakis was building Grove, a browser-based Radicle node, and implemented the protocol in TypeScript. His correctly encrypted implementation could not communicate with live Radicle nodes, so he inspected the traffic, and that is how he found the cleartext behaviour, according to his technical account [16]. He reported it on June 24th [15]. Radicle credits Maninakis and a second reporter identified as "cryptocode", and says the peer-impersonation report arrived on August 12th [17]. The notice went out 91 days after the first report and 42 days after the second [23][24].

The two flaws compose in a specific order. An observer on the path can see the Node IDs at both ends of a connection and use one of them to request the repository later [5]. That request works because a connecting peer can claim a Node ID that is not its own [3], and because the fetch list for a private repository is a list of allow-listed IDs [4]. Radicle says the allow-list is not public, which makes impersonation harder for anyone without that vantage point [6]. For the observer already positioned on the path, the notice says no repository setting or allow-list protects the data [7].

Replication is the design. Repositories live on peers instead of behind one company's hosting service, and the access list decides which peers can fetch [20]. That list controls access, and the disclosure says it does not protect data moving between authorized peers [20]. Authenticating contents does not stop an observer from reading them [8].

Radicle's instruction is to treat any private repository previously transmitted to another node as leaked [9]. An owner who wants to know which peers already fetched a given repository will not find that in the notice.

The planned fix replaces Radicle's custom Noise-based networking protocol with iroh, an open-source peer-to-peer networking stack [18]. The whole function of this network is peers fetching from peers, and the swap changes the transport they do it over [20].

Diakomichalis and Sellier founded Berlin-based Monadic GmbH in January 2018 to pursue what Radicle's project history calls a "sovereign developer stack" [21], and the network was built so developers could collaborate without a central host [22]. Radicle wrote its own transport, so its defaults are Radicle's to answer for. In my view the honest description of a Radicle private repository today is a repository with a fetch allow-list and no transport secrecy [20]. The advice to treat what was already sent as leaked follows from that design and not just from these two bugs [9].

What to watch

  • Whether the iroh transport ships with a cutover plan for nodes still speaking the Noise-based protocol.
  • Whether Radicle updates the disclosure with a way for an owner to see which peers fetched a private repository.
  • Whether Grove, the browser node whose encrypted implementation could not talk to the network, works against the new transport.
Loading claim ledger
Loading source directory links
Loading share composer
Loading topic controls
Loading related stories