Skip to content

harden: deep-freeze PROGRAM_IDS, STAKE_PROGRAM_IDS, and STAKE_IX#189

Open
0x-SquidSol wants to merge 1 commit intodcccrypto:mainfrom
0x-SquidSol:harden/freeze-program-ids-and-tags
Open

harden: deep-freeze PROGRAM_IDS, STAKE_PROGRAM_IDS, and STAKE_IX#189
0x-SquidSol wants to merge 1 commit intodcccrypto:mainfrom
0x-SquidSol:harden/freeze-program-ids-and-tags

Conversation

@0x-SquidSol
Copy link
Copy Markdown
Contributor

Summary

  • as const is compile-time only — it does NOT prevent runtime mutation
  • Without Object.freeze, a supply-chain attack or prototype pollution could silently redirect program IDs:
    (PROGRAM_IDS as any).mainnet.percolator = "attacker-program";
  • This would redirect all user transactions to an attacker-controlled program
  • Fix: Deep-freeze PROGRAM_IDS (both nested network objects + top-level), STAKE_PROGRAM_IDS, and STAKE_IX
  • Follows the precedent of IX_TAG which was frozen in PR fix(abi): remove redundant IX_TAG mutations, freeze object #135
  • Zero code paths mutate these objects — all accesses are read-only

Objects frozen:

Object File Freeze Type Threat
PROGRAM_IDS program-ids.ts Deep (inner + outer) Program ID substitution
STAKE_PROGRAM_IDS stake.ts Shallow (flat strings) Staking redirect
STAKE_IX stake.ts Shallow (flat numbers) Instruction tag corruption

Test plan

  • No new test failures (729 passed, same 16 pre-existing)
  • Verified: no code path mutates these objects
  • Env var overrides (PROGRAM_ID, STAKE_PROGRAM_ID) still work — they return early before touching frozen objects

🤖 Generated with Claude Code

as const is compile-time only — it does NOT prevent runtime mutation.
Without Object.freeze, a supply-chain attack or prototype pollution
could silently redirect program IDs:

  (PROGRAM_IDS as any).mainnet.percolator = "attacker-program";

Deep-freezes PROGRAM_IDS (both nested network objects + top-level),
STAKE_PROGRAM_IDS, and STAKE_IX. Follows the precedent of IX_TAG
which was frozen in PR dcccrypto#135.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 13, 2026

Warning

Rate limit exceeded

@0x-SquidSol has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 17 minutes and 53 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 17 minutes and 53 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 282ae652-0311-494c-8bd1-bbd66a23f4a0

📥 Commits

Reviewing files that changed from the base of the PR and between 2f80d79 and 4df136a.

📒 Files selected for processing (2)
  • src/config/program-ids.ts
  • src/solana/stake.ts
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

0x-SquidSol added a commit to 0x-SquidSol/sdk-findings-fixes that referenced this pull request Apr 13, 2026
Exported config objects declared as mutable Records could be
mutated at runtime by compromised dependencies:
- PYTH_SOLANA_FEEDS: oracle feed poisoning (wrong mint-to-feed map)
- SLAB_TIERS_V1M/V1M2/V_ADL/V_SETDEXPOOL/V12_1: corrupt layout
  detection, wrong slab sizes for market creation

Deep-freezes each object and its inner entries after their
population loops complete. Follows the IX_TAG freeze precedent
(PR dcccrypto#135) and PROGRAM_IDS freeze (PR dcccrypto#189).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant