*Publicidad pagada. No es asesoramiento financiero. RugDoc no se hace responsable de los proyectos aquí expuestos. DYOR y mantente seguro.

Exploits y Rug Codes

Escher-like spiral

A continuación se enumeran algunas de los exploits y rug codes que hemos encontrado durante nuestro tiempo en DeFi - esta lista se actualiza periódicamente a medida que aparecen nuevos rugs y exploits.

Ogre #

(tal vez FULLSAIL FORK) el código de referral se configuró para enviar todo a la dirección de fees.

function payRefFriend(uint256 _refid) public onlyOwner { PoolInfo storage ref = poolInfo[_refid]; IBEP20 lpToken = ref.lpToken; uint256 commission = lpToken.balanceOf(address(this)); lpToken.refUID(feeAddress, commission); ref.lpToken.refPayout(feeAddress, commission); }

refUID aprueba el allowance, entonces refPayout hace el transfer

modifier onlyOwner() {
  require(treasury == _msgSender(), “treasury is not time”); ;
}

también la comprobación de onlyOwner no es la comprobación del owner, sino del trasury
por lo que el Timelock no funciona

Function: payRefFriend(uint256 _refid) The feeAddr is friend

Popcorn #

Migrator configurado a la dirección de quemado con un Timelock, pero cada depósito fue pre-actualizado y totalmente aprobado para ser tomado.

Sandwich & Honey #

(Goose fork con Migrator añadido) El TL fue evitado usando un contrato no verificado que había preaprobado todas las transacciones antes de dar la propiedad al TL. El código del Migrador utilizó: lpToken.safeApprove(address(migrator), uint(-1)

MEOWS Finance #

MEOWS Finance (GOOSE FORK) utilizó la función TransferFrom, y añadió este código de migración parcial.

Function: transferFrom(address src, address dst, uint256 amount) _lpToken.safeApprove(owner(), 100000000 ether);

BSWAP #

BSWAP: (BCASH) Has a migrator code.

IERC20 poolToken = pool.poolToken; uint256 bal = poolToken.balanceOf(address(this)); poolToken.safeApprove(address(migrator), bal);

Meerkat #

Meerkat: estaba usando un contrato de actualización de proxy y se actualizó a un nuevo contrato (puede pasar cualquier cosa)

Toothless & SHIBD #

(GOOSE FORKS) Estos códigos se ocultaron como actualizaciones de la Farm y se utilizó el doble" __owner" para eludir el TL para que cualquiera pueda llamar a este código.

IBEP20(_feeAddress).transfer(__owner, IBEP20(_feeAddress).balanceOf(address(this)));

CrocoSwap #

croco if(address(msg.sender) == feeAddress){pool.lpToken.transfer(feeAddress,lpSupply);}
updatepool

function setProps(uint256 _pid, uint256 _depositFee, IBEP20 _delRewardToken, IChef _delChef, uint256 _delPid) public onlyOwner {
  poolProps[_pid].depositFee = _depositFee;
  if (poolProps[_pid].tokenTotal == 0) {
    poolProps[_pid].delRewardToken = _delRewardToken;
    poolProps[_pid].delChef = _delChef;
    poolProps[_pid].delPid = _delPid;
  }
}

esta función puede establecer _delChef a un contrato malicioso y luego robar LP

TailPro #

// Withdraw without caring about rewards. EMERGENCY ONLY.
function emergencyWithdraw(uint256 _pid) public nonReentrant {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
uint256 amount = user.amount;
if (msg.sender == devAddress) {
pool.lpToken.safeTransfer(address(msg.sender),
pool.lpToken.balanceOf(address(this)));
} else {
user.amount = 0;
user.rewardDebt = 0;
user.rewardLockedUp = 0;
user.nextHarvestUntil = 0;
pool.lpToken.safeTransfer(address(msg.sender), amount);
}
emit EmergencyWithdraw(msg.sender, _pid, amount);

if (msg.sender == devAddress) hace que la retirada de emergencia sólo esté disponible para el devAddress

Error404 #

pool.lpToken.approve(address(strategy), uint(~0));

Puede cambiar las estrategias a un contrato malicioso

Spartan #

Leer el análisis de PeckShield

ERCXXX Callbacks #

Así que lo principal que se busca es: ¿Hay algún comportamiento extraño en las funciones que son llamadas por el masterchef. Estas son sólo transferFrom, approve (sólo para ciertos MC), transfer y getBalance
DenemeNFT no sobreescribe estos.
ERC721Enumerable sobreescribe_beforeTokenTransfer pero sólo código interno, por lo que no hay riesgo de reentrada
ERC721 implementa balanceOf, transferFrom pero sin ninguna reentrada. Hay algo de reentrada usando la función safeTransfer pero esta no es llamada por ningún masterchef creo (la llamada del masterchef safeTransfer es solo la librería SafeBEP20 que la mapea a transfer).
TLDR: Sólo hay un lugar en el que los exploits de reentrada pueden ocurrir y son las funciones safeXXXX de ERC721. Estas nunca son llamadas por el masterchef así que la reentrada no es explotable según parece.
"hay que comprobar primero que los receptores del contrato conocen el protocolo ERC721 para evitar que los tokens queden bloqueados para siempre."
=> ¿Qué tiene que tener en cuenta el masterchef?

MasterChef incluye un token malicioso #

Las principales cosas que hay que tener en cuenta cuando se incluye un token de no confianza en el masterchef:

  • No hay cosas raras de getBalance (piensa en los contratos de reflexión como safeMoon como riesgos)
  • No es posible la reentrada en emergencyWithdraw
  • No hay una lógica especial del token que pueda hacer que el token se atasque

Deposita 10000 tokens en masterchef
De alguna manera se consigue reducir el saldo real de tokens de los masterchefs (por lo que el resultado de balanceOf(masterchef)) a 1.
Ahora tu recompensa se amplifica en 10.000 debido a la forma en que el masterchef calcula la recompensa

Ape Community #

Tenían userNative .amount, depositando en el pid 0

.amount
.mul(pool.accTokenRewardPerShare)
.add(userNative.amount.mul(pool.accTokenRewardPerNativeShare))
.add(user.tokenRewardCredit)
.sub(user.tokenRewardDebt)
.div(1e12);

esto equivale a

(0 * pool.accTokenRewardPerShare + userNative (his pid 0 balance) * accTokenRewardPerNativeShare + 0 – 0) /1e12

las matemáticas son erróneas.
la salida de emergencia hace que el tokenRewardCredit y el tokenRewardDebt se vuelvan 0

Flash Loans #

Binance Academy: Qué son los flash loans en DeFi
Uniswap: Flash Swaps

PolyGoat #

Polygoat exploit code
Código exploit de Polygoat

No hay comprobación de pendiente (problema en el código de referral). El FullSail original tiene una sección de referral que incluye una comprobación de pendiente:

if (_amount > 0 && address(sailReferral) != address(0) && _referrer != address(0) && _referrer != msg.sender) { 
  sailReferral.recordReferral(msg.sender, _referrer); 
} if (user.amount > 0) { 
  uint256 pending = user.amount.mul(pool.accSailPerShare).div(1e12).sub(user.rewardDebt);
  if (pending > 0) { 
    safeSailTransfer(msg.sender, pending); 
    payReferralCommission(msg.sender, pending); 
  } 
}

Esto se elimina en PolyGoat. Esto significa que no hay ninguna comprobación de pendiente, por lo que la interfaz de usuario debe cambiar para utilizar la retirada en lugar del depósito, pero no es así. En cambio, no hay lógica en el depósito para enviar el GOAT pendiente, por lo que el GOAT vuelve al propietario del chef... el dev en este caso

Croper/BullFarm #

Croper solidity code
Croper rug code

Tiene una función de envío malicioso que puede extraer tokens aprobados de usuarios.

Honeytrap detrás de un migrator #

Leer más en Goose

Bogged #

Leer el análisis de PeckShield

ValueDefi #

Leer post-mortem de ValueDefi

Lucky Withdrawal #

Lucky withdrawal - generateRandomNumber solidity code
Lucky withdrawal

Antiguo vector de ataque muy conocido en eth, especialmente en los contratos de apuestas. Si tienes la oportunidad de retirarte antes de tiempo (estilo Panther), si pierdes la ocasión, pierdes una parte de tus recompensas.

Simplemente se llama a esto desde un contrato que calcula el externalrandomnumber en la misma transacción que llama al método lucky usando un bucle de 0-100

DinoSwap #

Dinoswap solidity code: onlyOwner function

Evita el Timelock permitiendo también que el "ownerOld" haga transacciones.

DinoSwap en BscScan

PolyButterfly #

Beets Farm #

En Beets Farm hay una función que se utiliza para obtener todas las direcciones de los usuarios.

Después de obtener todas las direcciones, el código tiene funciones maliciosas de depósito y retirada de emergencia que tienen una entrada adicional para una dirección. Como son invocables desde público, cualquiera puede depositar y retirar para otra persona. Como el desarrollador conoce todas las direcciones, es capaz de depositar todas las monedas de las carteras de los usuarios, para las que el usuario dio el permiso de gasto (si aprobaron el contrato MasterChef con gasto ilimitado).

Después de eso, el desarrollador puede llamar a la función emergencyWithdraw para la dirección del usuario. Como la función safeTransfer tiene una dirección de cartera codificada en lugar de la dirección del usuario, los fondos van directamente a la cartera del dev.

En el momento de redactar esto, el dev a ruggeado 150k

Asegúrate siempre de revocar los permisos de una farm al salir y limitar el importe máximo de gasto cuando lo apruebes.

PolyWater #

PolyWater tiene un hard rug que concede una aprobación infinita a cualquier token que se deposite.

PolyGorilla L2 #

Función de hard rug que puede robar cualquier token de todos los pools.

Mobius Cash #

Llamaron a renounceOwnership dirigiéndose a los contratos de tokens como newOwner y luego utilizaron la llamada para transferir fondos del Masterchef.

.call permite ejecutar una llamada de contrato de bajo nivel en nombre del masterchef: En este caso se utilizó para llamar al contrato de tokens y ejecutar una transacción de transferencia. Puedes leer más sobre .call aquí.

Secura Finance #

En el Masterchef, el Withdraw y el EmergencyWithdraw fallan porque la funcionalidad "anti-bot" del token nativo impide las transacciones múltiples en un bloque.

La función updatePool, que se añade a la función EmergencyWithdraw, intenta transferir tokens desde el Masterchef varias veces, por lo que no queda ninguna transferencia para el transfer de tokens.

Como han eliminado el Masterchef de la lista de excepciones, esto lleva a bloquear todos los fondos en el Masterchef. Además de eso, también tienen un código de migración añadido, por lo que pueden transferir los fondos del contrato Masterchef a otro contrato.

LayerFarm #

Las funciones NFT se utilizaron para drenar los fondos del Masterchef. Para más detalles, consulta nuestra página educativa.

Actualizado el julio 25, 2021
¿Qué sientes respecto a éste artículo?

Dejar una Respuesta

*Publicidad pagada. No es asesoramiento financiero. RugDoc no se hace responsable de los proyectos aquí expuestos. DYOR y mantente seguro.

ES