
프런트엔드 하이재킹: 진짜 웹사이트가 당신에게 등을 돌릴 때
피싱 대응 조언의 대부분은 한 가지 규칙으로 요약됩니다. 진짜 사이트에 접속했는지 확인하라는 것입니다. 주소를 직접 입력하고, 북마크를 사용하고, 메시지 속 링크는 무시하라고 하죠. 좋은 조언이지만 사각지대가 있습니다. 때로는 진짜 주소에 있는 진짜 사이트가 악성 콘텐츠를 내보내기 시작하기도 합니다.
이것이 바로 프런트엔드 하이재킹입니다. 탈중앙화 앱 뒤에 있는 스마트 컨트랙트는 완벽하게 안전할 수 있지만, 그 컨트랙트에 접근할 때 사용하는 웹사이트는 몰래 바꿔치기되었을 수 있고, 그 사이트가 서명을 요청하는 모든 트랜잭션은 당신의 지갑을 비우도록 설계되어 있습니다.
웹사이트와 프로토콜은 별개입니다
탈중앙화 앱은 두 부분으로 이루어져 있습니다.
- 블록체인 위의 컨트랙트: 자금을 보관하고 규칙을 집행합니다.
- 프런트엔드, 즉 웹사이트: 데이터를 읽고, 트랜잭션을 만들고, 서명을 위해 지갑으로 보냅니다.
컨트랙트는 보통 감사를 거쳤고, 공개되어 있으며, 변경하기 어렵습니다. 반면 프런트엔드는 평범한 인프라에 호스팅된 평범한 웹사이트이며, 서명을 위해 무엇이 당신 앞에 놓일지를 정확히 결정합니다. 공격자가 웹사이트를 장악하면 컨트랙트에는 손댈 필요조차 없습니다. 진짜 트랜잭션 대신 자신의 트랜잭션에 당신이 서명하게 만들기만 하면 됩니다.
프런트엔드는 어떻게 하이재킹되는가
- DNS 하이재킹. 공격자가 도메인 설정을 장악한 뒤(주로 도메인 등록 기관이나 도메인을 관리하는 계정을 통해) 진짜 주소가 자신의 서버를 가리키도록 바꿉니다. 브라우저의 URL은 맞지만 사이트는 가짜입니다.
- 호스팅 또는 배포 환경 침해. 프로젝트의 호스팅, 빌드 파이프라인, 배포 키에 접근할 수 있는 공격자가 변조된 버전의 사이트를 배포합니다.
- 악성 의존성. 사이트가 불러오는 서드파티 스크립트나 라이브러리(분석 도구, UI 컴포넌트, 지갑 연결 패키지 등)가 침해되어, 이를 사용하는 모든 사이트가 공격자의 코드를 내보내기 시작합니다.
- 주입된 스크립트. 취약점을 통해 공격자가 원래는 정상적인 페이지에 코드를 삽입합니다.
어느 경우든 방문하는 동안에는 모든 것이 평소와 똑같아 보입니다. 같은 URL, 같은 디자인, 같은 흐름. 트랜잭션 요청이 나타나기 전까지는 말이죠.
공격은 어떤 모습인가
하이재킹된 프런트엔드는 보통 몇 가지 고가치 요청 중 하나를 노립니다.
- 공격자 주소에 대한 무제한 토큰 승인: 평범한 "계속하려면 승인" 단계로 위장합니다.
- NFT "전체 승인": 리스팅이나 수령으로 포장됩니다.
- 오프체인 서명(퍼밋이나 마켓플레이스 주문 등): 나중에 제출되어 추가 확인 없이 자금을 옮길 수 있습니다.
- 직접 전송: 입금, 수령, 마이그레이션으로 위장합니다.
결정적 단서는 당신이 하려는 일과 서명을 요청받는 내용 사이의 불일치입니다. 소액을 스왑하는 데 모르는 주소에 무제한 한도를 승인할 필요는 없습니다. 보상을 받는 데 전 재산을 전송할 필요도 없습니다.
스스로를 지키는 방법
페이지를 보는 것만으로는 하이재킹된 서버를 알아챌 수 없습니다. 방어선은 서명 단계입니다. 공격자의 의도가 반드시 드러나야 하는 곳이 바로 그곳이기 때문입니다.
- 모든 요청은 웹사이트가 아니라 지갑에서 읽으세요. 페이지는 무엇이든 보여줄 수 있지만, 지갑은 실제로 무엇에 서명하는지를 보여줍니다.
- 승인 요청에서는 지출자와 금액을 확인하세요. 모르는 주소와 무제한 한도라면 단호하게 멈춰야 합니다.
- 흐름의 갑작스러운 변화를 의심하세요. 특정 단계에서 서명이나 승인을 한 번도 요구하지 않던 사이트가 갑자기 요구한다면 경고 신호입니다.
- 시뮬레이션 기능이 있다면 활용하세요. 트랜잭션이 무엇을 할지 미리 확인하면 실제 효과가 표시된 설명과 다른 요청을 잡아낼 수 있습니다.
- 공지를 주시하세요. 프런트엔드 침해를 감지한 프로젝트는 대개 공식 채널을 통해 빠르게 경고합니다. 뭔가 이상하다고 느껴지면 서명하기 전에 확인하세요.
- 확신이 없다면 나중에라도 철회하세요. 사이트가 침해된 기간에 무언가를 승인했다면 즉시 승인을 철회하세요.
이는 피싱에 관한 기존 조언을 대체하는 것이 아니라 보완하는 것입니다. 주소를 확인하면 가짜 사이트로부터 보호받고, 요청을 읽으면 변질된 진짜 사이트로부터 보호받습니다.
SSP가 도움이 되는 부분
WalletConnect로 연결된 탈중앙화 앱이 SSP에 서명을 요청하면, 요청에는 어느 사이트가 요청하는지, 네트워크, 주소가 표시되며, SSP는 승인 전에 일반적인 호출을 디코딩합니다. 전송, 승인, NFT 전체 승인 요청에는 라벨이 붙고, 더 위험한 요청에는 명시적인 경고가 표시됩니다. 메시지는 가능한 한 읽을 수 있는 텍스트로 표시되며, 원시 데이터도 확인할 수 있습니다.
그다음 모든 요청은 별도 기기의 SSP Key에서 두 번째 승인을 받아야 합니다. 이것이 하이재킹된 웹사이트가 악의적인 요청을 보내는 것 자체를 막지는 못합니다. 하지만 요청의 정체를 똑똑히 확인할 기회를 두 번 제공하며, 그 어느 쪽도 공격자가 장악한 페이지 위에서 이루어지지 않습니다.
팀을 위해 SSP Enterprise 볼트는 서명자가 승인하기 전에 트랜잭션 시뮬레이션과 위험 경고를 추가합니다. 따라서 침해된 프런트엔드를 통해 만들어진 제안도 서명해야 하는 모든 사람이 독립적으로 한 번 더 검토하게 됩니다.
솔직한 요약
프런트엔드 하이재킹은 컨트랙트나 URL을 건드리지 않고도 신뢰받는 웹사이트를 공격자의 도구로 바꿔 놓습니다. 주소창을 확인하는 것만으로는 알아챌 수 없습니다.
당신이 할 수 있는 일은 모든 서명 요청을 진짜 인터페이스로 대하는 것입니다. 지갑에서 읽고, 지출자와 금액, 수신자를 확인하고, 원래 하려던 일과 맞지 않는 것은 모두 거부하세요.


