본문 바로가기

블록체인교육129

[블록체인 보안] 스마트컨트랙트 취약성(Visibility- 부적절한 접근 제어 취약점) 함수의 기본 가시성은 공개(public)임 만약 안전하지 않은 가시성 설정이 있다면, 공격자는 스마트계약 내의 민감한 함수를 직접 호출 할 수 있음 onwerGame 계약은 계약의 소유자를 변경하기 위함 changeOwner 함수를 가지고 있음 그러나 부적절한 접근 제어로 인해 이 함수는 공개적으로 접근 가능하며, 외부 계정 또는 계약에서 호출 될 수 있음 결과적으로 공격자는 이 함수를 호출하여 계약의 소유권을 변경하고 제어를 얻을 수 있음 개선 접근 제어 수정자 사용 : modifier onlyOwner 등 테스트 소스 https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/Visibility.sol 코드 취약부분 테스트 참고문서 https://w.. 2023. 8. 24.
[블록체인 보안] 스마트컨트랙트 취약성 (예측가능한 무작위성 취약점) 블록 해시, 블록 번호, 블록 타임스탬프 및 기타 필드와 같은 전역변수의 사용은 안전하지 않으며, 마이너와 공격자가 이를 제어할 수 있음 시나리오 GuessTheRandomNumber는 블록해시와 타임스탬프에서 생성된 유사한 무작위 숫자를 맞춘다면 1 이더를 얻을 수 있는 게임 처음에는 올바른 숫자를 맞추는 것은 불가능한 것처럼 보임 엘리스가 1 이더와 함께 GuessTheRandomNumber를 배포함 이브가 Attack을 배포함 이브가 Attack.attack()를 호출하고 1 이더를 획득함 개선방안 blockhash와 block.timestamp를 무작위성의 소스로 사용하지 말것 테스트 소스 https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/tes.. 2023. 8. 24.
[블록체인 보안] 스마트컨트랙트 취약성 (DOS) KingOfEther 계약은 사용자가 현재 잔액보다 더 많은 이더를 보내는 것으로 왕위를 요구할 수 있는 게임을 운영 새로운 사용자가 더 많은 이더를 보낼 때, 계약은 이전 “왕”에게 이전 잔액을 반환하려고 시도함 그러나 이 매커니즘은 악용될 수 있음 공격자의 계약은 왕이 되어서 후속 fallback 함수를 실패시키거나 정해진 가스 한도보다 더 많은 가스를 소비하여 KingOfEther 계약이 이전 왕에게 이더를 반환하려고 할때 claimThrone 함수를 실패하게 만들 수 있음 개선방법 Pull 지불 패턴 사용, 사용자가 이더를 받는 대신 인출할 수 있도록 하는 것! 소스파일 https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/DOS.sol 코.. 2023. 8. 24.
[블록체인 보안] 스마트컨트랙트 취약성 Bypass isContract() validation 테스트 소스 https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/Bypasscontract.sol 공격방법 공격자는 스마트계약인지 여부 감지하는 매커니즘을 우회하기 위해서 스마트계약의 생성자(constructor)에 코드를 작성하면 됨. 참고문서 https://web3sec.notion.site/Bypass-isContract-validation-5a20427b58814513a27d251983c2a829 2023. 8. 24.
[블록체인 보안] 스마트컨트랙트 취약성 hidden backdoor 소스파일 https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/Backdoor-assembly.sol 이 계약은 표면적으로 공정한 ‘LotteryGame’이라고 생각할수 있음 실제 계약 배포자, 관리자에게 특권이 부여되어 있음 어셈블리 레벨의 스토리지 변수 접근을 통해서 달성됨 referee function은 관리적인 백도어를 제공하도록 설계됨 pickWinner 함수는 무작위로 당첨자를 선택하는 것처럼 보이지만 실제로는 관리자가 당첨자를 설정할 수 있게 해줌 결국 일반적인 접근제어를 우회하며 무단 사용자가 상금 풀을 인출하는데 사용할 수 있는 러그풀(rug pull)의 한 유형임. 공격자는 인라인 어셈블리 작성하여 백도어로 스마트계약을 조작할수 .. 2023. 8. 24.
[블록체인 보안] 스마트컨트랙트 취약성, private data 취약성 테스트 소스 https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/Privatedata.sol 코드 취약성 - 솔리디티는 컨트랙트에 정의된 변수를 슬롯에 저장함. - 각 슬롯은 최대 32바이트 또는 256비트까지 데이터를 수용할 수 있음 - 온체인 데이터는 공개, 비공개든 읽을 수 있음. - 비공개 데이터가 있는 보안 컨트랙트로부터 메모리 슬롯을 예측하여 읽어 낼 수 있음. 테스트 참고문서 https://web3sec.notion.site/Private-data-6c0a2a7122e443988cdf514cc54a0a79 2023. 8. 24.
[블록체인 보안] 스마트컨트랙트 취약성 Unchecked external call - call injection 안전하지 않은 호출 취약점 TokenWhale 계약의 ApproveAndCallcode 함수에서 발생하는 취약점. 이 취약점은 임의의 데이터와 함께 임의의 호출이 실행될 수 있게 해서 잠재적인 보안 위험과 의도치 않은 결과를 초래할 수 있음 이 함수는 _spender 주소로부터 받은 _extraData에 대한 유효성 검사나 호가인을 수행하지 않고 저수준 호출(_spender.call(_extraData)를 사용하여 코드를 실행함. 이로 인해 예상치 못한 동작, 재진입공격 또는 무단작업이 발생할 수 있음 이 연습은 입력 및 반환값이 확인되지 않는 계약으로의 저수준 호출에 관한 것임, 호출 데이터가 조작 가능한 경우 임의의 함수 실행을 일으키는것이 쉬움. 테스트 소스 https://github.com/Sun.. 2023. 8. 24.
[블록체인 보안] 스마트컨트랙트 취약성(재진입공격) 재진입 취약점 EtherStore 재진입 취약점은 스마트계약설계의 결함으로, 공격자가 재진입을 악용하여 EtherStore 계약으로부터 자신이 권한이 있는 금액보다 더 많은 자금을 인출할 수 있는 문제임. 이 취약점은 EtherStore 계약의 withdrawFunds 함수에서 발생함. 여기서 Ether가 공격자 주소로 전송되고 나서 잔액을 업데이트 하기 때문임. 이로 인해 공격자의 계약은 잔액 업데이트 이전에 withdrawfunds 함수로 재진입 호출을 수행할 수 있음. 이로써 여러차례의 인출이 발생하고 EtherSotre 계약에서 모든 Ether가 흡수될 수 있음. 시나리오. EtherStore는 간단한 금고로, 모든 사람의 이더를 관리할 수 있음. 하지만 이는 취약함. 보안방법 check-effe.. 2023. 8. 24.
[블록체인 보안] 스마트컨트랙트 취약성 unsafe delegatecall 안전하지 않은 Delegate Call 취약성 Proxy 계약 소유자 조작 취약점은 스마트계약 설계에서 발행하는 결함으로, 공격자가 Proxy 계약의 소유자를 조작할 수 있는 문제임. 이 취약점은 Proxy 계약의 fallback 함수에서 delegatecall을 사용함으로써 발생 함. delegatecall은 공격자가 proxy 계약의 컨텐스트 내에서 delegate 계약의 pwn()함수를 호출할 수 있게 해주므로, Proxy 계약의 소유자 상태 변수값을 변강할 수 있음. 이로써 스마트계약은 런타임시 다른 주소에서 코드를 동적으로 로드할 수 있게 됨. 시나리오 Proxy 계약은 사용자가 로직 계약을 호출하는데 도움을 주기 위해 설계 됨. Proxy 계약의 소유자는 0xdeadbeef로 하드코딩되어 있음.. 2023. 8. 24.