본문 바로가기

블록체인교육/블록체인보안26

[블록체인 보안] 스마트컨트랙트 취약성(곱하기 전에 나누기) 정밀도 문제 - 곱하기 전에 나누기 솔리디티에서 나눗셈 연산을 수행할때 발생하는 일반적인 문제 솔리디티의 부동 소수점 숫자를 지원하지 않기 때문에 연산 순서가 정수 잘림(truncation)으로 인해 결과에 영향을 줄수 있음 “Miscalculation” 계약에서 함수 price는 나눗셈을 곱하기보다 먼저 수행함(price/100)*discount 솔리디티는 정수를 나눌 때 정수 잘림(integer truncation)을 수행하기 때문에, 가격이 100미만인 결과는 0이 됨. 이로 인해 곱셈의 결과도 0이 됨 반면에 “Calculation”계약에서 함수 price는 곱셈을 나눗셈보다 먼저 수행함(price*discount)/100 이렇게 하면 곱셈은 잘리지 않고 최종 결과만 잘리기 때문에 결과가 올바르게.. 2023. 8. 25.
[블록체인 보안] 스마트컨트랙트 취약성(솔리디티 diritybytes) 솔리디티 0.8.15에서의 dritybytes Memory나 calldata에서 storage로 ‘bytes’ 배열을 복사할 때, 길이가 32의 배수가 아닌 경우에도 32바이트 단위로 청크(chunks)를 나눠서 복사함 따라서 배열 끝을 넘어서는 추가 바이트가 calldata나 memory에서 storage로 복사될 수 있음. 이런 dirty bytes는 storage의 ‘bytes’ 배열에 ‘.push()’를 인자 없이 수행한 후에 관찰 가능해질 수 있음 즉, 이러한 .push()는 배열 끝에 예상대로 0 값이 생성되지 않을 수 있음. 이 버그는 레거시코드 생성 파이프라인에만 영향을 미치며, IR을 통한 새로운 코드 생성 파이프라인에는 영향을 미치지 않음. 테스트 소스 https://github.com.. 2023. 8. 24.
[블록체인 보안] 스마트컨트랙트 취약성(storage vs memory) 데이터 위치 혼동 취약점 updaterewardDebt 함수에서 사용자의 스토리지(storage) 및 메모리(memory) 참조를 오용함 updaterewardDebt 함수는 메모리에 저장된 UserInfo 구조체의 rewardDebt 값을 업데이트 함 이 문제는 이 값이 함수 호출간에 지속되지 않는다는 것임 함수 실행이 완료되면 메모리가 지워지고 변경 내용이 손실됨 보안방법. 함수 매개변수에서 메모리 및 스토리지 사용을 올바르게 확인해야 함. 모든 위치를 명시적으로 지정할것 테스트 소스 https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/DataLocation.sol 취약성 코드 테스트 결과 참고문서 https://web3sec.notion.s.. 2023. 8. 24.
[블록체인 보안] 스마트컨트랙트 취약성(signature replay) 서명 재생 취약점 앨리스는 밥이 앨리스의 계정에서 밥의 계정으로 토큰을 전송할 수 있도록 트랜잭션에 서명함 밥은 이 서명을 여러 계약(이 경우 TokenWhale 및 SixEyeToken계약)에 반복해서 사용함 매번 앨리스의 계정에서 자신의 계정으로 토큰을 전송하도록 승인함 계약이 트랜잭션에 대한 서명 및 확인을 위해 동일한 방법을 사용하지만 리플레이 공격을 방지하기 위해 nonce를 공유하지 않기 때문에 가능함. 서명 재생 공격에 대한 보호가 누락되면, 동일한 서명을 여러 번 사용하여 함수를 실행할 수 있음 개선 서명 및 확인 프로세스에 nonce를 도입하여 한 번만 사용되는 번호를 사용함으로써 리플레이 공격을 방지할 수 있음. 테스트소스 https://github.com/SunWeb3Sec/DeFiV.. 2023. 8. 24.
[블록체인 보안] 자금 탈취 공격 (approval scam) 지나친 승인(Over-Permissive) 스캠 이 취약점은 ERC20 토큰의 승인 프로세스와 관련 있음 이 시나리오에서 앨리스는 이브가 앨리스의 계정에서 무제한(type(uint256).max) 수량의 토큰을 전송할 수 있도록 승인함. 향후에 이브는 이 승인을 악용하여 엘리스의 계정에서 1000개의 토큰을 자신의 계정으로 전송함 대부분의 현재 사기는 승인(approve) 또는 setApprovelForAll 을 사용하여 이 전송권한을 남용함 테스트소스 https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/ApproveScam.sol 공격코드 테스트 참고문서 https://web3sec.notion.site/Approval-scam-4f1f711b.. 2023. 8. 24.
[블록체인 보안] 스마트컨트랙트 취약성 Storage collision 테스트소스 https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/Storage-collision.sol 스토리지 충돌 취약점 Proxy와 Logic 계약이 중요한 변수를 저장하는데 동일한 스토리지 슬롯(슬롯0)을 사용한다는 것 이 중요한 변수는 Proxy 계약에서 구현주소(implementation address)이며, Logic 계약에서는 GuestAddress 임. Proxy 계약이 Logic 계약과 Delegatecall 메서드를 사용하여 상호작용하기 때문에 이들은 같은 스토리지 공간을 공유함. Foo 함수가 호출되면 proxy 계약의 구현주소가 덮어쓰여져 예상치 못한 동작이 발생함 해결방법 프록시와 로직 계약의 스토리지 레이아웃을 일관되게 .. 2023. 8. 24.
[블록체인] 스마트컨트랙트 취약성(불완전한 tx.orgin 취약점) 소스 https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/txorigin.sol 불완전한 tx.origin 취약점 tx.origin은 솔리디티의 전역변수로, 이 변수를 스마트계약에서 인증에 사용하면 계약이 피싱 공격에 취약해질 수 있음 시나리오 wallet은 소유자만 다른 주소로 이더를 전송할 수 있는 간단한 계약임 wallet.transfer()는 호출자가 소유자인지 확인하기 위해 tx.origin을 사용함 앨리스는 Attack.attack()안에 있는 Attack.attack()을 호출해서 트릭을 사용함 엘리스의 지갑에 있는 모든 자금을 이브의 주소로 전송하는 것을 요청함 wallet.transfer()에서 tx.orgin이 앨리스의 주소와 .. 2023. 8. 24.
[블록체인 보안] 스마트컨트랙트 취약성(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.