¿Cómo reducir las posibilidades de que su billetera Ethereum sea pirateada?

Resumen

El hack que ocurrió el 12 de mayo de 2016 para robar 7218 éteres de Patrick solo afecta a los mineros donde:

  • Las conexiones RPC entrantes desde Internet en el puerto TCP 8545 se reenvían a la máquina que ejecuta el software del nodo Ethereum geth;
  • gethse está ejecutando con los parámetros --rpchabilitados; y
  • La billetera Ethereum (Niebla) se usa en la misma gethmáquina y se usa para enviar una transacción, lo que requiere que la gethcuenta se desbloquee por un período de 2 segundos.

El pirata informático envió un flujo continuo (cada 2 segundos) de sendTransaction(...)solicitud a la dirección IP de Patrick en el puerto 8545, y esta solicitud se reenvió a la gethinstancia. Cuando Patrick usó Ethereum Wallet para enviar una transacción, Ethereum Wallet desbloqueó la cuenta de Patrick durante 2 segundos y la transacción del pirata informático logró mover los éteres de Patrick a la cuenta del pirata informático.



Los detalles

El usuario Patrick en el foro DAOHub publicó el mensaje ayer con el asunto [Urgente] La compra de DAO usando Mist ha sido pirateada .

Patrick usó Ethereum Wallet para transferir 1 éter para probar la compra de tokens TheDAO en su computadora de minería . Cuando (hasta ahora parece que) la billetera Ethereum desbloqueó su gethbilletera durante 2 segundos (a través de la API de IPC, no expuesta a Internet), un bot que estaba observando la gethactividad de su billetera se abalanzó para enviar una instrucción de transferencia a geth(a través de JSON-RPC , expuesto a Internet) y transfirió los 7218 éteres restantes a la cuenta del hacker.


Aquí está la cuenta de Patrick que muestra la transferencia de 1 éter antes de la eliminación de su saldo restante ~ 17 segundos después ( 0x95a3ba0aabc6296cbbe3862a889ecb37979da493 ):ingrese la descripción de la imagen aquí


Aquí está la cuenta del hacker que muestra los 7218 éteres divididos en muchos fragmentos de 97.54489533580829 transacciones de éter ( 0xc5d431ee2470484b94ce5660aa6ae835346abb19 ):ingrese la descripción de la imagen aquí


Aquí está el fragmento de código de Ethereum Wallet mist/interface/client/templates/popupWindows/sendTransactionConfirmation.js #228 que desbloquea la gethcuenta durante 2 segundos:

    web3.personal.unlockAccount(Session.get('data').from, pw || '', 2, function(e, res){

La transacción 1 ETH ocurrió el 2016-05-12 03:12:57. La transacción 7218.368874849814 ETH ocurrió el 2016-05-12 03:29:03, ~ 17 segundos después de la transacción 1 ETH, que es la ventana de 2 segundos + el tiempo de bloqueo promedio de Ethereum de ~ 15 segundos.


Después del hackeo, Patrick realizó algunos análisis en su computadora y encontró comunicaciones de red cada pocos segundos a través del gethpuerto RPC 8545 ejecutando los siguientes comandos:

  • eth_accounts- para enumerar las cuentas en la gethinstancia
  • eth_mining- para averiguar la actividad minera en el nodo
  • miner_setEtherBase- para intentar configurar gethla cuenta etherbase pero esto falló
  • eth_getBalance- para encontrar el saldo de las cuentas de Patrick


Existe la pregunta de por qué se habilitó el puerto RPC 8545 para que las comunicaciones RPC de Internet se reenvíen a la gethcomputadora.

Patrick ejecuta mineros de GPU fuera de su red y habilitó el reenvío de puertos para el puerto 8545 para sus mineros de GPU fuera de su red, sabiendo que su cuenta permanecería bloqueada el 99,99 % del tiempo. Todo lo que tomó fue una ventana de 2 segundos.



Como @tayvano ha enumerado a continuación, Dios mío, mis cuentas de eth han sido pirateadas y documentan otro exploit a través del protocolo RPC.

También tenga en cuenta que un pirata informático con acceso a la máquina local también podrá acceder a gethla comunicación IPC de durante este período de desbloqueo de 2 segundos para enviar transacciones no autorizadas.


¿Cuáles son algunos pasos que se pueden tomar para reducir las posibilidades de que esto ocurra?

Otro para un estudio de caso cuando tengas tiempo. Rpc relacionado también. Seguimiento del hilo también. m.reddit.com/r/ethereum/comments/3ird55/…
Entonces, ¿es esto causado principalmente por ejecutar Mist en su plataforma de minería? ¿La comida para llevar del profano aquí es nunca hacer eso?
Escuché sobre él porque estaba de moda en reddit, no puedo recordar qué subreddit ahora que se eliminó, o ya no puedo encontrarlo. Si hay censura allí esto no es bueno, ¿alguien puede encontrarme el enlace de reddit? Volveré a publicar la noticia de todos modos
Triste historia, pero esto es solo el comienzo. Lo extraño en este caso es que Patrick parece ser un usuario avanzado de computadoras. ¿Pero no es ese el problema? Los usuarios básicos probablemente solo tendrían mist en una PC, no minería, ningún nodo abierto... Espero que usar solo la billetera básica y el navegador evitará que muchos usuarios sean pirateados. De todos modos, los enemigos de ETH probablemente saltarán sobre esta noticia. Día triste...
¿De dónde venían las comunicaciones de la red? Parece que la computadora de Patrick estuvo comprometida.
Me he estado preguntando acerca de esto. 1) Patrick habilitó intencionalmente el reenvío de puertos para 8545 desde Internet a su gethcomputadora; 2) Patrick habilitó involuntariamente el reenvío de puertos para 8545 desde Internet a su gethcomputadora; o 3) El pirata informático de alguna manera habilitó el reenvío de puertos para 8545 a su gethcomputadora. Acabo de hacer esto le pregunté ahora.
@Nick Johnson, Patrick estaba ejecutando un "grupo en solitario" con mineros de GPU distribuidos fuera de su gethred informática a través de RPC y mantenía sus cuentas siempre bloqueadas, pero lamentablemente se aprovechó la ventana de oportunidad de 2 segundos.
Creo que esta cuenta todavía contiene la mayor parte del Éter, bastante actividad de cambio de forma en curso que, por supuesto, tiene sentido tratar de ofuscar. Muchos de los tx divididos salientes nuevamente aquí. ¿Alguien sabe si el atacante ha sido atrapado? Dado que ya obtuvo la IP de AWS el mismo día en que se estaba produciendo un ataque, parece bastante sencillo.

Respuestas (3)

(Por favor, edítame. Soy un wiki de la comunidad)

Resumen

  1. No permita que la solicitud TCP en el puerto 8545 de Internet se reenvíe a su gethmáquina
  2. No habilite --rpcsin verificar que solo sus computadoras de minería GPU pueden acceder al puerto TCP 8545 en su gethcomputadora nodo Ethereum
  3. No ejecute Ethereum Wallet en la misma máquina que su gethcomputadora.
  4. Si necesita un "grupo de minería en solitario", considere usar el software de back-end del grupo que restringirá las instrucciones que se reenviarán a su gethinstancia.

EDIT 31/05/2016 - ¡ALERTA DE SEGURIDAD!

De blog.ethereum.org - Alerta de seguridad: cpp-ethereum mantiene las cuentas desbloqueadas :

Configuraciones afectadas : cpp-ethereum (eth, AlethZero, ...) versión 1.2.0 hasta 1.2.5 (corregido en 1.2.6) Nota: Ni "geth" ni "Mist" ni "Ethereum Wallet" (a menos que se usen explícitamente juntos con cpp-ethereum) se ven afectados por esto, vuelven a bloquear las cuentas correctamente.

Gravedad : Alta

Posibles ataques : los atacantes pueden gastar fondos de cuentas utilizadas anteriormente si tienen acceso a la máquina local o a una interfaz json-rpc expuesta.

Detalles : debido a un error en cpp-ethereum, las cuentas permanecen desbloqueadas una vez que se ingresa la contraseña hasta que se cierra cpp-ethereum. Esto incluye cuentas cifradas con la "contraseña maestra" ingresada al inicio o cualquier contraseña ingresada a través de Mist. Esto significa que un atacante puede gastar fondos de la cuenta tan pronto como tenga acceso a la interfaz RPC. Para que eso suceda, necesitan acceso al sistema de archivos local o a la interfaz http-json-rpc expuesta (no la configuración predeterminada). El uso de Mist en "modo Mist" (no es la configuración predeterminada) y la navegación a un sitio web malicioso también proporciona acceso a ese sitio web a la interfaz RPC.

Solución temporal propuesta : reinicie eth después de cada transacción, no exponga la interfaz json-rpc a través de http y actualice a la versión 1.2.6 tan pronto como se publiquen los archivos binarios. Ya se ha fusionado una solución con la rama de desarrollo.



Detalles

Aquí hay algunos pasos para reducir las posibilidades de que su billetera Ethereum sea pirateada.


1. Restrinja el acceso a RPC en sus computadoras de minería

Para la mayoría de los mineros de Ethereum, utilizará gethpara ejecutar el nodo de cadena de bloques y ethminerrealizar los cálculos de minería.

Si está ejecutando solo una gethinstancia y el ethminers en una sola computadora, restrinja su puerto RPC para servir solo en la computadora local. La opción --rpcaddr 127.0.0.1(que es la configuración predeterminada) restringirá sus comunicaciones RPC solo a esa computadora.

Si está ejecutando solo una gethinstancia en una computadora y ethmineren la misma computadora más ethmineren otras computadoras que necesitarán comunicarse con una gethinstancia, deberá usar la IP de la red local de su computadora, por ejemplo --rpcaddr 192.168.1.123. En este caso, es mejor configurar un firewall para restringir las comunicaciones a través de RPC gethsolo a sus equipos de minería.


2. No ejecute la billetera Ethereum (Niebla) en su gethcomputadora de nodo de minería

Si ejecuta Mist en su nodo de minería, cuando envíe una transacción con Mist, se comunicará a través del socket IPC para indicarle gethque desbloquee su cuenta durante 2 segundos.

Si tiene RPC activado y se puede acceder a este puerto desde Internet, los scripts y los bots podrán enviar transacciones en su gethnodo para arrebatar sus monedas en el corto período de tiempo que Mist desbloquea sus cuentas, como le sucedió a Patrick.

Si tiene RPC apagado y su computadora de minería se ha visto comprometida, cualquier malware instalado localmente podrá usar el zócalo IPC para arrebatar sus monedas.

No ejecutes Mist en tu computadora de minería . Úselo en una computadora segura separada en su lugar.


3. Verifique su $HOME/.ethereum/historyarchivo y borre si es necesario

El historial de los comandos que ingresa geth ... consolese almacena en archivos $HOME/.ethereum/history. Lo siguiente muestra lo que acabo de escribir en la consola:

> eth.mining
true
> personal.unlockAccount(eth.accounts[0], "invalidpassword", 2)
Decryption failed: MAC mismatch
    at InvalidResponse (<anonymous>:-81662:-62)
    at send (<anonymous>:-156322:-62)
    at unlockAccount (<anonymous>:-133322:-62)
    at <anonymous>:1:1

Y aquí están las dos últimas líneas de mi $HOME/.ethereum/historyarchivo:

eth.mining
personal.unlockAccount(eth.accounts[0], "invalidpassword", 2)

Verifique el contenido de su archivo de historial usando el comando:

user@Kumquat:~$ grep unlock $HOME/.ethereum/history
personal.unlockAccount(eth.accounts[0], "invalidpassword", 2)

Si alguna vez ha usado el comando personal.unlockAccount(...), borre su archivo de historial:

rm $HOME/.ethereum/history

De forma predeterminada, el directorio en el que se encuentra su archivo de historial solo puede ser leído por su propio usuario. Pero si su cuenta está comprometida, su contraseña está en su archivo de historial:

user@Kumquat:~$ ls -al | grep .ethereum
drwx------   9 user user       4096 May 14 00:28 .ethereum


4. Mueva sus recompensas mineras si son demasiado para perder

Su computadora de minería está continuamente en comunicación con otros programas en Internet y tiene un riesgo más alto de lo habitual de verse comprometido.

Los piratas informáticos pueden encontrar fácilmente nodos de Ethereum en Internet y su computadora puede ser el objetivo. Mueva sus recompensas mineras a una cuenta Ethereum más segura para reducir el tamaño de sus pérdidas si lo piratean.


5. Reduzca su superficie de ataque si es posible

Ejecute la versión de servidor de Ubuntu Linux si es posible. Es un poco más difícil de instalar, especialmente los controladores de GPU, pero tiene menos posibilidades de ser pirateado ya que se ejecutan menos servicios en esta versión en comparación con la versión de escritorio.

  • Ubuntu Desktop tiene muchos más bits de software ejecutándose continuamente con puertos expuestos. Si tiene que usar el escritorio de Ubuntu, apague los servicios innecesarios, no instale software que no sea de confianza. Es posible que desee utilizar la configuración de privacidad para reducir cualquier fuga de información:

    • Configuración -> Seguridad y privacidad -> Archivos y aplicaciones DESACTIVADAS
    • Configuración -> Seguridad y privacidad -> Búsqueda desactivada
    • Configuración -> Seguridad y privacidad -> Diagnóstico TODO APAGADO
    • /etc/default/appport. Establecerenabled=0
  • Las Mac y Windows llaman continuamente a casa y es muy probable que tengan puertas traseras para Apple y Microsoft, respectivamente. Incluso si Apple y Microsoft tienen pocos incentivos para exponerse utilizando las puertas traseras, la conversación continua dificulta la detección de comunicaciones anormales entre su servidor y otras computadoras.


6. Proteja su red

  • Compruebe que tiene un módem/enrutador ADSL relativamente seguro o un dispositivo de red. A veces, el fabricante y su proveedor de servicios de Internet instalan puertas traseras (si obtuvo su módem de ellos como parte del servicio). Si bien es posible que no quieran causar ningún daño malicioso al utilizar las puertas traseras, los piratas informáticos se han aprovechado de algunos de los dispositivos de red mal protegidos. Por ejemplo, consulte las puertas traseras de Cisco, Linksys y Netgear .
  • Ejecute sus computadoras de minería en la DMZ (zona desmilitarizada) para separar sus computadoras de minería expuestas a Internet de sus otros dispositivos en red. Debe probar la funcionalidad DMZ de su dispositivo de red si usa esto, ya que me he encontrado con algunos dispositivos de red que no dividen la DMZ correctamente.
  • Ponga un cortafuegos en sus computadoras de minería para que el único puerto de entrada de Internet sea TCP y UDP 30303, y si tiene RPC activado para su gethinstancia, solo permita las comunicaciones en el puerto RPC desde sus computadoras de minería.


7. No use el usuario root(o usuario con privilegios de administrador) para ejecutar sus mineros

Si sus programas orientados a Internet ( geth) tienen una vulnerabilidad, un pirata informático puede causar más daños si el programa se ejecuta con privilegios de administrador.


8. Verifique las reglas de reenvío de puertos en su enrutador o firewall

Su módem o firewall solo debe reenviar el puerto 30303 para el tráfico TCP y UDP a su gethcomputadora nodo. El puerto 8545 (o lo que haya configurado para su puerto RPC) NO debe reenviarse a su gethcomputadora nodo.

Mis reglas de firewall son para mis 2 equipos de minería (.120 tiene la gethinstancia, .121 es solo un minero de GPU, .111.* es mi DMZ):

* Allow Internet to DMZ geth machine TCP 30303
    Protocol TCP, Source Any, Destination 192.168.111.120:30303
* Allow Internet to DMZ geth machine UDP 30303
    Protocol UDP, Source Any, Destination 192.168.111.120:30303
* Allow Ethereum RPC 8545 traffic from GPU miner to geth machine
    Protocol TCP, Source 192.168.111.121, Destination 192.168.111.120:8545
* Allow SSH traffic to mining rigs
    Protocol TCP, Source 192.168.1.*, Destination 192.168.111.*:22
* Block everything else
    Protocol *, Source Any, Destination 192.168.111.*:*


9. Pruebe los puertos abiertos en su conexión a Internet

Utilice un servicio como GRC para sondear los puertos abiertos en su conexión a Internet. Haga clic en grc.com , haga clic en Shields UP!! , luego haga clic en ShieldsUP! otra vez. Lea el texto y haga clic en Continuar.

En la página web que se muestra a continuación, escribí puertos 8545, 30303y hice clic en Sonda de puerto personalizada especificada por el usuario :

ingrese la descripción de la imagen aquí

Los resultados de la sonda se muestran a continuación: el puerto 8545 ( gethRPC) no está abierto a Internet, mientras que el puerto 30303 (puerto Ethereum P2P) sí lo está:ingrese la descripción de la imagen aquí

Probablemente sea una buena idea probar todos los puertos de servicio (puertos 0 a 1055) al mismo tiempo para confirmar qué puertos tiene abiertos. Los siguientes resultados muestran que solo tengo abierto el puerto 443 (HTTPS):ingrese la descripción de la imagen aquí


10. Apertura de puertos RPC para mineros fuera de su red (su propio grupo de minería individual con sus propios mineros distribuidos)

No abra su puerto RPC 8545 si tiene mineros GPU fuera de su red.

Sus alternativas si tiene mineros de GPU fuera de su red con su gethinstancia:

  1. Ejecute gethlocalmente dentro de cada una de las redes de su minero GPU apuntando a la misma cuenta de coinbase si es necesario; o
  2. Considere ejecutar el ether-poolcomponente de open-ethereum-pool . No tiene que ejecutar la interfaz web, unlockingo los payoutmódulos. Solo las instrucciones seguras desde/hacia los mineros de GPU hacia/desde gethpasan a través del software del pool de minería. Una ventaja de ejecutar este software es que obtiene un mejor rendimiento del protocolo proxy de minería de estrato. La capacidad de minar con una base de monedas en particular (dirección de pago) no depende de que el nodo de minería tenga acceso a las claves privadas de la base de monedas; puede generar la dirección y la clave privada en otra máquina y establecer la base de monedas del nodo de minería en la dirección generada. Esto reduce el daño de un nodo comprometido: los pagos anteriores no se pueden robar simplemente comprometiendo el nodo.
Por favor, no publiques trabajos en curso. Use un sandbox de rebajas en algún lugar o cree un sandbox en meta.
Buena lista, ¿podría agregar más detalles sobre la exposición del puerto 8545? Gracias.

0. Lea el aviso de seguridad oficial.

blog de ethereum: [alerta de seguridad] geth configurado de forma insegura puede hacer que los fondos sean accesibles de forma remota

1. Nunca encienda RPC en billeteras activas. Incluso con IP y CORS limitados a localhost. Simplemente no lo hagas.

geth                # rpc is disabled by default
eth                 # rpc is disabled by default
parity              # rpc is disabled by default

2. Nunca encienda IPC en una máquina en la que no sienta que tiene control total sobre la seguridad. O usa la paridad.

geth --ipcdisable   # ipc is enabled by default, turn it off
geth --no-ipc       # ipc is enabled by default, turn it off
parity              # parity has not ipc (yet)

3. No utilice cuentas para almacenar grandes cantidades de éter. Utilice contratos multifirma.

4. No use computadoras en línea para almacenar grandes cantidades de éter. Usuario de máquinas con espacio de aire o billeteras de papel.

El problema con el contrato de billetera multisig es que se anunció hace mucho tiempo como experimental. Por lo tanto, es probable que algunos usuarios aún confíen en la cuenta básica para almacenar ether porque temen usar billeteras multisig y enfrentar un error.
Tenga en cuenta que la PC con espacio de aire con una copia del sitio JS de myetherwallet parece ser la forma más segura de generar transacciones fuera de línea y, al mismo tiempo, es tan simple que reduce el miedo a cometer un error (incluso si todavía hay cierta ansiedad al mover grandes cantidades , pero igual que cuando vas a tu banco)
La paridad tiene ipc :)
IPC en paridad debe ser nuevo/en desarrollo. ¿Cómo deshabilitarlo?
está deshabilitado de manera predeterminada, rpc está habilitado de manera predeterminada. --rpc No hace nada; JSON-RPC está activado de forma predeterminada ahora.

Imagino que tal vez Mist no usa transacciones firmadas, sino que desbloquea una cuenta para enviar transacciones sin firmar. Entonces, quizás enviar transacciones firmadas usando web3 en una consola de línea de comando NodeJS o usando un script permitiría enviar una transacción sin riesgo de ataque. Esto supone que las cuentas nunca se desbloquean cuando se envían transacciones firmadas, pero no estoy seguro de que ese sea el caso.

Los comentarios serían apreciados