Sé que exponer personal sobre rpc es vulnerable. Pero, ¿hay alguna forma en que pueda hacer que la exposición personal sobre rpc sea segura?
Permítanme exponer mi requisito. He implementado una criptomoneda. Ahora quiero exponer sus funciones como api.
Pero para eso tengo que exponer personal sobre rpc para realizar transacciones. Por ej. para realizar transfer
, puedo escribir el siguiente código:
function transferCoin(to, amount,frm, passphrase){
web3.personal.unlockAccount(frm,passphrase);
var tx=contract1.transfer(to, amount, {from: frm});
}
Problema:
Pero si alguien puede conectarse a mi nodo, puede hacer un mal uso personal y vaciar mi cuenta.
Editar:
mientras escribía la pregunta, me di cuenta de que no se trata solo de personal, sino de rpc que es inseguro. Por ejemplo, consideremos un caso en el que el personal no está expuesto sobre rpc. Pero, si alguien puede conectarse a mi nodo a través de rpc, puede ejecutar una función como:
function EtherTransfer(){
while(true){
//console.log("hello");
web3.eth.sendTransaction({from:"addr1", to:"addr2", value: web3.toWei(100,"ether")});
}
};
y llevar todos mis éteres.
Entonces, ¿hay alguna solución al problema? Como indiqué en mi requisito, necesito exponer personal sobre rpc para proporcionar funciones de API de mi contrato a mi otra aplicación.
Antes de enviar Transacción, debe ejecutar unlockAccount con su frase de contraseña, por lo que la vulnerabilidad se debe principalmente a su frase de contraseña débil, no demasiado con la interfaz expuesta.
web3.personal.sendTransaction()
. Esta función solo funciona desde la consola geth.geth
. Está documentado para JSON-RPC en github.com/ethereum/go-ethereum/wiki/… , pero sigue siendo un problema pendiente #2 que se implementará en geth
.
Badr Bellaj
tjaden hess
Prashant Prabhakar Singh
Prashant Prabhakar Singh