Polymarket 익스플로잇: 컨트랙트 버그가 아닌 유출된 키

2026년 5월 22일, 온체인 조사관 ZachXBT가 Polymarket의 지갑 중 하나에서 이상 출금을 포착했다. 초기 추정치는 약 52만 달러였다. 팀이 세부 사항을 확인할 즈음에는 그 수치가 66만~70만 달러에 근접해 있었다. 재진입 공격도 없었고, 오라클 조작도 없었으며, 교묘한 플래시론 조작도 없었다. 단지 있어서는 안 될 곳에 노출된 개인 키 하나뿐이었다.
Polymarket 익스플로잇은 모두가 Trail of Bits와 OpenZeppelin에 돈을 내고 들여다보게 하는 스택의 부분을 건드리지 않았다. 리워드 자금 조달과 운영 유지를 위해 사용하는 내부 충전 지갑, 즉 운영 계정을 공격했다. 감사 범위에 절대 포함되지 않는 종류의 지갑이다. 컨트랙트가 아니기 때문이다. 누군가의 인프라 어딘가에 놓인 키 하나일 뿐이다.
그것이 불편한 부분이다. 헤드라인이 브리지와 DVN 설정 오류로 가득 찼던 한 해가 지난 후, 세계에서 가장 많은 투자를 받은 예측 시장이 역사상 가장 기본적인 실패 방식으로 털렸다.
Polygon에서 실제로 무슨 일이 있었나
털린 계정은 운영 지갑이었으며, 프로토콜 핵심 컨트랙트에 보관된 사용자 자금이 아니었다. CoinDesk의 보도에 따르면, ZachXBT는 약 52만 달러가 이동하는 것을 포착했고 Polymarket 팀은 고객 자금은 안전하다고 밝혔다. 공격자는 Polygon의 지갑에서 POL과 기타 자산을 쓸어간 후, 공격자들이 언제나 그러듯 누군가 무언가를 동결하기 전에 브리지를 통해 자금을 분산시켰다.
Decrypt는 금액을 약 70만 달러로 추산했으며, 이를 구체적으로 내부 충전 지갑으로 특정했다. 수치의 차이는 처음 24시간 동안 흔히 나타나는 현상이다. 메커니즘 자체는 논쟁의 여지가 없다. 누군가가 키를 손에 넣었다.
이것은 POL이 지갑에 있던 자산이었다는 의미에서만 Polygon POL 익스플로잇이다. 체인은 실패하지 않았다. 컨트랙트는 실패하지 않았다. 운영 키 하나의 보안이 실패했다.
UMA CTF Adapter가 문제가 아니었던 이유
Polymarket의 마켓 결산은 UMA CTF Adapter를 통해 UMA의 옵티미스틱 오라클로 처리된다. 질문을 게시하고, 분쟁을 처리하며, 결과를 정산하는 컨트랙트다. 이것이 표면적으로 가장 많은 적대적 위험을 안고 있는 부분이다. 감사도 받았고, 수천 개의 마켓에 걸쳐 검증되기도 했다.
그리고 이번 사건과는 아무런 관계가 없었다.
사람들이 대충 넘어가겠지만 그러지 말아야 할 세부 사항이 바로 이것이라고 생각한다. 스마트 컨트랙트 레이어는 버텼다. 오라클도 버텼다. 깨진 것은 사람이 키로 통제하고, 사람(또는 CI 파이프라인, 또는 핫 서명 서비스)이 접근할 수 있는 지갑이었다. 우리는 불 마켓 내내 공식 검증이 갖춰진 부분만 강화하고, .env 파일로 관리되는 부분은 무시해왔다.
이제 운영 키가 진짜 공격 표면이다
2026년 사고들의 패턴이 여기 있다. Solidity는 점점 나아지고 있다. 감사자들은 자신의 일을 잘 하고 있다. 형식 검증은 예전에 9자리 금액을 날려버리던 재진입 버그를 잡아낸다. 그래서 공격자들이 방향을 바꿨다.
그들은 취약한 부분으로 이동했다:
- 리워드, 가스 충전, 마켓 메이킹에 사용되는 핫 월렛.
- 출시 이후 한 번도 교체되지 않은 배포자 키.
- 서명과 웹 서핑에 같은 노트북을 사용하는 멀티시그 서명자.
- 프로덕션에서 트랜잭션에 서명할 수 있는 CI/CD 시크릿.
이 중 어느 것도 감사 보고서에 나오지 않는다. 규제된 거래소에서 보안 범위를 설정할 때, 컨트랙트 검토는 작업의 3분의 1 정도에 불과하다. 나머지는 HSM, 서명자 분리, 키 세레모니 문서화, 그리고 "새벽 3시에 누가 돈을 움직일 수 있고 무엇이 그를 막겠는가"라는 지극히 따분한 질문이다. 대부분의 팀이 취약한 부분이 바로 여기다.
이것은 Kelp DAO LayerZero 손실과 같은 교훈이다. 컨트랙트 버그가 아닌 운영 레이어의 설정 오류로 2억 9,200만 달러가 사라진 것과 마찬가지다. 메커니즘은 다르지만 근본 원인은 같다. 아무도 감사하지 않는 지루한 부분.
66만 달러짜리 운영 지갑이 갖췄어야 할 것들
단일 키로 66만 달러를 움직일 수 있다면, 그것은 운이 나쁜 것이 아니라 설계 결정의 문제다. 의미 있는 가치를 보유한 운영 지갑이라면 당연히 갖춰야 할 몇 가지:
- 지갑 로직 자체에 지출 한도 설정. 리워드 충전 지갑이 한 번의 트랜잭션으로 전체 잔액을 보낼 이유가 없다. 온체인에서 한도를 설정하라.
- 기준 금액 이상에는 임계값 서명 적용. 소규모 자동 지급은 핫으로 운영해도 된다. 예를 들어 1만 달러 이상은 두 번째 서명자가 필요해야 한다. 대규모 이체에 낮은 임계값을 가진 Safe 멀티시그는 구현이 어렵지 않다.
- 앱 환경으로부터 키 격리. 운영 지갑의 서명 키는 애플리케이션 코드, 의존성, 또는 침해된 CI 러너가 읽을 수 있는 곳에 절대 두어서는 안 된다.
- 비정상적인 출금 시 사람에게 알리는 모니터링. ZachXBT가 팀 발표 전에 이것을 포착했다. 자체 알림 시스템이 멤풀을 지켜보는 제3자보다 빨라야 한다.
이 중 새로운 것은 없다. 팀이 빠르게 출시하면서, 지갑이 "그냥 리워드용"이라는 이유로 삭제되는 것들이다.
아무도 책임지지 않는 감사 스택의 공백
더 깊은 문제는 내부적인 관할권의 문제다. 스마트 컨트랙트 보안에는 명확한 책임자가 있다. 바로 감사 회사다. 운영 키 보안에는... 마감 압박 속에서 지갑을 설정한 사람이 있을 뿐이다. 대개 다시는 검토되지 않는다. 나는 이 공백에 대해 DeFi의 망가진 감사 스택의 맥락에서 쓴 적이 있다. 인증은 컨트랙트를 다루고 컨트랙트 경계에서 멈춘다. 운영에 관련된 모든 것은 범위 밖이고, 관심 밖이다.
규제 기관이나 보험사가 운영 보안을 책임자가 있는 예산 항목으로 강제하기 전까지 이런 일은 계속될 것이다. 2026년 DeFi 운영 보안은 2019년의 스마트 컨트랙트 보안과 거의 같은 위치에 있다. 중요하다는 것은 알지만, 아무도 책임지지 않고, 마지막에 자금이 배정된다.
Polymarket은 괜찮을 것이다. 66만 달러는 그 규모의 플랫폼이 감당할 수 있는 손실이며, 그들의 공을 인정하자면 빠르고 명확하게 소통했다. 하지만 다음에 이런 일이 일어나는 팀은 그것을 흡수할 여력이 없을 수도 있다. 리워드 지갑이 아닌 트레저리를 비우는 키 탈취 사고는 반드시 올 것이며, 그것은 Solidity 버그가 아닐 것이다. 누군가의 노트북에 있는 키 문제일 것이다.