보안 검토
출시 전, BitTool Signer 1.0.0의 소스 코드는 플랫폼마다 두 건의 AI 보조 보안 검토를 각각 따로 받았습니다. 네 보고서 모두 아래에 전문을 공개합니다. 치명 또는 높음 등급의 문제는 어느 검토에서도 발견되지 않았습니다. iPhone 검토는 각각 낮음 등급 문제를 한 건씩 발견했습니다. Android 검토는 중간 등급 문제를 발견했으며, 그중 네 건은 출시된 Android 1.0.0에서 아직 해결되지 않았고, 그 가운데 세 건은 두 앱이 공유하는 서명 엔진에 있습니다.
- 어느 것도 보안 업체의 감사가 아니며, 사람 감사자도 참여하지 않았습니다.
- Opus 5와 Opus 5.5 검토는 검토 대상 코드의 상당 부분을 작성하거나 수정한 것과 같은 모델 계열이 수행했습니다. 보고서는 이를 제3자 증명이나 인증으로 제시해서는 안 된다고 밝힙니다.
- GPT-6 Astra 검토는 스스로를 프로젝트 소유자를 위해 작성된 AI 보조 엔지니어링 검토라고 설명하며, 감사 기관의 인증이나 사람의 승인이 아니라고 밝힙니다.
- 두 Android 보고서 모두, 가치가 큰 지갑을 보호하기 전에 해결되지 않은 중간 등급 발견 사항을 수정할 것을 권고합니다. Android용 BitTool Signer 1.0.0은 이 문제들이 해결되지 않은 채 출시되었습니다. 모든 발견 사항을 참고하세요.
- 독립적인 제3자 감사는 아직 진행되지 않았습니다. 보고서는 실제 기기 테스트, 실제 타사 지갑과의 왕복 테스트와 함께 이를 큰 자금을 보관하기 전에 남은 작업으로 꼽습니다.
iPhone용 BitTool Signer
두 보고서
| Opus 5 | GPT-6 Astra | |
|---|---|---|
| 날짜 | 2026년 10월 19일 | 2026년 10월 18일(보고서 BTS-SEC-2026-1018-R3) |
| 검토한 코드 | 태그 v1.0.0, 커밋 f621372 | 10월 18일 시점의 작업 트리: 커밋 3d706b7에 변경된 파일 59개와 새 테스트 1개를 더한 상태 |
검토한 엔진(signer.js, SHA-256) | 6933d0d8…f21077 | 6933d0d8…f21077 |
| 방법 | 소스 코드 줄 단위 검토(JavaScript 3,546줄, Swift 11,858줄), 공격 프로브 11개, QR 입력에 대한 4,000건 변이(mutation) 테스트, 테스트 모음, 클린룸 재빌드 | 서브시스템별 소스 검토, 이전 라운드와의 비교, 독립적인 Bitcoin 및 Solana 픽스처, 1,509건 변이 테스트, 테스트 모음, 재현 가능한 빌드, 의존성 보안 권고(advisory) 확인 |
| 실행한 테스트 | 엔진 210개, 네이티브 168개 | 엔진 210개, 네이티브 및 UI 177개 |
| 결과 | 치명 0 · 높음 0 · 중간 0 · 낮음 1 · 정보 3 | 치명 0 · 높음 0 · 중간 0 · 낮음 1 · 관찰 사항 4 |
| 독립성 | 코드 상당 부분의 작성자가 수행한 자체 검토 | AI 보조, 프로젝트 소유자를 위해 작성 |
두 검토 모두 BitTool Signer 1.0.0에 포함되어 출시된 것과 같은 엔진 파일을 검토했습니다. 모든 트랜잭션 파서, 위험 규칙, 서명 계획이 이 파일에 들어 있습니다. 앱의 나머지 부분(인터페이스, Keychain, 저장소)은 Swift 소스를 읽어 검토했습니다.
모든 발견 사항
| ID | 심각도 | 발견 사항 | 1.0.0에서의 상태 |
|---|---|---|---|
| BTS-OP5-01 | 낮음 | 높은 위험 요청에 대한 동의가 인터페이스에서만 강제됩니다. 엔진은 부분 해석 요청과 해석 불가(opaque) 요청에 대해서는 명시적 확인을 요구하지만, 완전 해석된 높은 위험 요청(무제한 승인, setApprovalForAll, Safe 권한 변경, 토큰 소각)에 대해서는 요구하지 않습니다. 앱은 확인란에 체크할 때까지 서명(Sign) 버튼을 비활성화하므로, 1.0.0에서는 공격자가 이 경로에 도달할 수 없습니다. 그래도 이 문제가 중요한 이유는 엔진이 사용자가 해시로 검증할 수 있는 부분이기 때문입니다. | 미해결. 보고서는 1.0.1에서 엔진에 이 검사를 추가할 것을 권고합니다. |
| R3-01 | 낮음 | 잔돈이 있는 소각 트랜잭션의 Bitcoin 요약. 금액이 0이 아닌 OP_RETURN 출력과 검증된 잔돈이 있는 트랜잭션에서, 결과 화면과 활동 내역의 짧은 요약이 "Every output returns to your wallet"(모든 출력이 지갑으로 돌아옵니다)라고 표시됩니다. 서명 화면 자체는 소각, 그 금액, 높음(High) 위험을 올바르게 보여 줍니다. | 미해결(1.0.0에 포함되어 출시된 엔진이 검토 대상 엔진입니다). |
| BTS-OP5-02 | 정보 | 활동 내역의 현지화 키 하나가 엔진 출력으로 만들어지며, SwiftUI는 이를 Markdown으로 렌더링합니다. 현재 이 키가 가질 수 있는 값은 모두 고정된 레이블이므로, 잠재적인(latent) 문제입니다. | 미해결, 잠재적. |
| BTS-OP5-03 | 정보 | 볼트의 비밀번호 KDF(PBKDF2-HMAC-SHA256, 600,000회 반복)는 메모리 하드(memory-hard)가 아닙니다. 기기에 묶인 Keychain 키를 사용하는 두 번째 암호화 계층으로 완화됩니다. 복사한 볼트 파일만으로는 공격을 시작조차 할 수 없습니다. | 수용됨. 향후 볼트 형식에 Argon2id 사용이 제안되었습니다. |
| BTS-OP5-04 | 정보 | Solana 파생 과정의 중간 Ed25519 키 자료는 명시적으로 지워지지 않습니다. 실제 통제 수단은 JavaScript 컨텍스트를 폐기하는 것입니다. | 미해결, 본질적인 한계. |
| O-01 | 정보 | 가져오기 중에 "이 지갑이 이미 있는가?"를 확인하는 느린 조회가 문구를 수정한 뒤에 끝나, 이전 지갑에 대한 비밀번호 재설정을 제안할 수 있습니다. 재설정 자체는 지갑 식별 정보를 다시 파생해 잘못된 지갑을 거부하며, 볼트는 변경되지 않습니다. | 보고서 작성 시점 기준 미해결. |
| O-02 | 정보 | Safe와 Solana 요약은 트랜잭션을 실행한 결과가 아니라 범위가 한정된(bounded) 디코더에서 나옵니다. 실시간 컨트랙트 상태는 오프라인에서 알 수 없습니다. | 설계상 그렇습니다. 검토 화면에서 고지합니다. |
| O-03 | 정보 | Swift와 JavaScript에서는 완전한 메모리 제로화를 보장할 수 없습니다. 물리 기기, OS 난수 생성기, 배포된 바이너리는 테스트하지 않았습니다. | 한계. |
| O-04 | 정보 | 개발 전용 의존성에 대한 보안 권고 6건(moderate 3건, low 3건). 해당 패키지는 출시된 엔진에 포함되어 있지 않습니다. | 유지 관리. |
두 보고서는 이전 두 차례 검토 라운드의 발견 사항도 다시 테스트해 수정되었음을 확인했습니다. 여기에는 높음 1건(DELEGATECALL과 중첩된 MultiSend가 있는 Safe 멀티시그 트랜잭션의 요약)과 Bitcoin 수수료 요약 및 Solana 소각 요약의 낮음 여러 건이 포함됩니다. Opus 5는 추가로, 결함이 아니라 TRON 프로토콜의 특성으로서 TRON 서명에 네트워크 식별자가 없다는 점을 언급하며, 앱은 이를 고지합니다.
공유 엔진에서 나중에 발견된 문제
iPhone용 BitTool Signer 1.0.0에는 SHA-256이 6933d0d8…f21077인 엔진이 포함되어 있습니다. GPT-6 Astra의 Android 검토는 바로 이 파일을 대상으로 엔진 관련 발견 사항을 재현했고, Opus 5.5 발견 사항에 해당하는 Bitcoin, EVM, TRON 코드도 이 파일에서 동일합니다. 따라서 다음 엔진 관련 발견 사항은 iPhone 1.0.0에도 해당됩니다.
| ID | 심각도 | iPhone 1.0.0에서의 의미 |
|---|---|---|
| BTS-02, BTS-07 | 중간 | 아주 작은 송금과 함께 보낸 Solana 소각, 권한 변경 또는 위임이 그 송금으로만 요약됩니다. 세부 정보의 경고와 위험 확인은 그대로 남습니다. |
| BTS-08 | 중간 | Bitcoin 잔돈이 지갑의 단일 서명 구성에서 어떤 주소 인덱스로든 받아들여집니다. 보기 전용 지갑이 절대 스캔하지 않는 인덱스도 포함됩니다. |
| BTS-09 | 낮음~중간 | 알 수 없는 EVM 또는 TRON 컨트랙트 호출과 함께 보내는 네이티브 코인이 저장된 요약에서 빠집니다. 검토 카드에는 표시됩니다. |
위의 R3-01은 Android의 BTS-04와 같은 결함이며, Android 엔진에서는 수정되었습니다. Opus 5.5 보고서는 나머지를 공유 엔진에서 수정할 것을 권고하며, 그 수정은 두 앱 모두에 반영됩니다.
검토에서 확인한 내용
| 영역 | 확인한 내용 | 자세히 |
|---|---|---|
| 서명 | Release 빌드에서 서명하는 유일한 방법은 고정된 계획(plan)을 거치는 것입니다. 서로 독립적인 검사 6개가 서명을 검토한 요청, 계획된 지갑, 승인된 키에 묶으며, 엔진은 서명 전에 복호화한 시드에서 모든 것을 다시 파생합니다. 실행으로 확인했습니다. | 서명 전 확인 |
| 난수 | 복구 문구는 SecRandomCopyBytes에서 생성되며, 오류가 나면 대체 경로 없이 생성이 중단됩니다. 엔진의 crypto.getRandomValues와 Math.random은 같은 소스로 연결됩니다. | 시드 생성 |
| 키 저장 | 인증된 헤더를 갖는 AES-GCM 계층 두 개, 기기 전용 Keychain 키, 재시작 후에도 유지되는 실패 시도 제한. | 키 저장 |
| 거부 | 이 문서에서 설명하는 모든 거부가 그대로 지켜집니다: SIGHASH_NONE/SINGLE/ANYONECANPAY, 이전 트랜잭션이 없는 SegWit v0 입력, Solana 조회 테이블, EIP-7702, blob 트랜잭션, 원시 해시 eth_sign, 지원하지 않는 체인 ID. | 제한과 오류 |
| 신뢰할 수 없는 입력 | 두 검토를 합쳐 변이된 QR, CBOR, PSBT, JSON 입력 5,509건: 유효하지 않은 입력은 하나도 받아들여지지 않았고, 통제되지 않은 예외도 없었습니다. | UR과 CBOR |
| 오프라인 | CFNetwork와 Network.framework 모두 링크되어 있지 않으며, JavaScript 브리지는 네트워크 API를 제공하지 않습니다. | 보안 모델 |
| 공급망 | 엔진은 태그로부터 바이트 단위로 똑같이 다시 빌드되고, 런타임 의존성은 정확한 버전으로 고정되어 있으며, 프로덕션 의존성 감사에서는 취약점이 보고되지 않았습니다. | 아래 참고 |
다루지 않은 범위
물리 기기에서의 테스트(결함 주입, 메모리 덤프, 부채널), OS 난수 생성기와 Secure Enclave 내부, 엔진 파일 외의 App Store 바이너리 출처(provenance), 실제 체인에서의 트랜잭션, 서드파티 지갑과의 왕복 테스트, 암호화 의존성의 전체 감사, 인터페이스 21개 언어의 언어 검수, 정형 검증(formal verification)은 다루지 않았습니다. 테스트 모음을 통과했다는 것은 그 모음이 테스트하는 사례에 대한 것일 뿐, 모든 트랜잭션이나 기기에 대한 것은 아닙니다.
엔진 직접 검증하기
App Store 실행 파일은 바이트 단위로 재현할 수 없지만(Apple이 다시 서명하고 암호화하기 때문입니다), 엔진은 암호화되지 않은 리소스이므로 비교할 수 있습니다. 태그에서 엔진을 빌드합니다.
git clone https://github.com/bitbill/bittool-signer-ios
cd bittool-signer-ios && git checkout v1.0.0
cd engine && npm ci --ignore-scripts && npm run build
shasum -a 256 ../BitToolSigner/Resources/signer.js
# 6933d0d8a6f60faa8222506ac0bd7eef80eb884c9f73e31e9f354b4740f21077 (1,181,026 bytes)
그런 다음 설치한 앱 안의 파일과 비교합니다. Apple Configurator로 앱을 .ipa로 내려받아 압축을 풀고, Payload/BitToolSigner.app/signer.js의 해시를 계산하세요. 검증이 어디까지 가능한지를 포함한 전체 절차는 저장소의 Reproducible-Build.md에 있습니다.
Android용 BitTool Signer
두 보고서
| Opus 5.5 | GPT-6 Astra | |
|---|---|---|
| 날짜 | 2026년 10월 25일 | 2026년 10월 24일 |
| 검토한 코드 | 정식 출시 1.0.0(버전 코드 1000001): 코드 커밋 71af693, 릴리스 기록 62996b8 | 출시 전 커밋 e7e71fb: 이전 기준선 bb1e656 이후 변경 사항에 대한 재검토 |
검토한 엔진(signer.js, SHA-256) | 4b371759…00fa19 | 6933d0d8…f21077(iPhone 1.0.0에 포함된 엔진) |
| 방법 | 다섯 영역으로 나눈 소스 검토(각 영역을 처음부터 끝까지 추적), 모든 발견 사항을 코드와 대조해 재확인, 합성 데이터로 엔진 문제 재현, 의존성 및 산출물 점검 | 변경된 코드와 호출부 검토, 세 가지 수정 검증, 커밋된 번들로 엔진 문제 재현, 자동 회귀 점검 |
| 실행한 테스트 | 앱 테스트 2,075건, 엔진 테스트 217건, 릴리스 검증 스크립트 25건 중 25건 | Android 테스트 1,616건, 엔진 테스트 210건(1건 실패, 1건은 실행되지 않은 채 통과 처리. BTS-06) |
| 결과 | 치명 0 · 높음 0 · 중간 4(1건은 낮음~중간) · 낮음 9 · 참고 사항 | 치명 0 · 높음 0 · 미해결: 중간 1, 낮음 1, 검증 1 · 해결 3 |
| 권고 | 가치가 큰 지갑을 보호하는 정식 출시 전에 BTS-07, BTS-08, BTS-10을 수정할 것 | 해당 리비전에서는 가치가 큰 지갑을 위한 정식 출시를 보류할 것 |
| 독립성 | 검토 대상 코드의 상당 부분을 같은 모델 계열이 작성함 | AI 보조. 프로덕션 코드는 수정하지 않음 |
두 검토 모두 Android 앱 전체를 살펴봤습니다. Kotlin 모듈, 네이티브 호스트(QuickJS 위의 JNI 계층과 네이티브 PBKDF2), 그리고 iPhone과 공유하는 서명 엔진입니다.
모든 발견 사항
Opus 5.5는 출시된 코드를 검토했으므로, 아래는 Android용 BitTool Signer 1.0.0의 발견 사항입니다.
| ID | 심각도 | 발견 사항 | 위치 |
|---|---|---|---|
| BTS-07 | 중간 | Solana 권한 변경이 소액 송금 뒤에 숨습니다. 계정 소유자나 권한을 바꾸거나, 위임자를 승인하거나, 알 수 없는 명령을 담은 요청에 1 lamport 송금이 함께 있으면 그 송금이 제목과 저장된 요약이 됩니다. 세부 정보의 높은 위험 경고는 남아 있고 위험 확인도 여전히 필요합니다. | 공유 엔진, iPhone도 해당 |
| BTS-08 | 중간 | Bitcoin 잔돈이 어떤 인덱스에서든 받아들여집니다. 출력의 스크립트가 지갑의 단일 서명 구성 중 하나와 일치하면 브랜치 0이든 1이든, 2³¹−1까지 어떤 인덱스든 확인된 잔돈으로 간주됩니다. 그곳으로 보낸 자금은 "모든 출력이 지갑으로 돌아옵니다"로 표시되지만, 제한된 범위만 스캔하는 지갑은 찾지 못할 수 있습니다. | 공유 엔진, iPhone도 해당 |
| BTS-09 | 낮음~중간 | 컨트랙트 호출에서 저장된 요약에 네이티브 코인 금액이 빠집니다. 네이티브 코인도 함께 보내는 알 수 없는 EVM 또는 TRON 컨트랙트 호출은 "알 수 없는 컨트랙트 호출"로 저장됩니다. 검토 카드와 경고에는 금액이 표시됩니다. | 공유 엔진, iPhone도 해당 |
| BTS-10 | 중간 | 릴리스 서명 키가 개발 컴퓨터에 있습니다. 키와 비밀번호가 작업 트리에 평문으로 저장되어 있었습니다(Git에서는 제외). | 릴리스 절차 |
| BTS-11 | 낮음 | 앱 잠금 화면 뒤에서 QR 카메라가 계속 스캔할 수 있습니다. 서명에는 여전히 지갑 비밀번호가 필요합니다. | Android 앱 |
| BTS-12 | 낮음 | 완전히 디코딩된 높은 위험 요청에 대한 위험 확인을 인터페이스에서만 강제합니다. | Android 앱(iPhone: BTS-OP5-01) |
| BTS-13 | 낮음 | Android 8~11에서 Keystore 오류가 나면 공개 지갑 데이터를 인증하는 키가 다시 만들어질 수 있고, 이후 지갑을 "복구"해야 합니다. 비밀 정보나 자금은 잃지 않습니다. | Android 앱 |
| BTS-14 | 낮음 | 보조 키 두 개가 화면 잠금 여부를 확인하지 않고, 일부 문서가 보호 수준을 과장합니다. 금고 자체는 여전히 화면 잠금을 요구합니다. | Android 앱 |
| BTS-15 | 낮음 | 기본 작업 선호도(task affinity) 때문에 구형 Android에서 작업 가로채기가 가능합니다. | Android 앱 |
| BTS-16 | 낮음 | 백업 확인을 시행착오로 통과할 수 있습니다. | Android 앱(보고서에 따르면 iPhone도 동일) |
| BTS-17 | 낮음 | 12단어 구문에서 복구 카드 한 장에 남는 엔트로피는 약 40비트입니다. | Android 앱 |
| BTS-18 | 낮음 | 지갑 매칭을 취소하면 검토 화면이 "일치하는 지갑을 찾는 중…"에 멈출 수 있습니다. | Android 앱 |
| BTS-19 | 낮음 | Android 8.0~9에서는 확인 컨트롤의 일부만 가리는 오버레이를 감지할 수 없습니다. 서명에는 여전히 비밀번호가 필요합니다. | Android 앱 |
보고서는 참고 사항도 제시합니다. 예를 들어 엔진 스레드에 CPU 시간 제한이 없다는 점(가용성에만 영향), 별도의 업로드 키를 설정하기 전까지 Google Play 빌드가 APK 키로 서명된다는 점, 재시도 지연이 기기 시계를 기준으로 한다는 점, JVM이 지울 수 없는 구문의 일시적인 사본이 있다는 점 등입니다.
GPT-6 Astra는 그보다 이전 커밋을 검토했습니다. 그 발견 사항과 정식 출시에서의 상태:
| ID | 심각도 | 발견 사항 | e7e71fb 기준 | Android 1.0.0 |
|---|---|---|---|---|
| BTS-01 | 중간 | 일부가 가려진 서명 및 위험 확인 컨트롤을 오버레이 너머로 누를 수 있었음 | 해결 | 해결 |
| BTS-02 | 중간 | 소액 송금과 섞인 Solana 소각이나 권한 변경이 그 송금으로 요약됨 | 미해결 | 소각은 수정됨, 권한 변경은 BTS-07로 남음 |
| BTS-03 | 낮음 | 작업 취소 후 비밀 정보 버퍼가 남을 수 있었음 | 해결 | 해결 |
| BTS-04 | 낮음 | 잔돈이 있는 Bitcoin 소각이 "모든 출력이 지갑으로 돌아옵니다"로 요약됨(iPhone의 R3-01) | 미해결 | 수정됨 |
| BTS-05 | 기능 | 중단된 QR 스캔이 재개되지 않았음 | 해결 | 해결 |
| BTS-06 | 검증 | 오래된 파일 경로 때문에 엔진 테스트 1건이 실패하고 다른 1건은 실행되지 않은 채 통과함 | 미해결 | 수정됨(엔진 테스트 217건 모두 통과) |
검토에서 확인한 내용
| 영역 | 확인한 내용 |
|---|---|
| 서명 | 비밀번호를 우회할 방법이 없고, 검토·매칭된 요청 외에는 서명할 수 없습니다. 계획은 요청 해시, 계획 해시, 서명 대상 바이트의 다이제스트에 묶이며, 엔진은 복호화한 시드로 계획을 다시 확인하고 서명되지 않은 Bitcoin 트랜잭션의 어떤 변경도 거부합니다. 취소, 앱 잠금, 새 요청 이후에 늦게 도착한 결과는 버려집니다. |
| 키 저장 | 네이티브 코드의 PBKDF2-HMAC-SHA256(600,000회), 암호화할 때마다 새 논스와 솔트를 쓰는 AES-256-GCM, 그리고 지갑마다 내보낼 수 없는 Android Keystore 키(기기에 있으면 StrongBox). 모든 비밀번호 시도는 키 유도 전에 집계되며, 카운터가 손상되면 거부됩니다. |
| 메모리 속 비밀 정보 | 잠금 해제된 비밀 정보는 사용 후 닫히는 보관 객체에 담기며, 취소된 경우에도 지워집니다. 복구 구문은 앱 자체 키보드로 입력되어 어떤 입력기도 볼 수 없습니다. |
| 엔진 호스트 | 번들은 SHA-256과 길이로 고정됩니다. QuickJS는 eval과 Function 없이 실행되며, 비밀 정보나 신뢰할 수 없는 입력을 다루는 작업마다 새 런타임을 쓰고 메모리와 스택에 제한이 있습니다. |
| 오프라인 및 플랫폼 | 인터넷 권한도, 네트워크 코드도 없습니다. 메인 화면만 외부에 공개되고 딥 링크가 없으며, 백업과 기기 간 이전에서 제외되고, 모든 창이 스크린샷, 녹화, 최근 앱 화면에 나타나지 않습니다. Android 12 이상에서는 다른 앱의 오버레이를 숨깁니다. 앱 잠금은 서명을 승인하지 않으며, 릴리스 빌드는 로그를 남기지 않습니다. |
| 공급망 | 깨끗한 npm ci --ignore-scripts 후 다시 빌드한 엔진은 커밋된 파일 및 APK 안의 사본과 바이트 단위로 같습니다. 프로덕션 의존성 감사에서 보고된 권고는 없습니다. |
다루지 않은 범위
실제 기기 테스트(제조사별 Keystore와 StrongBox 동작, 생체 인증, 오버레이, 화면 캡처), 악성 오버레이 실습, 부채널, ARM에서의 네이티브 코드 실행, 실제 체인에서의 트랜잭션, Maven 및 네이티브 의존성의 CVE 스캔, 그리고 Google Play가 빌드하는 사본. 두 보고서 모두 Android 8부터 최신 버전까지 대표적인 기기에서 출시 빌드를 확인할 것을 요구하며, Opus 5.5는 앱이 큰 자금을 보호하기 전에 독립적인 사람의 감사를 받을 것을 권고합니다.
APK와 엔진 검증하기
bittool.com/signer에 게시된 APK는 모두 확인할 수 있습니다. 해시, 서명 인증서, 그 안의 엔진, 그리고 인터넷 권한이 없다는 점(aapt2 dump badging 목록에 android.permission.INTERNET이 없음)입니다.
# 1. The APK from bittool.com/signer
shasum -a 256 BitToolSigner-1.0.0-1000001.apk
# 109dbf5c622ee77672904c34a10229df3c9b0eac45b07096c510b1e1e169c2a4
apksigner verify --print-certs BitToolSigner-1.0.0-1000001.apk
# Signer #1 certificate DN: CN=BITTOOL PTE. LTD., O=BITTOOL PTE. LTD., C=SG
# Signer #1 certificate SHA-256 digest: af41ed101765393ae89038eb4c6fc7fa96d930f6fcd76b881437a39b5a9e4631
# 2. The engine inside it
unzip -p BitToolSigner-1.0.0-1000001.apk assets/engine/signer.js | shasum -a 256
# 4b3717599e8ee3ed9d2480e640e7203731543cc8ab0f2c3cec3b78e6f400fa19 (1,181,432 bytes)
# 3. The same engine, rebuilt from source
git clone https://github.com/bitbill/bittool-signer-android
cd bittool-signer-android && git checkout 71af693
cd engine && npm ci --ignore-scripts && npm run build
shasum -a 256 ../core/engine/src/main/assets/engine/signer.js
인증서는 릴리스 간에 바뀌지 않고, Android는 같은 인증서를 가진 업데이트만 설치하며, 앱도 설정 › 완전한 오픈소스 › 이 빌드에서 인증서를 보여 줍니다. Google Play에서 설치한 사본은 Google Play가 업로드된 번들로 빌드한 다른 파일이므로 해시를 비교할 수 없습니다. 하지만 그 안의 assets/engine/signer.js는 바뀌지 않으므로 adb pull 후 같은 방법으로 비교할 수 있습니다. 전체 절차는 저장소의 Reproducible-Build.md에 있습니다. 위 값들은 2026년 10월 25일 게시된 APK와 대조해 확인했습니다.
보고서 내려받기
| 보고서 | 페이지 | SHA-256 |
|---|---|---|
| iPhone · Opus 5, 2026년 10월 19일 (PDF, 118 KB) | 17 | ff7ddd17e5dffccd99db6aaa43b8f0041167b58bd9b2bd7cc11d185e779bca1a |
| iPhone · GPT-6 Astra, 보고서 R3, 2026년 10월 18일 (PDF, 46 KB) | 16 | 02d7a358f8f35b2978eab7db1292add4365a94b736ff79e158dee3afb842b64a |
| Android · Opus 5.5, 2026년 10월 25일 (PDF, 252 KB) | 8 | 8242d58aeec1aa88823eb0a938c9461b0681abfab3f37805e2f77a41b3bba34c |
| Android · GPT-6 Astra, 재검토, 2026년 10월 24일 (PDF, 22 KB) | 7 | b37aaefd40d0d522384a86255accadeb976067175d76e38466a1b4c90b036f53 |
이 페이지의 요약은 저희가 작성한 것입니다. 표현이 보고서와 다른 경우에는 보고서가 우선합니다.