5.4 KiB
5.4 KiB
MEV Bot Security Audit
Date: 2025-11-03
Auditor: Codex (GPT-5)
1. Scope & Methodology
- Reviewed on-chain contracts in
contracts/with emphasis onProductionArbitrageExecutor.soland Balancer flash-loan receivers. - Inspected Go runtime components under
pkg/security,pkg/arbitrum,pkg/transport, and CLI tooling incmd/. - Assessed operational scripts and configuration artifacts within
scripts/,config/, and documentation references. - Static analysis only; no live transactions executed.
2. Executive Summary
The repository still embeds production credentials (Chainstack RPC token and an Alchemy API key), contains placeholder authentication logic, and ships a non-compilable main arbitrage contract. These issues allow credential theft, brute-force attacks on wallet material, and prevent reliable deployment. Immediate remediation is required before any production use.
3. Critical Findings
C-01 Hardcoded RPC Credential
- Location:
pkg/arbitrum/connection.go:197,pkg/pools/discovery.go:594-597,pkg/market/manager.go:118-123,README.md:68-69 - Risk: Embedded Chainstack token grants public RPC access; attackers can hijack traffic or exhaust quotas. The client falls back to this token silently, so operators may unintentionally deploy with leaked credentials.
- Recommendation: Rotate the Chainstack token. Remove every hardcoded endpoint, require operators to supply credentials via secrets storage or environment variables, and add CI checks that block
chainstack.com/<token>strings.
C-02 Exposed Alchemy API Key
- Location:
scripts/check-wallet-balance.sh:8 - Risk: Public key can be abused for unlimited balance queries, risking rate-limit bans or service suspension.
- Recommendation: Treat the key as compromised, rotate it, and load RPC URLs from configuration rather than shipping them in scripts.
C-03 Placeholder Authentication With Static Passwords
- Location:
pkg/security/keymanager.go:1550-1567 - Risk: Any adversary can authenticate with
secure_admin_password_123ordefault_password, granting access to signing keys. - Recommendation: Remove the stub entirely. Integrate a real credential store (bcrypt/argon2 hashes, salted) and enforce MFA/whitelisting policies defined in config.
C-04 Weak Keystore Derivation
- Location:
pkg/security/keymanager.go:295-301 - Risk: Uses
keystore.LightScryptN/ LightScryptPwhich is labelled “testing only” in go-ethereum and reduces brute-force cost dramatically. - Recommendation: Restore
keystore.StandardScryptN/StandardScryptPfor production or migrate to Argon2id. Update tests/benchmarks accordingly.
C-05 Unsafe Legacy Flash-Loan Executor
- Location:
contracts/balancer/FlashLoanReceiver.sol:112-139 - Risk: Sets
amountOutMinimumto zero and leaves token approvals unlimited, enabling routers to drain assets if trusted routes are compromised. - Recommendation: Retire this contract or align it with the hardened
FlashLoanReceiverSecureimplementation (bounded slippage, allowance resets, SafeERC20).
C-06 Non-Compilable Production Arbitrage Contract
- Location:
contracts/ProductionArbitrageExecutor.sol:548-570 - Risk: Relies on
getRoleMemberwithout importingAccessControlEnumerable, so the supposedly “production-ready” contract cannot deploy. Documentation claiming the bytecode is live is inaccurate. - Recommendation: Either extend
AccessControlEnumerableor redesign withdrawals to avoid enumeration. Recompile and update docs/tests after the fix.
4. Medium Findings
M-01 Insecure Private-Key Handling in Scripts
- Location:
scripts/check-wallet-balance.sh:7,scripts/setup-keystore.sh:8 - Risk: Reads secrets from
/tmp/wallet_key.txt, a predictable world-readable path on many systems. - Recommendation: Require user-supplied secure paths or interactive input. Wipe temporary buffers after use.
M-02 Default Test Private Key Fallback
- Location:
scripts/deploy-pool-detector.sh:30-37 - Risk: Deployment scripts silently use a known Foundry test key, risking accidental mainnet deployment with a public private key.
- Recommendation: Fail fast if
PRIVATE_KEYis unset. Keep test keys in local-only templates.
5. Positive Observations
contracts/balancer/FlashLoanReceiverSecure.soladdresses the audit findings (slippage bounds, SafeERC20, non-reentrancy); prioritize this contract for deployment.internal/loggeremploys structured logging with secret scrubbing and level-based filtering, which will aid operational monitoring once credentials are externalized.
6. Recommendations & Next Steps
- Rotate all leaked RPC/API credentials immediately and scrub them from repository history.
- Replace the placeholder authentication/KDF logic with production-grade implementations and add regression tests.
- Migrate to
FlashLoanReceiverSecureand ensureProductionArbitrageExecutorcompiles; rerun Foundry and Go test suites post-changes. - Harden operational scripts to avoid writing secrets to predictable locations and to fail without explicit credentials.
- Introduce CI checks (e.g.,
ripgreprules) to block committed secrets, Chainstack/Alchemy tokens, or default passwords going forward.
7. Testing Performed
- Manual static review; no automated tests were executed in this pass. Re-run
go test ./..., Foundry unit/integration tests, and any existing CI workflows after remediation.