セキュリティモデル
BitTool Signer は、iPhone と Android 向けのオフラインの ソフトウェア 署名アプリです。鍵の導出と署名を端末上で行い、外部とのやり取りは QR コードだけです。このセクションでは、その仕組みと保護の及ぶ範囲を説明します。ユーザーに正確に説明するためにお役立てください。
両アプリは同じ JavaScript の署名エンジンで動くため、リクエストのデコード、照合、署名はどちらでも同じです。違うのは OS に頼る部分で、iOS のキーチェーンか Android Keystore か、JavaScriptCore か QuickJS か、という点です。これらのページは iPhone 版を基準に説明し、Android 版で異なる点を記しています。
設計の要点
秘密鍵は BitTool Signer の中にだけ、署名を行うその瞬間だけメモリ上に存在します。保存時には、各ウォレットのリカバリーフレーズを 2 回暗号化します。1 回はウォレットのパスワードから導出した鍵で、もう 1 回はスマートフォンから出ることのないデバイス鍵(iOS のキーチェーンに保管、または Android Keystore の内部で生成)で暗号化します。アプリにはネットワーク処理のコードがありません。リクエストは QR コードで届き、隔離されたランタイム(iPhone では JavaScriptCore、Android では QuickJS)で動く同梱の JavaScript エンジンがデコードと確認を行います。署名のたびに、ウォレットのパスワードが改めて必要です。
防御できる脅威
| 脅威 | 保護 |
|---|---|
| オンラインのスマートフォンやコンピューター上のマルウェア、または侵害されたアカウント | 鍵は別のオフライン端末にあります。オンラインのウォレットが保持するのは公開鍵だけです。 |
| 改ざんされたリクエスト(受取人、金額、ネットワーク、署名者の誤り) | 署名デバイスは署名するバイト列そのものをデコードして表示し、署名前に署名鍵、ネットワーク、構造をチェックします。署名前のチェック を参照してください。 |
| 署名用スマートフォンの盗難 | Vault(保管庫)を開くには、ウォレットのパスワードとデバイス鍵が必要です。OS がデバイス鍵を渡すのは、端末にパスコードまたは画面ロックが設定されている場合だけです。パスワードの推測は遅延されます。 |
| アプリのファイルのコピー | Vault は暗号化されており、スマートフォンから出ることがなくバックアップにも含まれないデバイス鍵に結び付けられています。 |
| 脆弱な乱数生成器 | 新しいフレーズには OS の暗号論的に安全な乱数生成器を使い、エンジンの crypto.getRandomValues と Math.random もどちらもこれにつなぎ替えています。シードの生成を参照してください。 |
保証しないこと
以下の限界はアプリ自身のドキュメントにも明記されています。統合する側も、これを誇張して伝えないでください。
- ハードウェアウォレットではありません。 署名はアプリのメモリ上で行われ、セキュアエレメントの中ではなく OS によって保護されています。脱獄・root 化などで侵害された OS は、使用中の秘密情報を観察できます。
- スマートフォンをエアギャップにするわけではありません。 署名用のスマートフォンは機内モードにし、Wi-Fi と Bluetooth をオフにして、ほかのアプリはインストールしないでください。アプリはこの助言を表示しますが、強制はできません。
- オフラインでの確認には限界があります。 署名デバイスは、現在の残高、トークンの実際の挙動、コントラクトが悪意あるものかどうか、blockhash が新しいかどうか、オンチェーンのマルチシグのメンバー構成を知ることができません。バイト列が示す内容を表示し、検証できないものにはその旨のラベルを付けます。
- 独立した監査はまだ受けていません。 両アプリはオープンソースで、それぞれ AI 支援による 2 件のセキュリティレビューを受けています。深刻度が重大・高の問題はどのレビューでも見つかっていませんが、Android 版のレビューでは未修正の深刻度「中」の問題が見つかり、そのうち 3 件は共有エンジンにあります。どちらのアプリも、独立したセキュリティ企業の監査は受けていません。
セキュリティレビュー
バージョン 1.0.0 は、リリース前にプラットフォームごとに 2 回、いずれも AI 支援によるレビューを受けました。iPhone 版のレビュー(Opus 5 と GPT-6 Astra)はそれぞれ深刻度「低」の問題を 1 件見つけ、配布されたエンジンをソースからバイト単位で再ビルドしました。Android 版のレビュー(Opus 5.5 と GPT-6 Astra)は深刻度「中」の問題を見つけました。リクエストを過小に表示し得る Solana と Bitcoin の要約、そしてリリース用署名鍵の保管方法です。レポートは、すべての指摘事項とその状況とともに全文公開しています:セキュリティレビュー。
コードの所在
| 領域 | ソース |
|---|---|
| 乱数、Vault の暗号化、キーチェーン | 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/ にあります。