[Hardening] Validate legacy block_headers length before slicing (F-007)

Abierto Apto para principiantes
#236 0 comentarios 0 reacciones 0 asignados Ver en GitHub

@notmandatory ya está trabajando en esto.

Desde el 9/11/2026.

  • #238 de @notmandatory — abierto

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
78/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
rust

Línea de trabajo

Empieza en las líneas 1062–1068 de raw_client.rs en la revisión afectada y sigue el procesamiento de la respuesta heredada de blockchain.block.headers para el protocolo 1.4. Comprueba cómo se usan la longitud de los encabezados decodificados y count antes de dividirlos en segmentos, y añade pruebas de regresión para encabezados vacíos y truncados, así como para recuentos que no coinciden. El objetivo se cumple cuando las respuestas malformadas devuelven un error de protocolo sin provocar un panic, y una respuesta válida de encabezados sigue funcionando.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

bug

Summary

In rust-electrum-client 0.25.2 (reported upstream commit 7c1d759e2789b5e46fcae1525ab06ff4012bc668), the pre-1.6 legacy response path for blockchain.block.headers trusts the server-controlled result.count and slices the decoded header bytes in fixed 80-byte chunks without validating the available length. A malicious or compromised Electrum server (or an attacker able to alter the Electrum connection) can make a release build panic, causing client/wallet availability loss.

Reproduction

  1. Build the client in release mode.
  2. Connect to a mock TCP Electrum server.
  3. Negotiate protocol version 1.4.
  4. Return this response to blockchain.block.headers:
{"jsonrpc":"2.0","id":1,"result":{"count":1,"max":8,"hex":""}}

Observed:

range end index 80 out of range for slice of length 0

A negative control containing one valid 80-byte header with count=1 returns normally. A count=3 response containing only one header panics at the second slice.

Source

Reported source location: raw_client.rs lines 1062–1068 (in the affected revision).

Suggested hardening

  • Validate the decoded header byte length (and its consistency with count) before fixed-size slicing.
  • Return a normal protocol error on mismatch instead of panicking.
  • Add regression tests for empty/truncated headers and mismatched counts.

This is a hardening issue: the demonstrated impact is availability loss in release mode; no fund or privacy compromise was observed.

Lenguaje dominante
Rust
Estrellas
89
Forks
87
Merge medio
1 h 25 min
PR fusionados (30 d)
4

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de bitcoindevkit/rust-electrum-client

Todos los issues de bitcoindevkit/rust-electrum-client

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.