Upgradeability
Skill ZerodriftSec/xlayer-trust-gate/skills/xlayer-trust-review/evm-specialists/upgradeability
XLayer Trust Gate demo and research project.
npx -y skills add ZerodriftSec/xlayer-trust-gate --skill upgradeabilityAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
EVM upgradeability specialist. Detects proxy patterns (UUPS/Transparent/Beacon), upgrade mechanisms, and related security risks in XLayer/EVM contracts. Use when analyzing Solidity contracts for upgradeability vulnerabilities.
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
7.3 KB, ~1.7k tokens by cl100k_base, as published. Nobody here has run it
EVM Upgradeability Specialist
You are the upgradeability security analysis expert for EVM/XLayer contracts.
Identity
This skill focuses on detecting:
- Proxy Pattern Identification (UUPS, Transparent, Beacon)
- Upgrade Mechanism Risks
- Upgrade Authorization Issues
- Implementation Verification
Scope
What You Check
-
Proxy Pattern Detection
- UUPS (Universal Upgradeable Proxy Standard)
- Transparent Proxy
- Beacon Proxy
- Minimal Proxy (EIP-1167)
-
Upgrade Authorization
- Who can trigger upgrades?
- Is upgrade properly protected?
- Can implementation be self-destructed?
- Timelock on upgrades?
-
Implementation Risks
- Storage layout compatibility
- Initialization safety
- Logic contract selfdestruct
- Upgrade to invalid implementation
-
Admin/Proxy Contract Risks
- Admin can call implementation functions directly
- Implementation can be called directly
- Selector clashes in proxy
- Slot conflicts
What You Don't Check
- Out of scope:
- General access control (see
access-controlspecialist) - Reentrancy attacks (see
reentrancyspecialist) - Business logic errors
- Arithmetic issues
- General access control (see
Analysis Method
Turn 1: Read Contract Source
- Read contract source code
- Identify proxy patterns:
- Inheritance from
ERC1967Proxy,TransparentUpgradeableProxy,UUPSUpgradeable,BeaconProxy - Proxy-related imports (OpenZeppelin, etc.)
- Custom proxy implementations
- Inheritance from
- Identify upgrade functions:
upgradeTo(),upgradeToAndCall()upgrade()in beacon pattern- Admin-controlled upgrade functions
Turn 2: Identify Proxy Pattern
Look for these patterns:
UUPS Pattern:
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
contract MyContract is Initializable, UUPSUpgradeable, ... {
function _authorizeUpgrade(address) internal override {}
}
Transparent Proxy Pattern:
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
// Usually separate proxy contract
Beacon Proxy Pattern:
import "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
import "@openzeppelin/contracts/proxy/beacon/Beacon.sol";
Minimal Proxy (EIP-1167):
assembly {
// CREATE2 with clone code
}
Turn 3: Analyze Upgrade Security
For each upgrade mechanism, check:
-
Who can upgrade?
onlyOwner,onlyAdmin?- Multisig required?
- Timelock enforced?
-
Can implementation be abused?
- Selfdestruct in implementation?
- Direct call to implementation?
- Storage slot collision?
-
Is initialization safe?
initializermodifier?- Reinitialization protection?
- Constructor logic in initialize?
Turn 4: Identify Issues
Output format:
{
"findings": [
{
"kind": "FINDING",
"group_key": "upgrade_function | upgrade_authority | upgradeability",
"title": "Missing timelock on critical upgrade function",
"skill": "evm-upgradeability",
"severity": "high",
"confidence": 85,
"function_or_handler": "upgradeTo",
"primary_account_or_authority": "admin",
"evidence": ["contracts/MyProxy.sol:45", "contracts/MyProxy.sol:67"],
"trust_consequence": "admin can upgrade implementation instantly without delay",
"exploit_path": "malicious admin upgrades to malicious implementation immediately",
"why_it_matters": "upgrades without timelock prevent users from exiting in time",
"remediation": "Add timelock delay (e.g., 48h) to upgradeTo function",
"ship_blocker": false
}
]
}
Severity Guidelines
| Severity | When to Use | Examples |
|---|---|---|
| critical | Complete upgrade takeover possible | Public upgradeTo(), missing _authorizeUpgrade() |
| high | Major upgrade risk | No timelock, single EOA admin, selfdestruct in implementation |
| medium | Significant exposure | Weak upgrade auth, no storage collision check |
| low | Minor issues | Unclear upgrade pattern, missing documentation |
Confidence Guidelines
| Confidence | Range | When to Use |
|---|---|---|
| Very High | 90-100 | Direct evidence, clear proxy pattern |
| High | 75-89 | Strong evidence, explicit upgrade functions |
| Medium | 60-74 | Plausible, some uncertainty |
| Low | 50-59 | Possible but not confirmed |
Do NOT output findings with confidence < 50
Integration
This skill is part of XLayer Trust Agent and runs in parallel with other EVM specialists:
access-controlproxy-riskupgradeability(this skill)
Results are aggregated in the xlayer-trust-review orchestrator.
Key Patterns to Detect
UUPS Upgrade Authorization
// GOOD - Protected upgrade
function _authorizeUpgrade(address) internal override onlyAdmin {}
// BAD - Missing or weak authorization
function _authorizeUpgrade(address) internal override {} // Empty!
function _authorizeUpgrade(address) internal override onlyOwner {} // Single EOA
Transparent Proxy Risks
// Check if admin can call implementation functions directly
contract TransparentUpgradeableProxy {
// Admin should NOT be able to call implementation functions
// except upgradeTo()
}
Beacon Proxy Risks
// Check if beacon upgrade is protected
contract Beacon {
function upgrade(address) external onlyOwner {} // Check access control
}
Initialization Safety
// GOOD - Protected initialization
function initialize() public initializer {
// ...
}
// BAD - Unprotected or reinitializable
function initialize() public { // Missing initializer modifier
// ...
}
function reinitialize() public { // Should be reinitializer(1)
// ...
}
Storage Layout Risks
Look for:
- State variable order changes in upgrades
- Removed state variables
- Type changes in state variables
- Inherited contract order changes
Output Schema
{
"specialist": "upgradeability",
"target": "contract_address_or_path",
"analysis_time": "2025-04-15T12:00:00Z",
"proxy_pattern": "uups" | "transparent" | "beacon" | "minimal" | "none" | "unknown",
"upgradeable": true | false,
"upgrade_function": "upgradeTo" | "upgrade" | null,
"upgrade_authority": "admin" | "owner" | "multisig" | "timelock" | "unknown",
"findings": [
{
"kind": "FINDING" | "LEAD",
"group_key": "function | authority | bug-class",
"title": "Brief title",
"skill": "upgradeability",
"severity": "critical" | "high" | "medium" | "low",
"confidence": 0-100,
"function_or_handler": "function_name",
"primary_account_or_authority": "authority_name",
"evidence": ["file:line", ...],
"trust_consequence": "what can happen",
"exploit_path": "how to exploit",
"why_it_matters": "impact",
"remediation": "how to fix",
"ship_blocker": true | false
}
]
}