ZPER 토큰 컨트렉트 코드 위험 - 후오비 SMT, BEC 해킹 사건
https://github.com/zperteam/zperlight/blob/master/smartcontract/contracts/ZperToken.sol
최근 후오비에서 오버플로우에 의한 해킹된 코인(SMT, BEC) 이 떠돌면서 시장에 큰 충격을 줬다. 총 발행량 31억 개인 SMT 코인 1경 개가 입금되는 것을 후오비가 포착하면서 이슈는 크게 확산되지 않았지만, 시장은 이를 명분으로 조정이 들어왔다. 해킹의 원인은 해당 토큰 컨트렉트 코드에서 safeMath 를 사용하지 않은데서 비롯됐다. transferProxy 함수에서 오버플로우가 발생한 것이다.
자산이 오가는 컨트렉트 코드에서 보안과 안정적인 코드를 짜는 일의 중요성은 두 말하면 입아프다. 대부분의 컨트렉트가 연산 검증을 위해서 safeMath로 오버플로우와 언더플로우를 점검을 하는 것을 기본으로 한다. ZPER 코드에서 safeMath를 사용하지 않으면서 batchTransfer 코드를 써 놓은 것은 위험도를 이해하지 못하고 있는 것이라고 본다. 토큰 컨트렉트를 다시 발행하거나 리스크를 그대로 가진 채로 토큰 배분을 진행해야 할텐데, 올바른 결정을 했으면 좋겠다.
컨트렉트 개발은 비행기 엔진을 만드는 것과 같이 안정성을 필수로 한다. 급하게 컨트렉트를 만들어서 이더리움 모으려는 마음은 이해가 가지만, 문제가 발생했을 때는 암호화폐 시장 전체의 신뢰도 하락으로 이어질 수 있다. 책임감을 갖고 ICO 를 진행하는 것은 투자금을 모으는 일 보다 중요한 일이다.
학력 이슈에서 문제가 생긴 이후 코드 불안정성을 보니, 급하게 진행하면서 발생하는 문제점이 눈에 많이 띈다. 체인 파트너스, 데일리 모두 돈을 벌고 싶은 모습은 이해가지만, 기본적인 코드는 점검 하면서 진행은 했으면 좋겠다.
ICO 투자자들과 전체 암호화폐 시장의 발전을 위해서...
I will upvote and resteem your last blog post free to my 35,000+ followers if you reply with the word, "free".
코드 보면 batchtransfer에서는 transfer를 콜하고 있고 transfer에서는 후오비 해킹과같은 오버플로우는 일어날 일이 없네요
연산에서 safeMath 쓰는 건 솔리디티 기본아닌가요?
safeMath 안 쓴 건 오버플로우 체크를 안 하고 있는건데, 어떻게 없다고 단정할 수 있죠?
다른 코드들은 왜 그러면 safeMath 를 쓸까요? 코드만 길어지는데...
안녕하세요. 저는 지퍼 팀 멤버입니다.
먼저 지퍼에 관심 가져주셔서 정말 감사합니다. 팀이 부족한 부분이 많아서 작성자님 같은 분들의 관심과 지적, 조언을 감사하게 듣고 있습니다. 앞으로도 많은 관심과 지적 부탁드립니다. 다만, 팀이 많이 바빠서 작성자님과 같은 많은 분들의 의견을 하나하나 다 찾아다니기 힘드니, 지퍼의 소통 채널을 이용해 주셨으면 하는 바람이 있습니다. ^^
아, 그리고 먼저 댓글에 썼지만, 지적 해주실때 좀 더 자세히 검토 해주셨으면 합니다. 이쪽 함수엔 문제가 없는데 마치 전체가 문제가 있는것처럼 얘기하시면 깜짝 깜짝 놀랍니다. ㅎㅎ . 지퍼엔 바운티 프로그램도 있으니 참고해주세요!! ^^
텔레그램에서 질문했는데 이 부분은 답변을 못 들었습니다^^
safeMath 를 안 썼고, 오버플로우 체크를 안 한 것이 핵심이죠.
그로 인해 연산 기능을 포함한 모든 함수의 오버플로우가 일어날 가능성이 있죠.
지금 저기있는 transfer함수에서 오버플로우가 어떻게 가능한지 설명 해주시겠어요?
98, 99 Line 참조하시면 될 듯 합니다.
transfer 를 콜하는 것이랑은 별 관련이 없어요.
기본적인 Smart-Contract Audit 과정도 없었던 것 같네요.
safeMath를 안 쓴 이유 설명해 주시겠어요??
https://blog.matryx.ai/batch-overflow-bug-on-ethereum-erc20-token-contracts-and-safemath-f9ebcc137434
https://medium.com/@merunasgrincalaitis/how-to-audit-a-smart-contract-most-dangerous-attacks-in-solidity-ae402a7e7868
그 밑에서 transfer를 콜하고 transfer함수 안에서 balances값을 바꾸는데 왜 관련이 없죠? 세이프메쓰의 기능을 그냥 다른 코드에 넣으면 되는데 왜 굳이 그 라이브러리를 똑같이 가져다 써야하죠?