èŠå
ãã®èšäºã¯ãèªååæè£
çœ®ã®æå¹æ§ã®è©äŸ¡ã§ã¯ãããŸããã ããããèªåã®å¥çŽã«é©çšããæå³çã«ãšã©ãŒãåæããåå¿ãç ç©¶ããŸãã ãã®ãããªèª¿æ»ã¯ããããæªããã倿ããããã®åºç€ãšãªãããšã¯ã§ããŸããããã®ããããã®çš®ã®ãœãããŠã§ã¢ã®æ°ãŸãããªæ§è³ªãèãããšã宿œãéåžžã«é£ããå¥çŽã®å€§èŠæš¡ãªãµã³ãã«ã§ç²æ€èª¿æ»ã宿œããããšã¯çã«ããªã£ãŠããŸãã å¥çŽã®å°ããªãšã©ãŒãã¢ãã©ã€ã¶ãŒããžãã¯ã®å€§éšåãç¡å¹ã«ããå¯èœæ§ãéåžžã«é«ããåçŽãªãã¥ãŒãªã¹ãã£ãã¯ãµã€ã³ããç«¶åä»ç€Ÿãåã«è¿œå ããããšãã§ããªãã£ãåºç¯ãªãã°ãèŠã€ããããšã«ãã£ãŠãã¢ãã©ã€ã¶ãŒã«èšå€§ãªéã®ãã€ã³ãã远å ããå¯èœæ§ããããŸãã å¥çŽã®æºåãšç·šéã®èª€ããéèŠãªåœ¹å²ãæãããŸãã åé¡ã®ãœãããŠã§ã¢ã¯ãã¹ãŠéåžžã«æ°ãããçµ¶ããéçºãããŠããããã修埩äžå¯èœãªåé¡ãšããŠæ¹å€çãªã³ã¡ã³ããåãåããªãã§ãã ããã
ãã®èšäºã®ç®çã¯ãããŸããŸãªã¢ãã©ã€ã¶ãŒã§ã®ã³ãŒãåæã®æ¹æ³ãã©ã®ããã«æ©èœããããããã³ãéžæãããã®ã§ã¯ãªããããããæ£ãã䜿çšããèœåãèªè
ã«çè§£ãããããšã§ãã åççãªéžæã¯ãåæãããå¥çŽã«æãé©ãããã®ã«çŠç¹ãåãããŠãäžåºŠã«è€æ°ã®ããŒã«ã䜿çšããããšã§ãã
èµ·åã®ã»ããã¢ãããšæºå
ãã¹ãªã«ã¯äžåºŠã«ããã€ãã®ã¿ã€ãã®åæã䜿çšããŸãããããã«é¢ããããã€ãã®åªããèšäºããããŸãã æãéèŠãªã®ã¯ ã thisãŸãã¯thisã§ãã ç¶è¡ããåã«ãããããèªãããšã¯çã«ããªã£ãŠããŸãã
ãŸããMythrilã®ç¬èªã®Dockerã€ã¡ãŒãžãäœæããŸãããïŒäœã倿Žããããã¯é¢ä¿ãããŸãããïŒïŒïŒ
git clone https://github.com/ConsenSys/mythril-classic.git cd mythril-classic docker build -t myth .
ä»ãç§ãã¡ã®contracts/flattened.sol
ïŒã¯ããã«èª¬æãããã®ãšåãå¥çŽã䜿çšããŠããŸãïŒã§å®è¡ããŠã¿ãŠãã ããOwnable
ãšBooking
2ã€ã®äž»èŠãªå¥çŽããããŸãã ã³ã³ãã€ã©ãŒã®ããŒãžã§ã³ã«ã¯ãŸã åé¡ããããŸãã以åã®èšäºãšåãæ¹æ³ã§ä¿®æ£ããDockerfileã«ã³ã³ãã€ã©ãŒã®ããŒãžã§ã³ã眮ãæããè¡ã远å ããŸããã
COPY --from=ethereum/solc:0.4.20 /usr/bin/solc /usr/bin
ã€ã¡ãŒãžãåæ§ç¯ããåŸãå¥çŽåæãå®è¡ããŠã¿ãããšãã§ããŸãã ããã«-v4
ããã³--verbose-report
ãã©ã°ã䜿çšããŠããã¹ãŠã®èŠåã確èªããŸãããã è¡ããïŒ
docker run -v $(pwd):/tmp \ -w /tmp myth:latest \ -v4 \ --verbose-report \ -x contracts/flattened.sol
ããã§ã¯ãäŸåé¢ä¿ã®ãªããã©ããåãããã³ã³ãã©ã¯ãã䜿çšããŸãã å¥ã®Booking.sol
ã³ã³ãã©ã¯ããåæããMythrilããã¹ãŠã®äŸåé¢ä¿ããã£ããããããã«ããã«ã¯ã次ã®ãããªãã®ã䜿çšã§ããŸãã
docker run -v $(pwd):/tmp \ -w /tmp myth:latest \ --solc-args="--allow-paths /tmp/node_modules/zeppelin-solidity/ zeppelin-solidity=/tmp/node_modules/zeppelin-solidity" \ -v4 \ --verbose-report \ -x contracts/Booking.sol
ç§ã¯ããã©ããåããããªãã·ã§ã³ã䜿çšããããšã奜ã¿ãŸãã ã³ãŒãã倧å¹
ã«å€æŽããŸãã ãããã --truffle
ã¯éåžžã«äŸ¿å©ãªã¢ãŒã--truffle
ãããã¯truffle
ãã¹ãŠãåçŽã«--truffle
truffle
ããããžã§ã¯ãå
šäœã®è匱æ§ããã§ãã¯ããŸãã ãã1ã€ã®éèŠãªæ©èœã¯ãã³ãã³ãä»ããŠåæããå¥çŽã®ååãæå®ããæ©èœã§ãããã以å€ã®å ŽåãMythrilã¯ééãããã¹ãŠã®å¥çŽãåæããŸãã Ownable
ã®Ownableã¯å®å
šãªå¥çŽã§ãããšèããŠããã Booking
ã®ã¿ãåæãããããå®è¡ããæçµè¡ã¯æ¬¡ã®ãšããã§ãã
docker run -v $(pwd):/tmp -w /tmp myth:latest -x contracts/flattened.sol:Booking -v4 --verbose-report
å¥çŽã®éå§ãšå±é
äžèšã®è¡ã§ã¢ãã©ã€ã¶ãŒãèµ·åããåºåã確èªãããšããšãããæ¬¡ã®è¡ã衚瀺ãããŸãã
mythril.laser.ethereum.svm [WARNING]: No contract was created during the execution of contract creation Increase the resources for creation execution (--max-depth or --create-timeout) The analysis was completed successfully. No issues were detected.
ã³ã³ãã©ã¯ãã¯äœæãããŠãããããšãã¥ã¬ãŒã¿ã§ãä¿®æ£ããããŠããªãããšãããããŸããã ãã®ããããã¹ãŠã®ã¿ã€ãã®åæã«-v4
ãã©ã°ã䜿çšããŠããã¹ãŠã®ã¡ãã»ãŒãžã衚瀺ãã1ã€ã®éèŠãªã¡ãã»ãŒãžãèŠéããªãããã«ããããšããå§ãããŸãã äœãæªãã®ããèããŠã¿ãŸãããã ãã®å®çšçãªåé¡ã®è§£æ±ºçã¯ãMythrilãæ£ãã䜿çšããæ¹æ³ãçè§£ããããã«éåžžã«éèŠã§ãã
ã ããã It uses concolic analysis, taint analysis and control flow checking to detect a variety of security vulnerabilities
ã«ã€ããŠèªãã§ããïŒ It uses concolic analysis, taint analysis and control flow checking to detect a variety of security vulnerabilities
ã ãããã®çšèªã«ããŸã粟éããŠããªãå Žåã¯ã ããã§ã³ã³ã³ãªãã¯ãã¹ãã«é¢ããwikiããå§ãããŸããã ããã§ã¯ x86ã®æ±æãã§ãã¯ã«é¢ããåªãããã¬ãŒã³ããŒã·ã§ã³ã玹ä»ããŸãã èŠããã«ãMythrilã¯ã³ã³ãã©ã¯ãã®å®è¡ããšãã¥ã¬ãŒãããå®è¡ãé²ããã©ã³ããä¿®æ£ããã³ã³ãã©ã¯ãã®ãå£ãããç¶æ
ãéæããããšãããã©ã¡ãŒã¿ãŒã®ããŸããŸãªçµã¿åããããœãŒããããã¹ãŠã®å¯èœãªãã¹ãåé¿ããããšããŸãã äžèšã®èšäºã®ãµã³ãã«ã¢ã¯ã·ã§ã³å³ã次ã«ç€ºããŸãã
1. . symbolic-, . 2. , , trace . , , . 3. . 4. trace-. 5. symbolic execution trace, symbolic , , , . 6. , . , . 7. : , , input-, , . input- , .6 . 8. .4
ããã倧å¹
ã«ç°¡çŽ åããããã«ãã³ãŒãå
ã®ãã©ã³ãã«ééããMythrilã¯ãã©ã®å€æ°ã»ããã®äžã§1ã€ã®ãã©ã³ããšä»ã®ãã©ã³ãã«å
¥ãããšãã§ããããçè§£ã§ããŸãã åãã©ã³ãã§ã¯ã selfdestruct
assert
ã transfer
ã selfdestruct
ããã³ãã®ä»ã®ã»ãã¥ãªãã£é¢é£ã®ãªãã³ãŒãã«ã€ãªãããã©ãããç¥ã£ãŠããŸãã ãããã£ãŠãMythrilã¯ãã©ã®ãã©ã¡ãŒã¿ãšãã©ã³ã¶ã¯ã·ã§ã³ã®ã»ãããã»ãã¥ãªãã£äŸµå®³ã«ã€ãªããå¯èœæ§ãããããåæããŸãã ãããŠãMythrilãå¶åŸ¡ãåŸãããªããã©ã³ããåæããå¶åŸ¡ãããŒãåæããæ¹æ³ãäž»ãªããªãã¯ã§ãã ãã¹ãªã«ã®å
èãšãã©ã³ããŠã©ãŒãã³ã°ã®è©³çްã«ã€ããŠã¯ã ãã¡ããã芧ãã ãã ã
ã¹ããŒãã³ã³ãã©ã¯ãã®å®è¡ã®æ±ºå®æ§ã«ãããåãåœä»€ã·ãŒã±ã³ã¹ã¯ããã©ãããã©ãŒã ãã¢ãŒããã¯ãã£ããŸãã¯ç°å¢ã«é¢ä¿ãªããåžžã«å³å¯ã«1ã»ããã®ç¶æ
å€åã«ã€ãªãããŸãã ãŸããã¹ããŒãã³ã³ãã©ã¯ãã®æ©èœã¯éåžžã«çãããªãœãŒã¹ã¯éåžžã«éãããŠãããããã·ã³ããªãã¯å®è¡ãšãã€ãã£ãå®è¡ãçµã¿åãããMythrilã®ãããªã¢ãã©ã€ã¶ãŒã¯ãã¹ããŒãã³ã³ãã©ã¯ãã«å¯ŸããŠéåžžã«å¹ççã«åäœã§ããŸãã
ãã®éçšã§ãMythrilã¯ãç¶æ
ãã®æŠå¿µã§åäœããŸããããã¯ãå¥çŽã®ã³ãŒãããã®ç°å¢ãçŸåšã®ã³ãã³ããžã®ãã€ã³ã¿ãå¥çŽã®ä¿åãã¹ã¿ãã¯ã®ç¶æ
ã§ãã ããã¥ã¡ã³ãã¯æ¬¡ã®ãšããã§ãã
The machine state ÎŒ is defined as the tuple (g, pc, m, i, s) which are the gas available, the program counter pc â P256, the memory contents, the active number of words in memory (counting continuously from position 0), and the stack contents. The memory contents ÎŒm are a series of zeroes of size 256.
ç¶æ
éã®é·ç§»ã°ã©ãã¯ãç ç©¶ã®äž»ãªç®çã§ãã åæãæ£åžžã«èµ·åããå Žåããã®ã°ã©ãã«é¢ããæ
å ±ãåæãã°ã«è¡šç€ºãããŸãã ãŸãã --graph
ã¯ã --graph
ãªãã·ã§ã³ã䜿çšããŠã人éãèªãã圢åŒã§ãã®ã°ã©ãã--graph
ã§ããŸãã
ããã§ãMythrilãäœãããã®ããå€ããå°ãªããçè§£ããå¥çŽãè§£æãããªãçç±ãš[WARNING]: No contract was created during the execution of contract creation
ç±æ¥ãçè§£ãç¶ããŸãã [WARNING]: No contract was created during the execution of contract creation
ã å§ããããã«ã --create-timeout
ããã³--max-depth
ïŒæšå¥šïŒãã²ãããçµæãåŸãããªãã®ã§ãã³ã³ã¹ãã©ã¯ã¿ãŒã®ããã ãšæããŸãã-ãã®äžã®äœããæ©èœããŸããã§ããã 圌ã®ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
function Booking( string _description, string _fileUrl, bytes32 _fileHash, uint256 _price, uint256 _cancellationFee, uint256 _rentDateStart, uint256 _rentDateEnd, uint256 _noCancelPeriod, uint256 _acceptObjectPeriod ) public payable { require(_price > 0); require(_price > _cancellationFee); require(_rentDateStart > getCurrentTime()); require(_rentDateEnd > _rentDateStart); require(_rentDateStart+_acceptObjectPeriod < _rentDateEnd); require(_rentDateStart > _noCancelPeriod); m_description = _description; m_fileUrl = _fileUrl; m_fileHash = _fileHash; m_price = _price; m_cancellationFee = _cancellationFee; m_rentDateStart = _rentDateStart; m_rentDateEnd = _rentDateEnd; m_noCancelPeriod = _noCancelPeriod; m_acceptObjectPeriod = _acceptObjectPeriod; }
ãã¹ãªã«ã®è¡åã®ã¢ã«ãŽãªãºã ãæãåºããŠãã ããã ãã¬ãŒã¹ãå®è¡ããã«ã¯ãã³ã³ãã©ã¯ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãå¿
èŠããããŸããããã¯ã以éã®å®è¡ã¯ãã¹ãŠãã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããããã©ã¡ãŒã¿ãŒã«äŸåããããã§ãã ããšãã°ã _price == 0
ã§ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããšãã³ã³ã¹ãã©ã¯ã¿ãŒã¯require(_price > 0)
äŸå€ãã¹ããŒããŸãã _price
ãå€ãã®_price
å€ãå埩åŠçããŠããããšãã°_price <= _cancellationFee
å Žåãã³ã³ã¹ãã©ã¯ã¿ãŒã¯åŒãç¶ãç ŽæããŸãã ãã®å¥çŽã§ã¯ãå³ããå¶éã«é¢é£ä»ãããã倿°ã®ãã©ã¡ãŒã¿ãŒãããããã¡ãããMythrilã¯ãã©ã¡ãŒã¿ãŒã®æå¹ãªçµã¿åãããæšæž¬ã§ããŸããã 圌ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã®ãã©ã¡ãŒã¿ãŒããœãŒãããŠãå®è¡ã®æ¬¡ã®ãã©ã³ãã«ç§»åããããšããŸãããå®éã«ã¯æšæž¬ããæ©äŒããããŸãã-ãã©ã¡ãŒã¿ãŒã®çµã¿åãããå€ãããŸãã ãããã£ãŠãå¥çŽã®èšç®ã¯ããŸããããŸãã-ãã¹ãŠã®æ¹æ³ã¯äœããã®çš®é¡ã®require(...)
ã«åºã¥ããŠãããäžèšã®åé¡ãçºçããŸãã
2ã€ã®æ¹æ³ããããŸãã1ã€ç®ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã¹ãŠã®require
ãã³ã¡ã³ãåããŠç¡å¹ã«ããããšã§ãã ãã®åŸãMythrilã¯ä»»æã®ãã©ã¡ãŒã¿ã»ããã§ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãããšãã§ãããã¹ãŠãæ©èœããŸãã ããããããã¯ããã®ãããªãã©ã¡ãŒã¿ãŒã䜿çšããŠã³ã³ãã©ã¯ããæ€æ»ããããšã«ãããMythrilã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ããã誀ã£ãå€ã§çºçããå¯èœæ§ã®ãããšã©ãŒãèŠã€ããããšãæå³ããŸãã ç°¡åã«èšãã°ãå¥çŽäœæè
ã_cancellationFee
ã®ã¬ã³ã¿ã«äŸ¡æ Œã®10ååã«æå®ããå Žåã«çºçãããã°ã_cancellationFee
ãçºèŠããå Žåããã®ãããªãã°ã§ã¯äœ¿çšã§ããŸãã-ãã®ãããªå¥çŽã¯ãããã¯_mprice
ããšã©ãŒãèŠã€ããããã®ãªãœãŒã¹ãæ¶è²»ãããŸãã ç§ãã¡ã¯ãå¥çŽããŸã å€ããå°ãªããäžè²«ãããã©ã¡ãŒã¿ãŒã§ã¹ã¿ãã¯ããŠããããšãæç€ºããŠããã®ã§ããããªãåæã®ããã«ãããçŸå®çãªã³ã³ã¹ãã©ã¯ã¿ãŒãã©ã¡ãŒã¿ãŒãæå®ããŠãMythrilãå¥çŽãé©åã«éããããå Žåã«æ±ºããŠçºçããªããšã©ãŒãæ¢ããªãããã«ããŸãã
ã³ã³ã¹ãã©ã¯ã¿ãŒã®ããŸããŸãªéšåãå«ããŠãç¡å¹ã«ããããšã§ãå±éãã©ãã§äžæããããæ£ç¢ºã«çè§£ããããšãäœæéãè²»ãããŸããã ãã©ãã«ã«å ããŠãã³ã³ã¹ãã©ã¯ã¿ãŒã¯getCurrentTime()
䜿çšããŠçŸåšã®æå»ãè¿ããŸããããã®åŒã³åºããMythrilãã©ã®ããã«åŠçãããã¯äžæã§ãã ããã§ã¯ãããã®åéºã«ã€ããŠã¯èª¬æããŸããã ã»ãšãã©ã®å Žåã宿çã«äœ¿çšãããšããããã®åŸ®åŠãªç¹ãç£æ»äººã«ç¥ãããããã«ãªããŸãã ãããã£ãŠã2çªç®ã®æ¹æ³ãéžæããŸããïŒå
¥åããŒã¿ãå¶éããã³ã³ã¹ãã©ã¯ã¿ãŒãããã¹ãŠã®ãã©ã¡ãŒã¿ãŒãåé€ãã getCurrentTime()
ã§ãããå¿
èŠãªãã©ã¡ãŒã¿ãŒãã³ã³ã¹ãã©ã¯ã¿ãŒã«çŽæ¥ããŒãã³ãŒãã£ã³ã°ããŸããïŒçæ³çã«ã¯ããããã®ãã©ã¡ãŒã¿ãŒã¯é¡§å®¢ããååŸããå¿
èŠããããŸãïŒïŒ
function Booking( ) public payable { m_description = "My very long booking text about hotel and beautiful sea view!"; m_fileUrl = "https://ether-airbnb.bam/some-url/"; m_fileHash = 0x1628f3170cc16d40aad2e8fa1ab084f542fcb12e75ce1add62891dd75ba1ffd7; m_price = 1000000000000000000; // 1 ETH m_cancellationFee = 100000000000000000; // 0.1 ETH m_rentDateStart = 1550664800 + 3600 * 24; // current time + 1 day m_rentDateEnd = 1550664800 + 3600 * 24 * 4; // current time + 4 days m_acceptObjectPeriod = 3600 * 8; // 8 hours m_noCancelPeriod = 3600 * 24; // 1 day require(m_price > 0); require(m_price > m_cancellationFee); require(m_rentDateStart > 1550664800); require(m_rentDateEnd > m_rentDateStart); require((m_rentDateStart + m_acceptObjectPeriod) < m_rentDateEnd); require(m_rentDateStart > m_noCancelPeriod); }
ããã«ããã¹ãŠãéå§ããã«ã¯ã max-depth
ãã©ã¡ãŒã¿ãŒãèšå®ããå¿
èŠããããŸãã AWSã€ã³ã¹ã¿ã³ã¹t2.mediumã§--max-depth=34
ã--max-depth=34
ããŠããã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§--max-depth=34
ãŸããã åæã«ããã匷åãªã©ãããããã§ã¯ã max-depth
ãªãã§ãã¹ãŠãå§ãŸããŸãã ãã®ãã©ã¡ãŒã¿ãŒã®äœ¿çšãã倿ãããšãåæã®ããã«ãã©ã³ããæ§ç¯ããå¿
èŠãããããã®ããã©ã«ãå€ã¯ç¡éïŒ code ïŒã§ãã ãããã£ãŠããã®ãã©ã¡ãŒã¿ãŒããã€ã¹ãå転ãããŸãããç®çã®å¥çŽãåæãããããã«ããŸãã æ¬¡ã®ãããªã¡ãã»ãŒãžã§ãããçè§£ã§ããŸãã
mythril.laser.ethereum.svm [INFO]: 248 nodes, 247 edges, 2510 total states mythril.laser.ethereum.svm [INFO]: Achieved 59.86% coverage for code: .............
æåã®è¡ã¯åæãããã°ã©ãã説æããã ãã§ãæ®ãã®è¡ãèªåã§èªãã§ãã ããã å®è¡å¯èœãªããŸããŸãªãã©ã³ããåæããã«ã¯ãæ·±å»ãªèšç®ãªãœãŒã¹ãå¿
èŠã§ãããã®ãããå€§èŠæš¡ãªå¥çŽãåæããå Žåã¯ãé«éã®ã³ã³ãã¥ãŒã¿ãŒã§ãåŸ
ããªããã°ãªããŸããã
ãšã©ãŒãæ€çŽ¢ãã
ããã§ãšã©ãŒãæ¢ããç¬èªã®ãšã©ãŒã远å ããŸãã ãã¹ãªã«ã¯ãæŸéãèªå·±ç Žå£ã䞻匵ãããã³ã»ãã¥ãªãã£ã®èгç¹ããéèŠãªãã®ä»ã®ã¢ã¯ã·ã§ã³ãè¡ããããã©ã³ããæ¢ããŸãã äžèšã®æç€ºã®ãããããå¥çŽã³ãŒãã®ã©ããã«ããå ŽåãMythrilã¯ãã®ãã©ã³ãã«å°éããæ¹æ³ã調ã¹ãããã«ãã®ãã©ã³ãã«ã€ãªãããã©ã³ã¶ã¯ã·ã§ã³ã®ã·ãŒã±ã³ã¹ã衚瀺ããŸãïŒ
æåã«ãMythrilãé·å¹Žã®Booking
å¥çŽã®ããã«çºè¡ãããã®ãèŠãŠã¿ãŸãããã æåã®èŠåïŒ
==== Dependence on predictable environment variable ==== SWC ID: 116 Severity: Low Contract: Booking Function name: fallback PC address: 566 Estimated Gas Usage: 17908 - 61696 Sending of Ether depends on a predictable variable. The contract sends Ether depending on the values of the following variables: - block.timestamp Note that the values of variables like coinbase, gaslimit, block number and timestamp are predictable and/or can be manipulated by a malicious miner. Don't use them for random number generation or to make critical decisions. -------------------- In file: contracts/flattened.sol:142 msg.sender.transfer(msg.value-m_price)
ãããŠããã¯èµ·ãã
require(m_rentDateStart > getCurrentTime());
ãã©ãŒã«ããã¯é¢æ°ã§ã
getCurrentTime()
é ããŠããããšã«æ°ã¥ããããšã«æ³šæããŠãã ããã å¥çŽã®æå³ã¯ééãã§ã¯ãªããšããäºå®ã«ããããããã block.timestamp
ããããŒããã£ã¹ãã«é¢é£ä»ãããšããäºå®ã¯çŽ æŽãããã§ãïŒ ãã®å Žåãããã°ã©ããŒã¯ããã€ããŒãå¶åŸ¡ã§ããå€ã«åºã¥ããŠæ±ºå®ãäžãããããšãçè§£ããå¿
èŠããããŸãã ãŸããå°æ¥ããµãŒãã¹ã®ãªãŒã¯ã·ã§ã³ãŸãã¯å¥ã®ãªãŒã¯ã·ã§ã³ãå¥çŽã®ãã®å Žæã§çºçããå Žåãããã³ãã©ã³ãã³ã°æ»æã®å¯èœæ§ãèæ
®ããå¿
èŠããããŸãã
次ã®ããã«ãã¹ããããåŒã³åºãã§å€æ°ãé衚瀺ã«ããå Žåã block.timestamp
ãžã®äŸåé¢ä¿ãblock.timestamp
ãã©ãããèŠãŠã¿ãŸãããã
function getCurrentTime() public view returns (uint256) { - return now; + return getCurrentTimeInner(); } + function getCurrentTimeInner() internal returns (uint256) { + return now; + }
ãããŠã¯ãïŒ ãã¹ãªã«ã¯åŒãç¶ãblock.timestampãšãããŒããã£ã¹ãã®è»¢éãšã®é¢ä¿ã確èªããŠããŸããããã¯ç£æ»äººã«ãšã£ãŠéåžžã«éèŠã§ãã æ»æè
ã«ãã£ãŠå¶åŸ¡ããã倿°ãšãå¥çŽã®ç¶æ
ã®ããã€ãã®å€æŽåŸã«è¡ãããæ±ºå®ãšã®é¢ä¿ã¯ãããžãã¯ã«ãã£ãŠéåžžã«é ãããŠããå¯èœæ§ããããMythrilã§ã¯ããã远跡ã§ããŸãã ãã¹ãŠã®å¯èœãªå€æ°éã®ãã¹ãŠã®å¯èœãªæ¥ç¶ãgetCurrentTime()
ããããšããäºå®ã«äŸåãã䟡å€ã¯ãããŸãããã getCurrentTime()
颿°ã§getCurrentTime()
ãç¶ããäžéã®ãã¹ãã®æ·±ããäœãç¶ãããšãèŠåã¯æ¶ããŸãã Mythrilã®å颿°åŒã³åºãã«ã¯ãæ°ããç¶æ
ãã©ã³ããäœæããå¿
èŠããããããéåžžã«æ·±ãã¬ãã«ã®ãã¹ããåæããã«ã¯ãèšå€§ãªãªãœãŒã¹ãå¿
èŠã«ãªããŸãã
ãã¡ãããåæãã©ã¡ãŒã¿ãŒã誀ã£ãŠäœ¿çšããããã¢ãã©ã€ã¶ãŒã®æ·±ãã®ã©ããã§ã«ãããªããçºçãããããããªãæ·±å»ãªå¯èœæ§ããããŸãã ç§ãèšã£ãããã«ããã®è£œåã¯å·çæç¹ã§ç©æ¥µçã«éçºäžã§ããããªããžããªã«max-depth
èšåãããã³ããããããã®ã§ãçŸåšã®åé¡ãçå£ã«åãåããªãã§ãã ãã.Mythrilãæé»çãªæ¥ç¶ãéåžžã«å¹æçã«æ¢ãããšãã§ãããšããååãªèšŒæ ããã§ã«çºèŠããŠããŸã倿°ã
æåã«ãã¯ã©ã€ã¢ã³ãã«ãããŒããã£ã¹ããã³ã³ãã©ã¯ãã«éä¿¡ããåŸã«ã®ã¿ã誰ã«ã§ããããŒããã£ã¹ããæäŸãã颿°ãã³ã³ãã©ã¯ãã«è¿œå ããŸãã å¥çŽãState.PAID
ç¶æ
ã«ããå Žåã®ã¿ïŒã€ãŸããã¯ã©ã€ã¢ã³ããã¬ã³ã¿ã«çªå·ãèªç©ºã§æ¯æã£ãåŸã«ã®ã¿ïŒã誰ã§ãèªç©ºã®1/5ãåãåãããšãèš±å¯ããŸããã 颿°ã¯æ¬¡ã®ãšããã§ãã
function collectTaxes() external onlyState(State.PAID) { msg.sender.transfer(address(this).balance / 5); }
ãã¹ãªã«ã¯åé¡ãçºèŠããŸããïŒ
==== Unprotected Ether Withdrawal ==== SWC ID: 105 Severity: High Contract: Booking Function name: collectTaxes() PC address: 2492 Estimated Gas Usage: 2135 - 2746 Anyone can withdraw ETH from the contract account. Arbitrary senders other than the contract creator can withdraw ETH from the contract account without previously having sent a equivalent amount of ETH to it. This is likely to be a vulnerability. -------------------- In file: contracts/flattened.sol:149 msg.sender.transfer(address(this).balance / 5) -------------------- -------------------- Transaction Sequence: { "2": { "calldata": "0x", "call_value": "0xde0b6b3a7640000", "caller": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" }, "3": { "calldata": "0x01b613a5", "call_value": "0x0", "caller": "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" } }
çŽ æŽããããã€ãŸã ãã¹ãªã«ã¯2ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ãå
¬éããŸãããããã«ãããå¥çŽãããšãŒãã«ãååŸããããšãã§ããŸãã æ¬¡ã®ããã«ã State.PAID
èŠä»¶ãState.RENT
倿ŽããŸãã
- function collectTaxes() external onlyState(State.PAID){ + function collectTaxes() external onlyState(State.RENT) {
ããã§ã collectTaxes()
ã¯ãå¥çŽãState.RENT
ç¶æ
ã«ããå Žåã«ã®ã¿åŒã³åºãããšãã§ããçŸæç¹ã§ã¯æ®é«ã«äœããããŸããã å¥çŽã¯ãã§ã«ãããŒããã£ã¹ãå
šäœãææè
ã«éä¿¡ããŠããŸãã ããã§éèŠãªããšã¯ãMythrilã¯ä»åã¯ãšã©ãŒ==== Unprotected Ether Withdrawal ====
åºåããªãããšã§ãïŒ onlyState(State.RENT)
æ¡ä»¶äžã§ã¯ãã¢ãã©ã€ã¶ãŒã¯ãæ®é«ããŒãã§ãªãå¥çŽãããšãŒãã«ãéä¿¡ããã³ãŒããã©ã³ãã«å°éããŸããã§ããã State.RENT
ã¯ãã©ã¡ãŒã¿ã®ããŸããŸãªãªãã·ã§ã³ãæ€èšããŸãããããã¹ãŠã®ãããŒããã£ã¹ãã貞ãæã«éä¿¡ããããšã§ã®ã¿State.RENT
ã§ããŸãã ãããã£ãŠããã©ã³ã¹ããŒãã§ãªãã³ãŒãã®ãã®åå²ã«å°éããããšã¯äžå¯èœã§ãããMythrilã¯çµ¶å¯Ÿã«ç£æ»äººãæ©ãŸããŸããïŒ
åæ§ã«ã selfdestruct
ãèŠã€ããŠassert
ãã©ã®ã¢ã¯ã·ã§ã³ãå¥çŽã®ç Žå£ãŸãã¯éèŠãªæ©èœã®æ
éã«ã€ãªããå¯èœæ§ãããããç£æ»äººã«ç€ºããŸãã ãããã®äŸã¯æäŸãããäžã®äŸã®ãããªé¢æ°ãäœæããŠã selfdestruct
åŒã³åºãselfdestruct
ã§ããã®ããžãã¯ãã²ãããŸãããã
ãŸããMythrilã®äžéšãã·ã³ããªãã¯å®è¡ã§ããããã®ã¢ãããŒãèªäœãå®è¡ããšãã¥ã¬ãŒãããã«å€ãã®è匱æ§ã倿ã§ããããšãå¿ããªãã§ãã ããã ããšãã°ããªãã©ã³ãã®1ã€ãæ»æè
ã«ãã£ãŠäœããã®åœ¢ã§å¶åŸ¡ãããŠããå Žåãã+ããã-ããããã³ãã®ä»ã®ç®è¡æŒç®åã䜿çšãããšããæŽæ°ãªãŒããŒãããŒãã®è匱æ§ãšèŠãªãããŸãã ããããç¹°ãè¿ããŸãããMythrilã®æã匷åãªæ©èœã¯ãã·ã³ããªãã¯å®è¡ãšãã€ãã£ãå®è¡ã®çµã¿åãããšãè«çåå²ã«ã€ãªãããã©ã¡ãŒã¿å€ã®å®çŸ©ã§ãã
ãããã«
ãã¡ãããMythrilãæ€åºã§ããæœåšçãªåé¡ã®å
šç¯å²ã瀺ãã«ã¯ãè€æ°ã®èšäºãå¿
èŠã§ãããããã€ãã®èšäºãå¿
èŠã§ãã ä»ã®ãã¹ãŠã«ã圌ã¯å®éã®ãããã¯ãã§ãŒã³ã§ãã¹ãŠãè¡ãæ¹æ³ãç¥ã£ãŠããã眲åã«ãã£ãŠå¿
èŠãªå¥çŽãšè匱æ§ãèŠã€ããçŸããã³ãŒã«ã°ã©ããæ§ç¯ããã¬ããŒãããã©ãŒãããããŸãã ãŸããMythrilã§ã¯ãç¬èªã®ãã¹ãã¹ã¯ãªãããèšè¿°ããŠãPythonããŒã¹ã®ã€ã³ã¿ãŒãã§ã€ã¹ãã³ã³ãã©ã¯ãã«æäŸããåã
ã®æ©èœããã¹ããããããã©ã¡ãŒã¿å€ãä¿®æ£ããããä»»æã®æè»æ§ã§éã¢ã»ã³ãã«ãããã³ãŒããæäœããç¬èªã®æŠç¥ãå®è£
ããããšãã§ããŸãã
Mythrilã¯ãŸã ããªãè¥ããœãããŠã§ã¢ã§ãããããã¯IDA Proã§ã¯ãªããããã€ãã®èšäºãé€ããŠã»ãšãã©ããã¥ã¡ã³ãããããŸããã å€ãã®ãã©ã¡ãŒã¿ãŒã®å€ã¯ã cli.pyã§å§ãŸãMythrilã³ãŒãã§ã®ã¿èªã¿åãããšãã§ããŸãã åãã©ã¡ãŒã¿ãŒã®æäœã«é¢ããå®å
šãã€è©³çްãªèª¬æãããã¥ã¡ã³ãã«èšèŒãããããšãé¡ã£ãŠããŸãã
ããã«ãã³ã³ãã©ã¯ããå€ããå°ãªããã倧éã®ãšã©ãŒã®åºåã¯å€ãã®ã¹ããŒã¹ãå æããŸãããèŠã€ãã£ããšã©ãŒã«é¢ããå§çž®ãããæ
å ±ãåä¿¡ã§ããããã«ããããšæããŸãã Mythrilã䜿çšããå Žåã¯ãåæãã¬ãŒã¹ãå¿
ã確èªããå¯èœãªéããã¹ããããå¥çŽã確èªããç£æ»äººãåœéœæ§ãšèŠãªãç¹å®ã®ãšã©ãŒã匷å¶çã«ç¡å¹ã«ããããšãã§ããŸãã
ããããäžè¬çã«ãMythrilã¯ã¹ããŒãã³ã³ãã©ã¯ããåæããããã®åªããéåžžã«åŒ·åãªããŒã«ã§ãããçŸæç¹ã§ã¯ç£æ»äººã®æŠåšã«ãªãã¯ãã§ãã ããã«ãããå°ãªããšãã³ãŒãã®éèŠãªéšåã«æ³šæãæãã倿°éã®é ããé¢ä¿ãæ€åºã§ããŸãã
èŠçŽãããšãMythrilã®äœ¿çšã«é¢ããæšå¥šäºé
ã¯æ¬¡ã®ãšããã§ãã
- 調æ»äžã®å¥çŽã®éå§æ¡ä»¶ãã§ããã ãçµããŸãã åæäžã«ãMythrilãå®éã«ã¯å®è£
ãããªããã©ã³ãã«å€ãã®ãªãœãŒã¹ãè²»ãããšãæ¬åœã«éèŠãªãã°ãèŠã€ããããšãã§ããªããªããããæœåšçãªãã©ã³ãã®é åãåžžã«çµã蟌ãã§ãã ããã
mythril.laser.ethereum.svm [WARNING]: No contract was created during the execution of contract creation Increase the resources for creation execution (--max-depth or --create-timeout)
ãªã©ã®ã¡ãã»ãŒãžãèŠéããªãããã«ãå¥çŽåæãéå§ãããŠããããšã確èªããŠãã ããmythril.laser.ethereum.svm [WARNING]: No contract was created during the execution of contract creation Increase the resources for creation execution (--max-depth or --create-timeout)
ããã以å€ã®å Žåã¯ããã°ããªããšèª€ã£ãŠèæ
®ããå¯èœæ§ããããŸãã- å¥çŽã³ãŒãã§ãã©ã³ããä»»æã«ç¡å¹åããŠãMythrilããã©ã³ããéžæããŠãªãœãŒã¹ãç¯çŽããéã®å€åãå°ãªãããããšãã§ããŸãã åæããåãèœãšããªããããã«
max-depth
å¶éãèšããªãã§ãã ãããããšã©ãŒãé ããªãããã«æ³šæããŠãã ããã - åèŠåã«æ³šæããŠãã ããã軜ãã³ã¡ã³ãã§ãã£ãŠããå°ãªããšãå¥çŽã³ãŒãã«ã³ã¡ã³ãã远å ããŠãä»ã®éçºè
ãç°¡åã«ã§ããããã«ãã䟡å€ãããå ŽåããããŸãã
次ã®èšäºã§ã¯ãManticoreã¢ãã©ã€ã¶ãŒãåãäžããŸãããããã«ãå·çã®æºåãã§ããŠããããŸãã¯å·çäºå®ã®èšäºã®ç®æ¬¡ã瀺ããŸãã
ããŒã1. ã¯ããã«ã Solidityã®ã³ã³ãã€ã«ããã©ããåãããŒãžã§ã³
ããŒã2. ã¹ãªã¶ãŒ
ããŒã3.ãã¹ãªã«ïŒãã®èšäºïŒ
ããŒã4. ManticoreïŒå·çäžïŒ
ããŒã5.ãšãããïŒå·çäžïŒ