일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- blockchain
- 이더리움
- web3
- Ethereum
- 블록체인
- web3.js
- 트랜잭션
- 제어의역전
- ethers
- Python
- github
- truffle
- Docker
- solidity
- git
- 네트워크
- server
- 솔리디티
- JavaScript
- MySQL
- ERC20
- ERC165
- tcp
- erc721
- NFT
- web
- Programming
- geth
- 스마트 컨트랙트
- erc
- Today
- Total
멍개의 연구소
[블록체인] multi-sig와 key rotation을 이용한 악용사례 본문
안녕하세요 멍개입니다.
이번 시간엔 multi-sig와 key rotation을 이용한 사기 수법을 소개합니다.
본 포스트의 목적은 사기 수법을 공개함으로써 피해자가 없기를 바라는 마음으로 작성합니다.
evm, aptos, solana 등 대부분의 블록체인에서는 어카운트 구조를 사용합니다.

개인키는 해당 어카운트의 모든 권한을 가지게 됩니다.
· 다중서명(Multi-Sig) or 권한(Permission)
한 어카운트를 하나의 개인키가 아닌 다수의 개인키를 등록시켜서 다수의 개인키 서명을 받아야 트랜잭션을 성공시키는 방법이 multi sig 입니다.
multi sig를 사용하는 이유는 어카운트의 제어권을 여러 개인키로 분산함으로써 도난 / 무단 액세스 등의 위험으로부터 보호하기 위함입니다.

이렇게 되면 기존의 개인키로만 트랜잭션을 서명하더라도 해당 트랜잭션이 실행되지 않습니다. 추가적으로 등록된 개인키의 서명이 필요합니다. 이 부분은 블록체인 네트워크마다 다른 개념으로 등록이 가능할 수 있는데. aptos의 경우는 등록된 개인키마다 가중치를 부여하여 일정 이상의 가중치를 넘길만큼의 서명을 받으면 트랜잭션을 실행합니다. tron의 경우는 등록된 개인키마다 권한(permission)을 부여하여 개인키마다 권한을 부여할 수 있습니다.

· 키 회전(Key Rotation)
키 회전을 하는 이유는 보안상의 이유입니다. 가령 개인키가 노출될 경우 해당 어카운트는 더이상 안전하지 않게 됩니다. 하지만 트랜잭션을 실행할 수 있는 개인키를 변경한다면 어카운트는 안전한 상태가 됩니다.

이렇게 Changed Private Key로 어카운트의 개인키를 변경한다면 기존의 Private Key는 Address로 파생할때만 사용가능하며, 트랜잭션 서명시에는 Changed Private Key를 사용해야 합니다.
· 악용
앞에서 multi sig와 key rotation을 알아보았습니다.
그렇다면 이 둘을 이용하여 어떻게 사기를 칠 수 있는지 알아보겠습니다.
어카운트는 다음과 같이 multi-sig or key rotation된 어카운트를 낚시 계정(피싱 계정)이라고 표현하겠습니다.


악용 사례자는 낚시 계정의 원래의 private key를 피해자들에게 뿌립니다.

이렇게 되면 피해자들은 privatekey를 통해 해당 자산에 접근이 가능합니다.
하지만 private key만 뿌리면 피해자는 해당 자산에 접근만 가능할 뿐입니다.
여기사 악용 사례자는 해당 어카운트에 네이티브 코인(Eth, Apt, Trx)를 0로 만든 다음 USDT를 굉장히 많이 보유하도록 합니다.
피해자들은 해당 어카운트의 개인키를 알고 있기 때문에 네이티브 코인만 있다면 USDT를 본인의 지갑으로 옮길 수 있을거라는 생각을 합니다.

피해자들은 낚시 계정에 Native Coin을 전송합니다. 그리고 낚시 계정의 USDT를 본인의 지갑으로 뺴기 위해 악용 사례자에게 받은 Private Key로 서명한 후 트랜잭션을 실행하면 실패하게 됩니다. 악용 사례자는 Multi Sig( 추가로 등록된) 개인키 / Key Rotation(변경된 키)로 피해자가 전송한 Native Coin을 다른 지갑(or 거래소)으로 옮길수 있습니다.

· 실제 사례
해당 사건은 제가 실제로 겪었던 일입니다. 물론 저는 낚시 계정에 Native Coin을 전송하지 않았습니다. 앞의 개념을 알고 있었고 이를 확인하는 방법을 알았기 때문에 사기에 당하지 않았습니다.
저는 유튜브 댓글을 통해 다음과 같은 니모닉을 전달받았습니다.(니모닉은 개인키를 생성하는 방법)
여기서는 니모닉 = 개인키로 이해해도 충분합니다.
니모닉 : mistake turkey blossom warfare blade until bachelor fall squeeze today flee guitar
어카운트: TAy4omTf7uENvTm2QrT22ZY8BvdrjXUKzC
니모닉을 알려주는 이유는 다음과 같았습니다.
"USDT를 가지고 있는 어카운트가 있다 해당 어카운트의 니모닉은 xxx 이며, 이를 거래소로 옮기려고 한다. 도와달라" 라는 형태의 메시지와 함께 니모닉을 알려줍니다.
해당 니모닉은 trx 기반 네트워크에서 USDT를 굉장히 많이 보유하고 있는 어카운트의 개인키입니다.

저는 USDT가 어느 네트워크에서 발행된 USDT인지 찾아보니 tron이었습니다.

여기서 저는 해당 잔액을 확인함과 동시에 트랜잭션 목록이 눈에띄었습니다.
아니 나에게 전송하는 방법을 물어봤는데 이미 전송 내역이 있다는 점이 매우 이상했습니다. 그래서 해당 어카운트의 Permission을 확인해보았습니다.
어카운트의 주소와 Permission의 주소가 다르게 나옵니다. 즉 해당 어카운트로 TRX를 전송하더라도 악용 사례자가 공유한 니모닉(개인키)를 이용하여 USDT를 전송할 수 없습니다.

aptos의 경우도 Multi sig어카운트와 Key Rotation 모두 지원하며 Key Rotation은 다음과 같이 exploer에서 [resources] - authentication_key와 어카운트 주소가 동일한지 다른지로 확인할 수 있습니다.

'블록체인' 카테고리의 다른 글
[ethereum] foundry를 이용하여 스마트 컨트랙트 개발하기 (0) | 2025.02.17 |
---|---|
[ethereum] 개인키와 공개키 그리고 트랜잭션 서명 (0) | 2022.08.28 |
[ethereum] RLP 인코딩 (0) | 2022.08.28 |
[ethereum] web3와 ethers를 이용하여 메타마스크로 트랜잭션 발생하기 (0) | 2022.08.28 |
[dapp] react에서 web3js 정상적으로 사용하기 (0) | 2022.08.28 |