예측시장 플랫폼 Polymarket이 제3자 공급업체 침해로 인한 프런트엔드 보안 사고를 인정했다. 공격자는 Polymarket의 핵심 스마트계약을 직접 뚫은 것이 아니라, 일부 사용자가 접속하는 웹 화면에 악성 스크립트를 삽입하는 방식으로 접근했다. 블록체인 기반 서비스가 내세워 온 “스마트계약 보안”과 “온체인 투명성”이 안전의 전부가 아니라는 사실을 다시 보여준 사건이다.
Polymarket은 6월 25일 공식 계정을 통해 “제3자 벤더가 침해돼 일부 사용자가 보는 프런트엔드에 악성 스크립트가 삽입된 사실을 발견했다”고 밝혔다. 회사는 문제가 된 의존성을 제거했고, 사고를 차단했으며, 영향받은 이용자에게 직접 연락해 전액 환불하겠다고 설명했다.
짧은 공지였지만 의미는 무겁다. Polymarket은 단순한 콘텐츠 서비스가 아니다. 이용자가 실제 자산을 연결하고, 특정 사건의 결과에 돈을 걸며, 거래와 지갑 승인을 수행하는 금융성 플랫폼에 가깝다. 이런 서비스에서 프런트엔드가 침해되면 공격자는 스마트계약의 취약점을 찾지 않아도 된다. 사용자가 보는 화면과 클릭하는 버튼, 지갑이 띄우는 승인 요청을 조작하는 것만으로도 자산 이동을 유도할 수 있기 때문이다.
외부 블록체인 보안 분석가들과 보도에 따르면 이번 사고로 빠져나간 금액은 약 294만~300만달러 수준으로 추정된다. 피해는 최소 11개 이상의 지갑에서 발생한 것으로 알려졌다. 다만 Polymarket은 공식 공지에서 정확한 피해 금액과 피해자 수, 침해된 제3자 업체의 이름을 공개하지 않았다.
이번 사건의 본질은 ‘프런트엔드 공급망 공격’이다. 서비스의 핵심 서버나 블록체인 스마트계약이 아니라, 웹사이트가 외부에서 불러오는 코드와 라이브러리, 분석 도구, 배포 패키지, 클라우드 자원, 인증 모듈 가운데 하나가 공격받았을 가능성이 크다. 공격자는 이 경로를 통해 정상 서비스 화면에 악성 자바스크립트를 심고, 사용자가 자산 이동이나 지갑 연결 과정에서 잘못된 승인을 하도록 유도할 수 있다.
쉽게 말해 사용자는 평소처럼 Polymarket 웹사이트에 들어갔을 수 있다. 주소도 정상이고, 화면도 익숙하며, 거래 화면도 평소와 크게 다르지 않았을 가능성이 있다. 그러나 그 화면 어딘가에 삽입된 악성 코드가 지갑 연결 요청이나 토큰 승인 요청을 바꾸면 이야기는 달라진다. 사용자가 믿고 있던 공식 사이트 자체가 공격의 통로가 되는 것이다.
이런 사고는 블록체인 업계에서 특히 위험하다. 전통 금융 서비스에서는 부정 거래가 발생했을 때 카드사나 은행이 송금을 중단하거나 취소할 수 있는 경우가 있다. 반면 암호자산 지갑에서 이뤄진 토큰 승인과 자산 전송은 대체로 되돌리기 어렵다. 공격자가 사용자의 서명을 유도해 자산을 외부 지갑으로 옮기면, 기술적으로 거래를 되돌릴 수 없는 경우가 많다.
그래서 Polymarket의 “전액 환불” 결정은 단순한 고객 보상 차원을 넘어선다. 법적으로나 기술적으로 자동 복구가 어려운 암호자산 사고에서 플랫폼이 피해를 직접 부담하겠다는 뜻이기 때문이다. 이는 이용자 신뢰를 지키기 위한 선택이지만, 동시에 Web3 서비스가 결국 중앙화된 책임 구조를 완전히 피할 수 없다는 사실도 보여준다.
블록체인 서비스는 흔히 탈중앙화를 강조한다. 거래 기록은 체인에 남고, 스마트계약은 공개되며, 이용자는 자기 지갑을 직접 관리한다. 그러나 실제 사용 경험은 매우 중앙화돼 있다. 이용자는 특정 웹사이트에 접속하고, 그 서비스가 제공하는 인터페이스를 통해 지갑을 연결하며, 플랫폼이 만든 버튼을 누르고, 플랫폼이 선택한 외부 라이브러리와 API를 거친다.
이 과정에서 가장 약한 고리가 공격 표면이 된다. 스마트계약 코드가 아무리 안전하게 감사를 받았더라도, 사용자가 보는 프런트엔드가 변조되면 공격자는 이용자를 속일 수 있다. 다시 말해 온체인 보안과 오프체인 보안은 분리된 문제가 아니다. 스마트계약이 금고라면, 프런트엔드는 사용자가 금고 문을 여는 손잡이다. 금고가 단단해도 손잡이가 가짜로 바뀌면 사용자는 스스로 자산을 넘길 수 있다.
이번 사고는 공급망 보안의 중요성도 다시 부각했다. 현대의 웹 서비스는 한 회사가 모든 코드를 직접 만들고 직접 운영하지 않는다. 오픈소스 패키지, CDN, 클라우드 호스팅, 분석 도구, 지갑 연결 SDK, 인증 모듈, 광고·통계 스크립트, 외부 API 등 수많은 제3자 의존성 위에서 작동한다. 이 가운데 하나만 침해돼도 공격자는 정상 서비스에 침투할 수 있다.
기업 입장에서 가장 어려운 점은 공격자가 내부 시스템을 직접 공략하지 않을 수 있다는 데 있다. 내부 보안을 강화하고, 스마트계약 감사를 반복하고, 지갑 보안 정책을 정비해도 제3자 공급업체가 뚫리면 피해가 발생할 수 있다. 따라서 보안의 범위는 더 이상 자사 코드와 서버에만 머물 수 없다. 어떤 외부 코드가 서비스 화면에 로드되는지, 어떤 패키지가 업데이트됐는지, 어떤 공급업체가 접근 권한을 갖는지까지 관리해야 한다.
특히 금융성과 자산 이동 기능을 가진 서비스라면 프런트엔드 코드의 무결성 검증이 중요하다. 운영 중인 웹사이트가 배포 시점의 코드와 동일한지, 외부 스크립트가 예상치 못하게 바뀌지 않았는지, 특정 기능이 정상 흐름과 다른 승인 요청을 띄우지 않는지 실시간으로 감시해야 한다. 공급망 보안은 이제 개발팀의 편의성 문제가 아니라 이용자 자산 보호 문제다.
이용자 관점에서도 교훈은 분명하다. 암호자산 서비스에서 지갑 연결이나 토큰 승인 요청이 뜰 때는 ‘어떤 사이트에 접속했는가’만으로 안심해서는 안 된다. 공식 도메인이라도 프런트엔드가 침해될 가능성은 있다. 지갑이 요청하는 승인 내용, 실제로 어떤 토큰에 어떤 권한을 주는지, 무제한 승인인지, 자산 전송 요청인지 확인해야 한다.
하지만 이용자 주의만으로 문제를 해결할 수는 없다. 대부분의 사용자는 복잡한 스마트계약 승인 문구나 지갑 권한 구조를 이해하기 어렵다. 서비스 화면이 정상처럼 보이는 상황에서 공격 여부를 판별하는 것은 더 어렵다. 결국 책임의 중심은 플랫폼으로 돌아올 수밖에 없다. 사용자가 안전한 결정을 내릴 수 있는 인터페이스를 만들고, 위험한 승인 요청을 차단하며, 외부 공급망을 감시하는 일은 서비스 사업자의 몫이다.
Polymarket은 이번 사건에서 비교적 빠르게 문제를 인정하고, 영향을 받은 의존성을 제거했으며, 피해자 전액 환불 방침을 내놨다. 그러나 아직 답해야 할 질문은 남아 있다. 어떤 제3자 공급업체가 침해됐는지, 악성 스크립트는 얼마나 오랫동안 노출됐는지, 어떤 사용자 행동이 피해로 이어졌는지, 공격자는 어떤 방식으로 지갑 승인을 유도했는지, 피해 범위는 더 확대될 수 없는지 등에 대한 기술적 설명이 필요하다.
사후 분석 보고서도 중요하다. 단순히 “문제를 차단했다”는 발표만으로는 다른 플랫폼이 같은 사고를 막기 어렵다. 공급망 공격은 동일한 코드 패키지나 유사한 운영 구조를 쓰는 다른 서비스로 번질 수 있다. 공격의 진입 지점과 탐지 방식, 차단 조치, 재발 방지책이 공개돼야 업계 전체가 방어력을 높일 수 있다.
이번 사건은 Web3 서비스가 마주한 역설을 보여준다. 블록체인은 중앙 기관 없이 자산을 관리할 수 있는 기술로 출발했다. 그러나 이용자는 블록체인 자체가 아니라 웹사이트와 모바일 앱을 통해 그 기술을 경험한다. 결국 탈중앙화된 금융도 중앙화된 화면과 공급망 위에서 작동한다.
Polymarket 사고의 진짜 경고는 여기 있다. 스마트계약 감사만으로는 충분하지 않다. 체인 위의 코드가 안전해도 체인 밖의 사용자 경험이 공격받으면 자산은 빠져나갈 수 있다. Web3 보안의 최전선은 블록체인 네트워크만이 아니라, 사용자가 매일 접속하는 브라우저 화면과 제3자 코드, 그리고 그 사이를 잇는 공급망 전체가 됐다.
이번 공격은 “누가 스마트계약을 해킹했는가”라는 오래된 질문보다 더 현실적인 질문을 던진다. 사용자가 믿는 화면은 정말 안전한가. 플랫폼이 연결한 외부 코드는 누구의 통제를 받는가. 그리고 자산을 움직이는 마지막 클릭을 누가 보호하는가.
Polymarket은 피해자 환불을 약속했다. 그러나 이번 사건의 더 큰 비용은 신뢰다. 예측시장과 암호자산 플랫폼은 이용자가 돈을 걸고, 지갑을 연결하고, 결과를 기다리는 서비스다. 이 구조에서 화면 자체가 공격 경로가 될 수 있다는 사실은 단순한 보안 사고를 넘어 서비스 모델의 신뢰 기반을 흔든다.
블록체인 시대의 보안은 이제 지갑 키를 지키는 문제만이 아니다. 사용자가 보는 화면, 클릭하는 버튼, 승인하는 권한, 그리고 그 화면을 구성하는 수많은 외부 코드까지 함께 지켜야 한다. Polymarket의 사고는 그 사실을 가장 직접적인 방식으로 보여줬다.