El hack que ocurrió el 12 de mayo de 2016 para robar 7218 éteres de Patrick solo afecta a los mineros donde:
geth
;geth
se está ejecutando con los parámetros --rpc
habilitados; ygeth
máquina y se usa para enviar una transacción, lo que requiere que la geth
cuenta 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 geth
instancia. 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.
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 geth
billetera durante 2 segundos (a través de la API de IPC, no expuesta a Internet), un bot que estaba observando la geth
actividad 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 ):
Aquí está la cuenta del hacker que muestra los 7218 éteres divididos en muchos fragmentos de 97.54489533580829 transacciones de éter ( 0xc5d431ee2470484b94ce5660aa6ae835346abb19 ):
Aquí está el fragmento de código de Ethereum Wallet mist/interface/client/templates/popupWindows/sendTransactionConfirmation.js #228 que desbloquea la geth
cuenta 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 geth
puerto RPC 8545 ejecutando los siguientes comandos:
eth_accounts
- para enumerar las cuentas en la geth
instanciaeth_mining
- para averiguar la actividad minera en el nodominer_setEtherBase
- para intentar configurar geth
la 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 geth
computadora.
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 geth
la 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?
(Por favor, edítame. Soy un wiki de la comunidad)
geth
máquina--rpc
sin verificar que solo sus computadoras de minería GPU pueden acceder al puerto TCP 8545 en su geth
computadora nodo Ethereumgeth
computadora.geth
instancia.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.
Aquí hay algunos pasos para reducir las posibilidades de que su billetera Ethereum sea pirateada.
Para la mayoría de los mineros de Ethereum, utilizará geth
para ejecutar el nodo de cadena de bloques y ethminer
realizar los cálculos de minería.
Si está ejecutando solo una geth
instancia y el ethminer
s 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 geth
instancia en una computadora y ethminer
en la misma computadora más ethminer
en otras computadoras que necesitarán comunicarse con una geth
instancia, 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 geth
solo a sus equipos de minería.
geth
computadora de nodo de mineríaSi 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 geth
que 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 geth
nodo 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.
$HOME/.ethereum/history
archivo y borre si es necesarioEl historial de los comandos que ingresa geth ... console
se 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/history
archivo:
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
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.
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:
/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.
geth
instancia, solo permita las comunicaciones en el puerto RPC desde sus computadoras de minería.root
(o usuario con privilegios de administrador) para ejecutar sus minerosSi 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.
Su módem o firewall solo debe reenviar el puerto 30303 para el tráfico TCP y UDP a su geth
computadora nodo. El puerto 8545 (o lo que haya configurado para su puerto RPC) NO debe reenviarse a su geth
computadora nodo.
Mis reglas de firewall son para mis 2 equipos de minería (.120 tiene la geth
instancia, .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.*:*
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, 30303
y hice clic en Sonda de puerto personalizada especificada por el usuario :
Los resultados de la sonda se muestran a continuación: el puerto 8545 ( geth
RPC) no está abierto a Internet, mientras que el puerto 30303 (puerto Ethereum P2P) sí lo está:
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):
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 geth
instancia:
geth
localmente dentro de cada una de las redes de su minero GPU apuntando a la misma cuenta de coinbase si es necesario; oether-pool
componente de open-ethereum-pool . No tiene que ejecutar la interfaz web, unlocking
o los payout
módulos. Solo las instrucciones seguras desde/hacia los mineros de GPU hacia/desde geth
pasan 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.geth # rpc is disabled by default
eth # rpc is disabled by default
parity # rpc is disabled by default
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)
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
tayvano
HodlDwon
eur10
Nicolás Massart
nick johnson
privacidadisahumanright.eth
geth
computadora; 2) Patrick habilitó involuntariamente el reenvío de puertos para 8545 desde Internet a sugeth
computadora; o 3) El pirata informático de alguna manera habilitó el reenvío de puertos para 8545 a sugeth
computadora. Acabo de hacer esto le pregunté ahora.privacidadisahumanright.eth
@Nick Johnson
, Patrick estaba ejecutando un "grupo en solitario" con mineros de GPU distribuidos fuera de sugeth
red 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.SCBuergel