12편 중 6번째 글읽는 데 5분

휴대폰이 보여 주는 것: 서명 기기에서 하는 트랜잭션 분석

지갑 도난은 대부분 주인의 동의 아래 일어나요. 페이지는 하나를 보여 주고, 지갑은 다른 것에 서명하고, 주인은 Confirm(확인)을 눌렀어요. 휴대폰이 할 일은 눈에 보이는 것과 서명하는 것이 같도록 만드는 거예요.

알 수 없는 승인 대상에게 주는 무제한 허용량을 디코딩한 휴대폰, 두 탐지 항목을 끌어낸 설명 상자, 페이지에는 Swap이라고만 적혀 있었음을 보여 주는 작은 카드
페이지가 설명한 요청이 아니라, 실제 그대로의 요청.
목차

주장과 진실

웹 페이지는 서명을 요청하면서 그게 무엇인지도 알려 줘요. "1 ETH를 USDC로 스왑", "보상 받기", "지갑 인증하기". 이 설명은 페이지가 하는 주장이고, 악의적인 페이지는 원하는 대로 아무 주장이나 할 수 있어요. 페이지가 지갑에 넘기는 바이트는 별개이고, 블록체인이 보는 건 오직 그 바이트뿐이에요.

AirNox Vault는 그 주장을 무시해요. 실제로 서명할 바로 그 바이트에서, 휴대폰 위에서, 자체 파서로 요청을 디코딩하고 그 결과를 보여 줘요. 데스크톱이 요청에 대해 하는 말은 주장이에요. 휴대폰이 보여 주는 것이 진실이에요.

왼쪽: 페이지에는 1 ETH를 USDC로 Swap이라고 적혀 있음. 오른쪽: 휴대폰은 알 수 없는 승인 대상에게 주는 무제한 허용량으로 디코딩함
같은 요청, 두 가지 설명. 바이트에서 나온 건 하나뿐이에요.

표준 메서드는 알아봐요

서명하는 것 대부분은 평범해요. 전송. 토큰 허용량(allowance). 잘 알려진 라우터를 통한 스왑. 컨트랙트 예치. 휴대폰은 지원하는 각 체인 계열의 표준 작업을 알아보고 쉬운 말로 보여 줘요. 어떤 작업인지, 어떤 토큰인지, 얼마인지, 누구에게인지, 어느 네트워크인지, 수수료 상한은 얼마인지요. 전송은 전송으로 보여요. 허용량은 허용량으로 보이고, 승인 대상(spender)과 금액이 분명히 적혀 있어요.

닮은꼴은 경고해요

위험한 요청은 평범해 보이지만 실제로는 그렇지 않은 요청이에요. 이름은 표준 메서드와 비슷한데 파라미터가 맞지 않는 메서드. 겉으로 드러나지 않는 방식으로 다른 컨트랙트에 제어권을 위임하는 호출. 페이지가 상대한다고 말한 컨트랙트가 아닌 대상. 유명한 토큰의 심볼을 사칭하는 토큰. 내 주소 중 하나와 앞뒤 글자가 같은 수신 주소.

이런 것들은 하나하나 탐지되어 탐지 항목이 돼요. 결정은 사용자의 몫이라서 휴대폰이 서명을 거부하지는 않아요. 대신 절대 놓칠 수 없게 만들어요.

여섯 가지 탐지 항목: 무제한 허용량, 알 수 없는 승인 대상, 닮은꼴 메서드, 사칭 토큰, 닮은꼴 수신 주소, 숨겨진 위임
휴대폰이 수락을 허락하기 전에 띄우는 탐지 항목.

탐지 항목

무제한 허용량은 드레이너(drainer)의 전형적인 수법이에요. 한 번 승인(approve)하면, 이후 그 토큰은 전부 털려요. 휴대폰은 "unlimited"(무제한)를 빨간색으로 표시하고 탐지 항목으로 다뤄요.

알 수 없는 승인 대상이란, 아무도 보증하지 않은 주소에 허용량을 주는 경우예요. 특정 라우터로 스왑 견적을 받았는데 승인 대상이 다른 곳이라면, 그 불일치가 탐지 항목이 돼요.

닮은꼴 메서드, 사칭 토큰 심볼, 닮은꼴 수신 주소, 숨겨진 위임은 각각 이름을 붙여 따로 알려 줘요. 수신 주소의 경우 데스크톱과 휴대폰 모두 주소로부터 항상 똑같이 만들어지는 이미지를 보여 줘요. 그래서 16진수로는 눈을 속이는 닮은꼴 주소도 이미지로는 속이지 못해요.

확인한 다음에 Accept

탐지 항목은 반사적으로 닫아 버릴 수 있는 팝업이 아니에요. 모든 탐지 항목에 체크하기 전까지 Accept(수락)는 비활성 상태로 남아 있어요. 거절은 언제든 할 수 있어요. 수락은 휴대폰이 찾아낸 내용을 확인한 뒤에만 할 수 있어요. 이 설계 하나가 "그냥 눌렀어요"를 "읽어 보고 진행하기로 했어요"로 바꿔요. 털린 지갑과 본인의 결정을 가르는 차이가 바로 여기에 있어요.

데스크톱이 먼저 검사해요

같은 분석이 요청이 데스크톱을 떠나기 전에 데스크톱에서도 실행돼요. 그래서 나쁜 요청은 대부분 휴대폰에 닿기 전에 지갑 창에서 먼저 경고로 표시돼요. 휴대폰이 분석을 한 번 더 하는 건 데스크톱이 감염됐다고 가정하는 컴퓨터이기 때문이에요. 두 기기에서 서로 독립적으로 두 번 검사하고, 최종 판단은 키를 가진 쪽이 내려요.

읽는 건 여전히 사용자의 몫

진실을 보여 주는 서명 기기(signer)라도, 거기에 동의하는 것까지 막을 수는 없어요. 할 수 있는 건 진실을 놓칠 수 없게 만드는 거예요. 바이트에서 디코딩하고, 쉬운 말로 보여 주고, 위험한 부분은 빨간색으로 표시하고, 일부러 통과해야 하는 관문을 두는 거죠. 나머지는 사용자에게 달려 있고, 이제 결정에 필요한 건 다 갖췄어요.

시리즈 목차

  1. 컴퓨터는 이미 감염됐다고 가정하세요
  2. Mass Adoption Security: 서명 기기는 이미 가진 휴대폰이에요
  3. 에어갭을 건너는 세 가지 방법: QR 코드, Bluetooth LE, NFC
  4. 전파에 드러나지 않기: 아무도 스캔으로 찾을 수 없는 서명 기기
  5. 전송 수단은 절대 신뢰하지 않아요
  6. 휴대폰이 보여 주는 것: 서명 기기에서 하는 트랜잭션 분석
  7. 휴대폰은 자기만의 기록을 남겨요
  8. 데스크톱의 금고: Argon2id와 추측에 강한 프로필
  9. 브라우저 지갑 없이 dApp 쓰기
  10. 규칙이 있는 MCP 서버: 한도 안에서 움직이는 AI 에이전트
  11. 모든 걸 담은, 보호받는 지갑 하나
  12. 작고 네이티브하게: C++, JavaScript 런타임 없이, 워크스테이션부터 Raspberry Pi까지

사전 등록

이메일을 남기면 출시 소식을 보내 드려요. 그 밖의 메일은 보내지 않아요.