보안동향

최신 보안정보를 신속하게 전해드립니다.

[해외동향] 가상화폐 탈취 가능한 OpenSea NFT 플랫폼 취약점

2021-10-14

OpenSea에서 공격자가 특수 조작한 토큰을 전송하여 사용자의 가상화폐를 인출할 수 있는 새로운 취약점이 발견되었으며, 현재는 패치가 적용된 상태입니다.


OpenSea는 거래 규모가 34억 달러에 이르는 세계 최대 규모의 NFT(Non-Fulliable Token) 등 디지털 자산을 사고 판매하는 시장입니다. NFT는 블록체인을 통해 판매 및 거래할 수 있는 사진, 영상, 오디오 등과 같은 고유한 디지털 자산이며, 소유권의 인증 및 공개 증거로 설정하기 위해 이 기술을 정품 인증서로 사용합니다.


이에 사이버보안업체 Check Point는 OpenSea 플랫폼 작동 방식을 자세히 살펴보고 공격 시나리오를 통해 취약점 점검을 진행하였습니다.


Check Point Research 공격 시나리오

공격 방법은 악성 페이로드로 NFT를 만들어 피해자에게 전송하는 것으로 시작합니다. 악성 NFT를 통해 공격자들이 사용자 계정을 하이재킹하고, 사용자들의 가상화폐 지갑을 탈취할 수 있습니다.


OpenSea 계정은 플랫폼이 지원하는 목록에서 타사 암호화폐 지갑을 필요로 하며, 이를 구글이나 페이스북과 같은 일반 웹사이트와 연결해야 합니다. 기본 지갑 중 가장 인기 있는 것은 MetaMask입니다.


가상화폐 지갑과의 통신은 계정의 모든 행위에 대해 발생하며, [그림 1]과 같이 시스템에서 간단한 작업을 하더라도 지갑 로그인을 요구합니다.

 

[그림 1] 간단한 작업이라도 계정 인증 요구 (출처 : check point)


OpenSea 플랫폼은 누구나 디지털 아트를 판매할 수 있도록 하는데, 아래 [표 1]에 포함된 확장자라면 최대 40MB까지 파일을 저장할 수 있습니다.

JPG, PNG, GIF, SVG, MP4, WEBM, MP3, WAV, OGG, GLB, GLTF

[표 1] 디지털 아트 파일 확장자


이에 따라, Check Point는 악의적인 JavaScript 코드를 전송하는 SVG 이미지를 OpenSea 시스템에 업로드 하고, 새 탭에서 열기 위해 클릭했을 때 ‘storage.opensea.io’ 하위 도메인에서 파일이 실행되는 것을 확인하였습니다.

 

[그림 2] storage.opensea.io 하위 도메인에서 실행되는 업로드 파일 (출처 : Check Point)


또한, 피해자의 Ethereum 지갑과의 통신을 시작하는 데 필요한 “window.ethereum”을 주입하는 HTML 코드를 로드하기 위해 SVG 이미지에 iFrame을 추가하였습니다.


공격자가 지갑의 기능을 악용할 때는 RPC-API를 통해 이루어지는데, 이는 MetaMask와 통신을 시작하고 지갑 연결을 위한 팝업창을 띄웁니다. 그 후, 공격자는 피해자를 대신하여 작업을 수행할 수 있도록 피해자가 정상 팝업과 상호작용을 하는 것을 유도해야 합니다.

 

[그림 3] RPC-API를 통한 MetaMask 통신과 팝업 오픈 (출처 : Check Point)


피해자가 거래에 서명하기 위해 팝업창을 클릭하면, 공격자는 지갑에 있는 피해자가 제공한 정보를 읽을 수 있을 뿐만 아니라 피해자를 대신해 원하는 행위를 할 수 있습니다.

 

[그림 4] [그림 3] 이후 연결 (출처 : Check Point)


공격자가 피해자의 지갑에 있는 가상화폐를 얻기 위해서는 또 다른 서명 요청 팝업이 필요합니다. 하지만, 지갑 시그니처 팝업은 시스템 공지사항으로 자주 나타나기 때문에 사용자가 메시지를 주의 깊게 읽지 않고 거래를 승인할 가능성이 높습니다.


따라서, 사용자들은 OpenSea 플랫폼 뿐만 아니라 다른 NFT 플랫폼에서도 자신이 서명으로 승인한 것이 무엇이며, 그것이 예상된 동작과 상관관계가 있는지의 여부를 잘 알고 있어야 합니다.


이렇게 공격자가 접근 권한을 얻게 된다면, 지갑 주소를 검색하고 잔고를 찾은 뒤 [표 2]의 send_transaction 함수를 이용하여 모든 잔고를 공격자의 계좌로 이체할 수 있습니다.

ethereum.request({ method: ‘eth_accounts’ }).then(function(accounts){

        ethereum.request({ method: ‘eth_getBalance’, params: [accounts[0], “latest”], “id”: 1}).then(function(balance){


send_transaction(accounts[0], balance)


        });

});

[표 2] 공격자의 지갑 잔고 확인 및 이체 (출처 : Check Point)


[그림 5]의 송금 화면에서 거래의 주체를 확인하고, 어떤 조치를 취할 것인지, 그리고 조치의 비용은 얼마인지 확인할 수 있습니다. 만약 사용자가 모르는 거래 요청이라면 거절하는 것이 중요합니다.

 

[그림 5] 송금 장면 (출처 : Check Point)

 

NFT 관련 사이버 공격으로부터 보호하는 방법

OpenSea가 타사 링크를 보거나 클릭하기 위해 지갑 승인을 요청하지 않는다는 것을 유의해야 합니다. 구매와 같은 OpenSea의 특정 작업과 무관한 지갑 승인과 상호 작용을 해서는 안됩니다.


또한, 가상화폐 지갑과 관련한 메시지나 팝업에 주의를 기울여야 합니다. 시스템 공지사항으로 자주 나타나거나 사용자가 물건을 구입 및 제안할 때 주로 나타나지만, 제 3자로부터 받은 이미지를 클릭해 지갑으로 서명해 달라는 요청은 평소 보던 팝업과 다르기 때문입니다.


따라서, 온라인에서 지갑에 사인해 달라는 요청을 승인하기 전에 요청 중인 내용을 주의 깊게 검토하고, 비정상적이거나 의심스럽지는 않은지 고려해야 합니다.

 

공격 요약

1. 공격자가 피해자에게 악의적인 NFT를 만들어 전송.
2. 피해자가 악성 NFT를 보고, OpenSea의 storage 도메인에서 팝업을 띄워서 피해자의 암호화폐 지갑과의 연결을 요청.
3. 피해자가 클릭을 통해 지갑을 연결하고, 공격자로부터 전송받은 악성 NFT를 통해 공격자가 피해자의 지갑에 접근할 수 있도록 함.
4. 공격자는 OpenSea의 storage 도메인에서 전송된 추가 팝업을 실행함으로써, 피해자 지갑에 있는 잔고 탈취.


(출처 :

https://www.bleepingcomputer.com/news/security/opensea-nft-platform-bugs-let-hackers-steal-crypto-wallets/

https://research.checkpoint.com/2021/check-point-research-prevents-theft-of-crypto-wallets-on-opensea-the-worlds-largest-nft-marketplace/ )


보안관제센터 Team MIR

목록