News

Un input de splice que decía pertenecer a un solo lado

El 21 de agosto de 2026 LDK integró una corrección en la negociación de un splice. Presentar el input compartido del canal como propio acreditaba al otro lado un dinero que no había aportado, y la transacción se firmaba igual.

4 min de lecturaSplicing
Un input de splice que decía pertenecer a un solo lado

Qué pasó

El 21 de agosto de 2026 el Lightning Development Kit integró dos commits que hacen que un nodo rechace un input de splice presentado como propio de un solo par cuando pertenece a los dos. El primero describe el problema con sus propias palabras: "Un iniciador malicioso de splice puede codificar el outpoint de financiación compartido esperado usando prevtx y omitiendo shared_input_txid. El receptor contabiliza entonces toda la salida de financiación anterior como propiedad del iniciador, lo que permite que salidas adicionales del iniciador consuman el presupuesto de comisión previsto para la transacción sin dejar de pasar la comprobación de tasa por parte" (commit 972a25c1). El commit atribuye el reporte al Bitcoin Red Team.

Qué cambia

Un splice redimensiona un canal Lightning sin cerrarlo. La transacción de splice gasta la salida de financiación actual del canal y paga a una nueva de otro tamaño. Esa salida de financiación es un 2-de-2, así que es el único input que ambos pares tienen que firmar: el input compartido.

Los dos pares construyen la transacción juntos, cada uno añadiendo inputs y salidas, y BOLT 2 reparte la cuenta. El iniciador paga por los campos comunes; "el resto de los bytes de la transacción son responsabilidad del par que aportó ese input o esa salida". Al terminar el intercambio, cada lado revisa al otro y debe abortar si "la tasa pagada por el par no alcanza o supera la feerate acordada", o si los inputs del par valen menos que sus salidas.

El input compartido se anuncia de forma distinta a uno propio. El iniciador "DEBE añadir el input del canal actual a la transacción de splice enviando tx_add_input con shared_input_txid" y "NO DEBE incluir prevtx para ese input compartido", porque prevtx existe para probar el valor y el script de un input que el receptor nunca ha visto, y ambos lados ya conocen su propia salida de financiación.

LDK leía primero la otra rama de ese mensaje. Un input con prevtx y sin shared_input_txid se tomaba como propiedad exclusiva de quien lo enviaba, apuntara a donde apuntara, de modo que un iniciador que enviase la transacción de financiación anterior completa quedaba acreditado con todo el saldo del canal, incluida la mitad del receptor. Ese crédito de más es el que pagaba las salidas propias del iniciador mientras su aritmética seguía cuadrando.

La firma seguía a la transacción y no a la negociación. Al construirla, LDK localizaba el input compartido buscando el outpoint de financiación, "con independencia de cómo se hubiera contabilizado ese input durante la negociación" (commit 65ca961e), así que el receptor ponía su clave sobre el input que acababa de anotar como ajeno. El resultado "puede por tanto quedar completamente firmado y ser válido según consenso mientras paga menos que la comisión negociada". La corrección rechaza un prevtx que nombre el outpoint de financiación compartido, y toma el input compartido de cómo lo clasificó la negociación.

Qué no cambia

No es una vía hacia el saldo del canal. Lo que gana el iniciador es el presupuesto de comisión: la transacción confirma a una tasa menor que la acordada por ambos lados, y hasta que confirme el canal queda a medio splice. Eso es un coste real y no es un robo de los fondos de la contraparte, y el mensaje del commit no afirma nada más.

Solo alcanza a nodos que aceptan splices de pares en los que no tienen motivo para confiar. LDK lo condiciona a UserConfig::reject_inbound_splices, que existe desde que el splicing llegó en la versión 0.2, el 2 de diciembre de 2025.

No arregla nada de lo que hay instalado. Los commits están en la rama principal de desarrollo, que lleva la versión 0.3.0. Ni la rama 0.3 ni la rama 0.2, cuya publicación más reciente es la 0.2.5 del 4 de agosto de 2026, los contienen, y la misma rama sin protección de prevtx sigue en el código de 0.2. Y no dice nada sobre las demás implementaciones: cada una ha escrito su propia construcción interactiva de transacciones, y un fallo en una no es prueba sobre las otras.

Contexto

El splicing es joven y la complejidad está exactamente en esta maquinaria. La propia serie 0.2 de LDK ya traía una corrección del mismo vecindario: un canal con saldo exactamente cero y comisiones de compromiso a cero permitía que "la contraparte sacase todo su saldo mediante un splice, incumpliendo los requisitos de reserva que en otro caso estaría obligada a mantener".

El otro patrón que merece atención es quién lo encontró. Las mismas notas de versión que incluyen esa corrección agradecen a Project Loupe los problemas de seguridad reportados, y este commit acredita al Bitcoin Red Team. Las implementaciones de Bitcoin se están leyendo a un ritmo al que no se habían leído antes, y el resultado visible es una cola de parches pequeños, concretos y bien descritos, no un incidente. El límite de LND a la memoria del gossip llegó del mismo modo a principios de este mes: no eran fondos, sino algo que un nodo estaba haciendo y no debía.

Etiquetado

Boletín

Bitcoin, sin ruido

Qué ha pasado en Bitcoin, qué cambia de verdad, y las fuentes para que puedas comprobarnos. Un número cada vez, directo a tu correo.

  • Un correo por número, nunca una secuencia automática
  • Sin píxeles de seguimiento y sin compartir direcciones
  • Baja desde cualquier número con un clic

Recibe el próximo número

Un correo por número, sin píxeles de seguimiento, y te puedes dar de baja desde cualquiera de ellos. No compartimos tu dirección. Política de privacidad