Hosted on hyper.media via the Hypermedia Protocol.
En Bitcoin, normalmente bloqueas tus fondos de tal manera que solo pueden ser gastados si aportas una firma digital válida que se vincula a todas las partes de la transacción (te voy adelantando que mejor que sea así).
Sin embargo, en Bitcoin también puedes gastar tus fondos aportando una firma digital que no se vincula a todas las partes de la transacción o incluso puedes gastarlos sin utilizar firmas digitales si así fue definido en el script de bloqueo de los fondos.
En ambos casos, esto puede dar lugar a situaciones en las que tus bitcoin son como un billete de 50€ abandonado en plena calle y al alcance de cualquiera.
Es decir, no es que te los estén robando, sino que nunca los protegiste correctamente.
Para evitar que esto te ocurra, he listado posibles situaciones en las que tus fondos bitcoin se harían vulnerables:
1. SINGLE|ANYONECANPAY con Qty Input > Qty Output
El indicador SigHash SINGLE|ANYONECANPAY es sin lugar a duda, uno de los más interesantes por su versatilidad y por las vulnerabilidades que puede provocar. Tanto, que aparece dos veces en esta lista.
Este indicador firmará el input en cuestión y el output con el mismo índice que el input; además permitirá que se puedan añadir otros inputs, lo que resulta en que tanto los outputs no firmados como los inputs no firmados sean modificables.
En una transacción sin confirmar, si uno de los inputs es firmado con el indicador SigHash SINGLE|ANYONECANPAY y ese input desbloquea más fondos que el output al que está referenciado, es posible llevárselos a otra transacción quedándote con la diferencia entre la cantidad de fondos bitcoin del input y del output correspondiente.
Esto es posible puesto que el indicador SigHash SINGLE|ANYONECANPAY brinda un alto grado de modularidad al input en cuestión, permitiendo que se modifique tanto el resto de inputs como el resto de outputs no firmados. (NOTA 1: Outputs dummies)
En la imagen vemos una transacción vulnerable, en la que uno de los inputs se firma con el indicador SigHash SINGLE|ANYONECANPAY. Este input en cuestión (B) desbloquea 1,5BTC > 1BTC del output al que está referenciado (D).
El atacante puede crear una transacción de ataque, en la que completando para el mismo número de inputs y outputs previos, se llevara al output F (una dirección que controla) la diferencia entre el input B y D. Es decir, el atacante pone un nuevo input (en el ejemplo el input E con 0,1BTC) y pone como output el F, al que se envían 0,6BTC (0,1BTC del input E + 0,5BTC del diferencial entre B y D)
A pesar de que esto es posible, la transacción de ataque sigue siendo vulnerable a otro ataque del mismo estilo. Solo se garantizaría el éxito del ataque cuando una de las transacciones fuera confirmada, lo que ocurrirá generalmente con aquella que pague una mayor fee.
Quien hace este tipo de firma, si lo hace de manera consciente, tiene en mente algo como "mientras que una parte de los fondos lleguen a esta dirección, haz lo que quieras con el resto de direcciones de llegadas y añade tantos inputs como quieras."
Normalmente en la timechain (o blockchain) de Bitcoin, los inputs firmados con este indicador suelen desbloquear una cantidad de fondos igual o inferior a la del output con el mismo índice. Esto hace que, en la práctica, este tipo de ataque no sea económicamente viable, ya que el atacante tendría que aportar fondos adicionales con nuevos inputs, terminando por beneficiar al destinatario original en lugar de obtener ganancias.
2. SINGLE|ANYONECANPAY con nInputs > nOutputs
En el apartado anterior establecía que para este tipo de indicador SigHash, se firma un solo input y el output con el mismo índice que el input a firmar.
Si una transacción tiene un número de inputs que excede el número de outputs y se da el caso de que uno o varios de los inputs que exceden el número de outputs se firman con el indicador SigHashSINGLE|ANYONECANPAY, la firma digital de esos inputs no estará firmando ninguna parte de la transacción sino el número 1. (NOTA2: Número 1)
Por ejemplo, si la transacción tiene dos inputs pero un solo output y el segundo input se firma como SINGLE|ANYONECANPAY, no tendrá un segundo output al que referenciarse. El código de Bitcoin establece en esta situación, que para ese segundo input para el que no hay un segundo output, el mensaje firmado será el número 1.
Este bug en el código de Bitcoin permite que una vez se ha retransmitido una transacción de estas características, si vuelven a llegar fondos al input o inputs que firmaban el número 1, se podrá volver a provocar la vulnerabilidad en una nueva transacción, reaprovechando la firma digital que ya se hizo sobre el número 1 y obteniendo esos fondos.
Esta vulnerabilidad ya la explicaba en mi anterior artículo "Maleabilidad en Bitcoin"
Un ejemplo real en la timechain de una dirección vulnerable a este ataque sería la siguiente:
1CeBmgAuBj8WVhwpEVqPPMyV36uHZRfevy siendo ésta la transacción que la hizo vulnerable.
3. NONE con un solo input
Una transacción con un solo input, y que haya sido firmada con el indicador SigHash NONE, no estará ligada a ningún otro input que sí pudiera firmar los outputs (dado que solo hay un input), permitiendo que los fondos se puedan encauzar hacia otra dirección si es detectada antes de ser confirmada.
Aquí puedes leer más sobre NONE
4. NONE|ANYONECANPAY
Igual ocurre con el indicador SigHash NONE|ANYONECANPAY, donde directamente solo se firma el input en cuestión y ninguna otra parte de la transacción. Esto permite antes de ser confirmada, no solo encauzar los fondos hacia otra dirección, sino también modificar el resto inputs al ser indicador ANYONECANPAY.
Aquí puedes leer más sobre NONE|ANYONECANPAY
5. P2SH con puzzles y retos como scripts
La condición de gasto P2SH normalmente es empleada para crear direcciones donde se requiere más de una firma digital para poder mover los fondos, conocida como multisignature. Sin embargo, el verdadero potencial de P2SH es posibilitar la creación una condición de gasto con los operadores (OP_CODES) que nosotros deseemos, dentro de los habilitados hasta el día de hoy en Bitcoin.
Con estos operadores se pueden llegar a crearse puzzles matemáticos y retos que, una vez resueltos, sea esa solución la que desbloquee los fondos. Es decir, quién consiga la respuesta a ese puzzle matemático (por ejemplo, resolver una ecuación), podrá emitir una transacción gastando los fondos.
Lo que ocurre es, que una vez retransmitida la transacción, la solución es conocida por todo el mundo y por tanto, dado que esa solución no está ligada a la transacción (como ocurre con las firmas digitales), cualquiera puede modificar la transacción antes de ser confirmada o incluso, una vez confirmada, si vuelven a llegar fondos a la dirección con el puzzle o el reto, dado que ya tenemos la solución, será cosa de poco gastar esos fondos.
Un ejemplo es el reto que propuso Peter Todd para encontrar colisiones de las distintas funciones hash. Se encontró una colisión en el SHA1, y alguien empleó esa colisión como solución para resolver uno de los retos con premio que había propuesto Peter Todd. Posteriormente, han seguido llegando fondos a esa dirección, y dado que la solución es conocida, se puede seguir reutilizando para gastar los fondos que van llegando.
Conclusión
Te voy adelantando que dentro de poco habrá otra entrada al blog detallando el uso y la profundidad de los puzzles y retos como scripts de bloqueo. De forma cariñosa me gusta llamar a ese próximo artículo: "No me da la gana utilizar firmas digitales (Estoy cansado, jefe)".
Conforme vaya descubriendo nuevas formas por las que se harían vulnerables tus bitcoin, iré actualizando esta entrada al blog. Si te sabes alguna que no haya citado y que guarde relación con las anteriores mencionadas, ¡ponla en los comentarios!
PD: si pones en práctica algo de lo que menciono, hazlo en testnet ;D
Notas
NOTA1: Outputs dummies
Para que el ataque sea fructífero, la transacción con la que se ataca debería tener tantos inputs y output previos como la transacción vulnerable. Esto es, si el input y el output que van a ser desplazados de una transacción a otra tenían originalmente un input y un output previos, en la transacción de ataque se deberá mantener esa estructura. Los inputs y outputs posteriores no son relevantes.
Esto es así puesto que a la hora de firmar ese input vulnerable, en el apartado de los outputs de la proto-transacción se incluyen tantos outputs dummies como outputs previos hubiera. Un output dummie es aquel que solo hace referencia a que, en efecto, hay un output pero sin que se determine su cantidad o la dirección a la que va.
Además, dado que el input firma el output con el mismo índice, es necesario añadir tantos inputs como había en la transacción vulnerable, para que en la transacción de ataque coincidan también los índices y por tanto, la transacción de ataque sea válida.
En definitiva, habrá que completar con el mismo número de inputs y outputs previos, siendo el ataque posible puesto que esos inputs y outputs previos serán modificables dada la versatilidad que el indicador SigHash SINGLE|ANYONECANPAY nos ofrece.
NOTA2: Número 1
En realidad es el número 1 de 256bits en hexadecimal, con byte order "Little Endian": 0100000000000000000000000000000000000000000000000000000000000000
En decimal ese número es: 452312848583266388373324160190187140051835877600158453279131187530910662656
Activity