{"data":{"skill":{"slug":"soulboardfun-soulboard","name":"soulboard","icon":"📦","repo":"https://github.com/soulboardfun/soulboard/tree/c04b510b649a3bbb8d538788d7a434614ab38315/skills/soulboard","status":"approved","author":"soulboardfun","authorVersion":"1.0.0","skillstoreRevision":1},"audit":{"id":"574d772b-fff4-4b69-9dc4-a9d9d7821c32","skill_id":"0f59f202-764b-41d8-8369-499666961152","version":1,"content_hash":"v3:01849f636f1410e4fc9287f62c7c9cd1700c583e:01d050c83bce30bcb2a127ec98541f38fe059e9b8eaf7163583caccf3531aaf0:9fe90d74eae569f64ca2c200118a201e1035defad51276791ee1ea5a667b0a30:736b696c6c732f736f756c626f61726466756e2f736f756c626f617264:4ee9f7539e1c22153499d5044558fd0f","risk_level":"high","is_blocked":false,"safe_to_publish":false,"analysis_status":"ok","agent_auto_install_policy":"confirmation_required","manual_install_policy":"allowed","summary":"Most static findings are formatting matches, documented API traffic, or protective guidance; no evidence of credential theft or prompt injection was found. The documented plaintext backend permits response tampering, although both scripts default to HTTPS. The CLI trusts backend transaction payloads without action validation and omits decoded transaction details, with an option to skip confirmation.","remediation":[{"issue":"SKILL.md recommends a plaintext HTTP backend that differs from both scripts.","severity":"medium","suggestion":"Document the HTTPS endpoint consistently and reject non-HTTPS remote backends and transport downgrades in both clients."},{"issue":"Backend-supplied transaction targets, calldata, and values are not checked against the requested mint or launch.","severity":"high","suggestion":"Validate chain, target contracts, function selectors, decoded parameters, approval spenders, and spending limits before preview or execution."},{"issue":"CLI confirmation omits parsedTx and the --yes option bypasses explicit per-transaction approval.","severity":"high","suggestion":"Display decoded transaction details and risks, require explicit confirmation for each signature, and remove unrestricted confirmation bypass."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"scripts/soulboard","line_end":45,"line_start":45},{"file":"scripts/soulboard","line_end":4,"line_start":4},{"file":"scripts/soulboard","line_end":6,"line_start":6},{"file":"scripts/soulboard","line_end":24,"line_start":24},{"file":"scripts/soulboard","line_end":243,"line_start":243},{"file":"scripts/soulboard","line_end":263,"line_start":263},{"file":"scripts/soulboard_mcp.py","line_end":5,"line_start":5},{"file":"scripts/soulboard_mcp.py","line_end":6,"line_start":6},{"file":"scripts/soulboard_mcp.py","line_end":74,"line_start":74},{"file":"SKILL.md","line_end":13,"line_start":13},{"file":"SKILL.md","line_end":15,"line_start":15},{"file":"SKILL.md","line_end":17,"line_start":17},{"file":"SKILL.md","line_end":20,"line_start":20},{"file":"SKILL.md","line_end":25,"line_start":25},{"file":"SKILL.md","line_end":31,"line_start":31},{"file":"SKILL.md","line_end":32,"line_start":32},{"file":"SKILL.md","line_end":33,"line_start":33},{"file":"SKILL.md","line_end":35,"line_start":35},{"file":"SKILL.md","line_end":37,"line_start":37},{"file":"SKILL.md","line_end":38,"line_start":38},{"file":"SKILL.md","line_end":39,"line_start":39},{"file":"SKILL.md","line_end":40,"line_start":40},{"file":"SKILL.md","line_end":43,"line_start":43},{"file":"SKILL.md","line_end":47,"line_start":45},{"file":"SKILL.md","line_end":48,"line_start":47},{"file":"SKILL.md","line_end":49,"line_start":48},{"file":"SKILL.md","line_end":50,"line_start":49},{"file":"SKILL.md","line_end":50,"line_start":50},{"file":"SKILL.md","line_end":52,"line_start":51},{"file":"SKILL.md","line_end":56,"line_start":52},{"file":"SKILL.md","line_end":57,"line_start":56},{"file":"SKILL.md","line_end":60,"line_start":57},{"file":"SKILL.md","line_end":61,"line_start":60},{"file":"SKILL.md","line_end":64,"line_start":61},{"file":"SKILL.md","line_end":65,"line_start":64},{"file":"SKILL.md","line_end":65,"line_start":65},{"file":"SKILL.md","line_end":74,"line_start":72},{"file":"SKILL.md","line_end":75,"line_start":74},{"file":"SKILL.md","line_end":76,"line_start":75},{"file":"SKILL.md","line_end":77,"line_start":76},{"file":"SKILL.md","line_end":80,"line_start":77},{"file":"SKILL.md","line_end":82,"line_start":80},{"file":"SKILL.md","line_end":84,"line_start":82},{"file":"SKILL.md","line_end":85,"line_start":84},{"file":"SKILL.md","line_end":85,"line_start":85},{"file":"SKILL.md","line_end":86,"line_start":86},{"file":"SKILL.md","line_end":90,"line_start":90},{"file":"SKILL.md","line_end":94,"line_start":93},{"file":"SKILL.md","line_end":94,"line_start":94}]},{"factor":"network","evidence":[{"file":"scripts/soulboard","line_end":35,"line_start":35},{"file":"scripts/soulboard","line_end":67,"line_start":67},{"file":"scripts/soulboard","line_end":71,"line_start":71},{"file":"scripts/soulboard","line_end":101,"line_start":101},{"file":"scripts/soulboard","line_end":104,"line_start":104},{"file":"scripts/soulboard","line_end":22,"line_start":22},{"file":"scripts/soulboard","line_end":38,"line_start":38},{"file":"scripts/soulboard_mcp.py","line_end":14,"line_start":14},{"file":"scripts/soulboard_mcp.py","line_end":23,"line_start":23},{"file":"scripts/soulboard_mcp.py","line_end":24,"line_start":24},{"file":"scripts/soulboard_mcp.py","line_end":28,"line_start":28},{"file":"scripts/soulboard_mcp.py","line_end":32,"line_start":32},{"file":"scripts/soulboard_mcp.py","line_end":8,"line_start":8},{"file":"scripts/soulboard_mcp.py","line_end":18,"line_start":18},{"file":"SKILL.md","line_end":25,"line_start":25},{"file":"SKILL.md","line_end":57,"line_start":57},{"file":"SKILL.md","line_end":25,"line_start":25}]},{"factor":"env_access","evidence":[{"file":"scripts/soulboard_mcp.py","line_end":18,"line_start":18}]}],"critical_findings":[],"high_findings":[{"title":"Backend Transactions Can Execute Without Meaningful Action Verification","locations":[{"file":"scripts/soulboard","line_end":126,"line_start":112},{"file":"scripts/soulboard","line_end":149,"line_start":148},{"file":"scripts/soulboard","line_end":186,"line_start":184},{"file":"scripts/soulboard","line_end":212,"line_start":208},{"file":"SKILL.md","line_end":94,"line_start":94}],"confidence":0.98,"description":"Mint and launch responses supply transaction targets, calldata, and values without local checks against the requested action. Confirmation shows value and risks, omits parsedTx and target details, and can be skipped with --yes. A compromised backend could substitute a transfer or approval and obtain wallet execution without meaningful review.","review_kind":"security","source_category":"semantic","source_severity":"high","confidence_reasoning":"The CLI directly forwards backend transaction fields and never displays parsedTx, despite the documented requirement. The --yes flag demonstrably bypasses the confirmation branch; exploitation requires a substituted backend response."}],"medium_findings":[{"title":"Hardcoded URL","locations":[{"file":"SKILL.md","line_end":25,"line_start":25}],"confidence":0.99,"description":"Set `SOULBOARD_BACKEND` (default `http://5.223.72.216:8248`). All on-chain state and action-preparat","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The documented backend uses plaintext HTTP for action preparation. A network attacker could alter transaction targets, calldata, or values before wallet signing."},{"title":"Hardcoded IP address","locations":[{"file":"SKILL.md","line_end":25,"line_start":25}],"confidence":0.99,"description":"Set `SOULBOARD_BACKEND` (default `http://5.223.72.216:8248`). All on-chain state and action-preparat","review_kind":"capability","source_category":"network","source_severity":"medium","confidence_reasoning":"The hardcoded IP is advertised as a plaintext HTTP backend for transaction preparation. This lacks authenticated transport and differs from the scripts' HTTPS defaults."}],"low_findings":[],"dangerous_patterns":[],"files_scanned":3,"total_lines":488,"audit_model":"codex","audited_at":"2026-10-29T14:53:57.954+00:00","created_at":"2026-10-29T15:26:58.289565+00:00","static_findings":[{"id":"external_commands:scripts/soulboard:45:python-subprocess-run","file":"scripts/soulboard","pattern":"Python subprocess.run","snippet":"p = subprocess.run(cmd, capture_output=True, text=True)","category":"external_commands","line_end":45,"severity":"high","line_start":45},{"id":"external_commands:scripts/soulboard:4:ruby-shell-backtick-execution","file":"scripts/soulboard","pattern":"Ruby/shell backtick execution","snippet":"Only needs: python3 (stdlib) + the `baw` CLI (Binance agentic wallet) signed in.","category":"external_commands","line_end":4,"severity":"medium","line_start":4},{"id":"external_commands:scripts/soulboard:6:ruby-shell-backtick-execution","file":"scripts/soulboard","pattern":"Ruby/shell backtick execution","snippet":"that and signs a one-time voucher; your agentic wallet signs the actual on-chain call via `baw`.","category":"external_commands","line_end":6,"severity":"medium","line_start":6},{"id":"external_commands:scripts/soulboard:24:ruby-shell-backtick-execution","file":"scripts/soulboard","pattern":"Ruby/shell backtick execution","snippet":"--wallet ADDR   override the agentic wallet address (default: from `baw wallet address`)","category":"external_commands","line_end":24,"severity":"medium","line_start":24},{"id":"external_commands:scripts/soulboard:243:ruby-shell-backtick-execution","file":"scripts/soulboard","pattern":"Ruby/shell backtick execution","snippet":"print(\"Could not read your agentic wallet. Run `baw auth signin` first (and `baw auth verify`).\")","category":"external_commands","line_end":243,"severity":"medium","line_start":243},{"id":"external_commands:scripts/soulboard:263:ruby-shell-backtick-execution","file":"scripts/soulboard","pattern":"Ruby/shell backtick execution","snippet":"print(\"Could not read your agentic wallet. Run `baw auth signin` first (and `baw auth verify`).\")","category":"external_commands","line_end":263,"severity":"medium","line_start":263},{"id":"network:scripts/soulboard:35:python-http-libraries","file":"scripts/soulboard","pattern":"Python HTTP libraries","snippet":"import urllib.request","category":"network","line_end":35,"severity":"low","line_start":35},{"id":"network:scripts/soulboard:67:python-http-libraries","file":"scripts/soulboard","pattern":"Python HTTP libraries","snippet":"req = urllib.request.Request(","category":"network","line_end":67,"severity":"low","line_start":67},{"id":"network:scripts/soulboard:71:python-http-libraries","file":"scripts/soulboard","pattern":"Python HTTP libraries","snippet":"return json.loads(urllib.request.urlopen(req, timeout=30).read())","category":"network","line_end":71,"severity":"low","line_start":71},{"id":"network:scripts/soulboard:101:python-http-libraries","file":"scripts/soulboard","pattern":"Python HTTP libraries","snippet":"req = urllib.request.Request(backend + \"/pin\", data=body,","category":"network","line_end":101,"severity":"low","line_start":101},{"id":"network:scripts/soulboard:104:python-http-libraries","file":"scripts/soulboard","pattern":"Python HTTP libraries","snippet":"return json.loads(urllib.request.urlopen(req, timeout=120).read())","category":"network","line_end":104,"severity":"low","line_start":104},{"id":"network:scripts/soulboard:22:hardcoded-url","file":"scripts/soulboard","pattern":"Hardcoded URL","snippet":"--backend URL   SoulBoard backend (default https://soulboard.fun)","category":"network","line_end":22,"severity":"low","line_start":22},{"id":"network:scripts/soulboard:38:hardcoded-url","file":"scripts/soulboard","pattern":"Hardcoded URL","snippet":"DEFAULT_BACKEND = \"https://soulboard.fun\"","category":"network","line_end":38,"severity":"low","line_start":38},{"id":"blocker:scripts/soulboard:25:system-reconnaissance","file":"scripts/soulboard","pattern":"System reconnaissance","snippet":"--value  WEI    native value to send on mint (default 0 = free first mint; set price for paid mints)","category":"blocker","line_end":25,"severity":"low","line_start":25},{"id":"blocker:scripts/soulboard:36:system-reconnaissance","file":"scripts/soulboard","pattern":"System reconnaissance","snippet":"import uuid","category":"blocker","line_end":38,"severity":"low","line_start":36},{"id":"external_commands:scripts/soulboard_mcp.py:5:ruby-shell-backtick-execution","file":"scripts/soulboard_mcp.py","pattern":"Ruby/shell backtick execution","snippet":"they return a `sign_this` {to, data, value} (plus any approve steps) that the host then signs with","category":"external_commands","line_end":5,"severity":"medium","line_start":5},{"id":"external_commands:scripts/soulboard_mcp.py:6:ruby-shell-backtick-execution","file":"scripts/soulboard_mcp.py","pattern":"Ruby/shell backtick execution","snippet":"the user's own agentic wallet via `baw contract-call` — this server never holds keys or signs.","category":"external_commands","line_end":6,"severity":"medium","line_start":6},{"id":"external_commands:scripts/soulboard_mcp.py:74:ruby-shell-backtick-execution","file":"scripts/soulboard_mcp.py","pattern":"Ruby/shell backtick execution","snippet":"\"\"\"Prepare listing `amount` of `asset` for sale at `price_wei`. Returns approve + list steps.\"\"\"","category":"external_commands","line_end":74,"severity":"medium","line_start":74},{"id":"network:scripts/soulboard_mcp.py:14:python-http-libraries","file":"scripts/soulboard_mcp.py","pattern":"Python HTTP libraries","snippet":"import urllib.request","category":"network","line_end":14,"severity":"low","line_start":14},{"id":"network:scripts/soulboard_mcp.py:23:python-http-libraries","file":"scripts/soulboard_mcp.py","pattern":"Python HTTP libraries","snippet":"req = urllib.request.Request(BACKEND + path, headers={\"user-agent\": \"SoulBoard-Skill/1.0\"})","category":"network","line_end":23,"severity":"low","line_start":23},{"id":"network:scripts/soulboard_mcp.py:24:python-http-libraries","file":"scripts/soulboard_mcp.py","pattern":"Python HTTP libraries","snippet":"return json.loads(urllib.request.urlopen(req, timeout=30).read())","category":"network","line_end":24,"severity":"low","line_start":24},{"id":"network:scripts/soulboard_mcp.py:28:python-http-libraries","file":"scripts/soulboard_mcp.py","pattern":"Python HTTP libraries","snippet":"req = urllib.request.Request(","category":"network","line_end":28,"severity":"low","line_start":28},{"id":"network:scripts/soulboard_mcp.py:32:python-http-libraries","file":"scripts/soulboard_mcp.py","pattern":"Python HTTP libraries","snippet":"return json.loads(urllib.request.urlopen(req, timeout=30).read())","category":"network","line_end":32,"severity":"low","line_start":32},{"id":"network:scripts/soulboard_mcp.py:8:hardcoded-url","file":"scripts/soulboard_mcp.py","pattern":"Hardcoded URL","snippet":"Run:  SOULBOARD_BACKEND=https://soulboard.fun  python3 soulboard_mcp.py","category":"network","line_end":8,"severity":"low","line_start":8},{"id":"network:scripts/soulboard_mcp.py:18:hardcoded-url","file":"scripts/soulboard_mcp.py","pattern":"Hardcoded URL","snippet":"BACKEND = os.environ.get(\"SOULBOARD_BACKEND\", \"https://soulboard.fun\").rstrip(\"/\")","category":"network","line_end":18,"severity":"low","line_start":18},{"id":"env_access:scripts/soulboard_mcp.py:18:python-environment-access","file":"scripts/soulboard_mcp.py","pattern":"Python environment access","snippet":"BACKEND = os.environ.get(\"SOULBOARD_BACKEND\", \"https://soulboard.fun\").rstrip(\"/\")","category":"env_access","line_end":18,"severity":"low","line_start":18},{"id":"external_commands:SKILL.md:13:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"SoulBoard is an **agent-gated launchpad** on Robinhood Chain (chainId 4663). Only **verified AI agen","category":"external_commands","line_end":13,"severity":"medium","line_start":13},{"id":"external_commands:SKILL.md:15:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"This skill is **non-custodial**: it only *prepares* actions via the SoulBoard backend and *relays* t","category":"external_commands","line_end":15,"severity":"medium","line_start":15},{"id":"external_commands:SKILL.md:17:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Live contracts (Robinhood Chain 4663):** $BOARD `0x9518a406109d6072a76aC7aB8816cF267ad291c3` · Lau","category":"external_commands","line_end":17,"severity":"medium","line_start":17},{"id":"external_commands:SKILL.md:20:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"1. The **`binance-agentic-wallet`** skill is installed and the user is signed in (`baw wallet status","category":"external_commands","line_end":20,"severity":"medium","line_start":20},{"id":"external_commands:SKILL.md:25:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Set `SOULBOARD_BACKEND` (default `http://5.223.72.216:8248`). All on-chain state and action-preparat","category":"external_commands","line_end":25,"severity":"medium","line_start":25},{"id":"external_commands:SKILL.md:31:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| \"what's live / show the board\" | `GET {backend}/api/board` → list tokens (symbol, name, progress, ","category":"external_commands","line_end":31,"severity":"medium","line_start":31},{"id":"external_commands:SKILL.md:32:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| \"details of <ca>\" | `GET {backend}/api/token/<ca>` (+ `/holders`, `/orderbook`, `/activity`). |","category":"external_commands","line_end":32,"severity":"medium","line_start":32},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| \"am I eligible?\" | `POST {backend}/prepare/mint {asset:<any live ca>, wallet}` — a `no Agent-ID` e","category":"external_commands","line_end":33,"severity":"medium","line_start":33},{"id":"external_commands:SKILL.md:35:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| \"launch a fair-mint token ...\" | `POST {backend}/prepare/launch {...}` → returns approve + launch ","category":"external_commands","line_end":35,"severity":"medium","line_start":35},{"id":"external_commands:SKILL.md:37:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| \"buy listing <id> on <ca>\" | `POST {backend}/prepare/buy {wallet, listingId}` → sign. |","category":"external_commands","line_end":37,"severity":"medium","line_start":37},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| \"sell <amount> of <ca> at <price>\" | `POST {backend}/prepare/sell {wallet, asset, amount, priceWei","category":"external_commands","line_end":38,"severity":"medium","line_start":38},{"id":"external_commands:SKILL.md:39:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| \"cancel listing <id>\" | `POST {backend}/prepare/cancel {listingId}` → sign (no voucher). |","category":"external_commands","line_end":39,"severity":"medium","line_start":39},{"id":"external_commands:SKILL.md:40:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| \"fund / withdraw RH ETH\" | `POST {backend}/prepare/transfer {to, value_wei}` → native send; sign. ","category":"external_commands","line_end":40,"severity":"medium","line_start":40},{"id":"external_commands:SKILL.md:43:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"1. Get the user's wallet address: `baw wallet address --json` (use the EVM address — same for chain ","category":"external_commands","line_end":43,"severity":"medium","line_start":43},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":47,"severity":"medium","line_start":45},{"id":"external_commands:SKILL.md:47:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":48,"severity":"medium","line_start":47},{"id":"external_commands:SKILL.md:48:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"The response is `{ \"ok\": true, \"sign_this\": { \"to\", \"data\", \"value\" }, \"voucher\": {...} }`.","category":"external_commands","line_end":49,"severity":"medium","line_start":48},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"If it returns `{ \"error\": \"no Agent-ID ...\" }`, stop and tell the user to claim an Agent-ID.","category":"external_commands","line_end":50,"severity":"medium","line_start":49},{"id":"external_commands:SKILL.md:50:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"For `launch`/`sell` the response has `steps: [ {to,data,value}, ... ]` — do each step in order (the ","category":"external_commands","line_end":50,"severity":"medium","line_start":50},{"id":"external_commands:SKILL.md:51:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"3. Sign + send each `sign_this`/step with the agentic wallet via the binance skill:","category":"external_commands","line_end":52,"severity":"medium","line_start":51},{"id":"external_commands:SKILL.md:52:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":56,"severity":"medium","line_start":52},{"id":"external_commands:SKILL.md:56:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":57,"severity":"medium","line_start":56},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"4. Report the transaction hash and confirm on the explorer (`https://robinhoodchain.blockscout.com`)","category":"external_commands","line_end":60,"severity":"medium","line_start":57},{"id":"external_commands:SKILL.md:60:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"A convenience wrapper is bundled (`scripts/soulboard`) that does steps 1–4 for minting:","category":"external_commands","line_end":61,"severity":"medium","line_start":60},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":64,"severity":"medium","line_start":61},{"id":"external_commands:SKILL.md:64:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":65,"severity":"medium","line_start":64},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"It reads the wallet from `baw`, prepares the mint, previews, asks to confirm, and executes. Requires","category":"external_commands","line_end":65,"severity":"medium","line_start":65},{"id":"external_commands:SKILL.md:72:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2. Compute `listHash = keccak256( utf8( addresses.join(\",\") ) )` over that normalized list.","category":"external_commands","line_end":74,"severity":"medium","line_start":72},{"id":"external_commands:SKILL.md:74:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- domain: `{ \"name\": \"SoulBoardWhitelist\", \"version\": \"1\", \"chainId\": 4663 }`","category":"external_commands","line_end":75,"severity":"medium","line_start":74},{"id":"external_commands:SKILL.md:75:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- type: `Whitelist(address token, bytes32 listHash, uint256 deadline)`","category":"external_commands","line_end":76,"severity":"medium","line_start":75},{"id":"external_commands:SKILL.md:76:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- message: `{ \"token\": \"<ca>\", \"listHash\": \"<0x...>\", \"deadline\": <unix_now + 600> }`","category":"external_commands","line_end":77,"severity":"medium","line_start":76},{"id":"external_commands:SKILL.md:77:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":80,"severity":"medium","line_start":77},{"id":"external_commands:SKILL.md:80:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":82,"severity":"medium","line_start":80},{"id":"external_commands:SKILL.md:82:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":84,"severity":"medium","line_start":82},{"id":"external_commands:SKILL.md:84:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":85,"severity":"medium","line_start":84},{"id":"external_commands:SKILL.md:85:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"The backend recomputes `listHash`, recovers the signer, and requires it to equal the token's on-chai","category":"external_commands","line_end":85,"severity":"medium","line_start":85},{"id":"external_commands:SKILL.md:86:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Status: `GET {backend}/whitelist/get?ca=<ca>` → `{ count, restricted }`.","category":"external_commands","line_end":86,"severity":"medium","line_start":86},{"id":"external_commands:SKILL.md:90:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`scripts/soulboard_mcp.py` exposes the same actions as MCP tools (board, token, config, prepare_mint","category":"external_commands","line_end":90,"severity":"medium","line_start":90},{"id":"external_commands:SKILL.md:93:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Non-custodial.** Never ask for, log, or handle private keys or seed phrases. Signing happens onl","category":"external_commands","line_end":94,"severity":"medium","line_start":93},{"id":"external_commands:SKILL.md:94:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Always preview before executing.** Show the user `parsedTx` + `risks` from `contract-call previe","category":"external_commands","line_end":94,"severity":"medium","line_start":94},{"id":"network:SKILL.md:25:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"Set `SOULBOARD_BACKEND` (default `http://5.223.72.216:8248`). All on-chain state and action-preparat","category":"network","line_end":25,"severity":"low","line_start":25},{"id":"network:SKILL.md:57:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"4. Report the transaction hash and confirm on the explorer (`https://robinhoodchain.blockscout.com`)","category":"network","line_end":57,"severity":"low","line_start":57},{"id":"network:SKILL.md:25:hardcoded-ip-address","file":"SKILL.md","pattern":"Hardcoded IP address","snippet":"Set `SOULBOARD_BACKEND` (default `http://5.223.72.216:8248`). All on-chain state and action-preparat","category":"network","line_end":25,"severity":"medium","line_start":25},{"id":"sensitive:SKILL.md:93:crypto-seed-private-key-mention","file":"SKILL.md","pattern":"Crypto seed/private key mention","snippet":"- **Non-custodial.** Never ask for, log, or handle private keys or seed phrases. Signing happens onl","category":"sensitive","line_end":93,"severity":"high","line_start":93},{"id":"blocker:SKILL.md:43:network-reconnaissance","file":"SKILL.md","pattern":"Network reconnaissance","snippet":"1. Get the user's wallet address: `baw wallet address --json` (use the EVM address — same for chain ","category":"blocker","line_end":43,"severity":"low","line_start":43}],"finding_verdicts":[{"id":"external_commands:scripts/soulboard:45:python-subprocess-run","reason":"All callers pass argument lists to the expected baw CLI without invoking a shell. No shell injection is evident; transaction authorization weaknesses are reported separately.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:scripts/soulboard:4:ruby-shell-backtick-execution","reason":"Backticks surround the baw dependency name inside a Python docstring. They do not execute commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:scripts/soulboard:6:ruby-shell-backtick-execution","reason":"The Python docstring describes wallet signing and uses backticks as formatting. No executable backtick expression exists.","verdict":"false_positive","confidence":1},{"id":"external_commands:scripts/soulboard:24:ruby-shell-backtick-execution","reason":"The docstring documents wallet address lookup using inline formatting. Backticks in this string are not shell execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:scripts/soulboard:243:ruby-shell-backtick-execution","reason":"This print statement displays authentication guidance as a literal string. It does not run the displayed commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:scripts/soulboard:263:ruby-shell-backtick-execution","reason":"Backticks appear inside a printed authentication error message. The message is not evaluated or passed to a shell.","verdict":"false_positive","confidence":1},{"id":"network:scripts/soulboard:35:python-http-libraries","reason":"urllib.request supports the advertised preparation and metadata upload operations. The import itself does not access secrets or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"network:scripts/soulboard:67:python-http-libraries","reason":"This helper serializes requested mint and launch parameters for the configured backend. No hidden credential collection or unrelated destination is evident.","verdict":"false_positive","confidence":0.97},{"id":"network:scripts/soulboard:71:python-http-libraries","reason":"The request reads the expected backend JSON response with a timeout. The separate semantic finding addresses unsafe reliance on transaction payloads.","verdict":"false_positive","confidence":0.97},{"id":"network:scripts/soulboard:101:python-http-libraries","reason":"The /pin request uploads launch metadata and an explicitly selected logo file. This is declared functionality, not covert file collection.","verdict":"false_positive","confidence":0.97},{"id":"network:scripts/soulboard:104:python-http-libraries","reason":"The call retrieves the response to the selected metadata upload with a timeout. No secret harvesting or unrelated transmission is evident.","verdict":"false_positive","confidence":0.97},{"id":"network:scripts/soulboard:22:hardcoded-url","reason":"The URL appears in help text describing the expected HTTPS backend. It is not an unrelated collection endpoint.","verdict":"false_positive","confidence":0.99},{"id":"network:scripts/soulboard:38:hardcoded-url","reason":"This is the HTTPS default for the advertised SoulBoard service. No evidence found that this literal alone represents malicious networking.","verdict":"false_positive","confidence":0.98},{"id":"blocker:scripts/soulboard:25:system-reconnaissance","reason":"The text documents a mint payment amount in wei. It performs no system inspection or reconnaissance.","verdict":"false_positive","confidence":1},{"id":"blocker:scripts/soulboard:36:system-reconnaissance","reason":"uuid.uuid4 creates a random multipart boundary for metadata uploads. The file does not use UUID hardware-node discovery.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:scripts/soulboard_mcp.py:5:ruby-shell-backtick-execution","reason":"The sign_this identifier is formatted inside a Python docstring. Backticks have no execution semantics here.","verdict":"false_positive","confidence":1},{"id":"external_commands:scripts/soulboard_mcp.py:6:ruby-shell-backtick-execution","reason":"The docstring describes signing by the external wallet. The MCP server contains no subprocess or shell execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:scripts/soulboard_mcp.py:74:ruby-shell-backtick-execution","reason":"Backticks mark parameter names in the prepare_sell docstring. They are not executable shell syntax.","verdict":"false_positive","confidence":1},{"id":"network:scripts/soulboard_mcp.py:14:python-http-libraries","reason":"urllib.request provides the declared backend integration. The import alone performs no network request.","verdict":"false_positive","confidence":0.99},{"id":"network:scripts/soulboard_mcp.py:23:python-http-libraries","reason":"The GET helper requests board, token, or configuration data from the configured service. It attaches only a public user-agent header.","verdict":"false_positive","confidence":0.98},{"id":"network:scripts/soulboard_mcp.py:24:python-http-libraries","reason":"The helper reads requested service data as JSON with a timeout. No credential transmission or hidden secondary endpoint is evident.","verdict":"false_positive","confidence":0.98},{"id":"network:scripts/soulboard_mcp.py:28:python-http-libraries","reason":"The POST helper sends tool-supplied action parameters to the configured backend. The server prepares transactions but does not sign them.","verdict":"false_positive","confidence":0.97},{"id":"network:scripts/soulboard_mcp.py:32:python-http-libraries","reason":"This retrieves preparation results for the requested wallet action. No evidence found of secret extraction or an unrelated upload.","verdict":"false_positive","confidence":0.97},{"id":"network:scripts/soulboard_mcp.py:8:hardcoded-url","reason":"The docstring demonstrates configuring the advertised HTTPS service. It is ordinary startup documentation.","verdict":"false_positive","confidence":0.99},{"id":"network:scripts/soulboard_mcp.py:18:hardcoded-url","reason":"The literal supplies the expected HTTPS backend when no override is configured. It does not identify an unrelated recipient.","verdict":"false_positive","confidence":0.98},{"id":"env_access:scripts/soulboard_mcp.py:18:python-environment-access","reason":"Only SOULBOARD_BACKEND is read to select the service URL. The code does not enumerate environment variables or read wallet secrets.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:13:ruby-shell-backtick-execution","reason":"Markdown backticks format an Agent-ID contract address. They are not shell execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:15:ruby-shell-backtick-execution","reason":"Inline Markdown names the required wallet CLI and companion skill. It does not contain backtick command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:17:ruby-shell-backtick-execution","reason":"Backticks format contract addresses and the configuration route. These are documentation literals, not shell expressions.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:20:ruby-shell-backtick-execution","reason":"The prerequisite describes wallet status lookup and Developer Mode. No executable backtick substitution is present.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:25:ruby-shell-backtick-execution","reason":"Backticks format a configuration variable and URL, not shell execution. The insecure URL is adjudicated under its network findings.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:31:ruby-shell-backtick-execution","reason":"This Markdown table row documents a board API request. Backticks are inline formatting only.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:32:ruby-shell-backtick-execution","reason":"This row lists token information routes in Markdown. It does not execute a shell command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","reason":"Inline formatting describes an eligibility preparation request and refusal response. No command substitution exists.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:35:ruby-shell-backtick-execution","reason":"This documents the launch preparation route and wallet signing workflow. Markdown backticks themselves do not execute commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:37:ruby-shell-backtick-execution","reason":"The table row describes the advertised purchase API. Backticks mark an HTTP request rather than shell substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","reason":"The sale preparation route appears as inline Markdown. This is documented functionality, not executable backtick syntax.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:39:ruby-shell-backtick-execution","reason":"The row documents cancellation preparation. Backticks only delimit the HTTP request text.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:40:ruby-shell-backtick-execution","reason":"This documents a user-requested native transfer route. No shell interpolation or hidden transfer destination is shown.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:43:ruby-shell-backtick-execution","reason":"The documented wallet address command retrieves the user's public address for the requested workflow. Backticks are Markdown, not shell substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","reason":"The matched text opens a Markdown code fence around an HTTP request example. A code fence is not backtick execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:47:ruby-shell-backtick-execution","reason":"This closes the HTTP example's Markdown code fence. It is not an executable command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:48:ruby-shell-backtick-execution","reason":"Inline Markdown describes the response fields. The JSON illustration is not passed to a shell.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","reason":"The text documents an error response and instructs stopping on failed eligibility. Backticks only format that response.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:50:ruby-shell-backtick-execution","reason":"The text documents launch and sale transaction steps using inline formatting. Transaction validation concerns are reported separately, not as backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:51:ruby-shell-backtick-execution","reason":"This names response fields and introduces the wallet signing workflow. No shell backtick substitution is present.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:52:ruby-shell-backtick-execution","reason":"A Markdown code fence contains expected wallet preview and execution commands. The example explicitly requires showing risks and obtaining confirmation first.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:56:ruby-shell-backtick-execution","reason":"This is the closing fence for the wallet command example. It does not execute any command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","reason":"Inline Markdown formats the public transaction explorer URL. There is no executable backtick expression.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:60:ruby-shell-backtick-execution","reason":"The bundled CLI path is formatted as inline code. The path is not executed through backticks.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","reason":"The match is a Markdown fence opening two CLI usage examples. Neither line uses shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:64:ruby-shell-backtick-execution","reason":"This closes the CLI usage code fence. It is formatting, not shell execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","reason":"Backticks identify the wallet CLI in an explanatory sentence. They have no executable shell meaning.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:72:ruby-shell-backtick-execution","reason":"The text documents whitelist hashing over normalized addresses. Backticks delimit a formula, not a shell command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:74:ruby-shell-backtick-execution","reason":"Inline Markdown formats the EIP-712 signing domain. It is structured documentation, not command execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:75:ruby-shell-backtick-execution","reason":"Backticks format the whitelist typed-message definition. No executable shell expression is present.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:76:ruby-shell-backtick-execution","reason":"This is a typed-message example with token, hash, and deadline fields. Markdown formatting does not execute it.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:77:ruby-shell-backtick-execution","reason":"The code fence contains wallet preview and signing commands for a creator-authorized whitelist update. No shell backtick substitution appears.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:80:ruby-shell-backtick-execution","reason":"The line closes the whitelist signing example's Markdown fence. It does not execute commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:82:ruby-shell-backtick-execution","reason":"The code fence contains an HTTP whitelist submission example. It is not a shell substitution expression.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:84:ruby-shell-backtick-execution","reason":"This closes the whitelist request code fence. The matched backticks are formatting only.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:85:ruby-shell-backtick-execution","reason":"Inline Markdown names a hash and creator lookup while describing backend authorization. No shell execution is requested by these backticks.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:86:ruby-shell-backtick-execution","reason":"Backticks format a whitelist status route and response fields. They are not executable syntax.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:90:ruby-shell-backtick-execution","reason":"The text documents the bundled MCP server, its tools, and dependency installation. Its backticks are Markdown rather than command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:93:ruby-shell-backtick-execution","reason":"The wallet CLI name is formatted inline within protective key-handling guidance. The backticks do not execute anything.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:94:ruby-shell-backtick-execution","reason":"Inline formatting names preview fields and execution commands. The instruction requires explicit confirmation, not hidden command execution.","verdict":"false_positive","confidence":1},{"id":"network:SKILL.md:25:hardcoded-url","reason":"The documented backend uses plaintext HTTP for action preparation. A network attacker could alter transaction targets, calldata, or values before wallet signing.","verdict":"confirmed","severity":"medium","confidence":0.99},{"id":"network:SKILL.md:57:hardcoded-url","reason":"The HTTPS explorer is used to confirm public transaction hashes. No evidence found of credential transmission to this endpoint.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:25:hardcoded-ip-address","reason":"The hardcoded IP is advertised as a plaintext HTTP backend for transaction preparation. This lacks authenticated transport and differs from the scripts' HTTPS defaults.","verdict":"confirmed","confidence":0.99},{"id":"sensitive:SKILL.md:93:crypto-seed-private-key-mention","reason":"The instruction explicitly forbids requesting, logging, or handling private keys and seed phrases. It directs signing through the user's wallet instead.","verdict":"false_positive","confidence":1},{"id":"blocker:SKILL.md:43:network-reconnaissance","reason":"The command retrieves the user's public wallet address for the requested transaction. It does not scan hosts, ports, or networks.","verdict":"false_positive","confidence":0.99}],"semantic_findings":[{"title":"Backend Transactions Can Execute Without Meaningful Action Verification","severity":"high","locations":[{"file":"scripts/soulboard","line_end":126,"line_start":112},{"file":"scripts/soulboard","line_end":149,"line_start":148},{"file":"scripts/soulboard","line_end":186,"line_start":184},{"file":"scripts/soulboard","line_end":212,"line_start":208},{"file":"SKILL.md","line_end":94,"line_start":94}],"confidence":0.98,"description":"Mint and launch responses supply transaction targets, calldata, and values without local checks against the requested action. Confirmation shows value and risks, omits parsedTx and target details, and can be skipped with --yes. A compromised backend could substitute a transfer or approval and obtain wallet execution without meaningful review.","confidence_reasoning":"The CLI directly forwards backend transaction fields and never displays parsedTx, despite the documented requirement. The --yes flag demonstrably bypasses the confirmation branch; exploitation requires a substituted backend response."}],"subject_marketplace_commit_sha":"01849f636f1410e4fc9287f62c7c9cd1700c583e","subject_content_hash":"01d050c83bce30bcb2a127ec98541f38fe059e9b8eaf7163583caccf3531aaf0","subject_tree_hash":"9fe90d74eae569f64ca2c200118a201e1035defad51276791ee1ea5a667b0a30","subject_plugin_path":"skills/soulboardfun/soulboard","audit_payload_hash":"4ee9f7539e1c22153499d5044558fd0f","confirmed_risk_level":"high","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"01849f636f1410e4fc9287f62c7c9cd1700c583e","contentHash":"01d050c83bce30bcb2a127ec98541f38fe059e9b8eaf7163583caccf3531aaf0","treeHash":"9fe90d74eae569f64ca2c200118a201e1035defad51276791ee1ea5a667b0a30","pluginPath":"skills/soulboardfun/soulboard","auditPayloadHash":"4ee9f7539e1c22153499d5044558fd0f"},"scannerVersion":"3.0.0","policyVersion":"skillstore-security-audit-policy-v1"},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"issued","url":"/api/skills/soulboardfun-soulboard/audits/1/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"high","confirmedFindingCount":1,"capabilityReviewCount":2,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"confirmation_required","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}