“비허가”는 정말 안전한가: Move 뒤에 있는 디자인 사상
원문 저자:@jolestar
최근 사용자와 Move 스마트 계약 간의 상호작용에서 승인(Approve)이 필요 없는 것이 더 안전한지, 더 위험한지에 대한 논란이 많습니다. 여기서는 두 가지의 차이점과 Move가 이렇게 설계된 배경에 대한 생각을 쉽게 설명해 보겠습니다.
먼저 사용자와 스마트 계약 간의 상호작용 방식을 이해해 봅시다. 우리가 거래를 서명하고 체인上的 스마트 계약을 호출하는 것은 물리적 세계에서 스마트 계약의 디지털 세계로 들어가는 것과 같습니다. 우리는 이 디지털 세계에서 하나의 분신을 가지고 있으며, 이 분신이 무엇을 하는지는 스마트 계약에 의해 정의됩니다.
EVM에서는 각 계약이 독립된 작은 세계에 해당하며, 분신이 이 세계에 들어가면 현재 계약 세계에서 사용자 상태(자산)를 조작할 수 있습니다.
예를 들어 swap 세계에 들어가서 자신의 usdt를 다른 자산으로 교환하고 싶다면, usdt는 usdt를 정의하는 계약 세계에 존재하므로 swap에서 자신의 신분으로 usdt 계약에서 자산을 직접 인출할 수 없습니다. 그래서 사용자는 먼저 usdt의 계약 세계에서 approve를 실행하여 usdt 계약에 swap이 자신의 자산을 인출할 수 있도록 알려주고, 그 후에 swap 세계로 들어가서 작업을 수행해야 합니다.
작업이 완료된 후에는 usdt 쪽에서 권한을 취소(revoke)해야 합니다. 하지만 여기서 approve와 revoke 작업은 모두 독립적인 거래가 필요하며, 사용자는 종종 가스 비용을 절약하기 위해 revoke를 하지 않는데, 이로 인해 swap 계약에서 보안 문제가 발생하면 사용자의 자산이 알지 못하는 사이에 도난당할 수 있습니다.
반면 Move에서는 모든 계약이 하나의 큰 디지털 세계에서 실행됩니다. 사용자의 디지털 분신은 계약 간에 자유롭게 이동하고, 어떤 작업이든 수행할 수 있으며, 사용자의 상태(자산)는 사용자의 저장 공간에 존재합니다.
사용자는 swap 진입점에서 자신의 잔액에서 usdt를 인출하고 교환하며, 저장은 같은 거래에서 원자적으로 완료될 수 있습니다. 이러한 방식은 계약에 더 자유로운 조합 방식을 제공하며, EVM에서 구현하기 어려운 다양한 조합 플레이를 가능하게 합니다. 이것이 EVM의 계정 추상화 솔루션이 구현하고자 하는 방식입니다. 물론, 이는 새로운 보안 도전도 가져옵니다.
그렇다면 EVM에서 계약 간 호출이 사용자의 신원을 직접 전달할 수 있는 기능을 추가할 수 있을까요? 기술적으로는 가능하지만, EVM에서는 동적 호출을 지원하여 임의의 주소의 계약을 호출할 수 있어 이러한 작업의 위험을 측정하기 어렵습니다. 또한 EVM의 상태 변경은 사용자와 지갑 모두에게 친숙하지 않으며, 지갑이 상태 변화를 통해 사용자에게 알리기 어렵습니다.
Move에서 이 보안 도전을 해결하는 방법은 두 가지입니다:
- 계약을 사전 실행할 때 계약 실행 후의 상태 변화를 사용자에게 알려주어, 사용자가 이 거래가 자신의 어떤 중요한 자산을 조작했는지 및 실행 결과를 알 수 있도록 합니다. 이 방법은 StarMask에서 이미 구현되었습니다. 링크 및 첨부된 그림을 참조하세요. https://starcoin.medium.com/starmask-v4-6-
- 일부 계약은 조건을 설정하여 일부 사용자가 사전 실행 시 상태 변화를 발견하지 못하도록 할 수 있습니다. @0xmetazen의 분석 https://twitter.com/0xmetazen/status/1582581013972414465, 그러나 Move에서는 동적 호출이 없으며, 계약이 배포될 때 그 실행 논리는 확정적입니다. 정적 분석 바이트코드를 통해 계약의 모든 가능한 경로에서 조작된 상태를 얻어 블록 탐색기나 지갑에서 사용자에게 알릴 수 있습니다.
EVM과 Move의 두 가지 솔루션은 보안 위험이 다릅니다. Approve 솔루션의 보안 위험은 즉각적인 권한 부여를 장기적인 권한 부여로 바꾸는 것입니다. 이 위험은 즉시 발생하지 않으며, 예를 들어 계약의 취약점이 발견되지 않거나 악의적인 계약이 긴 줄로 큰 물고기를 낚는 경우입니다. 일단 발생하면 사용자는 종종 수동적이며, 많은 사용자가 어떤 계약에 권한을 부여했는지 잊어버릴 수 있습니다.
반면 Move의 솔루션은 계약에 더 큰 자유를 부여하며, 악의적인 계약을 만날 경우 더 큰 위험이 있지만, 이러한 위험은 즉각적으로 발생하며 기술적 수단으로 감지할 수 있습니다. 최악의 경우, 앞서 빠르게 나간 사람이 함정에 빠지면 뒤에 있는 사람에게 경고할 수 있으며, 악의적인 계약은 빠르게 드러납니다.
마지막으로, 세상에 만능 해결책은 없으며, 특정 기술을 사용한다고 해서 모든 보안 문제를 해결할 수는 없습니다. 체인, 도구, 사용자 모두가 함께 노력해야 합니다.
Move 사용자에 대한 보안 권장 사항:
상태 변경 알림이 더 완전한 지갑을 선택하고, 지갑의 알림을 이해하려고 노력하세요.
출처가 불분명하거나 오픈 소스가 아닌 DApp과 임의로 상호작용하지 마세요.
위 두 가지를 실천할 수 없다면, 다른 사람이 먼저 함정을 밟을 때까지 기다리세요.
Move의 보안 측면에서의 도전과 개선 방안은 이뿐만이 아니며, 《왜 Move인가》 시리즈의 보안 편에서 자세히 설명할 예정입니다. 관심 있는 분들은 주목해 주세요.