Summary
95% of all REPORTED Findings have been addressed
- 3Not Solved
- 6Partially Solved
- 1Future Release
- 1Not Applicable
- 10Acknowledged
- 27Risk Accepted
- 18Solved
- 66All Findings
- Critical1
- 1Solved
- High3
- 1P. Solved
- 2Solved
- Medium28
- 11Risk A.
- 5P. Solved
- 8Solved
- 1F. Release
- 3Not Solved
- Low22
- 16Risk A.
- 6Solved
- Informational12
- 10Ack.
- 1Solved
- 1N/A
INTRODUCTION#
The MakaChain team engaged Halborn to assess the MakaWallet mobile application and its supporting backend API. The original assessment used the June 2026 source archives retained in Sources and combined manual source review with targeted proof-of-concept checks.
The review examined key management and secure storage, authentication and authorization, transaction construction and signing, WalletConnect and the in-app dApp browser, backend services, chain indexers, and deployment configuration.
Repository References#
The delivery scope identifies the following repository heads, verified on September 15, 2026:
makawallet-api (master):
7854ad71b4fbe1ec99c38f4139f8eb5c3e228819makapay (main):
d8fe3d8f8d0ae03a8e7d2a10df395d7764c081b6maka-wallet (master):
57a0da5746ab7f7474587a4f0c8e4687550ee8d1
MakaPay was assessed in a separate engagement, documented in the MakaPay assessment report. Its 32 findings are separate from this report's 66 MakaWallet and API findings.
Assessment and Remediation Revisions#
The September 12, 2026 remediation review used API revision 15dc70db5e845a44b0afc4cad2e2c28337ddae15 and wallet revision 57a0da5746ab7f7474587a4f0c8e4687550ee8d1. The current API is three commits newer; the wallet revision is unchanged. The current repository references do not imply that all later changes, MakaPay submodules, production deployments, or release artifacts were assessed. Original findings describe the audit baseline; each finding's remediation state and notes describe the subsequent review and remaining issues.
Technical Profile#
Assessment baseline: This section describes the June 2026 audit baseline. Subsequent changes and remaining issues are recorded in the findings; current repository references do not extend this architectural review to later revisions.
Document Purpose#
This section describes what the MakaWallet platform is, how it is implemented, and which architectural characteristics are most relevant to the assessment. It is the implementation and architecture baseline that supports the attack-surface and threat-model sections; it is not itself a findings report.
System Overview#
MakaWallet is a multi-chain, non-custodial wallet. The mobile application is the security-critical component: it generates the recovery phrase, derives EVM and Solana keys, holds the private material on-device, and signs and broadcasts transactions. The backend provides read and convenience services (balances, transaction history, token metadata, fee estimation, an address book, push notifications, and a referral and promotions program) and indexes on-chain activity for the addresses users track.
Mobile Application#
The client is built with React Native (0.83) and Expo (55) in TypeScript. Key material is encrypted with crypto-es (AES-CBC with PBKDF2) and stored in expo-secure-store (the iOS Keychain and the Android Keystore). Non-secret wallet state (addresses, balances, account metadata, and transaction history) is persisted with redux-persist to AsyncStorage. The app uses ethers (v6) and @solana/web3.js for chain interaction, WalletConnect v2 for external dApp connectivity, and a react-native-webview-based in-app browser that injects an EIP-1193 provider. App lock is enforced by a biometric and passcode gate, and over-the-air JavaScript updates are delivered through EAS Update.
Backend Services#
The backend is a Node.js (22) and Express (5) application using Sequelize over PostgreSQL. It is composed of the REST API (mounted routers for chains, tokens, wallets, activities, favorites, the address book, referrals, promotions, fees, and an admin panel), two chain publishers (EVM and Solana) that poll blocks and write the activities table, and background jobs for push notifications, price updates, and token-metadata refresh. Provider RPC access (for example Alchemy) is configured through the chain table and served to clients.
Trust Boundaries#
The principal trust boundaries are the device boundary (on-device secret storage and the app lock), the client-to-backend boundary (the REST API and the bridge and swap gateways), the wallet-to-dApp boundary (WalletConnect and the in-app browser provider), and the backend-to-database and backend-to-RPC boundaries. Several findings arise because data crossing these boundaries (backend-supplied calldata, RPC URLs, token metadata, and chain configuration) is trusted without validation, and because the affected client-to-backend operations lacked identity and authorization checks at the audit baseline.
Attack Surface#
Assessment baseline: The attack surfaces and control weaknesses below describe the June 2026 audit baseline. Later fixes and remaining exposure are recorded in each finding's remediation state and notes.
Document Purpose#
This section enumerates the points where untrusted input enters the platform and the interfaces an attacker can reach. It frames where the findings concentrate.
Backend REST API#
Every user-scoped endpoint is reachable over the network and is keyed by an attacker-suppliable identifier (wallet_address, owner_address, or seed_hash) with no authentication. This includes balances, full transaction history, the address book, favorites, mute state, push-token registration, and the entire referral and promotions surface. Because wallet addresses are public on-chain, any internet host can target any user.
WalletConnect, dApp Browser, and Injected Provider#
The wallet exposes signing to external dApps over WalletConnect v2 and through the in-app browser, which injects a provider bound to the user's address into every page it loads. The signing prompts present little detail about what is being signed, and the browser can be opened on an attacker-chosen URL through the makawallet:// deep-link scheme. This is the primary path by which a malicious or compromised dApp reaches the signing flow.
Admin Panel and Token Registration#
The admin panel is gated by a single static password with a hardcoded default, and the unauthenticated POST /tokens/custom endpoint writes attacker-controlled token metadata into the global catalog that the admin panel later renders. Together these form an unauthenticated path to stored cross-site scripting in the admin session and to app-wide token-list poisoning.
Backend-Controlled Configuration#
RPC URLs, explorer URLs, and token metadata are supplied by the backend and consumed by the wallet with no validation or allow-listing. A malicious or tampered chain list influences RPC selection, the in-app browser, and, with no transport pinning, the data that drives signing.
Transport#
All fund-affecting network calls (the REST API, the bridge gateway, deBridge, and RPC) use plain TLS with no certificate or public-key pinning, so a network attacker who can present a trusted certificate can tamper with responses.
Device-Local Surface#
On a lost, stolen, rooted, or malware-infected device, the relevant surfaces are SecureStore (where the encryption key is stored next to the ciphertext), unencrypted AsyncStorage, the four-digit passcode (no lockout), the clipboard, and the secret-display screens (no screenshot protection).
Chain Indexers and Jobs#
The publishers ingest attacker-influenceable on-chain data and write the activities table, and the notification job delivers messages whose content is partly attacker-controlled. The unauthenticated wallet-tracking endpoint lets anyone enroll arbitrary addresses for indexing.
Threat Model#
Assessment baseline: This threat model reflects the June 2026 implementation and the assumptions used for that assessment. The scenarios below are historical baseline observations; subsequent remediation is recorded in the findings. Later repository changes and the separate MakaPay engagement are not covered by this threat model.
What the Platform Must Protect#
The central security questions are whether the platform keeps users' keys and funds safe, whether it lets only the rightful owner read and modify their data, and whether a user can understand and control what they sign.
Keys, Seeds, and Funds#
The recovery phrase and the derived private keys are the highest-value assets. Their compromise, or the signing of an attacker-chosen transaction or approval, results in irreversible loss of funds. The wallet must protect this material at rest, gate access to it behind authentication, and ensure the user can verify every transaction before it is signed.
User Data and Privacy#
Balances, transaction history, the address book (which contains private contact labels), and any seed-derived identifier are sensitive. They must be readable and writable only by their owner, and no value that links a user's multiple addresses to a single identity should leave the device or be exposed by the backend.
Threat Actors Considered#
Remote unauthenticated attacker: any internet host calling the backend API. At the audit baseline, affected API operations lacked caller identity and ownership checks.
Malicious or compromised dApp: a site or WalletConnect peer that the user connects to or is steered to, which then requests signatures or transactions.
Network attacker: a party positioned to intercept TLS (for example with a mis-issued or rogue certificate) or to hijack DNS, given the absence of certificate pinning.
Malicious or compromised backend or third party: the MakaChain gateway, the deBridge API, or the provider RPC, whose responses the wallet trusts and signs.
Attacker with device access or local malware: a thief or malware with file-system or screen-capture access to an unlocked or compromised device.
Supply-chain attacker: a party that compromises the OTA update channel or the prebuilt native module, both of which can introduce code into the wallet process.
Key Trust Assumptions That Do Not Hold#
The platform implicitly trusts that callers of the API are who they claim to be, that backend-supplied calldata and configuration are honest, and that the transport cannot be tampered with. The original findings identify specific paths where these assumptions were not enforced, making the corresponding attack scenarios reachable at the audit baseline.
Assessment Summary#
Results Overview#
The original assessment identified 66 findings: 1 Critical, 3 High, 28 Medium, 22 Low, and 12 Informational. Of these, 48 concerned the wallet and 18 concerned the backend API. MakaPay's separate 32 findings are not included in these totals.
Original Assessment Themes#
In the assessed baseline, missing API authentication and ownership checks exposed user data and allowed unauthorized changes. Unescaped custom-token metadata created a stored-XSS path into the admin panel. Wallet findings concerned incomplete signing information, trust in external transaction data and web content, on-device key protection, seed-derived identifiers, and transport and deployment controls.
The assessment did not identify SQL injection in the reviewed backend queries or defects in the examined wallet entropy-generation and BIP39-handling paths. These observations apply only to the implementation and paths examined.
Remediation Review#
As checked on September 16, 2026, Halborn's recorded dispositions are: 18 Solved, 6 Partially Solved, 3 Not Solved, 27 Risk Accepted, 10 Acknowledged, 1 Future Release, and 1 Not Applicable. Risk acceptance, acknowledgement, and deferral do not represent implemented fixes.
For this review, Solved means the remediation addresses the principal risk of the original finding. Remaining risks and unimplemented recommendations are retained in each remediation comment; this classification does not mean every weakness has been eliminated. Seven findings were closed on this basis: HAL-001, HAL-003, HAL-008, HAL-027, HAL-052, HAL-053, and HAL-056.
The three Not Solved findings are HAL-013 (bridge transaction validation), HAL-015 (authentication at seed retrieval), and HAL-026 (admin authentication). The six Partially Solved findings are HAL-002, HAL-006, HAL-014, HAL-020, HAL-025, and HAL-029. Their remaining signing, clipboard, deep-link and promotion-integrity risks are described in the remediation notes.
The September 16 focused review checked the relevant source at API revision 7854ad71b4fbe1ec99c38f4139f8eb5c3e228819 and wallet revision 57a0da5746ab7f7474587a4f0c8e4687550ee8d1, with isolated checks using mocked external and native interfaces. It did not establish deployed configuration, device behavior, or private release-artifact equivalence, and was not a full assessment of all later changes. The WalletConnect permission fix was verified in commit 4e3b695934f53761b0db4b186415920acc48a13e. MakaPay's findings and remediation conclusions remain in its separate report.
Scope#
Findings Overview#
# | Title | Severity | Score | Status |
|---|---|---|---|---|
HAL-01 | No Authentication or Authorization on the API (Systemic IDOR Across All User-Scoped Endpoints) | Critical | 10.0 | Solved08/26/2026 |
HAL-02 | Blind Transaction and Message Signing in WalletConnect and the In-App dApp Browser | High | 8.1 | Partially Solved08/26/2026 |
HAL-03 | In-App dApp Browser Injects the Wallet Provider into Arbitrary Origins and Silently Discloses the User Address | High | 8.1 | Solved08/26/2026 |
HAL-04 | Unauthenticated Stored XSS in the Admin Panel via Custom-Token Metadata Leads to Admin Compromise | High | 7.8 | Solved08/26/2026 |
HAL-05 | Application-Layer Encryption Is Ineffective: AES Key Stored Alongside the Ciphertext and Not Bound to Auth or Hardware | Medium | 6.3 | Risk Accepted07/13/2026 |
HAL-06 | Seed Phrase and Private Keys Copied to the System Clipboard Without Auto-Clear or Sensitive Flags | Medium | 6.3 | Partially Solved08/26/2026 |
HAL-07 | No Screenshot / Screen-Recording / App-Switcher Protection on Secret-Display Screens | Medium | 6.3 | Risk Accepted07/06/2026 |
HAL-08 | No Brute-Force Protection on the App Passcode; Hardcoded 4-Digit PIN, No Weak-PIN Rejection | Medium | 6.3 | Solved08/26/2026 |
HAL-09 | App Lock and Sensitive-Action Auth Are Fully Bypassed When No Biometrics and No Passcode Are Configured; Onboarding Never Enforces Setup | Medium | 6.3 | Risk Accepted07/13/2026 |
HAL-10 | OTA JavaScript Updates Are Not Code-Signed (Malicious Update Leads to Full Wallet Compromise) | Medium | 6.3 | Future Release07/13/2026 |
HAL-11 | Database Connection Disables TLS Certificate Verification (rejectUnauthorized: false) | Medium | 6.3 | Solved08/26/2026 |
HAL-12 | Backend-Supplied rpc_url Interpolated Unescaped Into Injected WebView JavaScript (Script Injection) | Medium | 5.9 | Solved08/26/2026 |
HAL-13 | Bridge Flow Blindly Signs Transaction Calldata Returned by the Backend Gateway (No Clear-Signing, No Certificate Pinning) | Medium | 5.0 | Not Solved08/26/2026 |
HAL-14 | Token Swap Grants Unlimited (MaxUint256) Approval to a Backend-Supplied Address and Blindly Signs deBridge Calldata | Medium | 5.0 | Partially Solved08/26/2026 |
HAL-15 | Seed-Phrase Retrieval Is Not Authentication-Gated at the Storage Layer and Is Silently Decrypted for Referral Hashing | Medium | 5.0 | Not Solved08/26/2026 |
HAL-16 | keccak256 of the Raw Mnemonic Is Computed and Transmitted to the Backend (Seed-Derived Identifier Off-Device) | Medium | 5.0 | Risk Accepted07/13/2026 |
HAL-17 | Sensitive Wallet Data Persisted to Unencrypted AsyncStorage via redux-persist | Medium | 5.0 | Risk Accepted07/13/2026 |
HAL-18 | No TLS Certificate Pinning on Fund-Affecting Endpoints | Medium | 5.0 | Risk Accepted07/13/2026 |
HAL-19 | RPC Endpoints Are Backend-Controlled With No Allowlist or Validation | Medium | 5.0 | Risk Accepted07/13/2026 |
HAL-20 | No Clear-Signing: Confirmation Screens Show Only Truncated Recipient/Contract (Address-Poisoning Risk) | Medium | 5.0 | Partially Solved08/26/2026 |
HAL-21 | On-Chain Activity Reported to the Backend Keyed by the Seed-Derived Hash (Deanonymization) | Medium | 5.0 | Risk Accepted07/13/2026 |
HAL-22 | eth_accounts/eth_requestAccounts Auto-Return the Address Without User Consent (dApp Browser) | Medium | 5.0 | Solved08/26/2026 |
HAL-23 | WalletConnect/Browser Transactions Signed on the Active Chain Regardless of the Requested Chain | Medium | 5.0 | Solved08/26/2026 |
HAL-24 | Backend-Supplied explorer_url/rpc_url Flow Into the Provider-Injected In-App Browser | Medium | 5.0 | Solved08/26/2026 |
HAL-25 | makawallet:// Deep-Link Scheme Exposes the Provider-Injected Browser and Transaction Screens | Medium | 5.0 | Partially Solved08/26/2026 |
HAL-26 | Hardcoded Default Admin Password; Weak Admin Authentication | Medium | 5.0 | Not Solved08/26/2026 |
HAL-27 | Unauthenticated, Globally-Scoped Custom-Token Registration Leads to Token-List Poisoning | Medium | 5.0 | Solved08/26/2026 |
HAL-28 | GET /chains Exposes rpc_url/explorer_url Unauthenticated (Provider API-Key Exposure) | Medium | 5.0 | Risk Accepted07/09/2026 |
HAL-29 | Referral/Promo Integrity: Fabricable Qualifying Activity and Unauthenticated Invite/Credit | Medium | 5.0 | Partially Solved08/26/2026 |
HAL-30 | GET /referrals/lookup Leaks seed_hash, Defeating Its Use as a Private Identifier (Deanonymization) | Medium | 5.0 | Risk Accepted07/13/2026 |
HAL-31 | Activity Indexing Is Not Idempotent; Reorgs Leave Orphaned Activities, Causing Duplicate or Phantom Transactions | Medium | 5.0 | Solved08/26/2026 |
HAL-32 | Push-Notification Channel Abuse: Transaction-Event Leakage to Hijacked Devices and Symbol-Injection Phishing | Medium | 5.0 | Risk Accepted07/13/2026 |
HAL-33 | No TLS Pinning on API/Price Endpoints; Dev ngrok URL Embedded in the Bundle | Low | 4.2 | Risk Accepted07/13/2026 |
HAL-34 | Weak Passcode Hashing: Single Salted SHA-256 Over a Low-Entropy PIN | Low | 3.4 | Risk Accepted07/13/2026 |
HAL-35 | Secrets Encrypted With AES-CBC and No Authenticated Encryption (No Integrity/MAC) | Low | 3.4 | Risk Accepted07/13/2026 |
HAL-36 | Weak PBKDF2 Configuration: 2,500 to 10,000 Iterations Selected via PixelRatio, SHA-1 Default Hash | Low | 3.4 | Risk Accepted07/13/2026 |
HAL-37 | New Mnemonic Passed Through Navigation Params Instead of the In-Memory Transient Holder | Low | 3.4 | Risk Accepted07/13/2026 |
HAL-38 | Seed-Phrase Import Field Does Not Disable Autocorrect / Predictive Text / Spellcheck | Low | 3.4 | Risk Accepted07/13/2026 |
HAL-39 | Ineffective secureClear: Immutable JS Strings Cannot Be Wiped From Memory | Low | 3.4 | Risk Accepted07/13/2026 |
HAL-40 | Incomplete Deletion of Secret Material | Low | 3.4 | Risk Accepted07/13/2026 |
HAL-41 | Biometric Result Trusted as a Boolean; Authentication Not Cryptographically Bound to Key Release | Low | 3.4 | Risk Accepted07/13/2026 |
HAL-42 | passcode-verify Route Can Be Dismissed by Gesture Without Resolving the Pending Auth Promise | Low | 3.4 | Solved08/26/2026 |
HAL-43 | biometricsEnabled Redux Field Conflates 'Last Auth Succeeded' With 'Biometric Lock Enabled' (and Is Persisted) | Low | 3.4 | Risk Accepted07/13/2026 |
HAL-44 | removeSeed/removeAccount Clear Redux Only; SecureStore Secrets Remain | Low | 3.4 | Solved08/26/2026 |
HAL-45 | Solana Transfer Attribution Is Heuristic (Balance-Delta Pairing), Causing Inaccurate Counterparty or Direction | Low | 3.4 | Risk Accepted07/13/2026 |
HAL-46 | tracked_wallets Poisoning Forces Indexing of Arbitrary Addresses (Storage DoS) | Low | 3.4 | Solved08/26/2026 |
HAL-47 | notifyActivities Marks Activities Notified Before Confirming Delivery; Overlapping Runs Can Double-Send | Low | 3.4 | Risk Accepted07/13/2026 |
HAL-48 | Missing Security Hardening; Error-Message Disclosure; Enumeration; Permissive Dev CORS | Low | 3.1 | Risk Accepted07/13/2026 |
HAL-49 | Destructive Boot/State Reset Can Wipe SecureStore Secrets on a Redux/SecureStore Desync | Low | 2.5 | Risk Accepted07/13/2026 |
HAL-50 | Float-Based Amount Math in the Solana (and Legacy EVM) Signing Paths | Low | 2.1 | Risk Accepted07/13/2026 |
HAL-51 | SPL Transfers Use createTransferInstruction (Not transferChecked) With Backend-Supplied Decimals | Low | 2.1 | Solved08/26/2026 |
HAL-52 | Over-Broad WalletConnect Session Approval; Unverified dApp Metadata | Low | 2.1 | Solved09/08/2026 |
HAL-53 | Backend-Controlled Image/SVG URLs Are Fetched From Arbitrary Origins | Low | 2.1 | Solved08/26/2026 |
HAL-54 | Container Runs as Root; No Image Hardening | Low | 2.1 | Risk Accepted07/13/2026 |
HAL-55 | getPrivateKey() Legacy Fallback Can Return the Wrong Account's Key When Called Without an Address | Informational | 0.2 | Acknowledged07/13/2026 |
HAL-56 | Non-Constant-Time Passcode Comparison; Lockout Enforced Only in the UI | Informational | 0.2 | Solved08/26/2026 |
HAL-57 | Math.random-Based seedIds, Duplicate Branch, and Dead Code | Informational | 0.2 | Acknowledged07/13/2026 |
HAL-58 | Duplicate/Likely-Dead PasscodePad; priceSlice Not Registered; Minor Robustness Issues | Informational | 0.2 | Acknowledged07/13/2026 |
HAL-59 | Solana Fee Display Is a Hardcoded 5000 Lamports/Signature (Ignores ATA Rent) | Informational | 0.2 | Acknowledged07/13/2026 |
HAL-60 | Miscellaneous Transaction-Path Issues (Seed Decrypt Without Auth on Chain Switch, Prod Logs, Duplicate EVM Implementations) | Informational | 0.2 | Acknowledged07/13/2026 |
HAL-61 | Reinforcements & Minor (Seed Decrypt Without Auth for Account/Referral Derivation, priceSlice Crash, RemoteLogo) | Informational | 0.2 | Acknowledged07/13/2026 |
HAL-62 | No SQL Injection Found; Minor Backend Notes (Address Validation, Float Balances, Chain-Type Defaults) | Informational | 0.2 | Not Applicable07/13/2026 |
HAL-63 | Chain-Publisher Minor Notes (No Solana RPC Chain Check, Float value_usd, Worker-Pool, Logs) | Informational | 0.2 | Acknowledged07/13/2026 |
HAL-64 | Deployment/Dependency Confirmations & Minor (Alchemy Key in rpc_url, DB SSL in Prod, No Unique Constraint, CI Supply-Chain) | Informational | 0.2 | Acknowledged07/13/2026 |
HAL-65 | Private Key Passed Through a Redux Thunk Argument (Dead Path) | Informational | 0.1 | Acknowledged07/13/2026 |
HAL-66 | Prebuilt Native DIDComm Binary of Unverified Provenance, Committed Firebase Key & .claude Config, and Misc | Informational | 0.1 | Acknowledged07/13/2026 |
Disclaimer#
Halborn strongly recommends conducting a follow-up assessment of the project either within six months or immediately following any material changes to the codebase, whichever comes first. This approach is crucial for maintaining the project’s integrity and addressing potential vulnerabilities introduced by code modifications.
