019bb004-7ad9-72bc-bd34-1a7bbbd54b88
Open this run to answer one question: is this real attacker-relevant behavior with real impact, or just normal contract plumbing?
| ID | Type | Status | Attempts | Heartbeat |
|---|---|---|---|---|
| 39318 | artifact.fetch | complete | 1 / 3 | 3 months ago |
| 39319 | proxy.resolve | complete | 1 / 3 | 3 months ago |
| 39320 | tool.cast_disasm | complete | 1 / 3 | 3 months ago |
| 39321 | analysis.bundle | complete | 1 / 3 | 3 months ago |
| 39322 | capability.graph | complete | 1 / 3 | 3 months ago |
| 39323 | detector.run | complete | 1 / 3 | 3 months ago |
| 39324 | validation.fork | complete | 1 / 3 | 3 months ago |
| 39465 | report.consolidate | complete | 1 / 6 | 3 months ago |
{
"status": "not_proxy"
}
No slither job recorded yet.
{"no_findings":false,"summary":"Bytecode shows a selector-based router that DELEGATECALLs to a computed target from storage; no auth guards are detected in the proxy bytecode, so safety depends entirely on how the selector→implementation mapping is managed.","findings":[{"severity":"medium","category":"upgradeability","title":"DELEGATECALL target is computed from storage without visible access controls","exploit_scenario":"Any caller can reach the fallback path (non-matching selector) and trigger a DELEGATECALL to the address stored in a selector-derived mapping. If that mapping can be modified by an untrusted party (e.g., via an insecure facet or storage collision in delegated logic), an attacker can point a selector to a malicious contract and execute arbitrary code in the proxy’s context, enabling storage corruption, asset theft, or contract bricking.","recommendation":"Ensure all functions that can modify the selector→implementation mapping are strictly access-controlled (admin-only, timelocked, or immutable). Consider validating that new targets have code (extcodesize > 0) and emit events for updates to aid monitoring.","evidence":"Fallback path computes a keccak-based storage slot from calldata and loads the delegatecall target, then performs DELEGATECALL with computed target; auth guards are empty in the bytecode analysis. The only callsite is a computed DELEGATECALL at pc 240.","locations":["pc:0x00f0"]}]}
OpenAI Codex v0.77.0 (research preview)
--------
workdir: /tmp/codex-l87h39f3
model: gpt-5.2-codex
provider: openai
approval: never
sandbox: read-only
reasoning effort: high
reasoning summaries: auto
session id: 019bb019-e741-74b0-b85f-e70000db09e8
--------
user
You are a security auditor. You ONLY have runtime bytecode + analysis artifacts.
You MUST read `BYTECODE_BUNDLE.json` before concluding; it contains the bytecode summary,
evidence bundle, callsites, storage slots, and detector findings.
Special cases when reasoning from bytecode (be explicit about uncertainty):
- Selector inference is best-effort; missing selectors are common.
- Fallback/receive paths may be the only entrypoints.
- CALL vs DELEGATECALL semantics differ; DELEGATECALL executes in caller storage.
- Proxy patterns (EIP-1967, minimal proxies, beacon) change which storage is authoritative.
- Storage slots are raw; mappings/arrays appear via keccak patterns, names are unknown.
- Guard detection is heuristic; absence of guards does NOT mean unguarded.
- Returndata checking is unknown unless explicitly shown in evidence.
- Precompiles (0x1..0x9) and common ERC20 transfer selectors may appear; do not over-claim.
Output MUST be valid JSON matching the provided schema.
- If you find nothing meaningful: set no_findings=true and findings=[].
- Otherwise: set no_findings=false and include findings with severity/category/title.
- Locations can be pc references like "pc:0x123" or selectors like "selector:0xa9059cbb".
Focus on: reentrancy, access control, upgradeability/proxy issues, signature validation,
accounting/invariant breaks, dangerous delegatecall, and untrusted external calls.
Be conservative: if evidence is weak, mark severity low/medium and explain why.
mcp startup: no servers
thinking
**Preparing to read BYTECODE_BUNDLE**
exec
/bin/bash -lc 'rg --files' in /tmp/codex-l87h39f3 succeeded in 12ms:
codex-output-schema.json
BYTECODE_BUNDLE.json
thinking
**Reading BYTECODE_BUNDLE.json**
exec
/bin/bash -lc 'cat BYTECODE_BUNDLE.json' in /tmp/codex-l87h39f3 succeeded in 6ms:
{
"analysis_artifact": {
"address": "0xad2b801944acb63eb31fdbc6315d2a3842615e0a",
"artifact_hash": "0x85b44d8f484fbda995d24eec14cdc8e7752b238192cafda7d62cb87b618f82a2",
"artifact_json": {
"auth": {
"guards": []
},
"basic_blocks": [
{
"end_pc": 12,
"hash": "0xb422920917489623fe184081b17583815248c921555350d526b6bb72da0b930b",
"opcodes": [
"PUSH1",
"PUSH1",
"MSTORE",
"PUSH1",
"CALLDATASIZE",
"LT",
"PUSH2",
thinking
**Analyzing bytecode bundle structure**
exec
/bin/bash -lc 'rg -n "storage|slot|implementation|eip" BYTECODE_BUNDLE.json' in /tmp/codex-l87h39f3 succeeded in 21ms:
1155: "storage": {
1157: "slots": [
1161: "slot": "0x0000000000000000000000000000000000000000000000000000000000000009"
1166: "slot": "0x0000000000000000000000000000000000000000000000000000000000000008"
1171: "slot": "0x0000000000000000000000000000000000000000000000000000000000000006"
1176: "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
1194: "storage": {
1196: "slots": [
1200: "slot": "0x0000000000000000000000000000000000000000000000000000000000000009"
1205: "slot": "0x0000000000000000000000000000000000000000000000000000000000000008"
1210: "slot": "0x0000000000000000000000000000000000000000000000000000000000000006"
1215: "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
1233: "storage": {
1235: "slots": [
1239: "slot": "0x0000000000000000000000000000000000000000000000000000000000000009"
1244: "slot": "0x0000000000000000000000000000000000000000000000000000000000000008"
1249: "slot": "0x0000000000000000000000000000000000000000000000000000000000000006"
1254: "slot": "0x0000000000000000000000000000000000000000000000000000000000000005"
1272: "storage": {
1274: "slots": [
thinking
**Searching for storage references**
exec
/bin/bash -lc "sed -n '1120,1425p' BYTECODE_BUNDLE.json" in /tmp/codex-l87h39f3 succeeded in 10ms:
"function_entries": [
{
"entry_pc": 2522041626,
"selector": "0x96534d1a"
},
{
"entry_pc": 4050599390,
"selector": "0xed4cfed7"
},
{
"entry_pc": null,
"selector": "0xf16f3dde"
},
{
"entry_pc": 2488959524,
"selector": "0x29485e63"
},
{
"entry_pc": null,
"selector": "0x945a8224"
thinking
**Analyzing proxy delegatecall and fallback logic**
I'm parsing runtime bytecode and reasoning the contract acts as a proxy/router using a mapping from function selectors to target addresses, performing delegatecalls without on-chain guards. It has view functions reading storage slots but no setters visible, so upgradeability and access control are uncertain. The fallback delegatecall target is computed from calldata with a mask and mapping lookup, with a revert if zero. The main risk is untrusted delegatecall if the mapping can be modified without proper access control, suggesting a medium-to-high severity for security review.
thinking
**Examining unusual calldata masking approach**
I'm focused on decoding a peculiar 5-byte mask (`0x7fffffffff000...`) applied to calldata in the bytecode, which differs from the standard 4-byte selector mask. This might indicate a custom key used in the mapping for delegatecall targets, possibly to handle flags or extended selectors. I'm curious how this impacts selector uniqueness or collisions and looking to correlate this with other analysis artifacts or evidence available.
exec
/bin/bash -lc 'rg -n "evidence|callsites|callsite|bundle" BYTECODE_BUNDLE.json' in /tmp/codex-l87h39f3 succeeded in 20ms:
877: "callsites": [
1416: "proxy_evidence": {
2100: "type": "callsite"
2146: "evidence_json": {
thinking
**Checking callsites section**
exec
/bin/bash -lc "sed -n '840,940p' BYTECODE_BUNDLE.json" in /tmp/codex-l87h39f3 succeeded in 26ms:
"start_pc": 728
},
{
"end_pc": 761,
"hash": "0x5f22ac148b2f92217d955a85193496130fe85f370e204a69a835719ede8a079e",
"opcodes": [
"OP_84",
"OP_98",
"OP_8E",
"OP_1E",
"OP_80",
"CALLDATALOAD",
"OP_C0",
"PUSH22",
"STOP"
],
"start_pc": 731
},
{
"end_pc": 764,
thinking
**Analyzing delegatecall proxy risks**
thinking
**Preparing detailed JSON report**
I'll organize the findings into a JSON object following the schema required, including severity, category, exploit scenario, recommendations, evidence, and relevant code locations like pc:0x00f0 for delegatecall. I want to ensure the report is clear and valid while being conservative about severity and thorough with the explanations.
codex
{"no_findings":false,"summary":"Bytecode shows a selector-based router that DELEGATECALLs to a computed target from storage; no auth guards are detected in the proxy bytecode, so safety depends entirely on how the selector→implementation mapping is managed.","findings":[{"severity":"medium","category":"upgradeability","title":"DELEGATECALL target is computed from storage without visible access controls","exploit_scenario":"Any caller can reach the fallback path (non-matching selector) and trigger a DELEGATECALL to the address stored in a selector-derived mapping. If that mapping can be modified by an untrusted party (e.g., via an insecure facet or storage collision in delegated logic), an attacker can point a selector to a malicious contract and execute arbitrary code in the proxy’s context, enabling storage corruption, asset theft, or contract bricking.","recommendation":"Ensure all functions that can modify the selector→implementation mapping are strictly access-controlled (admin-only, timelocked, or immutable). Consider validating that new targets have code (extcodesize > 0) and emit events for updates to aid monitoring.","evidence":"Fallback path computes a keccak-based storage slot from calldata and loads the delegatecall target, then performs DELEGATECALL with computed target; auth guards are empty in the bytecode analysis. The only callsite is a computed DELEGATECALL at pc 240.","locations":["pc:0x00f0"]}]}
tokens used
33,788
{
"codex": {
"ran_at": "2026-01-12T02:50:37.237258+00:00",
"returncode": 0
},
"project": {
"mode": "bytecode",
"bytecode_length": 1534,
"bytecode_truncated": false,
"capability_graph_present": true,
"analysis_artifact_present": true
},
"summary": "Bytecode shows a selector-based router that DELEGATECALLs to a computed target from storage; no auth guards are detected in the proxy bytecode, so safety depends entirely on how the selector\u2192implementation mapping is managed.",
"raw_final": {
"summary": "Bytecode shows a selector-based router that DELEGATECALLs to a computed target from storage; no auth guards are detected in the proxy bytecode, so safety depends entirely on how the selector\u2192implementation mapping is managed.",
"findings": [
{
"title": "DELEGATECALL target is computed from storage without visible access controls",
"category": "upgradeability",
"evidence": "Fallback path computes a keccak-based storage slot from calldata and loads the delegatecall target, then performs DELEGATECALL with computed target; auth guards are empty in the bytecode analysis. The only callsite is a computed DELEGATECALL at pc 240.",
"severity": "medium",
"locations": [
"pc:0x00f0"
],
"recommendation": "Ensure all functions that can modify the selector\u2192implementation mapping are strictly access-controlled (admin-only, timelocked, or immutable). Consider validating that new targets have code (extcodesize > 0) and emit events for updates to aid monitoring.",
"exploit_scenario": "Any caller can reach the fallback path (non-matching selector) and trigger a DELEGATECALL to the address stored in a selector-derived mapping. If that mapping can be modified by an untrusted party (e.g., via an insecure facet or storage collision in delegated logic), an attacker can point a selector to a malicious contract and execute arbitrary code in the proxy\u2019s context, enabling storage corruption, asset theft, or contract bricking."
}
],
"no_findings": false
},
"no_findings": false,
"schema_version": 1
}
00000000: PUSH1 0x80 00000002: PUSH1 0x40 00000004: MSTORE 00000005: PUSH1 0x04 00000007: CALLDATASIZE 00000008: LT 00000009: PUSH2 0x005e 0000000c: JUMPI 0000000d: PUSH1 0x00 0000000f: CALLDATALOAD 00000010: PUSH1 0xe0 00000012: SHR 00000013: DUP1 00000014: PUSH4 0x96534d1a 00000019: GT 0000001a: PUSH2 0x0043 0000001d: JUMPI 0000001e: DUP1 0000001f: PUSH4 0x96534d1a 00000024: EQ 00000025: PUSH2 0x0145 00000028: JUMPI 00000029: DUP1 0000002a: PUSH4 0xed4cfed7 0000002f: EQ 00000030: PUSH2 0x0167 00000033: JUMPI 00000034: DUP1 00000035: PUSH4 0xf16f3dde 0000003a: EQ 0000003b: PUSH2 0x017c 0000003e: JUMPI 0000003f: PUSH2 0x0065 00000042: JUMP 00000043: JUMPDEST 00000044: DUP1 00000045: PUSH4 0x29485e63 0000004a: EQ 0000004b: PUSH2 0x0105 0000004e: JUMPI 0000004f: DUP1 00000050: PUSH4 0x945a8224 00000055: EQ 00000056: PUSH2 0x0130 00000059: JUMPI 0000005a: PUSH2 0x0065 0000005d: JUMP 0000005e: JUMPDEST 0000005f: CALLDATASIZE 00000060: PUSH2 0x0065 00000063: JUMPI 00000064: STOP 00000065: JUMPDEST 00000066: PUSH1 0x00 00000068: DUP1 00000069: CALLDATALOAD 0000006a: PUSH32 0xffffffff00000000000000000000000000000000000000000000000000000000 0000008b: AND 0000008c: DUP2 0000008d: MSTORE 0000008e: PUSH1 0x01 00000090: PUSH1 0x20 00000092: MSTORE 00000093: PUSH1 0x40 00000095: SWAP1 00000096: KECCAK256 00000097: SLOAD 00000098: PUSH1 0x01 0000009a: PUSH1 0x01 0000009c: PUSH1 0xa0 0000009e: SHL 0000009f: SUB 000000a0: AND 000000a1: DUP1 000000a2: PUSH2 0x00e0 000000a5: JUMPI 000000a6: PUSH1 0x40 000000a8: MLOAD 000000a9: PUSH32 0x08c379a000000000000000000000000000000000000000000000000000000000 000000ca: DUP2 000000cb: MSTORE 000000cc: PUSH1 0x04 000000ce: ADD 000000cf: PUSH2 0x00d7 000000d2: SWAP1 000000d3: PUSH2 0x0288 000000d6: JUMP 000000d7: JUMPDEST 000000d8: PUSH1 0x40 000000da: MLOAD 000000db: DUP1 000000dc: SWAP2 000000dd: SUB 000000de: SWAP1 000000df: REVERT 000000e0: JUMPDEST 000000e1: PUSH1 0x40 000000e3: MLOAD 000000e4: CALLDATASIZE 000000e5: PUSH1 0x00 000000e7: DUP3 000000e8: CALLDATACOPY 000000e9: PUSH1 0x00 000000eb: DUP1 000000ec: CALLDATASIZE 000000ed: DUP4 000000ee: DUP6 000000ef: GAS 000000f0: DELEGATECALL 000000f1: RETURNDATASIZE 000000f2: DUP1 000000f3: PUSH1 0x00 000000f5: DUP5 000000f6: RETURNDATACOPY 000000f7: DUP2 000000f8: DUP1 000000f9: ISZERO 000000fa: PUSH2 0x0101 000000fd: JUMPI 000000fe: DUP2 000000ff: DUP5 00000100: RETURN 00000101: JUMPDEST 00000102: DUP2 00000103: DUP5 00000104: REVERT 00000105: JUMPDEST 00000106: CALLVALUE 00000107: DUP1 00000108: ISZERO 00000109: PUSH2 0x0111 0000010c: JUMPI 0000010d: PUSH1 0x00 0000010f: DUP1 00000110: REVERT 00000111: JUMPDEST 00000112: POP 00000113: PUSH2 0x011a 00000116: PUSH2 0x01ad 00000119: JUMP 0000011a: JUMPDEST 0000011b: PUSH1 0x40 0000011d: MLOAD 0000011e: PUSH2 0x0127 00000121: SWAP2 00000122: SWAP1 00000123: PUSH2 0x0240 00000126: JUMP 00000127: JUMPDEST 00000128: PUSH1 0x40 0000012a: MLOAD 0000012b: DUP1 0000012c: SWAP2 0000012d: SUB 0000012e: SWAP1 0000012f: RETURN 00000130: JUMPDEST 00000131: CALLVALUE 00000132: DUP1 00000133: ISZERO 00000134: PUSH2 0x013c 00000137: JUMPI 00000138: PUSH1 0x00 0000013a: DUP1 0000013b: REVERT 0000013c: JUMPDEST 0000013d: POP 0000013e: PUSH2 0x011a 00000141: PUSH2 0x01bc 00000144: JUMP 00000145: JUMPDEST 00000146: CALLVALUE 00000147: DUP1 00000148: ISZERO 00000149: PUSH2 0x0151 0000014c: JUMPI 0000014d: PUSH1 0x00 0000014f: DUP1 00000150: REVERT 00000151: JUMPDEST 00000152: POP 00000153: PUSH2 0x015a 00000156: PUSH2 0x01cb 00000159: JUMP 0000015a: JUMPDEST 0000015b: PUSH1 0x40 0000015d: MLOAD 0000015e: PUSH2 0x0127 00000161: SWAP2 00000162: SWAP1 00000163: PUSH2 0x02bf 00000166: JUMP 00000167: JUMPDEST 00000168: CALLVALUE 00000169: DUP1 0000016a: ISZERO 0000016b: PUSH2 0x0173 0000016e: JUMPI 0000016f: PUSH1 0x00 00000171: DUP1 00000172: REVERT 00000173: JUMPDEST 00000174: POP 00000175: PUSH2 0x015a 00000178: PUSH2 0x01d1 0000017b: JUMP 0000017c: JUMPDEST 0000017d: CALLVALUE 0000017e: DUP1 0000017f: ISZERO 00000180: PUSH2 0x0188 00000183: JUMPI 00000184: PUSH1 0x00 00000186: DUP1 00000187: REVERT 00000188: JUMPDEST 00000189: POP 0000018a: PUSH2 0x019c 0000018d: PUSH2 0x0197 00000190: CALLDATASIZE 00000191: PUSH1 0x04 00000193: PUSH2 0x0212 00000196: JUMP 00000197: JUMPDEST 00000198: PUSH2 0x01d7 0000019b: JUMP 0000019c: JUMPDEST 0000019d: PUSH1 0x40 0000019f: MLOAD 000001a0: PUSH2 0x0127 000001a3: SWAP6 000001a4: SWAP5 000001a5: SWAP4 000001a6: SWAP3 000001a7: SWAP2 000001a8: SWAP1 000001a9: PUSH2 0x0254 000001ac: JUMP 000001ad: JUMPDEST 000001ae: PUSH1 0x09 000001b0: SLOAD 000001b1: PUSH1 0x01 000001b3: PUSH1 0x01 000001b5: PUSH1 0xa0 000001b7: SHL 000001b8: SUB 000001b9: AND 000001ba: DUP2 000001bb: JUMP 000001bc: JUMPDEST 000001bd: PUSH1 0x08 000001bf: SLOAD 000001c0: PUSH1 0x01 000001c2: PUSH1 0x01 000001c4: PUSH1 0xa0 000001c6: SHL 000001c7: SUB 000001c8: AND 000001c9: DUP2 000001ca: JUMP 000001cb: JUMPDEST 000001cc: PUSH1 0x06 000001ce: SLOAD 000001cf: DUP2 000001d0: JUMP 000001d1: JUMPDEST 000001d2: PUSH1 0x05 000001d4: SLOAD 000001d5: DUP2 000001d6: JUMP 000001d7: JUMPDEST 000001d8: PUSH1 0x0a 000001da: PUSH1 0x20 000001dc: MSTORE 000001dd: PUSH1 0x00 000001df: SWAP1 000001e0: DUP2 000001e1: MSTORE 000001e2: PUSH1 0x40 000001e4: SWAP1 000001e5: KECCAK256 000001e6: DUP1 000001e7: SLOAD 000001e8: PUSH1 0x01 000001ea: DUP3 000001eb: ADD 000001ec: SLOAD 000001ed: PUSH1 0x02 000001ef: DUP4 000001f0: ADD 000001f1: SLOAD 000001f2: PUSH1 0x03 000001f4: DUP5 000001f5: ADD 000001f6: SLOAD 000001f7: PUSH1 0x04 000001f9: SWAP1 000001fa: SWAP5 000001fb: ADD 000001fc: SLOAD 000001fd: PUSH1 0x01 000001ff: PUSH1 0x01 00000201: PUSH1 0xa0 00000203: SHL 00000204: SUB 00000205: SWAP4 00000206: DUP5 00000207: AND 00000208: SWAP5 00000209: SWAP3 0000020a: SWAP4 0000020b: SWAP1 0000020c: SWAP2 0000020d: AND 0000020e: SWAP2 0000020f: SWAP1 00000210: DUP6 00000211: JUMP 00000212: JUMPDEST 00000213: PUSH1 0x00 00000215: PUSH1 0x20 00000217: DUP3 00000218: DUP5 00000219: SUB 0000021a: SLT 0000021b: ISZERO 0000021c: PUSH2 0x0223 0000021f: JUMPI 00000220: DUP1 00000221: DUP2 00000222: REVERT 00000223: JUMPDEST 00000224: DUP2 00000225: CALLDATALOAD 00000226: PUSH1 0x01 00000228: PUSH1 0x01 0000022a: PUSH1 0xa0 0000022c: SHL 0000022d: SUB 0000022e: DUP2 0000022f: AND 00000230: DUP2 00000231: EQ 00000232: PUSH2 0x0239 00000235: JUMPI 00000236: DUP2 00000237: DUP3 00000238: REVERT 00000239: JUMPDEST 0000023a: SWAP4 0000023b: SWAP3 0000023c: POP 0000023d: POP 0000023e: POP 0000023f: JUMP 00000240: JUMPDEST 00000241: PUSH1 0x01 00000243: PUSH1 0x01 00000245: PUSH1 0xa0 00000247: SHL 00000248: SUB 00000249: SWAP2 0000024a: SWAP1 0000024b: SWAP2 0000024c: AND 0000024d: DUP2 0000024e: MSTORE 0000024f: PUSH1 0x20 00000251: ADD 00000252: SWAP1 00000253: JUMP 00000254: JUMPDEST 00000255: PUSH1 0x01 00000257: PUSH1 0x01 00000259: PUSH1 0xa0 0000025b: SHL 0000025c: SUB 0000025d: SWAP6 0000025e: DUP7 0000025f: AND 00000260: DUP2 00000261: MSTORE 00000262: PUSH1 0x20 00000264: DUP2 00000265: ADD 00000266: SWAP5 00000267: SWAP1 00000268: SWAP5 00000269: MSTORE 0000026a: SWAP2 0000026b: SWAP1 0000026c: SWAP4 0000026d: AND 0000026e: PUSH1 0x40 00000270: DUP4 00000271: ADD 00000272: MSTORE 00000273: PUSH1 0x60 00000275: DUP3 00000276: ADD 00000277: SWAP3 00000278: SWAP1 00000279: SWAP3 0000027a: MSTORE 0000027b: PUSH1 0x80 0000027d: DUP2 0000027e: ADD 0000027f: SWAP2 00000280: SWAP1 00000281: SWAP2 00000282: MSTORE 00000283: PUSH1 0xa0 00000285: ADD 00000286: SWAP1 00000287: JUMP 00000288: JUMPDEST 00000289: PUSH1 0x20 0000028b: DUP1 0000028c: DUP3 0000028d: MSTORE 0000028e: PUSH1 0x18 00000290: SWAP1 00000291: DUP3 00000292: ADD 00000293: MSTORE 00000294: PUSH32 0x46756e6374696f6e20646f6573206e6f742065786973742e0000000000000000 000002b5: PUSH1 0x40 000002b7: DUP3 000002b8: ADD 000002b9: MSTORE 000002ba: PUSH1 0x60 000002bc: ADD 000002bd: SWAP1 000002be: JUMP 000002bf: JUMPDEST 000002c0: SWAP1 000002c1: DUP2 000002c2: MSTORE 000002c3: PUSH1 0x20 000002c5: ADD 000002c6: SWAP1 000002c7: JUMP 000002c8: INVALID 000002c9: LOG2 000002ca: PUSH5 0x6970667358 000002d0: UNKNOWN(0x22) 000002d1: SLT 000002d2: KECCAK256 000002d3: PUSH2 0x680e 000002d6: UNKNOWN(0xDA) 000002d7: STOP 000002d8: UNKNOWN(0xDA) 000002d9: SWAP3 000002da: JUMP 000002db: DUP5 000002dc: SWAP9 000002dd: DUP15 000002de: CLZ 000002df: DUP1 000002e0: CALLDATALOAD 000002e1: UNKNOWN(0xC0) 000002e2: PUSH22 0x83e5e7d23218116403fd7d1f1fc0b2c964736f6c6343 000002f9: STOP 000002fa: MOD 000002fb: MUL 000002fc: STOP 000002fd: CALLER
| Severity | Category | Tool | Title | Confidence | Validated | Confirmed | Details |
|---|---|---|---|---|---|---|---|
| critical | upgradeability | detector | Untrusted DELEGATECALL target reachable | 70 | no | no |
viewtrace_id: 0x158f29f5ae276f1e75bb00c57d0ca18ec414d2b1e315c06d8f41d82d922dd429
validation_json{
"sink": "DELEGATECALL",
"errors": 0,
"status": "unknown",
"attempts": 60,
"trace_id": "0x158f29f5ae276f1e75bb00c57d0ca18ec414d2b1e315c06d8f41d82d922dd429",
"confirmed": false,
"trace_mode": "callTracer",
"call_targets": null,
"matched_probe": null,
"target_varies": null,
"classification": "no_sink"
}
witness_json{
"notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
"constraints": [],
"entrypoints": [
{
"calldata": "0x96534d1a",
"selector": "0x96534d1a",
"calldata_variants": [
"0x96534d1a",
"0x96534d1a0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xed4cfed7",
"selector": "0xed4cfed7",
"calldata_variants": [
"0xed4cfed7",
"0xed4cfed70000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0xf16f3dde",
"selector": "0xf16f3dde",
"calldata_variants": [
"0xf16f3dde",
"0xf16f3dde0000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x29485e63",
"selector": "0x29485e63",
"calldata_variants": [
"0x29485e63",
"0x29485e630000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x945a8224",
"selector": "0x945a8224",
"calldata_variants": [
"0x945a8224",
"0x945a82240000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 240,
"opcode": "DELEGATECALL",
"returndata_checked": null,
"value_expression_category": "n/a",
"target_expression_category": "computed"
}
],
"guards_detected": [],
"delegatecall_count": 1,
"untrusted_delegatecall_count": 1
}
|
| medium | upgradeability | codex | DELEGATECALL target is computed from storage without visible access controls | 75 | no | — |
viewevidence_json{
"evidence": "Fallback path computes a keccak-based storage slot from calldata and loads the delegatecall target, then performs DELEGATECALL with computed target; auth guards are empty in the bytecode analysis. The only callsite is a computed DELEGATECALL at pc 240.",
"locations": [
"pc:0x00f0"
],
"recommendation": "Ensure all functions that can modify the selector\u2192implementation mapping are strictly access-controlled (admin-only, timelocked, or immutable). Consider validating that new targets have code (extcodesize > 0) and emit events for updates to aid monitoring.",
"exploit_scenario": "Any caller can reach the fallback path (non-matching selector) and trigger a DELEGATECALL to the address stored in a selector-derived mapping. If that mapping can be modified by an untrusted party (e.g., via an insecure facet or storage collision in delegated logic), an attacker can point a selector to a malicious contract and execute arbitrary code in the proxy\u2019s context, enabling storage corruption, asset theft, or contract bricking."
}
|
| medium | upgradeability | cast | DELEGATECALL present | 80 | no | — |
viewevidence_json{
"notes": "delegatecall enables execution in caller context; common in proxies/upgradeable patterns",
"delegatecall_count": 1
}
|