019b3836-2211-7274-9805-31a96cedf1d9
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 |
|---|---|---|---|---|
| 217 | artifact.fetch | complete | 1 / 3 | 3 months ago |
| 218 | tool.cast_disasm | complete | 1 / 3 | 3 months ago |
| 43283 | analysis.bundle | complete | 1 / 3 | 1 week ago |
| 43284 | capability.graph | complete | 1 / 3 | 1 week ago |
| 43285 | detector.run | complete | 1 / 3 | 1 week ago |
| 43286 | validation.fork | complete | 1 / 3 | 1 week ago |
| 70723 | report.consolidate | complete | 1 / 6 | 1 week ago |
No slither job recorded yet.
{"no_findings":false,"summary":"The runtime is a very small two-selector contract. One selector (`0x60fe47b1`) reads slot `0x0`, masks it to an address, and performs a low-level `CALL` with nonzero ETH value and no detected authorization check. The only other selector (`0x6d4ce63c`) returns the constant `0xff`. No proxy or `DELEGATECALL` behavior is present in the supplied bytecode. Findings below are conservative because naming and selector intent are inferred only from runtime bytecode.","findings":[{"severity":"medium","category":"access_control","title":"Public entrypoint can force ETH transfer to the address stored in slot 0","exploit_scenario":"Any caller can invoke selector `0x60fe47b1`. The bytecode loads slot `0x0`, treats the low 20 bytes as the call target, and executes a value-bearing `CALL` without any detected guard. If this contract ever holds ETH, an attacker can repeatedly trigger this entrypoint to push funds out to that stored address until the balance is exhausted or calls start failing. Because only runtime bytecode is available, it is unclear whether this behavior is intentional, but there is no visible caller authorization in the deployed code.","recommendation":"If this payout/forwarding behavior is not meant to be public, add an explicit caller authorization check before the external call. If it is intended, constrain the reachable balance and document that anyone can trigger the transfer path.","evidence":"At `pc 0x2d` the contract performs `SLOAD` from slot `0x0`; at `pc 0x50` it executes `CALL`. The analysis artifact reports no detected guards, one storage read from slot `0x0`, and a validated nonzero-value external call reachable from selector `0x60fe47b1`. The supplied bytecode contains no runtime storage writes, so the call target is whatever address was already installed in slot `0x0`.","locations":["selector:0x60fe47b1","pc:0x2d","pc:0x50"]},{"severity":"low","category":"other","title":"Low-level ETH call ignores success/failure","exploit_scenario":"The `CALL` result is immediately discarded with `POP`, and the function jumps to a normal `STOP` path. If the callee reverts or the transfer fails, upstream integrations may still treat the transaction as successful because this function does not bubble the error or return a failure indicator. That can create silent payout/accounting mismatches.","recommendation":"Check the `CALL` return value and revert or emit an explicit failure signal when the transfer does not succeed. If failure is intentionally tolerated, make that behavior explicit in surrounding protocol logic.","evidence":"The only external callsite is `CALL` at `pc 0x50`. The stack result from `CALL` is not consumed by a conditional branch; it is popped at `pc 0x51`, and the artifact marks `returndata_checked` as unknown/null. No revert path is visible after the call.","locations":["selector:0x60fe47b1","pc:0x50","pc:0x51"]}]}
OpenAI Codex v0.118.0 (research preview)
--------
workdir: /tmp/codex-59bx_t5g
model: gpt-5.4
provider: openai
approval: never
sandbox: read-only
reasoning effort: high
reasoning summaries: none
session id: 019d5a4d-62d2-7da2-bc25-b7ef75d990a8
--------
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.
warning: Codex could not find system bubblewrap on PATH. Please install bubblewrap with your package manager. Codex will use the vendored bubblewrap in the meantime.
exec
/bin/bash -lc pwd in /tmp/codex-59bx_t5g
succeeded in 0ms:
/tmp/codex-59bx_t5g
exec
/bin/bash -lc 'rg --files' in /tmp/codex-59bx_t5g
succeeded in 0ms:
codex-output-schema.json
BYTECODE_BUNDLE.json
exec
/bin/bash -lc "sed -n '1,260p' BYTECODE_BUNDLE.json" in /tmp/codex-59bx_t5g
succeeded in 0ms:
{
"analysis_artifact": {
"address": "0x7aa73b556c0da8ca4e83e483d7404930e946473b",
"artifact_hash": "0x9313c6fce497a35e69fb7c6bc9dd9a0cd36372431ec7c048d9b8c0de39bf24e8",
"artifact_json": {
"auth": {
"guards": []
},
"basic_blocks": [
{
"end_pc": 23,
"hash": "0x4fd9637791b68adc1ff7df76b3de48256945f319cd17ae200fff5bde460fa261",
"opcodes": [
"PUSH1",
"PUSH1",
"MSTORE",
"PUSH1",
"PUSH1",
"EXP",
"PUSH1",
"CALLDATALOAD",
"DIV",
"PUSH4",
"OP_81",
"EQ",
"PUSH1",
"JUMPI"
],
"start_pc": 0
},
{
"end_pc": 33,
"hash": "0x424e4af57be4e62e961bdef24957487cf04333d7389b4ef5a2a93d6c11d75820",
"opcodes": [
"OP_80",
"PUSH4",
"EQ",
"PUSH1",
"JUMPI"
],
"start_pc": 24
},
{
"end_pc": 35,
"hash": "0xd992302ef73b1098f69c9c04a34424995e3f29a3c7f224d984cff0e85dbd9591",
"opcodes": [
"JUMPDEST",
"STOP"
],
"start_pc": 34
},
{
"end_pc": 87,
"hash": "0xea11695fbf90762c389b5e751b324342ffdcc79c282420da5c3bbea20a014030",
"opcodes": [
"JUMPDEST",
"PUSH1",
"PUSH1",
"CALLDATALOAD",
"PUSH1",
"OP_80",
"SLOAD",
"PUSH20",
"AND",
"OP_90",
"PUSH1",
"PUSH1",
"OP_82",
"OP_81",
"OP_81",
"OP_81",
"OP_85",
"OP_88",
"OP_83",
"CALL",
"POP",
"POP",
"POP",
"POP",
"POP",
"POP",
"JUMP"
],
"start_pc": 36
},
{
"end_pc": 99,
"hash": "0x6cad63129c501e345ea4350d4c6190e5193f8d72da64028e0316c4ca3b5e54be",
"opcodes": [
"JUMPDEST",
"PUSH1",
"PUSH1",
"OP_90",
"OP_81",
"MSTORE",
"PUSH1",
"OP_90",
"RETURN"
],
"start_pc": 88
}
],
"callsites": [
{
"opcode": "CALL",
"pc": 80,
"returndata_checked": null,
"target_expression_category": "computed",
"value_expression_category": "constant"
}
],
"cfg_edges": [
{
"from": "bb:0",
"to": "bb:36",
"type": "control_flow"
},
{
"from": "bb:0",
"to": "bb:24",
"type": "control_flow_fallthrough"
},
{
"from": "bb:24",
"to": "bb:88",
"type": "control_flow"
},
{
"from": "bb:24",
"to": "bb:34",
"type": "control_flow_fallthrough"
}
],
"cfg_hash": "0x6303e5098a30e003ca0c362a280d99292af977b164f2c6695ee4a7ef80054f63",
"dispatcher_type": "selector_jump_table",
"function_entries": [
{
"entry_pc": null,
"selector": "0x60fe47b1"
},
{
"entry_pc": null,
"selector": "0x6d4ce63c"
}
],
"functions": [
{
"auth": {
"guards": []
},
"entry_pc": null,
"selector": "0x60fe47b1",
"sinks": {
"call": 1,
"delegatecall": 0,
"selfdestruct": 0,
"staticcall": 0
},
"storage": {
"reads": 1,
"slots": [
{
"op": "SLOAD",
"pc": 45,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
],
"writes": 0
}
},
{
"auth": {
"guards": []
},
"entry_pc": null,
"selector": "0x6d4ce63c",
"sinks": {
"call": 1,
"delegatecall": 0,
"selfdestruct": 0,
"staticcall": 0
},
"storage": {
"reads": 1,
"slots": [
{
"op": "SLOAD",
"pc": 45,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
],
"writes": 0
}
}
],
"selectors": [
"0x60fe47b1",
"0x6d4ce63c"
],
"sinks": {
"call": 1,
"create": 0,
"create2": 0,
"delegatecall": 0,
"selfdestruct": 0,
"staticcall": 0,
"upgrade_slot_write_suspected": false
},
"storage": {
"keccak_count": 0,
"reads": 1,
"slots": [
{
"op": "SLOAD",
"pc": 45,
"slot": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
],
"writes": 0
},
"version": "analysis_artifact_v1"
},
"block_number": null,
"chain_id": 1,
"codehash": "0x202efbee42eee44310f93a805c5f525af954b640019ea8ba41f2ec5504be183e",
"created_at": "2026-04-04T19:44:58.000000Z",
"id": 1482,
"updated_at": "2026-04-04T19:44:58.000000Z",
"version": "analysis_artifact_v1"
},
"analysis_run": {
"address": "0x7aa73b556c0da8ca4e83e483d7404930e946473b",
"block_number": null,
"chain_id": 1,
"child_links": [],
"created_at": "2025-12-19T20:03:50.000000Z",
"id": "019b3836-2211-7274-9805-31a96cedf1d9",
"parent_links": [],
"status": "running",
"updated_at": "2026-04-04T19:44:58.000000Z"
},
"artifact": {
"codehash": "0x202efbee42eee44310f93a805c5f525af954b640019ea8ba41f2ec5504be183e",
"compiler_json": {
"etherscan": {
"skipped": true
}
},
"implementation_address": null,
"is_proxy": false,
"runtime_bytecode": {
"full": "0x606060405260e060020a600035046360fe47b1811460245780636d4ce63c146058575b005b60226004356000805473ffffffffffffffffffffffffffffffffffffffff16906001606082818181858883f1505050505050565b60ff6060908152602090f3",
"head": null,
"length": 202,
"tail": null,
"truncated": false
},
"verified_source": false
},
"capability_graph": {
exec
/bin/bash -lc "sed -n '261,520p' BYTECODE_BUNDLE.json" in /tmp/codex-59bx_t5g
succeeded in 0ms:
"address": "0x7aa73b556c0da8ca4e83e483d7404930e946473b",
"block_number": null,
"chain_id": 1,
"codehash": "0x202efbee42eee44310f93a805c5f525af954b640019ea8ba41f2ec5504be183e",
"created_at": "2026-04-04T19:44:59.000000Z",
"graph_hash": "0xc0d114c5682257ec667c15468c1262397d8281692e2e3efb03e5586c8d3746a0",
"graph_json": {
"edges": [
{
"from": "bb:0",
"to": "bb:36",
"type": "control_flow"
},
{
"from": "bb:0",
"to": "bb:24",
"type": "control_flow_fallthrough"
},
{
"from": "bb:24",
"to": "bb:88",
"type": "control_flow"
},
{
"from": "bb:24",
"to": "bb:34",
"type": "control_flow_fallthrough"
},
{
"from": "bb:36",
"to": "call:80",
"type": "contains"
},
{
"from": "call:80",
"to": "sink:call",
"type": "capability"
}
],
"nodes": [
{
"end_pc": 23,
"hash": "0x4fd9637791b68adc1ff7df76b3de48256945f319cd17ae200fff5bde460fa261",
"id": "bb:0",
"start_pc": 0,
"type": "basic_block"
},
{
"end_pc": 33,
"hash": "0x424e4af57be4e62e961bdef24957487cf04333d7389b4ef5a2a93d6c11d75820",
"id": "bb:24",
"start_pc": 24,
"type": "basic_block"
},
{
"end_pc": 35,
"hash": "0xd992302ef73b1098f69c9c04a34424995e3f29a3c7f224d984cff0e85dbd9591",
"id": "bb:34",
"start_pc": 34,
"type": "basic_block"
},
{
"end_pc": 87,
"hash": "0xea11695fbf90762c389b5e751b324342ffdcc79c282420da5c3bbea20a014030",
"id": "bb:36",
"start_pc": 36,
"type": "basic_block"
},
{
"end_pc": 99,
"hash": "0x6cad63129c501e345ea4350d4c6190e5193f8d72da64028e0316c4ca3b5e54be",
"id": "bb:88",
"start_pc": 88,
"type": "basic_block"
},
{
"id": "call:80",
"opcode": "CALL",
"pc": 80,
"type": "callsite"
},
{
"id": "sink:call",
"type": "sink"
},
{
"entry_pc": null,
"id": "fn:0x60fe47b1",
"selector": "0x60fe47b1",
"type": "function"
},
{
"entry_pc": null,
"id": "fn:0x6d4ce63c",
"selector": "0x6d4ce63c",
"type": "function"
}
],
"version": "capability_graph_v1"
},
"id": 1482,
"updated_at": "2026-04-04T19:44:59.000000Z",
"version": "capability_graph_v1"
},
"detector_findings": [
{
"confidence": 55,
"evidence_json": {
"eth_value_calls": 1,
"examples": [
{
"opcode": "CALL",
"pc": 80,
"returndata_checked": null,
"target_expression_category": "computed",
"value_expression_category": "constant"
}
],
"guards_detected": []
},
"normalized_json": {
"sink": "CALL",
"value": "nonzero"
},
"severity": "high",
"title": "ETH value transfer possible",
"validated": true,
"validation_json": {
"attempts": 1,
"call_targets": [
"0x7aa73b556c0da8ca4e83e483d7404930e946473b",
"0x9e0ae8ffd946d12d1d393c6f3bca0eecadc9428e"
],
"classification": "target_varies",
"confirmed": true,
"errors": 0,
"matched_probe": null,
"sink": "CALL",
"status": "confirmed",
"target_varies": true,
"trace_id": "0xff77c0006115c518bdd2e8a2c4b5a9013d8930a5c624d8cef7d573d37d7980c3",
"trace_mode": "callTracer"
}
},
{
"confidence": 60,
"evidence_json": {
"call_count": 1,
"examples": [
{
"opcode": "CALL",
"pc": 80,
"returndata_checked": null,
"target_expression_category": "computed",
"value_expression_category": "constant"
}
],
"guards_detected": [],
"untrusted_call_count": 1
},
"normalized_json": {
"sink": "CALL"
},
"severity": "high",
"title": "Untrusted CALL target/value reachable",
"validated": true,
"validation_json": {
"attempts": 1,
"call_targets": [
"0x7aa73b556c0da8ca4e83e483d7404930e946473b",
"0x9e0ae8ffd946d12d1d393c6f3bca0eecadc9428e"
],
"classification": "target_varies",
"confirmed": true,
"errors": 0,
"matched_probe": null,
"sink": "CALL",
"status": "confirmed",
"target_varies": true,
"trace_id": "0xff77c0006115c518bdd2e8a2c4b5a9013d8930a5c624d8cef7d573d37d7980c3",
"trace_mode": "callTracer"
}
}
],
"heuristics_summary": {
"create2_count": 0,
"delegatecall_count": 0,
"flags": [],
"selfdestruct_count": 0
}
}
exec
/bin/bash -lc "node - <<'NODE'
const bytecode='606060405260e060020a600035046360fe47b1811460245780636d4ce63c146058575b005b60226004356000805473ffffffffffffffffffffffffffffffffffffffff16906001606082818181858883f1505050505050565b60ff6060908152602090f3';
let pc=0; const opnames={0x00:'STOP',0x01:'ADD',0x02:'MUL',0x03:'SUB',0x04:'DIV',0x05:'SDIV',0x06:'MOD',0x07:'SMOD',0x08:'ADDMOD',0x09:'MULMOD',0x0a:'EXP',0x0b:'SIGNEXTEND',0x10:'LT',0x11:'GT',0x12:'SLT',0x13:'SGT',0x14:'EQ',0x15:'ISZERO',0x16:'AND',0x17:'OR',0x18:'XOR',0x19:'NOT',0x1a:'BYTE',0x20:'SHA3',0x30:'ADDRESS',0x31:'BALANCE',0x32:'ORIGIN',0x33:'CALLER',0x34:'CALLVALUE',0x35:'CALLDATALOAD',0x36:'CALLDATASIZE',0x37:'CALLDATACOPY',0x38:'CODESIZE',0x39:'CODECOPY',0x3a:'GASPRICE',0x3b:'EXTCODESIZE',0x3c:'EXTCODECOPY',0x3d:'RETURNDATASIZE',0x3e:'RETURNDATACOPY',0x40:'BLOCKHASH',0x41:'COINBASE',0x42:'TIMESTAMP',0x43:'NUMBER',0x44:'DIFFICULTY',0x45:'GASLIMIT',0x50:'POP',0x51:'MLOAD',0x52:'MSTORE',0x53:'MSTORE8',0x54:'SLOAD',0x55:'SSTORE',0x56:'JUMP',0x57:'JUMPI',0x58:'PC',0x59:'MSIZE',0x5a:'GAS',0x5b:'JUMPDEST',0xf0:'CREATE',0xf1:'CALL',0xf2:'CALLCODE',0xf3:'RETURN',0xf4:'DELEGATECALL',0xf5:'CREATE2',0xfa:'STATICCALL',0xfd:'REVERT',0xfe:'INVALID',0xff:'SELFDESTRUCT'};
for(let i=1;i<=32;i++){opnames[0x5f+i]="'`PUSH${i}`};for(let i=1;i<=16;i++){opnames[0x7f+i]=`DUP${i}`};for(let i=1;i<=16;i++){opnames[0x8f+i]=`SWAP${i}`};
const buf=Buffer.from(bytecode,'"'hex');
while(pc<buf.length){let op=buf[pc];let name=opnames[op]||('OP_'+op.toString(16)); let out=pc.toString().padStart(3)+' '+name; pc++; if(op>=0x60&&op<=0x7f){let n=op-0x5f; out+=' 0x'+buf.slice(pc,pc+n).toString('hex'); pc+=n;} console.log(out);}
NODE" in /tmp/codex-59bx_t5g
succeeded in 0ms:
0 PUSH1 0x60
2 PUSH1 0x40
4 MSTORE
5 PUSH1 0xe0
7 PUSH1 0x02
9 EXP
10 PUSH1 0x00
12 CALLDATALOAD
13 DIV
14 PUSH4 0x60fe47b1
19 DUP2
20 EQ
21 PUSH1 0x24
23 JUMPI
24 DUP1
25 PUSH4 0x6d4ce63c
30 EQ
31 PUSH1 0x58
33 JUMPI
34 JUMPDEST
35 STOP
36 JUMPDEST
37 PUSH1 0x22
39 PUSH1 0x04
41 CALLDATALOAD
42 PUSH1 0x00
44 DUP1
45 SLOAD
46 PUSH20 0xffffffffffffffffffffffffffffffffffffffff
67 AND
68 SWAP1
69 PUSH1 0x01
71 PUSH1 0x60
73 DUP3
74 DUP2
75 DUP2
76 DUP2
77 DUP6
78 DUP9
79 DUP4
80 CALL
81 POP
82 POP
83 POP
84 POP
85 POP
86 POP
87 JUMP
88 JUMPDEST
89 PUSH1 0xff
91 PUSH1 0x60
93 SWAP1
94 DUP2
95 MSTORE
96 PUSH1 0x20
98 SWAP1
99 RETURN
exec
/bin/bash -lc "node - <<'NODE'
let stack=['sig'];
function show(op){console.log(op, JSON.stringify(stack));}
function push(x){stack.push(x)}
function dup(n){stack.push(stack[stack.length-n])}
function swap(n){let i=stack.length-1,j=stack.length-1-n;[stack[i],stack[j]]=[stack[j],stack[i]]}
push('0x22');show('PUSH1 0x22');
push('arg');show('CALLDATALOAD(4)');
push('0');show('PUSH1 0');
dup(1);show('DUP1');
stack.pop(); push('slot0');show('SLOAD');
push('mask');show('PUSH20 mask');
stack.pop(); let a=stack.pop(); push("'`(${a}&mask)`);show('"'AND');
swap(1);show('SWAP1');
push('1');show('PUSH1 1');
push('0x60');show('PUSH1 0x60');
dup(3);show('DUP3');
dup(2);show('DUP2');
dup(2);show('DUP2');
dup(2);show('DUP2');
dup(6);show('DUP6');
dup(9);show('DUP9');
dup(4);show('DUP4');
NODE" in /tmp/codex-59bx_t5g
succeeded in 0ms:
PUSH1 0x22 ["sig","0x22"]
CALLDATALOAD(4) ["sig","0x22","arg"]
PUSH1 0 ["sig","0x22","arg","0"]
DUP1 ["sig","0x22","arg","0","0"]
SLOAD ["sig","0x22","arg","0","slot0"]
PUSH20 mask ["sig","0x22","arg","0","slot0","mask"]
AND ["sig","0x22","arg","0","(slot0&mask)"]
SWAP1 ["sig","0x22","arg","(slot0&mask)","0"]
PUSH1 1 ["sig","0x22","arg","(slot0&mask)","0","1"]
PUSH1 0x60 ["sig","0x22","arg","(slot0&mask)","0","1","0x60"]
DUP3 ["sig","0x22","arg","(slot0&mask)","0","1","0x60","0"]
DUP2 ["sig","0x22","arg","(slot0&mask)","0","1","0x60","0","0x60"]
DUP2 ["sig","0x22","arg","(slot0&mask)","0","1","0x60","0","0x60","0"]
DUP2 ["sig","0x22","arg","(slot0&mask)","0","1","0x60","0","0x60","0","0x60"]
DUP6 ["sig","0x22","arg","(slot0&mask)","0","1","0x60","0","0x60","0","0x60","1"]
DUP9 ["sig","0x22","arg","(slot0&mask)","0","1","0x60","0","0x60","0","0x60","1","(slot0&mask)"]
DUP4 ["sig","0x22","arg","(slot0&mask)","0","1","0x60","0","0x60","0","0x60","1","(slot0&mask)","0"]
codex
{"no_findings":false,"summary":"The runtime is a very small two-selector contract. One selector (`0x60fe47b1`) reads slot `0x0`, masks it to an address, and performs a low-level `CALL` with nonzero ETH value and no detected authorization check. The only other selector (`0x6d4ce63c`) returns the constant `0xff`. No proxy or `DELEGATECALL` behavior is present in the supplied bytecode. Findings below are conservative because naming and selector intent are inferred only from runtime bytecode.","findings":[{"severity":"medium","category":"access_control","title":"Public entrypoint can force ETH transfer to the address stored in slot 0","exploit_scenario":"Any caller can invoke selector `0x60fe47b1`. The bytecode loads slot `0x0`, treats the low 20 bytes as the call target, and executes a value-bearing `CALL` without any detected guard. If this contract ever holds ETH, an attacker can repeatedly trigger this entrypoint to push funds out to that stored address until the balance is exhausted or calls start failing. Because only runtime bytecode is available, it is unclear whether this behavior is intentional, but there is no visible caller authorization in the deployed code.","recommendation":"If this payout/forwarding behavior is not meant to be public, add an explicit caller authorization check before the external call. If it is intended, constrain the reachable balance and document that anyone can trigger the transfer path.","evidence":"At `pc 0x2d` the contract performs `SLOAD` from slot `0x0`; at `pc 0x50` it executes `CALL`. The analysis artifact reports no detected guards, one storage read from slot `0x0`, and a validated nonzero-value external call reachable from selector `0x60fe47b1`. The supplied bytecode contains no runtime storage writes, so the call target is whatever address was already installed in slot `0x0`.","locations":["selector:0x60fe47b1","pc:0x2d","pc:0x50"]},{"severity":"low","category":"other","title":"Low-level ETH call ignores success/failure","exploit_scenario":"The `CALL` result is immediately discarded with `POP`, and the function jumps to a normal `STOP` path. If the callee reverts or the transfer fails, upstream integrations may still treat the transaction as successful because this function does not bubble the error or return a failure indicator. That can create silent payout/accounting mismatches.","recommendation":"Check the `CALL` return value and revert or emit an explicit failure signal when the transfer does not succeed. If failure is intentionally tolerated, make that behavior explicit in surrounding protocol logic.","evidence":"The only external callsite is `CALL` at `pc 0x50`. The stack result from `CALL` is not consumed by a conditional branch; it is popped at `pc 0x51`, and the artifact marks `returndata_checked` as unknown/null. No revert path is visible after the call.","locations":["selector:0x60fe47b1","pc:0x50","pc:0x51"]}]}
tokens used
37,042
{
"codex": {
"ran_at": "2026-04-04T21:03:38.210262+00:00",
"returncode": 0
},
"project": {
"mode": "bytecode",
"bytecode_length": 202,
"bytecode_truncated": false,
"capability_graph_present": true,
"analysis_artifact_present": true
},
"summary": "The runtime is a very small two-selector contract. One selector (`0x60fe47b1`) reads slot `0x0`, masks it to an address, and performs a low-level `CALL` with nonzero ETH value and no detected authorization check. The only other selector (`0x6d4ce63c`) returns the constant `0xff`. No proxy or `DELEGATECALL` behavior is present in the supplied bytecode. Findings below are conservative because naming and selector intent are inferred only from runtime bytecode.",
"raw_final": {
"summary": "The runtime is a very small two-selector contract. One selector (`0x60fe47b1`) reads slot `0x0`, masks it to an address, and performs a low-level `CALL` with nonzero ETH value and no detected authorization check. The only other selector (`0x6d4ce63c`) returns the constant `0xff`. No proxy or `DELEGATECALL` behavior is present in the supplied bytecode. Findings below are conservative because naming and selector intent are inferred only from runtime bytecode.",
"findings": [
{
"title": "Public entrypoint can force ETH transfer to the address stored in slot 0",
"category": "access_control",
"evidence": "At `pc 0x2d` the contract performs `SLOAD` from slot `0x0`; at `pc 0x50` it executes `CALL`. The analysis artifact reports no detected guards, one storage read from slot `0x0`, and a validated nonzero-value external call reachable from selector `0x60fe47b1`. The supplied bytecode contains no runtime storage writes, so the call target is whatever address was already installed in slot `0x0`.",
"severity": "medium",
"locations": [
"selector:0x60fe47b1",
"pc:0x2d",
"pc:0x50"
],
"recommendation": "If this payout/forwarding behavior is not meant to be public, add an explicit caller authorization check before the external call. If it is intended, constrain the reachable balance and document that anyone can trigger the transfer path.",
"exploit_scenario": "Any caller can invoke selector `0x60fe47b1`. The bytecode loads slot `0x0`, treats the low 20 bytes as the call target, and executes a value-bearing `CALL` without any detected guard. If this contract ever holds ETH, an attacker can repeatedly trigger this entrypoint to push funds out to that stored address until the balance is exhausted or calls start failing. Because only runtime bytecode is available, it is unclear whether this behavior is intentional, but there is no visible caller authorization in the deployed code."
},
{
"title": "Low-level ETH call ignores success/failure",
"category": "other",
"evidence": "The only external callsite is `CALL` at `pc 0x50`. The stack result from `CALL` is not consumed by a conditional branch; it is popped at `pc 0x51`, and the artifact marks `returndata_checked` as unknown/null. No revert path is visible after the call.",
"severity": "low",
"locations": [
"selector:0x60fe47b1",
"pc:0x50",
"pc:0x51"
],
"recommendation": "Check the `CALL` return value and revert or emit an explicit failure signal when the transfer does not succeed. If failure is intentionally tolerated, make that behavior explicit in surrounding protocol logic.",
"exploit_scenario": "The `CALL` result is immediately discarded with `POP`, and the function jumps to a normal `STOP` path. If the callee reverts or the transfer fails, upstream integrations may still treat the transaction as successful because this function does not bubble the error or return a failure indicator. That can create silent payout/accounting mismatches."
}
],
"no_findings": false
},
"no_findings": false,
"schema_version": 1
}
00000000: PUSH1 0x60 00000002: PUSH1 0x40 00000004: MSTORE 00000005: PUSH1 0xe0 00000007: PUSH1 0x02 00000009: EXP 0000000a: PUSH1 0x00 0000000c: CALLDATALOAD 0000000d: DIV 0000000e: PUSH4 0x60fe47b1 00000013: DUP2 00000014: EQ 00000015: PUSH1 0x24 00000017: JUMPI 00000018: DUP1 00000019: PUSH4 0x6d4ce63c 0000001e: EQ 0000001f: PUSH1 0x58 00000021: JUMPI 00000022: JUMPDEST 00000023: STOP 00000024: JUMPDEST 00000025: PUSH1 0x22 00000027: PUSH1 0x04 00000029: CALLDATALOAD 0000002a: PUSH1 0x00 0000002c: DUP1 0000002d: SLOAD 0000002e: PUSH20 0xffffffffffffffffffffffffffffffffffffffff 00000043: AND 00000044: SWAP1 00000045: PUSH1 0x01 00000047: PUSH1 0x60 00000049: DUP3 0000004a: DUP2 0000004b: DUP2 0000004c: DUP2 0000004d: DUP6 0000004e: DUP9 0000004f: DUP4 00000050: CALL 00000051: POP 00000052: POP 00000053: POP 00000054: POP 00000055: POP 00000056: POP 00000057: JUMP 00000058: JUMPDEST 00000059: PUSH1 0xff 0000005b: PUSH1 0x60 0000005d: SWAP1 0000005e: DUP2 0000005f: MSTORE 00000060: PUSH1 0x20 00000062: SWAP1 00000063: RETURN
Warning: This is a nightly build of Foundry. It is recommended to use the latest stable version. To mute this warning set `FOUNDRY_DISABLE_NIGHTLY_WARNING` in your environment.
| Severity | Category | Tool | Title | Confidence | Validated | Confirmed | Details |
|---|---|---|---|---|---|---|---|
| high | other | detector | ETH value transfer possible | 55 | yes | yes |
viewtrace_id: 0xff77c0006115c518bdd2e8a2c4b5a9013d8930a5c624d8cef7d573d37d7980c3
call_targets:
0x7aa73b556c0da8ca4e83e483d7404930e946473b, 0x9e0ae8ffd946d12d1d393c6f3bca0eecadc9428e
target_varies:
yes
classification:
target_varies
validation_json{
"sink": "CALL",
"errors": 0,
"status": "confirmed",
"attempts": 1,
"trace_id": "0xff77c0006115c518bdd2e8a2c4b5a9013d8930a5c624d8cef7d573d37d7980c3",
"confirmed": true,
"trace_mode": "callTracer",
"call_targets": [
"0x7aa73b556c0da8ca4e83e483d7404930e946473b",
"0x9e0ae8ffd946d12d1d393c6f3bca0eecadc9428e"
],
"matched_probe": null,
"target_varies": true,
"classification": "target_varies"
}
witness_json{
"notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
"constraints": [],
"entrypoints": [
{
"calldata": "0x60fe47b1",
"selector": "0x60fe47b1",
"calldata_variants": [
"0x60fe47b1",
"0x60fe47b10000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x6d4ce63c",
"selector": "0x6d4ce63c",
"calldata_variants": [
"0x6d4ce63c",
"0x6d4ce63c0000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 80,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "constant",
"target_expression_category": "computed"
}
],
"eth_value_calls": 1,
"guards_detected": []
}
|
| high | other | detector | Untrusted CALL target/value reachable | 60 | yes | yes |
viewtrace_id: 0xff77c0006115c518bdd2e8a2c4b5a9013d8930a5c624d8cef7d573d37d7980c3
call_targets:
0x7aa73b556c0da8ca4e83e483d7404930e946473b, 0x9e0ae8ffd946d12d1d393c6f3bca0eecadc9428e
target_varies:
yes
classification:
target_varies
validation_json{
"sink": "CALL",
"errors": 0,
"status": "confirmed",
"attempts": 1,
"trace_id": "0xff77c0006115c518bdd2e8a2c4b5a9013d8930a5c624d8cef7d573d37d7980c3",
"confirmed": true,
"trace_mode": "callTracer",
"call_targets": [
"0x7aa73b556c0da8ca4e83e483d7404930e946473b",
"0x9e0ae8ffd946d12d1d393c6f3bca0eecadc9428e"
],
"matched_probe": null,
"target_varies": true,
"classification": "target_varies"
}
witness_json{
"notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
"constraints": [],
"entrypoints": [
{
"calldata": "0x60fe47b1",
"selector": "0x60fe47b1",
"calldata_variants": [
"0x60fe47b1",
"0x60fe47b10000000000000000000000000000000000000000000000000000000000000000"
]
},
{
"calldata": "0x6d4ce63c",
"selector": "0x6d4ce63c",
"calldata_variants": [
"0x6d4ce63c",
"0x6d4ce63c0000000000000000000000000000000000000000000000000000000000000000"
]
}
]
}
evidence_json{
"examples": [
{
"pc": 80,
"opcode": "CALL",
"returndata_checked": null,
"value_expression_category": "constant",
"target_expression_category": "computed"
}
],
"call_count": 1,
"guards_detected": [],
"untrusted_call_count": 1
}
|
| medium | access_control | codex | Public entrypoint can force ETH transfer to the address stored in slot 0 | 75 | no | — |
viewevidence_json{
"evidence": "At `pc 0x2d` the contract performs `SLOAD` from slot `0x0`; at `pc 0x50` it executes `CALL`. The analysis artifact reports no detected guards, one storage read from slot `0x0`, and a validated nonzero-value external call reachable from selector `0x60fe47b1`. The supplied bytecode contains no runtime storage writes, so the call target is whatever address was already installed in slot `0x0`.",
"locations": [
"selector:0x60fe47b1",
"pc:0x2d",
"pc:0x50"
],
"recommendation": "If this payout/forwarding behavior is not meant to be public, add an explicit caller authorization check before the external call. If it is intended, constrain the reachable balance and document that anyone can trigger the transfer path.",
"exploit_scenario": "Any caller can invoke selector `0x60fe47b1`. The bytecode loads slot `0x0`, treats the low 20 bytes as the call target, and executes a value-bearing `CALL` without any detected guard. If this contract ever holds ETH, an attacker can repeatedly trigger this entrypoint to push funds out to that stored address until the balance is exhausted or calls start failing. Because only runtime bytecode is available, it is unclear whether this behavior is intentional, but there is no visible caller authorization in the deployed code."
}
|
| low | other | codex | Low-level ETH call ignores success/failure | 65 | no | — |
viewevidence_json{
"evidence": "The only external callsite is `CALL` at `pc 0x50`. The stack result from `CALL` is not consumed by a conditional branch; it is popped at `pc 0x51`, and the artifact marks `returndata_checked` as unknown/null. No revert path is visible after the call.",
"locations": [
"selector:0x60fe47b1",
"pc:0x50",
"pc:0x51"
],
"recommendation": "Check the `CALL` return value and revert or emit an explicit failure signal when the transfer does not succeed. If failure is intentionally tolerated, make that behavior explicit in surrounding protocol logic.",
"exploit_scenario": "The `CALL` result is immediately discarded with `POP`, and the function jumps to a normal `STOP` path. If the callee reverts or the transfer fails, upstream integrations may still treat the transaction as successful because this function does not bubble the error or return a failure indicator. That can create silent payout/accounting mismatches."
}
|