블록체인/레벨 IX · 속도와 스펙터클/9.2 공정한 시장/수업 2
관리자 키와 불변성
컨트랙트 탈취의 근원, 그리고 이를 끝내는 봉인된 금고
준비물컨트랙트 검사 기능을 갖춘 블록 탐색기(예: Solscan 또는 Etherscan)권한 필드에 관한 SPL Token 문서OpenZeppelin 프록시 업그레이드 문서감사를 거친 스마트 컨트랙트의 소스 코드
호기심
- 민트 권한이란 무엇이며, 이를 가진 사람은 무엇을 할 수 있나요?
- 업그레이드가 가능한 프록시는 왜 보안 기능이면서 동시에 백도어가 될 수 있을까요?
- 관리자 키를 제거하면 공격은 사라지지만 수정도 불가능해진다면, 커뮤니티가 어떤 위험을 받아들일지는 누가 결정하나요?
탐구
- 많은 러그풀은 누군가 남겨 둔 권한에서 비롯됩니다. 민트 권한을 가진 사람은 토큰을 무제한으로 찍어 내 원할 때마다 시장에 팔 수 있습니다. 동결 권한이나 블랙리스트는 특정 홀더가 자기 잔고를 옮기지 못하게 막습니다. 소유자가 설정할 수 있는 세금은 매도 수수료를 100%까지 올려 유동성을 그 자리에 묶어 둘 수 있습니다. 이들 하나하나가 누군가 쥐고 있는 키이며, 각각 본래 이롭게 해야 할 바로 그 사람들에게 불리하게 사용될 수 있습니다.
- 업그레이드 가능한 프록시는 저장 공간과 로직을 분리합니다. 상태는 한 주소에 저장되고, 코드는 관리자가 언제든지 교체할 수 있는 다른 주소에서 실행됩니다. 덕분에 버그가 발견되면 패치를 적용할 수 있지만, 이는 동시에 모든 홀더에게 토큰의 규칙이 소급해서 바뀔 수 있다는 뜻이기도 합니다. DeFi 익스플로잇에서는 프록시 업그레이드가 악용되어 배포 후에 자금을 다른 곳으로 빼돌리거나 프로토콜의 동작을 바꾸는 데 쓰였습니다. 스퀴드 게임 토큰(2021년 11월)은 통제권을 남겨 두면 어떤 결과로 이어지는지 보여 줍니다. 이 토큰의 컨트랙트는 누구나 살 수 있게 했지만 일반 홀더의 매도는 막았고, 제작자들이 현금화하자 몇 분 만에 가격이 거의 0으로 떨어졌습니다.
- 이 트레이드오프는 구조적입니다. 민트 키를 제거하면 누구도 토큰을 추가로 찍어 낼 수 없고, 풀 유동성의 인출 경로를 제거하면 누구도 준비금을 빼낼 수 없습니다. 그 대가로 개발자, 감사인, 커뮤니티 구성원 누구도 버그를 고치거나, 긴급 상황에 대응하거나, 상황이 바뀌었을 때 파라미터를 조정할 수 없게 됩니다. 퍼미션리스 시장에서 모든 관리자 권한은 공격 표면이자 동시에 유지보수 도구입니다. 그것이 어느 쪽으로 작용할지는 키 보유자가 선의로 행동하고 키를 안전하게 보관하는지에 달려 있습니다.
- 지갑 계층의 방어는 컨트랙트 수준의 설계를 대신할 수 없습니다. 사용자는 토큰 승인을 철회하고, 알 수 없는 트랜잭션에 서명하지 않으며, 상호작용하기 전에 컨트랙트 주소를 확인할 수 있지만, 이런 습관은 실제로 사용되고 있는 민트 권한이나 거래 도중 규칙을 바꾸는 프록시 업그레이드 앞에서는 아무 소용이 없습니다. SPL 토큰에서 민트 권한은 항상 생성 시 설정되며 None으로 바뀔 때까지 유지됩니다. 동결 권한은 선택 사항이며, 생략하면 나중에 추가할 수 없습니다. 어느 경우든 살아 있는 권한은 사용자가 얼마나 조심하든 상관없이 작동합니다.
- OpenZeppelin의 프록시 문서는 이 구조를 명확히 보여 줍니다. 구현 컨트랙트가 로직을 담고, 프록시는 상태를 보관하면서 모든 호출을 delegatecall로 구현 컨트랙트에 전달합니다. 업그레이드란 프록시가 새로운 구현 주소를 가리키게 하는 것입니다. 팀들은 이런 방식으로 수정 사항을 배포하지만, 이는 업그레이드 권한을 가진 누구든 단 한 번의 트랜잭션으로 규칙 전체를 교체할 수 있다는 뜻이기도 합니다. 패치와 탈취의 차이는 기술이 아니라 순전히 행동에 있습니다.
- 토큰의 컨트랙트를 살펴보면 어떤 키가 살아 있는지 알 수 있습니다. EVM 체인에서는 컨트랙트에 소유자(owner) 역할이 있는지, 업그레이드 가능한 프록시 뒤에 있는지를 확인하고, 솔라나에서는 민트 권한과 동결 권한, 그리고 영구 위임자(permanent delegate), 전송 훅(transfer hook), 전송 수수료(transfer fee) 같은 Token-2022 확장 기능을 확인하세요. 없거나 철회된 권한 하나하나가 해당 공격 유형을 없앱니다. 남은 위험은 사람에게로 옮겨 갑니다. 피싱, 사칭, 사회적 조작은 전적으로 코드 바깥에서 작동합니다.
- 많은 스마트 컨트랙트는 출시 후에도 변경할 수 있습니다. 솔라나에서는 프로그램이 ‘업그레이드 권한(upgrade authority)’ 키를 통해 기본적으로 업그레이드 가능하며, 이더리움 같은 EVM 체인에서는 교체 가능한 구현 컨트랙트로 실행을 넘겨주는 프록시 패턴으로 만들지 않는 한 컨트랙트는 불변입니다. 이러한 설계 덕분에 버그 수정과 기능 추가가 가능하지만, 사용자가 오늘 상호작용하는 코드가 어제 읽은 코드와 같지 않을 수도 있다는 뜻이기도 합니다.
- 변경 가능성의 위험은 신뢰의 집중입니다. 개발자가 관리자 키를 보유하고 있다면 이론적으로 언제든지 토큰 공급량을 바꾸거나, 사용자 계정을 동결하거나, 유동성 풀의 자금을 빼낼 수 있습니다. 이는 블록체인의 탈중앙화 정신에 어긋나는 ‘갓 모드’를 만들어 냅니다. 2016년 6월 The DAO가 해킹당했을 때 이더리움 커뮤니티는 도난을 되돌리기 위해 하드포크를 할지 논쟁했고, 이 결정으로 체인은 이더리움과 이더리움 클래식으로 갈라졌습니다. 이 사건은 네트워크 수준의 변경조차 심각한 거버넌스 위험을 수반한다는 점을 부각했습니다.
- 불변성은 이 위험을 완전히 제거합니다. 솔라나의 발행(mint)·동결·프로그램 업그레이드 권한 같은 모든 관리 권한을 철회하거나, EVM 체인에서 프록시나 오너 역할 없이 배포하면 컨트랙트는 봉인된 금고가 됩니다. 배포 이후에는 누구도 규칙을 바꿀 수 없습니다. 실제로 작동하는 코드를 감사받은 코드와 한 번만 대조하면 되고, 그 상태는 그대로 유지됩니다. 이로써 내부자 남용의 위협은 사라지지만, 잠재적인 버그 역시 영구히 그대로 고정됩니다.
- 불변성의 대가는 영구성입니다. 치명적인 버그가 있어도 패치할 방법이 없으며, 새 컨트랙트로의 마이그레이션이나 네트워크 포크만이 이를 해결할 수 있습니다. 그만큼 출시 전 검증의 중요성이 커집니다. 팀은 배포 전에 형식 검증, 광범위한 퍼즈 테스트, 복수 기관의 감사에 많은 투자를 해야 합니다. 부담이 출시 후 유지보수에서 출시 전의 엄밀함으로 옮겨 가는 것입니다. 간과한 엣지 케이스 하나가 시스템의 영구적인 특성이 됩니다.
- 비트코인은 ‘신뢰할 수 있는 중립성’의 기준점 역할을 합니다. 비트코인의 규칙은 단일 주체가 아니라 수천 개의 독립적인 노드 사이의 폭넓은 합의를 통해서만 바뀝니다. 블록 보상이나 트랜잭션 유효성을 변경할 수 있는 관리자 키는 존재하지 않습니다. 이러한 경직성은 많은 사람이 비트코인을 신뢰할 수 있는 중립적 시스템으로 여기는 큰 이유입니다. 어떤 단일 당사자도 그 규칙을 고쳐 쓸 수 없기 때문입니다.
- 토큰 설계자에게 불변성을 선택한다는 것은 투명성에 대한 의지를 보여 주는 신호입니다. 사용자는 배포된 코드가 바뀔 수 없다는 사실을 직접 확인할 수 있습니다. 하지만 이 선택은 실수를 되돌릴 수 없다는 점을 받아들여야 함을 의미합니다. 트레이드오프는 분명합니다. 사용자가 검증할 수 있는 예측 가능성을 얻을 것인가, 아니면 단일 실패 지점과 잠재적 남용 가능성을 감수하면서 유연성을 유지할 것인가입니다.
파트 I관리자 키: 컨트랙트 탈취의 근원
파트 II불변성과 관리자 키의 부재
핵심 사실
- 민트 권한을 가진 사람은 새 토큰을 만들 수 있으며, 이 권한이 유지되면 기존 홀더 전체의 지분을 희석하는 데 쓰일 수 있습니다.
- 스퀴드 게임 토큰(2021)은 누구나 살 수 있게 했지만 일반 홀더의 매도는 막았습니다.
- 업그레이드 가능한 프록시는 상태를 로직과 분리해 저장하므로, 관리자 키로 패치와 소급적인 규칙 변경을 모두 할 수 있습니다.
- 소유자가 통제하는 매도세를 100%로 설정하면 허니팟처럼 작동합니다. 홀더는 수수료를 물지 않고는 빠져나갈 수 없습니다.
- 배포 시 민트, 동결, 업그레이드 권한을 포기하면 해당 공격 유형은 사라지지만 향후의 모든 유지보수 능력도 함께 사라집니다.
- SPL 민트 권한은 None으로 설정될 때까지 유효하며, 동결 권한은 생성 시 설정되었다면 철회될 때까지 유효합니다.
- 솔라나에서는 프로그램의 업그레이드 권한이 철회되면 그 프로그램은 불변이 됩니다. 토큰의 발행 권한과 동결 권한은 각각 별도로 철회할 수 있습니다.
- 프록시 패턴 없이 배포된 EVM 컨트랙트는 배포 후 업그레이드할 수 없습니다.
- 2016년 6월 The DAO 해킹은 하드포크로 이어졌고, 이로 인해 이더리움은 두 개의 체인으로 갈라졌습니다.
- 비트코인의 규칙은 관리자 키가 아닌 분산된 노드들 간의 광범위한 합의를 통해서만 변경됩니다.
- 불변성은 내부자에 의한 악용 위험을 없애주지만, 출시 이후에는 버그 수정이 불가능해집니다.
- 불변 컨트랙트는 영구적이기 때문에 형식 검증과 광범위한 테스트가 매우 중요합니다.
연습 아홉, 여섯, 셋, 하나
9모으기토큰 컨트랙트 또는 프로토콜 배포 사례 9개를 나열하세요. 각각에 대해 민트 권한, 동결 권한, 업그레이드 프록시가 특정 주소에 할당되어 있는지 아니면 포기되었는지 적으세요.
6묶기9개를 각각이 유지하고 있는 관리자 권한에 따라 6개 그룹으로 묶으세요.
3추리기유지된 권한 중 사회적·법적 구제 수단 없이 홀더에게 불리하게 사용될 수 있는 것이 있는지를 기준으로 6개 그룹을 3개 범주로 압축하세요.
1결정화유지보수 권한과 공격 표면을 기술적으로 구분하는 요소가 있다면 무엇인지 한 문장으로 쓰세요.
팩트 체크
날짜, 수치 및 주장은 아래에 명시된 출처들을 통해 확인되었습니다.
- Solana Program Library, SPL Token documentation
- OpenZeppelin, 'Proxy Upgrade Pattern' documentation
- Contemporary reporting on the Squid Game token collapse (November 2021)
- Chainalysis, Crypto Crime Report (2024)
- Solana documentation: deploying programs (upgrade authority)
- V. Buterin, 'Credible Neutrality as a Guiding Principle' (2020)