Debes haberte sentido tan afortunado (más feliz cuando todavía quedan uno o dos días para el día de pago y sabes que tu saldo es escaso como el papel) al retirar dinero de un cajero automático y cuando todavía estás nervioso por ello Cuando ves la pantalla del cajero automático que solicitas se está procesando, puede escuchar que los motores se encienden en el cajero automático.
Es decir, incluso antes de que se cuenten los billetes o la pantalla le diga el veredicto final. [a] Tienes suficiente dinero [b] la transacción ha sido aprobada, [c] la máquina funciona bien y [d] Estás a punto de conseguir el dinero.
Bueno, imagina si haces eso. encontrarse [Cancel] en el momento exacto entre la activación del mecanismo y el recuento del dinero …
… y si su tiempo fuera el correcto, su tarjeta permanecería en la máquina, no se le cobraría a su cuenta y se le preguntaría si desea volver a intentarlo, ¡PERO RECIBIRÁ EL EFECTIVO DE LA TRANSACCIÓN CANCELADA SIN! ? !!?
E imagina que mientras mantienes presionado ese botón mágico en el momento adecuado, podrías recurrir a ti mismo y poner la retirada espiritual en la retirada espiritual …
… hasta que la máquina finalmente se quedó sin dinero, o usted alcanzó un límite de software interno para retiros recursivos, o decidió detenerse mientras estaba al frente y salir del cajero automático antes de que sonara una alarma.
Índice de contenido
Ellos pensaron en eso
Por supuesto, los cajeros automáticos no son infinitamente ricos, porque el efectivo es más voluminoso de lo que cree. Entonces, si no recuperara su tarjeta y solo pudiera hacer este truco en un cajero automático, sería rico por un corto tiempo, pero no sería millonario de inmediato.
Dependiendo de la capacidad máxima de la máquina y la antigüedad de los billetes (el dinero usado no es tan plano como los billetes sin circulación), qué tan llena normalmente apila el banco esta máquina en particular y a qué hora del día.
Pero en la vida real nunca lo hará (o casi nunca, ya que «nunca» es una palabra engañosa en ciberseguridad) porque su banco no está loco: los pagos siguen un principio de ingeniería de software conocido en la jerga como ACID, que lo representa. atómico, consistente, aislado y duradero.
Esa es una forma elegante de decir que no recibirá el dinero si el cargo no se ha registrado en su cuenta, y no se le cobrará a su cuenta si el dinero no se puede retirar: siempre es ambos o ninguno, nunca solo ese o el otro.
(Y puede apostar a que si alguna vez hubiera un problema técnico, es casi seguro que favorecería al banco, y tendría que informar el problema en persona para que revisen la máquina y confirmar que el dinero realmente no salió es correcto).
En lógica booleana, esta situación podría describirse como (A AND B) OR ((NOT A) AND (NOT B)), o XNOR (la negación de lo exclusivo o) corto.
Nota. En el improbable caso de que alguna vez obtenga más dinero de un cajero automático de lo que esperaba, por ejemplo, si retira £ 100 y recibe una cuña de £ 10 20 en lugar de £ 10, o si su saldo no disminuye después del retiro. Acabo de embolsar $ 500 de la máquina, no asuma que es mala suerte para el banco y que el dinero es un regalo gratis. Si fue un error real y lo sabía bien, es casi seguro que será responsable por la cantidad, ya que finalmente la recibió y la conservó.
DeFi no es tan cuidadoso
DeFi, abreviatura de financiamiento descentralizado, está actualmente en boca de todos, especialmente en forma de criptomonedas no reguladas y los llamados «contratos inteligentes», que son esencialmente programas cortos (código de software en el que expresas una secuencia de comandos comerciales) que funcionan automáticamente para que tu criptomoneda mueva las acciones. alrededor en el éter.
los descentralizado La parte, que también es la parte desregulada (o más precisamente la parte no regulada), significa que no existen “cámaras de compensación” o procedimientos tradicionales que se utilizarían si operara a través de bancos centrales.
En la banca de la vieja escuela, las transacciones son lentas y pueden requerir la aprobación humana, pero pueden (al menos a veces) revertirse por completo si parte del proceso sale mal o se desafía con éxito.
En términos simples, DeFi tiene como objetivo evitar el control centralizado, eludiendo el interés propio de las instituciones financieras existentes y, por lo tanto, acelerando y liberalizando el comercio en línea, …
… mientras que al mismo tiempo elimina gran parte de la protección regulatoria (y posiblemente ignora siglos de sabiduría operativa) que disfruta en el mundo bancario tradicional y lento del que los fanáticos de DeFi quieren romper.
Probablemente no acepte el lema de codificación moderno y rápido de Muévete rápido y rompe cosas si confía en un software habilitado para la web para conducir su automóvil, diseñar un puente para usar todos los días o exponerlo a procedimientos médicos potencialmente peligrosos …
… pero en el sector financiero se podría pensar que este lema es más la regla que la excepción.
Cientos de millones de personas desaparecidas en acción
Por ejemplo, hace más de dos semanas describimos cómo una falla en el diseño del software llevó al intercambio de criptomonedas chino Poly Networks a sufrir un robo cibernético de más de 500 millones de dólares ($ 610 millones en general, aparentemente) hasta que el pirata informático detrás del robo decidió con cierta vacilación devolver los fondos, un proceso que aparentemente tomó hasta después el día de hoy completo.
El 20/8/2021, escribimos sobre un equipo japonés llamado Liquid que aparentemente perdió más de $ 100 millones por su propio aplastamiento electrónico.
Esta empresa, cuyo objetivo de mantener sus criptomonedas líquidas y negociables lo más rápido posible, ha puesto a la propia empresa en un estado peligrosamente ilíquido, solo se está recuperando gradualmente después de asegurar a los clientes que no saldrán de sus bolsillos.
Aparentemente, la compañía ha lanzado un nuevo sistema de seguridad para su almacenamiento de criptomonedas y ahora está pidiendo a sus clientes que «estar seguro, […] nuestro estado de la técnica [multi-party computation] La tecnología mantiene los activos seguros en todo momento. […] Sus activos están a salvo con nosotros y siempre lo estarán «.
Otro sistema de contrato inteligente muerde el polvo cibernético
Esta semana, es el turno de la firma taiwanesa de criptomonedas CREAM, que adolece de fallas en el descuido del software de contratos inteligentes.
La propia notificación de la compañía en Twitter solo dice que ocurrió el exploit …
…«A modo de reingreso al contrato de token de AMP».
Reingreso, o Recursividad Si quiere llamarlo así, es un problema digital muy similar al improbable «truco» del retiro en cajeros automáticos sobre el que especulamos al principio de este artículo.
Por ejemplo, imagine que tiene un código de contrato inteligente (muy simplificado a continuación) que le permite a la otra parte verificar que tiene al menos X $ en su cuenta. luego llame al código de contrato inteligente de su parte del trato para procesar $ X; luego, deduzca estos $ X de su cuenta.
Si no es un programador, no se preocupe porque el mal comportamiento general debe ser claro: acepta llamadas de función a un contrato inteligente llamado company.withdraw() Aquí, los clientes pueden especificar una cuenta para el retiro, una cantidad a retirar y su propio código de contrato inteligente, que se debe llamar para procesar el retiro de la cantidad especificada.
Una vez que haya verificado que el saldo de su cuenta puede cubrir el saldo y le haya permitido hacer la cantidad aprobada, debitará su cuenta con el dinero que acaba de gastar.
Entonces en pseudocódigo:
function company.withdraw(account, amount, contractcode) { // Check that there is 'amount' left in 'account' call company.verifybalance(account, amount); // Call 'contractcode' function with approved 'amount'. call contractcode(amount); // And then take 'amount' out of 'account' call company.reducebalance(account, amount); }
Sin embargo, esto abre una laguna donde el código de contrato inteligente proporcionado en la solicitud del usuario puede Ingrese su propio código nuevamentellamándolo de forma recursiva (es decir, sin esperar a que se complete la llamada anterior), de la siguiente manera:
function customer.contract(amount) { // Customer's smart contract code // First, spend the 'amount' approved by the company [...disburse the amount somehow...] // Then, re-enter the withdraw() function above, recursively // specifying this very function as the smart contract once again, // which will itself be called again, which will in turn // recursively call withdraw() again... call company.withdraw(account, amount, customer.contract); // And the line above in the withdraw() function where reducebalance() // is supposed to be called will never be reached, because this code // will keep jumping back into the withdraw() function right at the // top, which will come back here, etc. etc. :-( }
Si sigue el programa con el dedo, verá que si el cliente ha autenticado correctamente su cuenta y tiene al menos 1000 unidades de crédito disponibles para pasar la verificación de saldo inicial, entonces una transacción será iniciada por: a call company.withdraw(account,1000,customer.contract), el flujo de código se ve así:
0001: call company.withdraw(account,1000,customer.contract); // Start a transaction0002: call company.verifybalance(account,1000); // Succeeds because account has >= 1000 in it0003: call customer.contract(1000) // So there is 1000 to spend0004: [...disburse the amount somehow...] // And thus we spend 1000 that actually have0005: call company.withdraw(account,1000,customer.contract); // Sneakily re-enter withdraw() at the top0006: call company.verifybalance(account,1000); // Succeeds again because account wasn't debited yet0007: call customer.contract(1000) // So there is apparently still 1000 to spend0008: [...disburse the amount somehow...] // And we get to spend our first 1000 again0009: call company.withdraw(account,1000,customer.contract); // Again re-enter withdraw() at the top000A: call company.verifybalance(account,1000); // Succeeds yet again because account still not debited000B: call customer.contract(1000) // And another 1000 gets approved 000C: [...disburse the amount somehow...] // And we spend our first 1000 for a third time000D: [...and so on recursively forever...] // !!!KA-CHING! RE-ENTRANCY JACKPOT SITUATION!!!
CREMA (que en realidad es una abreviatura, como sugieren los puntos, que significa Crypto gobierna todo a mi alrededor), simplemente dijo que es tan «detuvo el exploit pausando la entrega y pidiendo prestado en AMP «, donde AMP es el sistema de criptomonedas en el que se abusó del error de la empresa, y dispositivos: “Se acerca la autopsia”.
¿Qué tengo que hacer?
¿Qué podemos decir además de lo que dijimos de antemano?
- No apueste más de lo que puede permitirse perder. DeFi no está regulado por las autoridades ni está completamente desarrollado en sus habilidades de ciberseguridad, por lo que no solo existe un mayor riesgo de perder sus fondos, sino también una menor posibilidad de recuperar su dinero si lo hacen.
- No mantenga todos sus fondos en un estado «caliente».. Ahorre tanto como sea posible sin conexión y cifrado en los llamados bolsos fríospor lo que sus criptomonedas no están todas disponibles instantáneamente en línea para que los ladrones las agarren si alguien más comete un error de seguridad.