Mynt and Zero
Program Overview
This bug bounty program includes in its scope actively used contracts as part of Sovryn’s Mynt and Zero smart contract systems and the accompanying frontend web application.
Zero is a decentralized borrowing protocol that enables users to lock BTC collateral in a “line of credit” and borrow a BTC-backed stablecoin called ZUSD at 0% interest, up to a minimum collateral ratio. ZUSD can then be deposited into a stability pool to provide liquidity for liquidations, or redeem ZUSD at face value for the underlying BTC collateral if the ZUSD peg drops too far below its expected value of 1 ZUSD = 1 USD. More information about Zero can be found here.
Mynt is a BTC-backed stablecoin aggregator. Users can deposit BTC-backed stablecoins such as DOC and ZUSD and receive a new stablecoin called the Sovryn Dollar (DLLR). At any time, the DLLR can be burned and redeemed for one of the underlying stablecoins. The purpose of aggregating BTC-backed stablecoins this way is to aggregate previously fragmented liquidity markets for the underlying stablecoins, and to create a new stablecoin that is more resilient and scalable than either of the individual underlying stablecoins. For more information about Mynt and the Sovryn Dollar, please visit https://wiki.sovryn.com/en/sovryn-dapp/sovryn-dollar
For Whitehats: It is highly recommended that you review the details of this program in full. Although many Bug Bounty programs have standard terms and conditions, each also has their own unique details that are critical to your success.
Prior to submitting a report please review the Immunefi Bug Report Template and Best Practices.
Rewards by Threat Level
Please review how rewards are distributed based on the Immunefi Vulnerability Severity Classification System V2.2. This is a simplified 5-level scale system with separate scales for Smart Contracts and Websites/Apps.
Rewards for critical smart contract bug reports will be further capped at 10% of direct funds at risk if the bug discovered is exploited. However, there is a minimum reward of USD 50 000.
In cases of repeatable attacks, only the first attack is considered unless the smart contract cannot be upgraded or paused. If the attack impacts a smart contract directly holding funds that cannot be upgraded or paused, the amount of funds at risk will be calculated with the first attack being at 100% of the funds that could be stolen and then a reduction of 25% from the amount of the first attack for every 300 blocks the attack needs for subsequent attacks from the first attack, rounded down. For avoidance of doubt, if a second attack would happen at 600 blocks and then a third at 900 blocks, the funds at risk would be counted at 50% and 25% from the first attack, respectively.
Payouts and Payout Requirements:
Payouts are handled by the Sovyrn team directly and are denominated in USD. However, payouts are done in RBTC and SOV. The payment is made up of 50% in RBTC and 50% in SOV in a 24 month vesting contract.
Sovyrn commits to honoring payouts according to the terms set out in this program at the time of report submission, and to treat this program as the agreement and source of truth concerning bug reports and responsible disclosures.
For the purposes of determining report validity, this is a Primacy of Impact program.
Learn more about report validity best practices here: Best Practice - Primacy of Impact vs Primacy of Rules.
KYC Requirements
Zero and Mynt does not have a Know Your Customer (KYC) requirement for bug bounty payouts.
Audit Discoveries and Known Issues
Bug reports covering previously-discovered bugs are not eligible for any reward through the bug bounty program. If a bug report covers a known issue, it may be rejected together with proof of the issue being known before escalation of the bug report via Immunefi.
Previous audits and known issues can be found at:
- https://github.com/DistributedCollective/sovryn-audits/blob/main/Smart%20Contract%20Audit_%20Zero.pdf
- https://github.com/trailofbits/publications/blob/master/reviews/LiquityProtocolandStabilityPoolFinalReport.pdf
- https://github.com/trailofbits/publications/blob/master/reviews/LiquityProxyContracts.pdf
- https://www.coinspect.com/liquity-audit/
- https://github.com/trailofbits/publications/blob/master/reviews/Liquity.pdf
- https://omniscia.io/sovryn-babelfish-protocol-v1/
- Issue with MocIntegration.sol when Fees are Introduced The function getDocFromDllrAndRedeemRBTC in MocIntegration.sol will always revert when fees are introduced for calling redeem (which is currently not the case) due to a require statement on line 86.
require( massetManager.redeemTo(address(doc), _dllrAmount, thisAddress) == _dllrAmount, "MocIntegration:: redeemed incorrect DoC amount" );
Once fees are introduced redeemTo would always return less than _dllrAmount.
-
Missing Bridge Check in tokensReceived The function tokensReceived in MassetManager.sol lacks a check to ensure that it is called from the bridge. If an external entity relies on this event, it could result in an error, unexpected behaviour, or token loss.
-
Two-Way Pointers Between Contracts Could Break Some contracts have two-way pointers that may break due to errors made by programmers or deployers. Ideally, modifying one contract should also modify the other. Examples of such contracts include MassetManager <-> DLLR, and MassetManager <-> BasketManagerV3.
-
mint Can be Called on MetaAssetToken While transfer, transferFrom, and transferWithPermit have recipient checks in place, mint does not. As a result, it can be called with the MetaAssetToken contract as a recipient.
-
Changing factor and bridge of a Basset Can Break Usage There is currently no check to ensure that there are no massets issued for a basset before changing its factor or bridge, which could potentially result in a bad ratio between masset and basset. I suggest a require statement be added to these functions.
-
Malicious Bridge Can Cause Griefing A malicious or compromised bridge for a specific basset could force a user to convert their massets into that basset using redeemByBridge in MassetManager, even if the user has no interest in the basset or does not trust the bridge or token. I recommend that a signature check be added to this function.
-
Lack of Owner Check in upgradeToV3 The call to upgradeToV3 is in a separate transaction from deployment or initialization, and could potentially be front-run. There is currently no owner check in place for this function.
Smart Contract
- Critical
- Level
- USD $50,000 to USD $1,000,000
- Payout
- High
- Level
- USD $22,140
- Payout
- Medium
- Level
- USD $8,800
- Payout
- Low
- Level
- USD $2,200
- Payout
Websites and Applications
- Critical
- Level
- USD $22,140
- Payout
- High
- Level
- USD $8,800
- Payout
- Medium
- Level
- USD $2,200
- Payout
Assets in scope
- TargetSmart Contract - Active pool https://explorer.rsk.co/address/0xf294ea272d6f8fedc08acf8e93ff50fe99e1f7e8?__ctab=CodeType
- Smart Contract - Active pool storageType
- Smart Contract - Base MathType
- Smart Contract - Borrower ops https://explorer.rsk.co/address/0x5b9db4b8bdef3e57323187a9ac2639c5dee5fd39?__ctab=CodeType
- Smart Contract - Borrower ops storageType
- Smart Contract - Check contractType
- Smart Contract - Coll surplus pool https://explorer.rsk.co/address/0x310ec7fe6e4943da773de8948255e37cc45e34bb?__ctab=CodeType
- Smart Contract - Surplus pool storageType
- Smart Contract - ConsoleType
- https://github.com/DistributedCollective/zero/blob/main/packages/contracts/contracts/DefaultPool.solTargetSmart Contract - Default pool https://explorer.rsk.co/address/0xcdba14ca707b99afb8ca93e178ad614db422a030?__ctab=CodeType
- Smart Contract - Default pool storageType
- Smart Contract - Fees distributor https://explorer.rsk.co/address/0x1261d5872d56e2ab61b3c68451d015b752105027?__ctab=generalType
- Smart Contract - Fees distributorType
- https://github.com/DistributedCollective/zero/blob/main/packages/contracts/contracts/HintHelpers.solTargetSmart Contract - Hint helpers https://explorer.rsk.co/address/0x1d7dac5a63a35540be9e031212ecf39584ae5595?__ctab=CodeType
- Smart Contract - Hint helpers storageType
- Smart Contract - Liquity baseType
- Smart Contract - Liquity base params https://explorer.rsk.co/address/0xf8b04a36c36d5dbd1a9fe7b74897c609d6a17aa2?__ctab=CodeType
- Smart Contract - Liquity mathType
- Smart Contract - Liquity safe mathType
- Smart Contract - Multi trove getter https://explorer.rsk.co/address/0xf265a169191348c02829b62650b025bdeaf00ae4?__ctab=CodeType
- Smart Contract - Multi trove getter storageType
- Smart Contract - Mynt libType
- Smart Contract - OwnableType
- TargetSmart Contract - Price feed https://explorer.rsk.co/address/0x6d1d9574d67e04cf35fa1d916f763eddae03b75d?__ctab=CodeType
- Smart Contract - Price feed storageType
- https://github.com/DistributedCollective/zero/blob/main/packages/contracts/contracts/Proxy/Proxy.solTargetSmart Contract - ProxyType
- Smart Contract - Rsk oracle https://explorer.rsk.co/address/0x46cfec2cd43fc514eb1bec2868027dedf15f1d08?__ctab=CodeType
- Smart Contract - Safe mathType
- Smart Contract - Sorted troves https://explorer.rsk.co/address/0xdeeb95480b94f9395514fe35caf692a1c788dfe9?__ctab=CodeType
- Smart Contract - Sorted troves storageType
- Smart Contract - Stability pool https://explorer.rsk.co/address/0xd46c0225d1331b46700d64ff8c906709d15c9202?__ctab=CodeType
- Smart Contract - Stability pool storageType
- Smart Contract - Trove manager https://explorer.rsk.co/address/0x82b09695ee4f214f3a0803683c4aaec332e4e0a3?__ctab=CodeType
- Smart Contract - Trove manager baseType
- Smart Contract - Trove manager redeem ops https://explorer.rsk.co/address/0xd3a497ec2de882daa13a04edfc792b3f42db47c0?__ctab=CodeType
- Smart Contract - Trove manager storageType
- Smart Contract - Upgradable proxy (ALL ZERO CONTRACTS HAS THIS PROXY LOGICS)Type
- TargetSmart Contract - Mynt admin proxy https://dashboard.tenderly.co/contract/rsk/0x466e023ddd08b53385b4763b883ab63820c123df/sourceType
- TargetSmart Contract - DLLR https://dashboard.tenderly.co/contract/rsk/0xc1411567d2670e24d9c4daaa7cda95686e1250aa/sourceType
- Smart Contract - Meta asset tokenType
- TargetSmart Contract - Masset manager https://dashboard.tenderly.co/contract/rsk/0x5f777270259e32f79589fe82269db6209f7b7582/sourceType
- Smart Contract - Fees vault https://dashboard.tenderly.co/contract/rsk/0xb424b283276bf63c35d98346632af1802e196d9b/sourceType
- TargetSmart Contract - Fees manager https://dashboard.tenderly.co/contract/rsk/0x36c6f1b5e9de57a59b41778a36f3dd9ed1851832/sourceType
- TargetSmart Contract - Basket manager https://dashboard.tenderly.co/contract/rsk/0x68510c9a93e8fff4b5d9e307bd415e1dc3b7759a/sourceType
- Smart Contract - MOC integration https://dashboard.tenderly.co/contract/rsk/0x9363323d9c653a2b89c758f62f5043f0b2c67c71/sourceType
- Primacy Of ImpactTargetSmart ContractType
- Websites and Applications - Main https://sovryn.appType
- Primacy Of ImpactTargetWebsites and ApplicationsType
Impacts only apply to assets in active use by the project like contracts on mainnet or web/app assets used in production. Any impact that applies to assets not in active use, like test or mock files, are out-of-scope of the bug bounty program unless explicitly mentioned as in-scope.
Smart Contracts
- Smart Contracts - PoC, Smart Contract bug reports are to include a runnable Proof of Concept (PoC) in order to prove impact.
- For more information on PoCs please visit: Proof of Concept (PoC) Guidelines and Rules
Web/App
- Web/App - Bug reports are to include a runnable Proof of Concept (PoC) in order to prove impact.
- All web/app bug reports must come with a PoC with an end-effect impacting an asset-in-scope in order to be considered for a reward. All PoC content must adhere to the PoC guidelines and rules of Immunefi. In the event that a PoC requires an attack on a web/app asset provided, they must still adhere to the rules provided, otherwise eligibility for a reward may be revoked.
- For more information on PoCs please visit: Proof of Concept (PoC) Guidelines and Rules
Whitehats are highly encouraged to review any potential subdomains and what specific port(s) are in scope. Even though the domain may be the same, different ports may point to different assets.
Dev Environment and Documentation
Zero and Mynt has included dev documentation and/or instructions to help in reviewing code and exploring for bugs:
- https://github.com/DistributedCollective/zero (extensive README)
Impacts to other assets
Hackers are encouraged to submit issues outside of the outlined Impacts and Assets in Scope.
If whitehats can demonstrate a critical impact on code in production for an asset not in scope, Zero and Mynt encourages you to submit your bug report using the “primacy of impact exception” asset.
Impacts in Scope
(For Blockchain/DLT and Smart Contracts Only) This program is considered to be governed by Primacy of Impact. For more information on what this means visit: Best Practice - Primacy of Impact vs Primacy of Rules.
Impacts are based on the Immunefi Vulnerability Severity Classification System V2.2.
At Immunefi, we classify bugs on a simplified 5-level scale:
- Critical
- High
- Medium
- Low
- None
Impacts in scope
Only the following impacts are accepted within this bug bounty program. All other impacts are not considered as in-scope, even if they affect something in the assets in scope table.
Smart Contract
- Direct theft of any user funds, whether at-rest or in-motion, other than unclaimed yieldCriticalImpact
- Permanent freezing of fundsCriticalImpact
- Protocol insolvencyCriticalImpact
- Theft of unclaimed yieldHighImpact
- Permanent freezing of unclaimed yieldHighImpact
- Temporary freezing of funds: >2 blocksHighImpact
- Block stuffing for profitMediumImpact
- Griefing (e.g. no profit motive for an attacker, but damage to the users or the protocol)MediumImpact
- Theft of gasMediumImpact
- Unbounded gas consumption in state changing functionsMediumImpact
- Contract fails to deliver promised returns, but doesn't lose valueLowImpact
Websites and Applications
- Execute arbitrary system commands resulting in financial lossCriticalImpact
- Retrieve sensitive data/files from a running server resulting in financial loss, such as: /etc/shadow, database passwords, blockchain keys (this does not include non-sensitive environment variables, open source code, or usernames)CriticalImpact
- Taking state-modifying authenticated actions (with or without blockchain state interaction) on behalf of other users without any interaction by that user, such as: Voting, Making trades, Withdrawals, etc.CriticalImpact
- Subdomain takeover with already-connected wallet interaction resulting in financial lossCriticalImpact
- Direct theft of user fundsCriticalImpact
- Malicious interactions with an already-connected wallet such as: Modifying transaction arguments or parameters, Substituting contract addresses, Submitting malicious transactionsCriticalImpact
- Injecting/modifying the static content on the target application without Javascript (Persistent) such as: HTML injection without Javascript, Replacing existing text with arbitrary text, Arbitrary file uploads, etc.HighImpact
- Taking down the application/websiteHighImpact
- Changing non-sensitive details of other users (including modifying browser local storage) without already-connected wallet interaction and with up to one click of user interaction, such as: Changing the name of user, Enabling/disabling notificationsMediumImpact
- Injecting/modifying the static content on the target application without Javascript (Reflected) such as: Reflected HTML injection, Loading external site dataMediumImpact
- Redirecting users to malicious websites (Open Redirect)MediumImpact
- Subdomain takeover without already-connected wallet interactionMediumImpact
- Improperly disclosing confidential user information such as: Email address, Phone number, Physical address, etc.MediumImpact
Out of Scope & Rules
The following impacts and attack vectors are excluded from rewards by default for all Immunefi bug bounty programs:
- Attacks that the reporter has already exploited themselves, leading to damage
- Attacks requiring access to leaked keys/credentials
- Attacks requiring access to privileged addresses (governance, strategist), except in such cases where the contracts are intended to have no privileged access to functions that make the attack possible
- Broken link hijacking is out of scope
Smart Contracts and Blockchain/DLT
- Basic economic governance attacks (e.g. 51% attack)
- Lack of liquidity
- Best practice critiques
- Sybil attacks
- Centralization risks
Websites and Apps
- Theoretical impacts without any proof or demonstration
- Content spoofing / Text injection issues
- Self-XSS
- Captcha bypass using OCR
- CSRF with no security impact (logout CSRF, change language, etc.)
- Missing HTTP Security Headers (such as X-FRAME-OPTIONS) or cookie security flags (such as “httponly”)
- Server-side information disclosure such as IPs, server names, and most stack traces
- Vulnerabilities used to enumerate or confirm the existence of users or tenants
- Vulnerabilities requiring unlikely user actions
- URL Redirects (unless combined with another vulnerability to produce a more severe vulnerability)
- Lack of SSL/TLS best practices
- Attacks involving DDoS
- Attacks requiring privileged access from within the organization
- SPF records for email domains
- Feature requests
- Best practices
Prohibited Activities
The following activities are prohibited by this bug bounty program. Violation of these rules can result in a temporary suspension or permanent ban from the Immunefi platform at the sole discretion of the Immunefi team, which may also result in: 1) the forfeiture and loss of access to all bug submissions, and 2) zero payout.
Please note that Immunefi has no tolerance for spam/low-quality/incomplete bug reports, “beg bounty” behavior, and misrepresentation of assets and severity. Immunefi exists to protect the global crypto community, not facilitate grift.
Prohibited:
- Any testing with mainnet or public testnet deployed code; all testing should be done on private testnets
- Attempting phishing or other social engineering attacks against our employees and/or customers
- Any testing with third party systems and applications (e.g. browser extensions) as well as websites (e.g. SSO providers, advertising networks)
- Any denial of service attacks
- Automated testing of services that generates significant amounts of traffic
- Public disclosure of an unpatched vulnerability in an embargoed bounty
- Any other actions prohibited by the Immunefi Rules. These rules are subject to change at any time.