본문 바로가기

Home363

[블록체인 보안] 스마트컨트랙트 취약성(배열 삭제 간과) 배열 삭제 간과 : 데이터 불일치로 이어지는 문제 솔리디티에서 동적 배열요소를 적절하게 삭제하지 않으면 데이터 불일치가 발생할 수 있음 배열에서 요소를 삭제할때 삭제 과정을 올바르게 처리하지 않으면 배열은 여전히 스토리지 공간을 유지하게 되며 예상치 못한 동작이 발생할 수 있음 조치방안 옵션1 : 마지막 요소를 복사하여 제거할 위치에 넣는 방법 옵션2 : 오른쪽에서 왼쪽으로 요소를 이동하여 삭제하는 방법 테스트 소스 https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/Array-deletion.sol 코드 취약부분 테스트 참고문헌 https://web3sec.notion.site/Array-Deletion-Oversight-199221ca7495.. 2023. 8. 25.
[블록체인 보안] 스마트컨트랙트 취약성(Struct Deletion Oversight) 구조체 삭제 간과 불완전한 구조체 삭제는 잔여 데이터를 남기게 됨. 매핑을 포함하는 구조체를 삭제하더라도 해당 매핑은 삭제되지 않음. 이 버그는 솔리디티의 delete 키워드가 스토리지를 초기 상태로 재설정하지 않고 부분적인 초기화를 수행하기 때문에 발생함. Delete myStructs[structId]가 호출되면 이는 매핑 내의 id 만 기본값인 0으로 재설정하지만, 매핑 내의 다른 플래그는 변경되지 않음. 따라서 구조체 내부의 매핑을 삭제하지 않고 구조체를 삭제하면 남아 있는 플래그라 스토리지에 계속 남게 됨. 조치 이 버그를 수정하려면 구조체 자체를 삭제하기 전에 구조체 내부의 매핑을 삭제해야 함. 테스트소스 https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/m.. 2023. 8. 25.
[블록체인 보안] 스마트컨트랙트 취약성(abi.encodePacked()) Abi.encodePacked() 해시 충돌 여러 가변 길이 인자와 함께 abi.encodePacked()을 사용하는 경우 특정 상황에서 해시 충돌이 발생할 수 있음. 해시함수는 각 입력에 대해 고유하도록 설계되었지만, 해시 함수의 크기 제한이나 가능한 입력 수의 한계로 인해 충돌이 발생할 수 있음. 해당 이슈 문서 https://docs.soliditylang.org/en/v0.8.17/abi-spec.html?highlight=collisions#non-standard-packed-mode Deposit 함수에는 사용자가 _string1 및 _string2 라는 두개의 문자열 입력을 기반으로 계약에 이더를 예치할 수 있음. 계약은 이 두 문자열을 연결하여 고유한 해시를 생성하기 위해 keccak256.. 2023. 8. 25.
[블록체인 보안] 스마트컨트랙트 취약성(토큰의 소수점이슈) 정밀도 손실 - 소수점 이하를 반올림하여 0으로 모든 ERC20 토큰을 지원하면서, 이러한 토큰들은 서로 다른 소수 자리를 가질 수 있음. 예를들어 USDC와 USDC는 6개의 소수자리를 가짐. (계산시 조심해야 함) 분자가 분모보다 작으면 결과가 0이 되는 상황을 피해야 함 반올림과 관련된 문제는 다음과 같은 방법으로 피할 수 있음 필요한대로 반올림/버림 라이브러리 사용 결과가 0이 아니거나 분모가 분자보다 작거나 같음을 요구 분자를 먼저 나눈 다음 곱하는 대신에 연산을 리팩토링하여 정밀도 손실이 증폭되는 상황 피하기 테스트소스 https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/Precision-loss.sol 취약코드 테스트결과 참고문서 h.. 2023. 8. 25.
[블록체인 보안] 스마트컨트랙트 취약성(ecRecover address(0) 반환) ecRecover가 address(0)을 반환하는 문제 SimpleBank 계약에서 transfer 함수는 매시지 해시와 서명(v,r,s 값)을 입력으로 받음. 이 함수는 서명을 복구하여 서명한 주소를 얻은 다음 이 주소가 관리자(admin)와 같은지 확인함 취약점은 ecRecover 함수가 서명 매개변수가 잘못된 경우에 0x0주소를 반환할 수 있다는 점 만약 v값이 27이나 28이 아닌 경우에도 0x0 주소를 반환할 것임 조치방안 Ecrecover 함수의 결과가 0이 아닌지 확인하거나 대신 openzeppelin의 ECDSA라이브러리를 사용 테스트소스 https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/ecrecover.sol 코드취약성 테스트.. 2023. 8. 25.
[블록체인보안] 스마트컨트랙트 취약성 Incompatibility with deflationary 테스트소스 https://github.com/SunWeb3Sec/DeFiVulnLabs/blob/main/src/test/fee-on-transfer.sol TA 토큰은 수령인으로부터 1%의 이체수수료를 조정한 조정모델을 가지고 있었음. 실제로 예치된 금액은 함수 매개변수의 depositAmount보다 낮을 수 있음 VulnVault : 조회되지 않는 조화/이체 수수료 토큰과의 호환성 개선방안 먼저 토큰을 이전하고 이후의 토큰 잔액을 비교하여 실제 예치된 금액을 계산. 테스트 참고문서 https://web3sec.notion.site/Incompatibility-with-deflationary-fee-on-transfer-tokens-c5414f0c92634d26b7c65409fc581002 2023. 8. 25.
[블록체인 보안] 스마트컨트랙트 취약성(곱하기 전에 나누기) 정밀도 문제 - 곱하기 전에 나누기 솔리디티에서 나눗셈 연산을 수행할때 발생하는 일반적인 문제 솔리디티의 부동 소수점 숫자를 지원하지 않기 때문에 연산 순서가 정수 잘림(truncation)으로 인해 결과에 영향을 줄수 있음 “Miscalculation” 계약에서 함수 price는 나눗셈을 곱하기보다 먼저 수행함(price/100)*discount 솔리디티는 정수를 나눌 때 정수 잘림(integer truncation)을 수행하기 때문에, 가격이 100미만인 결과는 0이 됨. 이로 인해 곱셈의 결과도 0이 됨 반면에 “Calculation”계약에서 함수 price는 곱셈을 나눗셈보다 먼저 수행함(price*discount)/100 이렇게 하면 곱셈은 잘리지 않고 최종 결과만 잘리기 때문에 결과가 올바르게.. 2023. 8. 25.
월드랜드(WorldLand) FreeToken 에어드랍 * 월드랜드 메인넷 런칭후 발행되었던 FreeToken 에어드랍은 2023년 11월 26일 날짜로 종료되었습니다!! 감사합니다!! WorldLand 메인넷 런칭 이후 첫번째로 발행된 토큰인 FREE Token 에어드랍에 대한 문서입니다. FreeToken의 총발행량은 21,000,000개입니다. (최대공급량도 21,000,000개입니다.-컨트랙트에서 소스로 확인 가능) 토큰의 분배는 아래 FreeTokenAirdrop 컨트랙트를 통해서 자유롭게 누구나 에어드랍을 요청할수 있습니다. 한번에 1,000개씩 에어드랍이 되며 총 발행량 21,000,000개가 다 분배되면 더 이상 에어드랍되지 않습니다. 에어드랍을 요청할때 WLC코인이 수수료로 발행되니 WLC가 일부 필요합니다. (WLC가 없으신 경우 현재는 C.. 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.