Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .github/workflows/aeon.yml
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,16 @@ jobs:
echo "::warning::could not materialize cron-state from the Issue; readers use the committed file"
fi

- name: Install Foundry (vuln-scanner PoC gate)
# High/Critical smart-contract findings must survive a deterministic test
# against a pinned live-chain fork before the skill may claim that severity.
# Install before stage-vuln-scanner so that script can wrap forge and leave
# machine-readable, redacted execution evidence.
if: steps.work.outputs.mode != '' && steps.skill.outputs.name == 'vuln-scanner'
uses: foundry-rs/foundry-toolchain@908c540300062bd5a7e473851cdb4282204cee09 # v1
with:
version: stable

- name: Stage vuln-scanner tools
# Purpose-built binary staging for vuln-scanner's scan arm — NOT a network
# workaround (there is no network sandbox). Installs semgrep/trufflehog/
Expand Down Expand Up @@ -1116,6 +1126,20 @@ jobs:
echo "${tool}=not-observed-or-not-applicable"
fi
done
if [ -s /tmp/vuln-scan/executions.log ] && grep -q '^forge \[redacted\]$' /tmp/vuln-scan/executions.log \
&& [ -s /tmp/vuln-scan/poc-executions.log ] && grep -q ' foundry-fork verified$' /tmp/vuln-scan/poc-executions.log; then
echo 'foundry-poc=verified'
elif [ -s /tmp/vuln-scan/poc-executions.log ] && grep -q ' foundry-fork failed$' /tmp/vuln-scan/poc-executions.log; then
echo 'foundry-poc=failed'
else
echo 'foundry-poc=not-observed-or-not-applicable'
fi
echo '--- PoC gate verdicts (redacted) ---'
if [ -s /tmp/vuln-scan/poc-executions.log ]; then
cat /tmp/vuln-scan/poc-executions.log
else
echo 'poc-gate=not-observed-or-not-applicable'
fi

# Undo "Single-source standing instructions" so the working tree matches HEAD
# before any capture/guard/commit step runs. always(): the file must come back
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/ci-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -127,3 +127,5 @@ jobs:
run: bash scripts/tests/test_secretcurl.sh
- name: secretcurl xai retry tests
run: bash scripts/tests/test_secretcurl_xai_retry.sh
- name: vuln-scanner PoC gate tests
run: bash scripts/tests/test_vuln_poc_gate.sh
2 changes: 1 addition & 1 deletion catalog/packs.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion catalog/skills.json

Large diffs are not rendered by default.

64 changes: 32 additions & 32 deletions eyebrowlock.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"version": 1,
"generatedAt": "2026-08-28T06:04:26.259698526Z",
"generator": "eyebrow/0.4.1",
"generatedAt": "2026-09-01T18:42:28.321251Z",
"generator": "eyebrow/0.4.2",
"artifacts": [
{
"id": "019b953b97c439b3",
Expand Down Expand Up @@ -117,7 +117,7 @@
"files": [
{
"path": "SKILL.md",
"hash": "a48fb63798be19f958820e880efc6f1f5cf0d242d6937eb26c4c02b79bb32bd5"
"hash": "b17491de609e1fa3b241a55012e60f21d63eaaac6ad9251c43509f40ec635872"
}
],
"findings": [
Expand All @@ -126,7 +126,7 @@
"severity": "critical",
"owasp": "ASK-01",
"file": "SKILL.md",
"line": 105,
"line": 108,
"snippet": "network is open, but `pip install` / `curl | sh` / `tar` are **not** on the in-run",
"explanation": "downloads and executes remote code via a pipe to a shell"
},
Expand All @@ -135,7 +135,7 @@
"severity": "critical",
"owasp": "ASK-01",
"file": "SKILL.md",
"line": 119,
"line": 122,
"snippet": "# open, but `pip install` / `curl | sh` / `tar` are NOT allow-listed — `python3 -m pip`,",
"explanation": "downloads and executes remote code via a pipe to a shell"
},
Expand All @@ -144,7 +144,7 @@
"severity": "medium",
"owasp": "ASK-03",
"file": "SKILL.md",
"line": 301,
"line": 304,
"snippet": "- `exec` / `spawn` / `system` / `eval` sinks + subprocess with string interpolation (RCE)",
"explanation": "uses a process-execution primitive"
},
Expand All @@ -153,12 +153,12 @@
"severity": "critical",
"owasp": "ASK-01",
"file": "SKILL.md",
"line": 872,
"line": 1013,
"snippet": "1. **Install** — the binaries (`semgrep`, `trufflehog`, `osv-scanner`, `slither`) are **not pre-installed**. Stage the…",
"explanation": "downloads and executes remote code via a pipe to a shell"
}
],
"contentHash": "sha256-a9cdb0547fa559f53196eef12f5459c6d1f8bace3a56fa257f809e4f309cb1c5",
"contentHash": "sha256-a81f0757d7b3bafe3baaa0c3d2c0e735eb284a7ebc9768264bdfe4e747b4aa9a",
"discoveredFrom": "skills/vuln-scanner/SKILL.md"
},
{
Expand Down Expand Up @@ -556,10 +556,10 @@
"files": [
{
"path": "SKILL.md",
"hash": "1b7a7503ca8a5fb3093853fb9ccfbccd206f5893b94ffb3ea8605d0d9f6f53a3"
"hash": "dfd812e4832da6958646746980e56d48f28a8a33bd2878cc0450ee84ebab69d4"
}
],
"contentHash": "sha256-f1b469d77f153c0a5eec34db24314d660c710d615df37dcf033c1127397b90f0",
"contentHash": "sha256-439f8e6953ca04fcf91b4d877bb66c5c09ec3ca20002adfe7b638f3374b43a42",
"discoveredFrom": "skills/skill-health/SKILL.md"
},
{
Expand Down Expand Up @@ -794,10 +794,10 @@
"files": [
{
"path": "SKILL.md",
"hash": "e5b436589402192933985c99e9f8fb2777df90147e879f2dc122d8ca88f6442b"
"hash": "35046f50614be666d0dd1a24d1540c24385f9c2d457b7bb35bb74abb2847595c"
}
],
"contentHash": "sha256-d5fc3ca382e466c15ae2645ea5ac219b66768d3cf5766148e0bac4396015a78a",
"contentHash": "sha256-41491fa777d21f338ea9bd2231e9fe389b5fc2c81616dbc832a41043bc1d187e",
"discoveredFrom": "skills/cortx-reliability/SKILL.md"
},
{
Expand Down Expand Up @@ -968,10 +968,10 @@
"files": [
{
"path": "SKILL.md",
"hash": "48ae451ff50ce7a5159526a0a92fb6654140bf977dcfb07f461b0ec0d6451eda"
"hash": "963c9d733523db9f0d66f6db28f75f437a1a1d95ee5b1efdd9ab7cdab8f738ef"
}
],
"contentHash": "sha256-63b2ce8d21137ebfb591b9bec26624ef27304ba73259bcd4373e1408044bd846",
"contentHash": "sha256-d3433068bf4a4a282db862cf93c2bc99b9d574c57fa406d4039a09699c8a4dda",
"discoveredFrom": "skills/changelog/SKILL.md"
},
{
Expand Down Expand Up @@ -1048,10 +1048,10 @@
"files": [
{
"path": "SKILL.md",
"hash": "dbc6ff98f4b697057fb4f5ca9b54cca784fe7072405c9fd47b4c35003bc629e8"
"hash": "25d7ec4b7c050449d30e56690b97bd456fe66b0c760e885c02832510b1339d62"
}
],
"contentHash": "sha256-3dafe59f0899927f2a3388ef397864d09cff2acdbd7b1ffbe763808d1a286939",
"contentHash": "sha256-36f7e1683c471664fc7e4a890bfb71e62cc6c0ee602a05318191dd1b004a9c51",
"discoveredFrom": "skills/skill-repair/SKILL.md"
},
{
Expand Down Expand Up @@ -1489,39 +1489,39 @@
"files": [
{
"path": "SKILL.md",
"hash": "e232a3a30edfd6b50f5a30b093eb67211df1db01febbc09c75a4106da06539c1"
"hash": "605b296d976df6631c7d9d5310442a9f933794ba32188136b7e342bb635b4dfc"
},
{
"path": "hook-deploy.sh",
"hash": "5517faced14159c24097dc5f083b3b0589c96cd4f1412075c76745c800a5f973"
"hash": "923ac9765f435569d322c24cf4de4ccafb1ecd190901ecc75a5538900cc072b5"
},
{
"path": "templates/DeployHook.s.sol",
"hash": "bb8f34ae0cad023d6c1cc1c7d2932e7faa40abef37f3fcfeac86e3eb2d5ce4c9"
"hash": "c97173a47b3bf4aeddb75e901033ed2d01a6903987d47cbdff94544dbd9e2f95"
},
{
"path": "templates/DynamicFeeHook.sol",
"hash": "54a05fed29a08a944501e97bc5c755351f6cf1babb71223b13037a1eb69836d2"
"hash": "e7a5e1a5b91e2e7db4e0cc3c793a2063ead9b9183f986c0892e2fa4bf95df8b8"
},
{
"path": "templates/Hook.sol",
"hash": "d233189f839a0ea113e1db02afd087f83b5a2608ca21a3639ad3299f6d45ebd3"
"hash": "7e63be28d67741a2b27a6db74553032d08e5555b7e1e2ef7e9c2c2d4cde82242"
},
{
"path": "templates/Hook.t.sol",
"hash": "f563b5261e35565939b9ad10e9ebd1eb3838cf3fd85beb3872de58a704e1656b"
},
{
"path": "templates/HookFeeHook.sol",
"hash": "7997835d61aa796c361f849bf6b7eb4667a21a8646a9b48aa08fc6497815c3f9"
"hash": "bb0e7a7bf69ea6c1cee61cee8080ba190e2085f0e1aac26aaadaaa73b9a4f511"
},
{
"path": "templates/MockERC20.sol",
"hash": "94e490eb5d82a0866f8f4d1ceb288b6bacd89c85820c382c02e567997e37b0fd"
},
{
"path": "templates/NoOpHook.sol",
"hash": "0a5eecbd92a4115fd6a1436a21563bef003d08b4bcf071f3540e20f2b166d43f"
"hash": "a902c6d2ba1914c36da3f475b24e5b5f300f74386d207247e398eed8651fcc29"
},
{
"path": "templates/chains.tsv",
Expand Down Expand Up @@ -1551,7 +1551,7 @@
"severity": "high",
"owasp": "ASK-06",
"file": "SKILL.md",
"line": 70,
"line": 116,
"snippet": "- **Freeform mode** (anything else): write the whole hook into `$HOOKBUILD_DIR/src/Hook.sol` — replace the `// --- AEO…",
"explanation": "references sensitive credential or secret paths"
},
Expand All @@ -1578,7 +1578,7 @@
"severity": "high",
"owasp": "ASK-06",
"file": "hook-deploy.sh",
"line": 175,
"line": 200,
"snippet": "[ -f hook.env ] \u0026\u0026 . ./hook.env",
"explanation": "references sensitive credential or secret paths"
},
Expand Down Expand Up @@ -1610,7 +1610,7 @@
"explanation": "references sensitive credential or secret paths"
}
],
"contentHash": "sha256-7f4d0f86055e92ebef05c8fab531bd678081d005a426f8dec475a019f68070b5",
"contentHash": "sha256-aa6b3cb711be49025443c10a749f3a4f11a5c7468f8cc9125f09009f9033c2b6",
"discoveredFrom": "skills/deploy-uni-hook/SKILL.md"
},
{
Expand Down Expand Up @@ -2071,7 +2071,7 @@
"files": [
{
"path": "SKILL.md",
"hash": "3886dade499b296f43f31ec5ecb2ee48d8c6c597cc4b88fd84d14984289eddf1"
"hash": "ee643687f351dbd256b18477706860852689592786aeef358b74f04fca2310c8"
},
{
"path": "references/ci.md",
Expand All @@ -2083,26 +2083,26 @@
},
{
"path": "references/layout.md",
"hash": "97900b5b0acdad8299e7382df3349198dbe5f1da828233692195649a2c6b53b0"
"hash": "087f9a34009dfa38dd8745c36c1d0e2e79a293f2f156fea0a9d343531d4e3373"
},
{
"path": "references/mcp.md",
"hash": "8808fcb6390d1bd8d6cdd2d0db6e312c81f91ad161392d166e64645dc528c66e"
"hash": "58c74b3a95abaaf1328568b873892a014a8f802f2d0e732acaa1ca3935d72875"
},
{
"path": "references/secrets.md",
"hash": "f81782fbe44734e7887a749ce1aac5d48bcfab497920c5e34c68c12bac8b2535"
"hash": "76b8105069a91632daba058cfdd7afec0e3b6ee9542b083b99b4601a73fbcd96"
},
{
"path": "references/skill-anatomy.md",
"hash": "679e818a8cc607d1e82cc7f896e982a0123cf073ed9c624a9f8c2fd0da845c67"
"hash": "009f52527d7407ad8b388209c573fac29cd07190d99a2ea52b0bbc4512f60d3d"
},
{
"path": "scripts/mine-history.mjs",
"hash": "0edc7445542a21cb5518e813a6ae462a1d469636601a799efc1bec86b4058c5a"
}
],
"contentHash": "sha256-8bd79c2aae5f6479bd74dc5b327f31da06add2bc9be78d5b62fecc742697c843",
"contentHash": "sha256-c43ac760993f8c41c7aa85b20ce6b53b948607d61d767f21d321f3b9853aa5e5",
"discoveredFrom": ".claude/skills/aeon/SKILL.md"
},
{
Expand Down
3 changes: 3 additions & 0 deletions scripts/skill_mode.sh
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,9 @@ WRITE_TOOLS="$WRITE_TOOLS,Bash(semgrep:*),Bash(osv-scanner:*),Bash(trufflehog:*)
# reaches for it when the clone already ships fuzz/fuzz_targets; the guard lives
# in the skill, not here.
WRITE_TOOLS="$WRITE_TOOLS,Bash(cargo:*)"
# High/Critical code findings must pass this key-scrubbing, evidence-producing
# runner before vuln-scanner may claim the severity or route a disclosure.
WRITE_TOOLS="$WRITE_TOOLS,Bash(./scripts/vuln-poc-gate.sh:*)"
# Foundry bare-names + the key-safe runner for deploy-uni-hook. Foundry is staged by
# scripts/stage-deploy-uni-hook.sh (the sandbox denies in-run installs); the skill then
# builds/simulates/broadcasts by bare name. `./hook-deploy.sh` hides the deployer key
Expand Down
21 changes: 21 additions & 0 deletions scripts/stage-vuln-scanner.sh
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ record() { echo "$1=$2" >> "$MANIFEST"; } # tool=installed|fail|skipped
# post-run workflow check reads this file; model prose is not execution evidence.
EXEC_LOG=/tmp/vuln-scan/executions.log
: > "$EXEC_LOG"
POC_EXEC_LOG=/tmp/vuln-scan/poc-executions.log
: > "$POC_EXEC_LOG"

instrument() { # command name, real executable
local name="$1" real="$2" wrapper="$BIN/$1"
Expand All @@ -59,6 +61,17 @@ EOF
chmod +x "$wrapper"
}

instrument_redacted() { # command name, real executable, fixed evidence label
local name="$1" real="$2" label="$3" wrapper="$BIN/$1"
[ -x "$real" ] || return 0
cat > "$wrapper" <<EOF
#!/usr/bin/env bash
printf '%s %s\n' '$name' '$label' >> '$EXEC_LOG'
exec '$real' "\$@"
EOF
chmod +x "$wrapper"
}

pip_install() { # package
pip install --quiet "$1" 2>/dev/null \
|| pip3 install --quiet "$1" 2>/dev/null \
Expand Down Expand Up @@ -141,6 +154,14 @@ instrument trufflehog "$BIN/trufflehog"
instrument osv-scanner "$BIN/osv-scanner"
instrument slither "$(command -v slither 2>/dev/null || true)"
instrument cargo-fuzz "$(command -v cargo-fuzz 2>/dev/null || true)"
# Keep private finding paths, test names, and fork arguments out of the public
# workflow evidence log. The gate's redacted result proves whether the PoC ran.
if command -v forge >/dev/null 2>&1; then
instrument_redacted forge "$(command -v forge)" '[redacted]'
record forge installed
else
record forge fail
fi

log "manifest (/tmp/vuln-scan/prefetch.txt):"
cat "$MANIFEST"
8 changes: 8 additions & 0 deletions scripts/tests/fixtures/vuln-poc-foundry/foundry.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[profile.default]
src = "src"
test = "test"
solc_version = "0.8.26"
evm_version = "cancun"

[fmt]
line_length = 100
4 changes: 4 additions & 0 deletions scripts/tests/fixtures/vuln-poc-foundry/src/Fixture.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract Fixture {}
54 changes: 54 additions & 0 deletions scripts/tests/live_vuln_poc_gate.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#!/usr/bin/env bash
# Opt-in network smoke test for the real Foundry/fork path. Not run in CI because
# public RPC availability is external state. It proves the gate reads a live Base
# block and executes a private test against that pinned fork.
set -euo pipefail
cd "$(dirname "$0")/../.."

POC_DIR="$(mktemp -d)"
RESULT_DIR="$(mktemp -d)"
trap 'rm -rf "$POC_DIR" "$RESULT_DIR"' EXIT
TARGET="$POC_DIR/target"
mkdir -p "$TARGET/src"
# Copy only canonical inputs. A prior local/agent build may have left untracked
# cache/ or out/ artifacts beside the fixture; committing those into the isolated
# repo would make the next Forge build look like a target-source mutation.
cp scripts/tests/fixtures/vuln-poc-foundry/foundry.toml "$TARGET/foundry.toml"
cp scripts/tests/fixtures/vuln-poc-foundry/src/Fixture.sol "$TARGET/src/Fixture.sol"
git -C "$TARGET" init -q
git -C "$TARGET" config user.email test@example.com
git -C "$TARGET" config user.name test
git -C "$TARGET" add .
git -C "$TARGET" commit -qm fixture
COMMIT="$(git -C "$TARGET" rev-parse HEAD)"

cat > "$POC_DIR/finding.json" <<EOF
{"id":"live-fork-smoke","target_repo":"aeonfun/aeon","target_commit":"$COMMIT","severity":"high","attacker_controls":"synthetic input used only by the integration smoke test","attacker_achieves":"synthetic outcome used only to exercise the verification runner"}
EOF
cat > "$POC_DIR/poc.t.sol" <<'EOF'
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract AeonPoC {
// WETH9 is deployed on Base. Reading its code proves this test is executing
// against real fork state rather than an empty local EVM.
address constant BASE_WETH = 0x4200000000000000000000000000000000000006;

function test_poc_reads_real_base_state() public view {
require(BASE_WETH.code.length > 0, "Base WETH missing from fork state");
}
}
EOF

VULN_POC_DIR="$POC_DIR" VULN_POC_RESULTS_DIR="$RESULT_DIR" \
bash scripts/vuln-poc-gate.sh foundry \
--finding "$POC_DIR/finding.json" \
--repo "$TARGET" \
--test-file "$POC_DIR/poc.t.sol" \
--chain base \
--match-contract AeonPoC \
--match-test '^test_poc_'

jq -e '.verdict == "verified" and .verifier == "foundry-fork" and .chain_id == "8453" and (.fork_block | tonumber) > 0' \
"$RESULT_DIR/live-fork-smoke.json" >/dev/null
echo "live-vuln-poc-gate: PASS"
Loading