보안 모델
BitTool Signer는 iPhone과 Android용 오프라인 소프트웨어 서명 앱입니다. 기기에서 키를 유도하고 서명하며, 외부와는 QR 코드로만 소통합니다. 이 섹션에서는 그 방식과 보호의 한계를 설명하므로, 사용자에게 정확하게 안내하는 데 활용하세요.
두 앱은 같은 JavaScript 서명 엔진으로 동작하므로 요청의 디코딩, 매칭, 서명이 양쪽에서 똑같습니다. 다른 점은 운영체제에 의존하는 부분으로, iOS 키체인 또는 Android Keystore, JavaScriptCore 또는 QuickJS입니다. 이 페이지들은 iPhone 앱을 기준으로 설명하고 Android에서 다른 점을 밝힙니다.
설계 요약
개인 키는 서명하는 순간에만 BitTool Signer 내부의 메모리에 존재합니다. 저장할 때 각 지갑의 복구 구문은 두 번 암호화됩니다. 한 번은 지갑 비밀번호에서 유도한 키로, 또 한 번은 휴대폰을 절대 떠나지 않는 기기 키(iOS 키체인에 보관하거나 Android Keystore 안에서 생성)로 암호화합니다. 앱에는 네트워크 코드가 없습니다. 요청은 QR 코드로 들어오고, 격리된 런타임(iPhone에서는 JavaScriptCore, Android에서는 QuickJS)에서 동작하는 내장 JavaScript 엔진이 디코딩하고 확인하며, 서명할 때마다 지갑 비밀번호가 다시 필요합니다.
방어하는 위협
| 위협 | 보호 방식 |
|---|---|
| 온라인 휴대폰이나 컴퓨터의 악성 코드 또는 계정 탈취 | 키는 별도의 오프라인 기기에 있습니다. 온라인 지갑은 공개 키만 보관합니다. |
| 변조된 요청(잘못된 수신자, 금액, 네트워크, 서명자) | 서명 기기는 서명할 정확한 바이트를 디코딩해 보여 주고, 서명 전에 서명자 키, 네트워크, 구조를 확인합니다. 서명 전 확인을 참고하세요. |
| 서명용 휴대폰 도난 | 금고(vault)를 열려면 지갑 비밀번호와 기기 키가 필요하며, 운영체제는 휴대폰에 암호나 화면 잠금이 설정된 경우에만 기기 키를 내줍니다. 비밀번호 추측은 지연됩니다. |
| 앱 파일 복사 | 금고는 암호화되어 있으며, 휴대폰을 떠나지 않고 백업에서도 제외되는 기기 키에 묶여 있습니다. |
| 취약한 난수 생성기 | 새 구문은 운영체제의 암호학적으로 안전한 난수 생성기를 사용하며, 엔진의 crypto.getRandomValues와 Math.random도 모두 여기에 연결됩니다. 시드 생성을 참고하세요. |
보장하지 않는 것
이 한계는 앱 자체 문서에도 명시되어 있으며, 연동하는 쪽에서도 과장해서는 안 됩니다.
- 하드웨어 지갑이 아닙니다. 서명은 보안 칩 안이 아니라, 운영체제가 보호하는 앱 메모리에서 이루어집니다. 탈옥이나 루팅 등으로 침해된 운영체제는 사용 중인 비밀 정보를 관찰할 수 있습니다.
- 휴대폰을 에어갭 상태로 만들어 주지는 않습니다. 서명용 휴대폰은 에어플레인 모드로 두고 Wi-Fi와 Bluetooth를 끄며, 다른 앱은 설치하지 마세요. 앱은 이 조언을 보여 주지만 강제할 수는 없습니다.
- 오프라인 검토에는 한계가 있습니다. 서명 기기는 현재 잔액, 토큰의 실제 동작, 컨트랙트의 악성 여부, blockhash의 유효성, 온체인 멀티시그 구성원 여부를 알 수 없습니다. 바이트가 말하는 내용을 보여 주고, 확인할 수 없는 부분은 그렇다고 표시합니다.
- 아직 독립적인 감사를 받지 않았습니다. 두 앱 모두 오픈 소스이며, 각각 두 건의 AI 보조 보안 검토를 받았습니다. 치명 또는 높음 등급의 문제는 발견되지 않았지만, Android 검토에서는 아직 해결되지 않은 중간 등급 문제가 발견되었고 그중 세 건은 공유 엔진에 있습니다. 두 앱 모두 독립적인 보안 업체의 감사는 받지 않았습니다.
보안 검토
버전 1.0.0은 출시 전에 플랫폼마다 두 차례, 모두 AI 보조 검토를 받았습니다. iPhone 검토(Opus 5와 GPT-6 Astra)는 각각 낮음 등급 문제를 한 건씩 발견했고, 배포된 엔진을 소스에서 바이트 단위로 다시 빌드했습니다. Android 검토(Opus 5.5와 GPT-6 Astra)는 중간 등급 문제를 발견했습니다. 요청을 실제보다 작게 보이게 할 수 있는 Solana와 Bitcoin 요약, 그리고 릴리스 서명 키의 보관 방식입니다. 보고서는 모든 발견 사항과 상태와 함께 전문 공개되어 있습니다: 보안 검토.
코드 위치
| 영역 | 소스 |
|---|---|
| 난수, 볼트 암호화, Keychain | BitToolSigner/Core/VaultCrypto.swift, WalletVault.swift |
| BIP39 시드 파생 | BitToolSigner/Core/BIP39Seed.swift |
| JavaScriptCore 샌드박스 | BitToolSigner/Core/SigningEngine.swift |
| QR 프로토콜 | engine/protocols.js |
| 요청과 지갑 매칭 | engine/src/resolver.js |
| 체인별 파싱과 서명 | engine/src/{bitcoin,evm,tron,solana}.js |
저장소: iPhone은 github.com/bitbill/bittool-signer-ios, Android는 github.com/bitbill/bittool-signer-android. Android 앱에도 같은 engine/ 폴더가 있으며, Kotlin 코드는 app/, core/, feature/에, QuickJS 호스트는 core/engine/src/main/cpp/에 있습니다.