VYPR
Moderate severityNVD Advisory· Published Feb 19, 2026· Updated Feb 20, 2026

Go Ethereum Improperly Validates the ECIES Public Key in RLPx Handshake

CVE-2026-26315

Description

go-ethereum (Geth) is a golang execution layer implementation of the Ethereum protocol. Prior to version 1.16.9, through a flaw in the ECIES cryptography implementation, an attacker may be able to extract bits of the p2p node key. The issue is resolved in the v1.16.9 and v1.17.0 releases of Geth. Geth maintainers recommend rotating the node key after applying the upgrade, which can be done by removing the file <datadir>/geth/nodekey before starting Geth.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
github.com/ethereum/go-ethereumGo
< 1.16.91.16.9

Affected products

1

Patches

1
46bee92f9e64

crypto/ecies: fix ECIES invalid-curve handling (#33669)

https://github.com/ethereum/go-ethereumfengjianJan 29, 2026via ghsa
2 files changed · +60 0
  • crypto/ecies/ecies.go+3 0 modified
    @@ -124,6 +124,9 @@ func (prv *PrivateKey) GenerateShared(pub *PublicKey, skLen, macLen int) (sk []b
     	if prv.PublicKey.Curve != pub.Curve {
     		return nil, ErrInvalidCurve
     	}
    +	if pub.X == nil || pub.Y == nil || !pub.Curve.IsOnCurve(pub.X, pub.Y) {
    +		return nil, ErrInvalidPublicKey
    +	}
     	if skLen+macLen > MaxSharedKeyLength(pub) {
     		return nil, ErrSharedKeyTooBig
     	}
    
  • p2p/rlpx/rlpx_oracle_poc_test.go+57 0 added
    @@ -0,0 +1,57 @@
    +package rlpx
    +
    +import (
    +	"bytes"
    +	"errors"
    +	"testing"
    +
    +	"github.com/ethereum/go-ethereum/crypto"
    +	"github.com/ethereum/go-ethereum/crypto/ecies"
    +)
    +
    +func TestHandshakeECIESInvalidCurveOracle(t *testing.T) {
    +	initKey, err := crypto.GenerateKey()
    +	if err != nil {
    +		t.Fatal(err)
    +	}
    +	respKey, err := crypto.GenerateKey()
    +	if err != nil {
    +		t.Fatal(err)
    +	}
    +
    +	init := handshakeState{
    +		initiator: true,
    +		remote:    ecies.ImportECDSAPublic(&respKey.PublicKey),
    +	}
    +	authMsg, err := init.makeAuthMsg(initKey)
    +	if err != nil {
    +		t.Fatal(err)
    +	}
    +	packet, err := init.sealEIP8(authMsg)
    +	if err != nil {
    +		t.Fatal(err)
    +	}
    +
    +	var recv handshakeState
    +	if _, err := recv.readMsg(new(authMsgV4), respKey, bytes.NewReader(packet)); err != nil {
    +		t.Fatalf("expected valid packet to decrypt: %v", err)
    +	}
    +
    +	tampered := append([]byte(nil), packet...)
    +	if len(tampered) < 2+65 {
    +		t.Fatalf("unexpected packet length %d", len(tampered))
    +	}
    +	tampered[2] = 0x04
    +	for i := 1; i < 65; i++ {
    +		tampered[2+i] = 0x00
    +	}
    +
    +	var recv2 handshakeState
    +	_, err = recv2.readMsg(new(authMsgV4), respKey, bytes.NewReader(tampered))
    +	if err == nil {
    +		t.Fatal("expected decryption failure for invalid curve point")
    +	}
    +	if !errors.Is(err, ecies.ErrInvalidPublicKey) {
    +		t.Fatalf("unexpected error: %v", err)
    +	}
    +}
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

7

News mentions

0

No linked articles in our index yet.