рд╕реНрдорд╛рд░реНрдЯ рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдСрдбрд┐рдЯ рдХреЗ рд▓рд┐рдП рдЧрд╛рдЗрдбред рднрд╛рдЧ 2: рдзреАрдорд╛

рд╡рд┐рд╢реНрд▓реЗрд╖рдХ: рдзреАрд░реЗ
рд╡рд┐рд╡рд░рдг: рд╕реЙрд▓рд┐рдбрд┐рдЯреА рдХреЗ рд▓рд┐рдП рдУрдкрди-рд╕реЛрд░реНрд╕ рд╕реНрдЯреИрдЯрд┐рдХ рдПрдирд╛рд▓рд┐рд╕рд┐рд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ
githib: https://github.com/trailofbits/slither


рдпрд╣ рдПрдХ рд╕реНрдерд┐рд░ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдЬрдЧрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЪрд░, рдХреЙрд▓, рдФрд░ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рдкрддрд╛ рдХреИрд╕реЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПред рдкреНрд░рддреНрдпреЗрдХ рднреЗрджреНрдпрддрд╛ рдореЗрдВ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд┐рдВрдХ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рд╕реЙрд▓рд┐рдбрд┐рдЯреА рдХреЗ рд▓рд┐рдП рдирдП рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред


рдзреАрд░реЗ-рдзреАрд░реЗ рдПрдХ рдЕрдЬрдЧрд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЕрдкрдиреА рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдСрдбрд┐рдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╕рд░рд▓ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдЬреЛ рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ рдпрд╣рд╛рдБ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред


рд╣рдо рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд▓рд┐рдкрд┐рдпреЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯ рдЖрдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП:


git clone https://github.com/trailofbits/slither.git cd slither docker build -t slither . 

рдФрд░ рд╣рдорд╛рд░реЗ рдЕрдиреБрдмрдВрдз рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред


рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░-рдПрде-рдмреБрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдбреЙрдХрдЯрд░ рд╕реЗ рдзреАрд░реЗ рдЪрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:


 $ docker run -v $(pwd)/contracts:/slither/contracts slither contracts/flattened.sol 

рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐ "рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕рдВрдХрд▓рдХ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ", рдФрд░ рдЕрдм рд╣рдореЗрдВ solc=0.4.20 рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ solc=0.4.20 рдореЗрдВ solc=0.4.20 ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЦреБрдж рдХреЗ рдбреЙрдХрд░реАрдлрд╛рдЗрд▓ рдХреЛ рд╕рд╣реА рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд░рд┐рдЪрдп рдореЗрдВ рдзрд╛рд░рд╛ 2 рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрд░реНрдерд╛рддреНред Dockerfile рдХреЗ рдЕрдВрдд рдореЗрдВ рдХрд╣реАрдВ рд╣рдо рд▓рд╛рдЗрди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:


 COPY --from=ethereum/solc:0.4.20 /usr/bin/solc /usr/bin 

, рдЫрд╡рд┐ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг, рднрд╛рдЧреЛ, рдЪреАрдпрд░реНрд╕, рд╕рдм рдХреБрдЫ рд╕рдВрдХрд▓рд┐рддред


рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╡рд┐рднрд┐рдиреНрди "рдкреНрд░рд╛рдЧреНрдорд╛" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддреЗ рд╣реИрдВ рдФрд░ Parameter '_price' of Booking.Booking (flattened.sol#73) is not in mixedCase рдЬреИрд╕реЗ рдЧрд▓рдд рдЪрд░ рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддреЗ рд╣реИрдВ Parameter '_price' of Booking.Booking (flattened.sol#73) is not in mixedCase ред рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХрд░реНрддрд╛ рдмрд╣реБрдд рд╕реА рдЪреЗрддрд╛рд╡рдиреА рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрд╕рд▓реА рдХреАрдбрд╝реЗ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЯреНрд░рд┐рдлрд╝рд▓ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗред рд╣рдо рдорд┐рд╢реНрд░рд┐рдд рд╕рдВрджреЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рд╕рдВрджреЗрд╢ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдм рдпрд╣ рд╢реИрд▓реА рддрдХ рдирд╣реАрдВ рд╣реИ:


 $ docker run -v $(pwd)/contracts:/slither/contracts slither contracts/flattened.sol 2>&1 | fgrep -v 'mixedCase' 

рд╕рдЪреНрдЪреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЛ рд╣рд░реЗ рд░рдВрдЧ рдХреА рдпрд╛рдж рдЖрддреА рд╣реИ, рд╕рдм рдХреБрдЫ рд▓рд╛рд▓ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдБ рдЭреВрдареЗ-рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреБрдмрдВрдз рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:


 Booking.refundWithoutCancellationFee (flattened.sol#243-250) sends eth to arbirary user Dangerous calls: - client.transfer(address(this).balance) (flattened.sol#249) Reference: https://github.com/trailofbits/slither/wiki/Vulnerabilities-Description#functions-that-send-ether-to-arbitrary-destinations INFO:Detectors: Booking.refundWithCancellationFee (flattened.sol#252-259) sends eth to arbirary user Dangerous calls: - owner.transfer(m_cancellationFee) (flattened.sol#257) - client.transfer(address(this).balance) (flattened.sol#258) Reference: https://github.com/trailofbits/slither/wiki/Vulnerabilities-Description#functions-that-send-ether-to-arbitrary-destinations 

рдЕрдм рджреЗрдЦреЗрдВ рдХрд┐ рдЕрдиреБрдмрдВрдз рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ:


  /************************** PRIVATE **********************/ function refundWithoutCancellationFee() private { address client = m_client; m_client = address(0); changeState(State.OFFER); client.transfer(address(this).balance); } function refundWithCancellationFee() private { address client = m_client; m_client = address(0); changeState(State.CANCELED); owner.transfer(m_cancellationFee); client.transfer(address(this).balance); } 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди refundWithoutCancellationFee() рдЗрд╕ рддрд░рд╣ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:


  function rejectPayment() external onlyOwner onlyState(State.PAID) { refundWithoutCancellationFee(); } function refund() external onlyClient onlyState(State.PAID) { refundWithoutCancellationFee(); } 

рд╣рдореНрдо, рдХреЛрдИ рдФрдкрдЪрд╛рд░рд┐рдХ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВ: рдХреЙрд▓ рдХреЗрд╡рд▓ onlyOwner рджреНрд╡рд╛рд░рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди onlyOwner рдХрд╕рдо рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдкреНрд░рд╕рд╛рд░рдг рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪреЗрдХ рдХреЗ рдзрдирд╡рд╛рдкрд╕реА рдХреЗ рддрд╣рдд рднреЗрдЬреЗ рдЧрдП рд╣реИрдВред рдФрд░ рд╡рд╣ рд╕рд╣реА рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрднрдЧ рдХреЛрдИ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдирд┐рдЬреА рд╣реЛрдиреЗ рджреЗрдВ, рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рд░реИрдкрд░ "рд░рд┐рдЬреЗрдХреНрдЯрдкреЗрдореЗрдВрдЯ ()" "рд░рд┐рдлрдВрдб ()" рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдЖрдк рдЕрдиреБрдмрдВрдз рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдиреЗ рдФрд░ refundWithoutCancellationFee() рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд╛рди рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдЬреЛрдЦрд┐рдо рд╣реЛрддрд╛ рд╣реИ, рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рдЙрдкрд▓рдмреНрдзред рдЗрд╕рд▓рд┐рдП, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреЛрдИ рднреЗрджреНрдпрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЬрд╛рдирдХрд╛рд░реА рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реБрдИ - рдпрд╣ рдХрдо рд╕реЗ рдХрдо "рдЪреЗрддрд╛рд╡рдиреА" рд╕реНрддрд░ рд╣реИ, рдЕрдЧрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдЕрдиреБрдмрдВрдз рдХреЛрдб рдХреЛ рдФрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЗ рджреЛ рдХрд╛рд░реНрдп рдПрдХ рд╣реА рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдирд┐рд░реНрдгрдп рдЧреИрд╕ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЕрдиреБрдмрдВрдз рдПрдХ рдмрд╛рд░ рдХрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХреА рд▓рд╛рдЧрдд рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░рдХ рд╣реИред


рдореИрдВрдиреЗ рдбрдмрд▓-рдЪреЗрдХ рдХрд┐рдпрд╛ рдХрд┐ рдХрд┐рд╕реА рднреА рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд▓реЗрдпрд░ рдХреЛ рдХреЛрд╕ рд░рд╣реЗ рдереЗ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдХреЛ рд╕реАрдзреЗ "рд░рд┐рдЬреЗрдХреНрдЯрдкреЗрдореЗрдВрдЯ (") рдФрд░ "рд░рд┐рдлрдВрдб ()" рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛, рдЪреЗрддрд╛рд╡рдиреА рдЧрд╛рдпрдм рд╣реЛ рдЧрдИ, рдЕрд░реНрдерд╛рддреНред рдзреАрд░реЗ-рдзреАрд░реЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЕрдм рдкреНрд░рд╕рд╛рд░рдг рдмрд┐рдирд╛ рдкрддреЗ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢рд╛рдирджрд╛рд░ рд╢реБрд░реБрдЖрдд!


рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрд▓реЗрд░реА рдЪрд░ рдХреЗ рдЖрд░рдВрдн рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рджреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХрддрд╛рдУрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рддреЗ рд╣реИрдВ:


 - m_fileHash = _fileHash; + // m_fileHash = _fileHash; - m_price = _price; + // m_price = _price; 

рдкрд╣рд▓рд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдЫрд┐рджреНрд░реЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпреЛрдВрдХрд┐ m_fileHash рдХрд╛ рдХрд╣реАрдВ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдЕрдиреБрдмрдВрдз рдмрдирд╛рддреЗ рд╕рдордп рдмреНрд▓реЙрдХрдЪреЗрди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди m_price рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╢рдкрде рд▓реЗрддрд╛ рд╣реИ рдХрд┐ m_price рдХреЛ рдХрд╣реАрдВ рднреА рдЖрд░рдВрднреАрдХреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 Booking.m_price (flattened.sol#128) is never initialized. It is used in: - fallback (flattened.sol#144-156) 

рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдпрд╣ рдПрдХ рд╕рд░рд▓ рдЪрд╛рд▓ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛ред


рдЕрдм рд╣рдо рдЕрдиреБрдмрдВрдз рдореЗрдВ рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рд░реАрдЯрд░реНрд░реЗрдВрдХ рдХреЛ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ: рд╣рдо рдмрд╛рд╣рд░реА рдХреЙрд▓ рдХреЗ рдмрд╛рдж рдЕрдиреБрдмрдВрдз рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВ:


  function refundWithoutCancellationFee() private { address client = m_client; - m_client = address(0); - changeState(State.OFFER); - client.transfer(address(this).balance); + client.call.value(address(this).balance)(); + m_client = address(0); + changeState(State.OFFER); } 

рдореБрдЭреЗ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЛ рдмрджрд▓рдирд╛ рдкрдбрд╝рд╛, рдХреНрдпреЛрдВрдХрд┐ рдЯреНрд░рд╛рдВрд╕рдлрд░ рд╡реИрд░рд┐рдПрдВрдЯ рдХрд╕рдо рдирд╣реАрдВ рдЦрд╛рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдиреНрдпреВрдирддрдо рдЧреИрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдХреЙрд▓ рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдХреЙрд▓рдмреИрдХ рдЕрд╕рдВрднрд╡ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬрдм Ethereum рдореЗрдВ рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯрд┐рдиреЛрдкрд▓ рдХрд╛рдВрдЯрд╛ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЧреИрд╕ рдХреА рдХреАрдордд рдмрджрд▓ рджреА рдЧрдИ рдереА рдФрд░ рдЗрд╕рдиреЗ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд░реАрдЗрдВрдЯрд░рдиреЗрд╢рди рд╣рдорд▓реЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ред


рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо:


 Reentrancy in Booking.refundWithoutCancellationFee (flattened.sol#243-253): External calls: - client.call.value(address(this).balance)() (flattened.sol#245) State variables written after the call(s): - m_client (flattened.sol#246) 

рдпрд╣ рдареАрдХ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдмрд╛рд╣рд░реА рдХреЙрд▓ рдХреЗ рдмрд╛рдж рд░рд╛рдЬреНрдп рдЪрд░ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред


рдпрджрд┐ рдЖрдк рд╕реВрдЪреА рдореЗрдВ рдШреВрдорддреЗ рд╣реИрдВ, рддреЛ рд╕реВрдЪреА рдореЗрдВ рд╢реЗрд╖ рднреЗрджреНрдпрддрд╛рдПрдВ рдпрд╛ рддреЛ рдХреЛрдб рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рддреА рд╣реИрдВ, рдпрд╛ рдЬреНрдЮрд╛рдд рдкреИрдЯрд░реНрди, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЕрдЬрдЧрд░ рджреНрд╡рд╛рд░рд╛ рдорд╛рд░реНрдХрдЕрдк рддрдХ рдкрд╣реБрдВрдЪ рдЙрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рдХрд╛рдлреА рдордЬрд╝рдмреВрддреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВред рдпрд╛рдиреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХрд╣реАрдВ рднреА рдкреИрдЯрд░реНрди рдпрд╛рдж рдирд╣реАрдВ рд╣реЛрдЧрд╛ред


рдЕрдм, рдореИрдВ рдРрд╕реЗ рдмрджрд▓рд╛рд╡ рдХрд░реВрдБрдЧрд╛ рдЬреЛ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдХрд╛рдо рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджрд┐рдЦрд╛ рджреЗрдВ:


 - client.transfer(address(this).balance + for (uint i=0; i < 1; i++) { + client.transfer(address(this).balance - 999999999999999999); + } 

рдФрд░ рдкрд░рд┐рдгрд╛рдо:


 Booking.refundWithoutCancellationFee has external calls inside a loop: - client.transfer(address(this).balance - 999999999999999999) (flattened.sol#252) Reference: https://github.com/trailofbits/slither/wiki/Vulnerabilities-Description/_edit#calls-inside-a-loop 

рдЪрдХреНрд░ рдХреЛ рдПрдХ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрддрд┐рдд рд╣реЛрддрд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП, рдЬрд╛рд░реА рдХреА рдЧрдИ рдЪреЗрддрд╛рд╡рдиреА рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реИ, рдФрд░ рдЦрддрд░рдирд╛рдХ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рдХрд╛ рдЕрднрд╛рд╡ рдЧрд▓рдд рд╣реИред рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдо, рдХреЙрд▓ рдХрд╛рдЙрдВрдЯрд┐рдВрдЧ - рдХрд╛рд░реНрдп рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭреЗрдВ рдХрд┐ рдХреМрди рд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓реЗрдВрдЧреА рдФрд░ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рд╣рдордиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛, рдФрд░ --print рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдмрдВрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕реА рднреА рджрд┐рд▓рдЪрд╕реНрдк рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрддреНрдкрд╛рджрдиред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдзреАрдореЗ рд╕реЗ CI рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рдЙрдкрдХрд░рдг рд╣реИред рдПрдХ рдмрдбрд╝реА рдЕрдиреБрдмрдВрдз рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реБрд░рдХреНрд╖рд╛-рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪрд░ рдХреЗ рдирд╛рдо рдЬрд╛рдирддреЗ рд╣реИрдВ: рд╕рдВрддреБрд▓рди, рдХрдореАрд╢рди рдЖрдХрд╛рд░, рдЭрдВрдбреЗ, рдФрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреЛрдб рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪрд░ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдирд╛, рдпрд╛ рдмрд╛рд╣рд░реА рдХреЙрд▓ рдХреЗ рдмрд╛рдж рд░рд╛рдЬреНрдп рдЪрд░ рдмрджрд▓рдирд╛, рдФрд░ рдЗрд╕рдХрд╛ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрдорд╛рдирд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╣реБрдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рдЙрдкрдХрд░рдг рд╣реИред
рд╕реНрд▓реЗрд░реА рдХрд╛ рдХрд╛рд░реНрдп рдЖрдкрдХреЛ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдХреАрдбрд╝реЗ рд╕реЗ рдмрдЪрд╛рдиреЗ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреНрдЮрд╛рдд рдЦрддрд░рдирд╛рдХ рдкреИрдЯрд░реНрди рдЦреЛрдЬрдиреЗ рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдирд╛ рд╣реИред рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдпрд╣ рд╕реЙрд▓рд┐рдбрд┐рдЯреА рдкрд░ рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ, рддреБрд░рдВрдд рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╕реЙрд▓рд┐рдбрд┐рдЯреА рдореЗрдВ рдХреЛрдб рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПред


рдкрд░рд┐рдгрд╛рдо


рдЕрдкрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд░реАрдХреНрд╖рдг рдореЗрдВ, рдореИрдВ рдмрд╣реБрдореБрдЦреА рдкреНрд░рддрд┐рднрд╛, рд╕рд░рд▓рддрд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рдЪрд╛рд░ рдФрд░ рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕рд░рд▓ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдкрд┐рдпреЛрдВ рдФрд░ CI рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рдирд╢реАрд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдбрд╛рд▓реВрдБрдЧрд╛ред


рдкреНрд░рд╕рд╛рд░рдг рдХреЛ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЬреБрдбрд╝реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рдкрд╛рдпрд╛ рдЧрдпрд╛, рдЗрд╕рдореЗрдВ рд╕рднреА рдмрдЧреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред рд╡рд╣ рдХреЗрд╡рд▓ рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛, рдЬрд┐рд╕реЗ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдЙрд╕реЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХрддрд╛, рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХрд╛ рддреНрдпрд╛рдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдорд┐рдерд╛рдЗрд▓ рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдЙрди рд▓реЗрдЦреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рджреА рдЧрдИ рд╣реИ, рдЬреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ рдпрд╛ рдиреАрдЪреЗ рд╣реИрдВ:


рднрд╛рдЧ 1. рдкрд░рд┐рдЪрдпред рд╕рдВрдХрд▓рди, рдЪрдкрдЯрд╛, рдПрдХрд░реВрдкрддрд╛ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг
рднрд╛рдЧ 2ред рдпрд╣рд╛рдВ (рдпрд╣ рд▓реЗрдЦ)
рднрд╛рдЧ 3. рдорд┐рдердХ
рднрд╛рдЧ 4. рдорддрд┐рдХреЛрд░ (рд▓реЗрдЦрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ)
рднрд╛рдЧ 5. рдЗрдЪрд┐рджрдирд╛ (рд▓реЗрдЦрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ)

Source: https://habr.com/ru/post/hi438338/


All Articles