codehawk-Liquidity Management
高 执行逻辑错误的参数漏洞代码:
/** * @notice 此函数是提款流程的结束。 * @dev 应更新所有必要的全局状态变量 * * @param withdrawn 从头寸中提取的代币数量 * @param positionClosed 当完全通过提款关闭头寸时为真,否则为假 */ function _handleReturn(uint256 withdrawn, bool positionClosed, bool refundFee) internal { (uint256 depositId) = flowData; uint256 shares = depositInfo[depositId].shares; uint256 amount; if (positionClosed) { amount = collateralToken.balanceOf(address(this)) * shares / totalShares; } else { uint ...
cantina-size Credit
cantina-size Credit使用owner()函数,该合约已经设置了owner为零漏洞代码
function reinitialize() external onlyOwner reinitializer(1_7_0) { // grant `AccessControlUpgradeable` roles to the `Ownable2StepUpgradeable` owner _grantRole(DEFAULT_ADMIN_ROLE, owner()); _grantRole(PAUSER_ROLE, owner()); _grantRole(KEEPER_ROLE, owner()); _grantRole(BORROW_RATE_UPDATER_ROLE, owner()); // transfer `Ownable2StepUpgradeable` ownership to the zero address to keep the state consisten ...
sherlock-Yieldoor 审计报告
Yieldoor整数溢出 (高)代码如下:
uint256 index = (observationCardinality + currentIndex - i) % observationCardinality;
这里的observationCardinality和currentIndex在合约中都是uint16的类型,也就是说2^16-1
0-65535,当他们俩个相加的话就会出现整数溢出,导致依赖计算的函数都会无法进行
溢出就会导致整个合约的核心功能无法使用
杠杆base计算错误 (高)代码如下:
base = owedAmount / vp.maxTimesLeverage;
使用了借款金额,来计算base,可能会导致超过初始抵押品的,导致用户被清算。
计算 base 时 未考虑初始抵押品 initCollateralValue,导致 base 可能超出合理范围。这导致用户在 实际抵押品仍然充足的情况下被提前清算。例子如下:假设:
用户存入 1000 USDT 作为抵押
借入 1000 USDT,总仓位变成 2000 USDT
vp.maxTimesLeverage ...
codeHawks-2024-12-Aldo SssTablecoinsss 审计报告
Aldo SssTablecoinsss 审计报告这次抽空在codeHarw上面,做了一次首飞。是关于defi 的。结果使用p语言写的,导致很多人可能就没有去参加,我也提交了3个,虽然只有一个被判为中等,但是这是我第一次被选择成最终报告
这是我正确的报告
语言机的时间设置的太大(中等)(me)(被选为作为报告)M-01. The TIMEOUT is set as a fixed constant of 72 hours, which makes it inflexible in adapting to the market price.SummaryIn this contract, the TIMEOUT is set as a fixed constant (72 hours, or 259200 seconds). This means that if the oracle price data is not updated within 72 hours, the data will be considered outdated, and the contract will ...
sherlock-2024-11-Oku'sNew Order Types 审计报告
一Summary在执行 _getExchangeRate函数的时候,没有检查,tokenIn和tokenOut是不是同种的代币,导致一些无意义的汇率计算出来
Root Cause2024-11-oku-HeYuan-33/oku-custom-order-types/contracts/automatedTrigger/AutomationMaster.sol
Lines 77 to 86 in ee3f781
function _getExchangeRate( IERC20 tokenIn, IERC20 tokenOut ) internal view returns (uint256 exchangeRate) { // Retrieve USD prices from oracles, scaled to 1e8 uint256 priceIn = oracles[tokenIn].currentValue(); uint256 priceOut = oracles[tokenOut]. ...
CTF-ApproveMain
CTF-ApproveMain题目的源代码:
pragma solidity ^0.8.0;// ERC20contract Cert{ mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; address public admin; struct AddressSlot { address value; } // 预挖给msg.sender 100个代币 constructor () { _mint(msg.sender, 100*10**18); } modifier safeCheek(address spender, uint256 amount) { if (uin ...
CTF-EverythingArt
CTF-EverythingArt题目源代码:
pragma solidity ^0.8.0;// Using @openzeppelin/contracts@3.2.0// pragma solidity ^0.8.0;import "@openzeppelin/contracts/utils/math/SafeMath.sol";import "@openzeppelin/contracts/token/ERC721/ERC721.sol";contract EverytingIsArt is ERC721 { using SafeMath for *; uint256 public totalMinted; bool public hope = true; bool public hope2 = true; // Deploy by CTFer EOA account constructor() public ERC721("All Arts", "AA" ...
关于solidity漏洞的基础知识
关于solidity漏洞的基础知识精度的计算这个错误常常出现于计算过程当中,使用了先除后乘,就会导致精度的计算错误,比如
interest = principal / 3_333 * 10_000;
如果本金小于3_333,那么就会计算的利息为零如果按一下的例子计算
interest = principal * 10_000 / 3_333;
那么就不会出现这种的错误,因为使先扩大的精度,再除的话,就能避免精度的损失个人也是通过近几次的审计报告发现,大家都是很注意计算的地方
函数变量不用同一个变量声明这是我再审计报告中,第一次了解到这个问题,但是学过Java的都知道,成员变量和方法的变量冲突的话就会使用this来区分,而我们solidity没有这种说法,所以只能用不同的命名来表示,比如
address owner;function change owner(address owner) internal{ require(owner == msg.sender,"NOT CHANGE"); owner = owner;}
在这个函数 ...
codeHawks-2024-11-twentyone 审计报告
twentyone 审计报告我自己这次犯了一个重大错误。就是没有真正的理解题目意思。导致全是找的破环游戏规则(可以任意查看手牌的错误。其实是游戏这么设定是合理的)然后这次就不放我的报告的了。因为都是public惹得祸。让我以为这次的首飞就是只有权限的问题,那就看看正确的漏洞出处
计算玩家和庄家的手牌不一致 (高)其实这个问题应该是最简单的。因为从下面代码就能显而易见
//playerHand if (cardValue == 0 || cardValue >= 10) { playerTotal += 10; } else { playerTotal += cardValue; }//dealerHand if (cardValue >= 10) { dealerTotal += 10; } else { ...
CTF-Storage
CTF-Storeage题目代码又俩个:
pragma solidity ^0.8.0;import "./StorageSlot.sol";contract Storage1 { uint256 public constant VERSION = 1; address public aaaaa; address public admin; bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); mapping(address => uint256) public gasDeposits; event SendFlag(); event SetLogicContract(bytes32 key, address oldAddress, address newAddress); event DepositedGas(address account, uint256 amount); event Wit ...