opencode-skills-collection 4.0.68 → 4.0.69
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundled-skills/.antigravity-install-manifest.json +266 -1
- package/bundled-skills/access-review/SKILL.md +394 -0
- package/bundled-skills/access-review/references/details.md +121 -0
- package/bundled-skills/agent-evals/SKILL.md +420 -0
- package/bundled-skills/agent-observability/SKILL.md +346 -0
- package/bundled-skills/agent-observability/references/details.md +786 -0
- package/bundled-skills/ai-agent-security/SKILL.md +393 -0
- package/bundled-skills/ai-agent-security/references/details.md +912 -0
- package/bundled-skills/ai-coding-agent-guardrails/SKILL.md +442 -0
- package/bundled-skills/ai-coding-agent-guardrails/references/details.md +753 -0
- package/bundled-skills/ai-inference-service-mesh/SKILL.md +449 -0
- package/bundled-skills/ai-pipeline-orchestration/SKILL.md +287 -0
- package/bundled-skills/ai-red-teaming/SKILL.md +409 -0
- package/bundled-skills/ai-security-hardening/SKILL.md +343 -0
- package/bundled-skills/ai-sre-incident-response/SKILL.md +336 -0
- package/bundled-skills/alerting-oncall/SKILL.md +458 -0
- package/bundled-skills/alerting-oncall/references/details.md +84 -0
- package/bundled-skills/apk-redteam-pipeline/SKILL.md +446 -0
- package/bundled-skills/argocd-gitops/SKILL.md +469 -0
- package/bundled-skills/arm-templates/SKILL.md +438 -0
- package/bundled-skills/arm-templates/references/details.md +64 -0
- package/bundled-skills/asset-inventory/SKILL.md +412 -0
- package/bundled-skills/asset-inventory/references/details.md +127 -0
- package/bundled-skills/audit-logging/SKILL.md +476 -0
- package/bundled-skills/aws-cloudtrail/SKILL.md +486 -0
- package/bundled-skills/aws-cost-optimization/SKILL.md +331 -0
- package/bundled-skills/aws-ec2/SKILL.md +426 -0
- package/bundled-skills/aws-ecs-fargate/SKILL.md +388 -0
- package/bundled-skills/aws-iam/SKILL.md +463 -0
- package/bundled-skills/aws-lambda/SKILL.md +428 -0
- package/bundled-skills/aws-rds/SKILL.md +380 -0
- package/bundled-skills/aws-s3/SKILL.md +434 -0
- package/bundled-skills/aws-secrets-manager/SKILL.md +486 -0
- package/bundled-skills/aws-vpc/SKILL.md +436 -0
- package/bundled-skills/azure-ai-document-intelligence-ts/SKILL.md +1 -1
- package/bundled-skills/azure-aks/SKILL.md +423 -0
- package/bundled-skills/azure-devops/SKILL.md +457 -0
- package/bundled-skills/azure-functions-devsec/SKILL.md +436 -0
- package/bundled-skills/azure-keyvault/SKILL.md +455 -0
- package/bundled-skills/azure-keyvault/references/details.md +83 -0
- package/bundled-skills/azure-monitor-audit/SKILL.md +379 -0
- package/bundled-skills/azure-networking/SKILL.md +448 -0
- package/bundled-skills/azure-networking/references/details.md +135 -0
- package/bundled-skills/azure-sql/SKILL.md +413 -0
- package/bundled-skills/azure-sql/references/details.md +113 -0
- package/bundled-skills/azure-vms/SKILL.md +402 -0
- package/bundled-skills/azure-vms/references/details.md +134 -0
- package/bundled-skills/backup-recovery/SKILL.md +388 -0
- package/bundled-skills/bb-methodology/SKILL.md +451 -0
- package/bundled-skills/bb-methodology/references/details.md +120 -0
- package/bundled-skills/block-storage/SKILL.md +371 -0
- package/bundled-skills/blue-green-deploy/SKILL.md +453 -0
- package/bundled-skills/blue-green-deploy/references/details.md +90 -0
- package/bundled-skills/bug-bounty/SKILL.md +447 -0
- package/bundled-skills/bug-bounty/references/details.md +1316 -0
- package/bundled-skills/bugcrowd-reporting/SKILL.md +351 -0
- package/bundled-skills/business-continuity/SKILL.md +463 -0
- package/bundled-skills/career-ops/SKILL.md +186 -0
- package/bundled-skills/cdn-setup/SKILL.md +374 -0
- package/bundled-skills/change-management/SKILL.md +438 -0
- package/bundled-skills/change-management/references/details.md +105 -0
- package/bundled-skills/circleci/SKILL.md +475 -0
- package/bundled-skills/cis-benchmarks/SKILL.md +150 -0
- package/bundled-skills/cloudflare-pages/SKILL.md +318 -0
- package/bundled-skills/cloudflare-r2/SKILL.md +353 -0
- package/bundled-skills/cloudflare-workers/SKILL.md +415 -0
- package/bundled-skills/cloudflare-zero-trust/SKILL.md +361 -0
- package/bundled-skills/cloudformation/SKILL.md +461 -0
- package/bundled-skills/constraint-driven-development/SKILL.md +335 -0
- package/bundled-skills/constraint-driven-development/references/floor-guard.md +99 -0
- package/bundled-skills/container-hardening/SKILL.md +126 -0
- package/bundled-skills/container-registries/SKILL.md +435 -0
- package/bundled-skills/container-scanning/SKILL.md +416 -0
- package/bundled-skills/convex-backend/SKILL.md +338 -0
- package/bundled-skills/dast-scanning/SKILL.md +437 -0
- package/bundled-skills/database-backups/SKILL.md +425 -0
- package/bundled-skills/datadog/SKILL.md +487 -0
- package/bundled-skills/dependency-scanning/SKILL.md +457 -0
- package/bundled-skills/devcontainers-nix/SKILL.md +416 -0
- package/bundled-skills/disaster-recovery/SKILL.md +374 -0
- package/bundled-skills/disaster-recovery/references/details.md +219 -0
- package/bundled-skills/dns-management/SKILL.md +375 -0
- package/bundled-skills/docker-compose/SKILL.md +482 -0
- package/bundled-skills/docker-management/SKILL.md +426 -0
- package/bundled-skills/ebpf-observability/SKILL.md +436 -0
- package/bundled-skills/ebpf-observability/references/details.md +542 -0
- package/bundled-skills/elk-stack/SKILL.md +487 -0
- package/bundled-skills/enterprise-vpn-attack/SKILL.md +395 -0
- package/bundled-skills/evidence-hygiene/SKILL.md +404 -0
- package/bundled-skills/feature-flags/SKILL.md +426 -0
- package/bundled-skills/feature-flags/references/details.md +86 -0
- package/bundled-skills/fedramp-compliance/SKILL.md +453 -0
- package/bundled-skills/firebase-app-platform/SKILL.md +381 -0
- package/bundled-skills/firewall-config/SKILL.md +479 -0
- package/bundled-skills/gcp-audit-logs/SKILL.md +452 -0
- package/bundled-skills/gcp-audit-logs/references/details.md +56 -0
- package/bundled-skills/gcp-cloud-functions/SKILL.md +284 -0
- package/bundled-skills/gcp-cloud-sql/SKILL.md +277 -0
- package/bundled-skills/gcp-compute/SKILL.md +319 -0
- package/bundled-skills/gcp-gke/SKILL.md +307 -0
- package/bundled-skills/gcp-networking/SKILL.md +293 -0
- package/bundled-skills/gcp-secret-manager/SKILL.md +421 -0
- package/bundled-skills/gcp-secret-manager/references/details.md +131 -0
- package/bundled-skills/gdpr-compliance/SKILL.md +451 -0
- package/bundled-skills/gdpr-compliance/references/details.md +145 -0
- package/bundled-skills/geo-audit/SKILL.md +368 -0
- package/bundled-skills/geo-brand-mentions/SKILL.md +68 -0
- package/bundled-skills/geo-brand-mentions/references/details.md +471 -0
- package/bundled-skills/geo-citability/SKILL.md +350 -0
- package/bundled-skills/geo-compare/SKILL.md +340 -0
- package/bundled-skills/geo-content/SKILL.md +383 -0
- package/bundled-skills/geo-crawlers/SKILL.md +408 -0
- package/bundled-skills/geo-llmstxt/SKILL.md +464 -0
- package/bundled-skills/geo-platform-optimizer/SKILL.md +314 -0
- package/bundled-skills/geo-proposal/SKILL.md +378 -0
- package/bundled-skills/geo-prospect/SKILL.md +225 -0
- package/bundled-skills/geo-report/SKILL.md +436 -0
- package/bundled-skills/geo-report-pdf/SKILL.md +157 -0
- package/bundled-skills/geo-schema/SKILL.md +408 -0
- package/bundled-skills/geo-technical/SKILL.md +78 -0
- package/bundled-skills/geo-technical/references/details.md +543 -0
- package/bundled-skills/git-workflow/SKILL.md +460 -0
- package/bundled-skills/github-actions/SKILL.md +368 -0
- package/bundled-skills/gitlab-ci/SKILL.md +340 -0
- package/bundled-skills/gpu-kubernetes-operations/SKILL.md +468 -0
- package/bundled-skills/gpu-server-management/SKILL.md +236 -0
- package/bundled-skills/hashicorp-vault/SKILL.md +408 -0
- package/bundled-skills/helm-charts/SKILL.md +469 -0
- package/bundled-skills/hipaa-compliance/SKILL.md +451 -0
- package/bundled-skills/hunt-aspnet/SKILL.md +321 -0
- package/bundled-skills/hunt-ato/SKILL.md +184 -0
- package/bundled-skills/hunt-auth-bypass/SKILL.md +426 -0
- package/bundled-skills/hunt-auth-bypass/references/details.md +80 -0
- package/bundled-skills/hunt-brute-force/SKILL.md +341 -0
- package/bundled-skills/hunt-business-logic/SKILL.md +281 -0
- package/bundled-skills/hunt-cache-poison/SKILL.md +382 -0
- package/bundled-skills/hunt-captcha-bypass/SKILL.md +136 -0
- package/bundled-skills/hunt-cicd/SKILL.md +311 -0
- package/bundled-skills/hunt-clickjacking/SKILL.md +110 -0
- package/bundled-skills/hunt-cors/SKILL.md +335 -0
- package/bundled-skills/hunt-dom/SKILL.md +323 -0
- package/bundled-skills/hunt-exceptional-conditions/SKILL.md +111 -0
- package/bundled-skills/hunt-file-upload/SKILL.md +202 -0
- package/bundled-skills/hunt-fintech-graphql/SKILL.md +289 -0
- package/bundled-skills/hunt-forgot-password/SKILL.md +114 -0
- package/bundled-skills/hunt-grpc/SKILL.md +317 -0
- package/bundled-skills/hunt-host-header/SKILL.md +309 -0
- package/bundled-skills/hunt-html-injection/SKILL.md +106 -0
- package/bundled-skills/hunt-http-smuggling/SKILL.md +129 -0
- package/bundled-skills/hunt-http-smuggling/references/phase2h-smuggling-cachepoison.md +177 -0
- package/bundled-skills/hunt-idor/SKILL.md +434 -0
- package/bundled-skills/hunt-jwt-crypto/SKILL.md +221 -0
- package/bundled-skills/hunt-k8s/SKILL.md +337 -0
- package/bundled-skills/hunt-laravel/SKILL.md +255 -0
- package/bundled-skills/hunt-ldap/SKILL.md +351 -0
- package/bundled-skills/hunt-lfi/SKILL.md +311 -0
- package/bundled-skills/hunt-llm-ai/SKILL.md +289 -0
- package/bundled-skills/hunt-mfa-bypass/SKILL.md +177 -0
- package/bundled-skills/hunt-misc/SKILL.md +378 -0
- package/bundled-skills/hunt-nextjs/SKILL.md +299 -0
- package/bundled-skills/hunt-nodejs/SKILL.md +263 -0
- package/bundled-skills/hunt-nosqli/SKILL.md +210 -0
- package/bundled-skills/hunt-ntlm-info/SKILL.md +314 -0
- package/bundled-skills/hunt-oauth/SKILL.md +459 -0
- package/bundled-skills/hunt-open-redirect/SKILL.md +223 -0
- package/bundled-skills/hunt-race-condition/SKILL.md +381 -0
- package/bundled-skills/hunt-race-condition/references/details.md +159 -0
- package/bundled-skills/hunt-rag-vector/SKILL.md +212 -0
- package/bundled-skills/hunt-rce/SKILL.md +444 -0
- package/bundled-skills/hunt-rce/references/details.md +110 -0
- package/bundled-skills/hunt-saml/SKILL.md +156 -0
- package/bundled-skills/hunt-session/SKILL.md +342 -0
- package/bundled-skills/hunt-shadow-api/SKILL.md +198 -0
- package/bundled-skills/hunt-source-leak/SKILL.md +345 -0
- package/bundled-skills/hunt-spa-api/SKILL.md +163 -0
- package/bundled-skills/hunt-springboot/SKILL.md +285 -0
- package/bundled-skills/hunt-sqli/SKILL.md +466 -0
- package/bundled-skills/hunt-ssrf/SKILL.md +396 -0
- package/bundled-skills/hunt-ssrf/references/details.md +179 -0
- package/bundled-skills/hunt-ssti/SKILL.md +163 -0
- package/bundled-skills/hunt-subdomain/SKILL.md +379 -0
- package/bundled-skills/hunt-tls-network/SKILL.md +399 -0
- package/bundled-skills/hunt-xxe/SKILL.md +466 -0
- package/bundled-skills/i-have-adhd/SKILL.md +170 -0
- package/bundled-skills/identity-access-management/SKILL.md +382 -0
- package/bundled-skills/identity-access-management/references/details.md +524 -0
- package/bundled-skills/incident-management/SKILL.md +484 -0
- package/bundled-skills/incident-response/SKILL.md +448 -0
- package/bundled-skills/incident-response/references/details.md +113 -0
- package/bundled-skills/interview-me/SKILL.md +248 -0
- package/bundled-skills/iso27001-compliance/SKILL.md +460 -0
- package/bundled-skills/jenkins/SKILL.md +462 -0
- package/bundled-skills/jev-use/SKILL.md +158 -0
- package/bundled-skills/kubernetes-hardening/SKILL.md +154 -0
- package/bundled-skills/kubernetes-ops/SKILL.md +449 -0
- package/bundled-skills/kubernetes-ops/references/details.md +108 -0
- package/bundled-skills/kustomize/SKILL.md +478 -0
- package/bundled-skills/linux-administration/SKILL.md +367 -0
- package/bundled-skills/linux-hardening/SKILL.md +154 -0
- package/bundled-skills/llm-app-security/SKILL.md +389 -0
- package/bundled-skills/llm-app-security/references/details.md +674 -0
- package/bundled-skills/llm-caching/SKILL.md +334 -0
- package/bundled-skills/llm-cost-optimization/SKILL.md +311 -0
- package/bundled-skills/llm-fine-tuning/SKILL.md +329 -0
- package/bundled-skills/llm-gateway/SKILL.md +282 -0
- package/bundled-skills/llm-inference-scaling/SKILL.md +286 -0
- package/bundled-skills/llmops-platform-engineering/SKILL.md +472 -0
- package/bundled-skills/load-balancing/SKILL.md +403 -0
- package/bundled-skills/loki-logging/SKILL.md +479 -0
- package/bundled-skills/m365-entra-attack/SKILL.md +423 -0
- package/bundled-skills/mac-mini-llm-lab/SKILL.md +350 -0
- package/bundled-skills/mcp-server-security/SKILL.md +356 -0
- package/bundled-skills/mcp-server-security/references/details.md +745 -0
- package/bundled-skills/mdm-device-management/SKILL.md +404 -0
- package/bundled-skills/mdm-device-management/references/details.md +410 -0
- package/bundled-skills/meme-coin-audit/SKILL.md +402 -0
- package/bundled-skills/mid-engagement-ir-detection/SKILL.md +377 -0
- package/bundled-skills/model-registry-governance/SKILL.md +452 -0
- package/bundled-skills/model-serving-kubernetes/SKILL.md +339 -0
- package/bundled-skills/model-supply-chain-security/SKILL.md +427 -0
- package/bundled-skills/mongodb/SKILL.md +436 -0
- package/bundled-skills/multi-tenant-llm-hosting/SKILL.md +435 -0
- package/bundled-skills/multi-tenant-llm-hosting/references/details.md +211 -0
- package/bundled-skills/mysql/SKILL.md +390 -0
- package/bundled-skills/new-relic/SKILL.md +472 -0
- package/bundled-skills/nfs-storage/SKILL.md +356 -0
- package/bundled-skills/object-storage/SKILL.md +378 -0
- package/bundled-skills/offensive-osint/SKILL.md +443 -0
- package/bundled-skills/okta-attack/SKILL.md +436 -0
- package/bundled-skills/ollama-stack/SKILL.md +379 -0
- package/bundled-skills/openclaw-deployment-hardening/SKILL.md +135 -0
- package/bundled-skills/openclaw-local-mac-mini/SKILL.md +426 -0
- package/bundled-skills/openclaw-local-mac-mini/references/details.md +221 -0
- package/bundled-skills/openclaw-security-hardening/SKILL.md +135 -0
- package/bundled-skills/openshift/SKILL.md +485 -0
- package/bundled-skills/opentelemetry/SKILL.md +438 -0
- package/bundled-skills/opentelemetry/references/details.md +78 -0
- package/bundled-skills/opentofu-migration/SKILL.md +349 -0
- package/bundled-skills/osint-methodology/SKILL.md +460 -0
- package/bundled-skills/osint-methodology/references/details.md +1350 -0
- package/bundled-skills/pci-dss-compliance/SKILL.md +446 -0
- package/bundled-skills/penetration-testing/SKILL.md +152 -0
- package/bundled-skills/performance-tuning/SKILL.md +381 -0
- package/bundled-skills/planetscale/SKILL.md +297 -0
- package/bundled-skills/platform-engineering/SKILL.md +348 -0
- package/bundled-skills/platform-engineering/references/details.md +944 -0
- package/bundled-skills/podman/SKILL.md +405 -0
- package/bundled-skills/policy-as-code/SKILL.md +434 -0
- package/bundled-skills/policy-as-code/references/details.md +204 -0
- package/bundled-skills/postgresql-devsec/SKILL.md +378 -0
- package/bundled-skills/prometheus-grafana/SKILL.md +469 -0
- package/bundled-skills/prompt-injection-defense/SKILL.md +483 -0
- package/bundled-skills/rag-infrastructure/SKILL.md +269 -0
- package/bundled-skills/rag-observability-evals/SKILL.md +444 -0
- package/bundled-skills/rag-observability-evals/references/details.md +92 -0
- package/bundled-skills/recon-scope-triage/SKILL.md +128 -0
- package/bundled-skills/redis/SKILL.md +421 -0
- package/bundled-skills/redteam-report-template/SKILL.md +370 -0
- package/bundled-skills/report-writing/SKILL.md +426 -0
- package/bundled-skills/report-writing/references/details.md +187 -0
- package/bundled-skills/reverse-proxy/SKILL.md +420 -0
- package/bundled-skills/runbook-creation/SKILL.md +438 -0
- package/bundled-skills/runbook-creation/references/details.md +71 -0
- package/bundled-skills/saas-security-posture/SKILL.md +415 -0
- package/bundled-skills/sast-scanning/SKILL.md +444 -0
- package/bundled-skills/sbom-supply-chain/SKILL.md +433 -0
- package/bundled-skills/security-arsenal/SKILL.md +446 -0
- package/bundled-skills/security-arsenal/references/details.md +540 -0
- package/bundled-skills/security-automation/SKILL.md +146 -0
- package/bundled-skills/semantic-versioning/SKILL.md +434 -0
- package/bundled-skills/semantic-versioning/references/details.md +83 -0
- package/bundled-skills/service-mesh/SKILL.md +422 -0
- package/bundled-skills/soc2-compliance/SKILL.md +409 -0
- package/bundled-skills/sops-encryption/SKILL.md +124 -0
- package/bundled-skills/sre-dashboards/SKILL.md +143 -0
- package/bundled-skills/ssh-configuration/SKILL.md +324 -0
- package/bundled-skills/ssl-tls-management/SKILL.md +428 -0
- package/bundled-skills/ssl-tls-management/references/details.md +99 -0
- package/bundled-skills/startup-it-troubleshooting/SKILL.md +415 -0
- package/bundled-skills/supply-chain-attack-recon/SKILL.md +453 -0
- package/bundled-skills/supply-chain-attack-recon/references/details.md +258 -0
- package/bundled-skills/systemd-services/SKILL.md +379 -0
- package/bundled-skills/terraform-aws/SKILL.md +125 -0
- package/bundled-skills/terraform-azure/SKILL.md +415 -0
- package/bundled-skills/terraform-azure/references/details.md +231 -0
- package/bundled-skills/terraform-gcp/SKILL.md +369 -0
- package/bundled-skills/threat-modeling/SKILL.md +487 -0
- package/bundled-skills/user-management/SKILL.md +383 -0
- package/bundled-skills/using-agent-skills/SKILL.md +220 -0
- package/bundled-skills/vector-database-ops/SKILL.md +300 -0
- package/bundled-skills/vendor-management/SKILL.md +439 -0
- package/bundled-skills/vendor-management/references/details.md +109 -0
- package/bundled-skills/vercel-deployments/SKILL.md +296 -0
- package/bundled-skills/vllm-server/SKILL.md +236 -0
- package/bundled-skills/vmware-vcenter-attack/SKILL.md +412 -0
- package/bundled-skills/vpn-setup/SKILL.md +452 -0
- package/bundled-skills/vulnerability-scanning/SKILL.md +448 -0
- package/bundled-skills/waf-setup/SKILL.md +354 -0
- package/bundled-skills/waf-setup/references/details.md +211 -0
- package/bundled-skills/web2-recon/SKILL.md +440 -0
- package/bundled-skills/web2-recon/references/details.md +319 -0
- package/bundled-skills/web3-audit/SKILL.md +445 -0
- package/bundled-skills/web3-audit/references/details.md +224 -0
- package/bundled-skills/windows-hardening/SKILL.md +454 -0
- package/bundled-skills/windows-hardening/references/details.md +204 -0
- package/bundled-skills/windows-server/SKILL.md +318 -0
- package/bundled-skills/zero-trust/SKILL.md +461 -0
- package/package.json +1 -1
- package/skills_index.json +6943 -323
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: web3-audit
|
|
3
|
+
description: Smart contract security audit
|
|
4
|
+
category: security
|
|
5
|
+
risk: offensive
|
|
6
|
+
source: https://github.com/elementalsouls/Claude-BugHunter
|
|
7
|
+
source_repo: elementalsouls/Claude-BugHunter
|
|
8
|
+
source_type: community
|
|
9
|
+
date_added: '2026-09-20'
|
|
10
|
+
license: MIT
|
|
11
|
+
license_source: https://github.com/elementalsouls/Claude-BugHunter/blob/main/LICENSE
|
|
12
|
+
compatibility: Requires explicit written authorization for a target scope plus the
|
|
13
|
+
relevant testing tools for this technique. Docs-only; helper scripts and commands
|
|
14
|
+
not bundled.
|
|
15
|
+
sources: public_research, community
|
|
16
|
+
---
|
|
17
|
+
> **⚠️ AUTHORIZED USE ONLY**
|
|
18
|
+
> This skill is for educational purposes or authorized security assessments only.
|
|
19
|
+
> You must have explicit, written permission from the system owner before using this tool.
|
|
20
|
+
> Misuse of this tool is illegal and strictly prohibited.
|
|
21
|
+
|
|
22
|
+
> **Mandatory confirmation gate**
|
|
23
|
+
> Before running any command that probes, exploits, changes, persists on, extracts data from, or attempts credential access against a target:
|
|
24
|
+
> 1. Ask the user to state the exact target URL, IP, account, or resource.
|
|
25
|
+
> 2. Ask the user to confirm written authorization and the permitted scope.
|
|
26
|
+
> 3. Show the exact command(s) and explain their expected effect.
|
|
27
|
+
> 4. Wait for explicit confirmation in the current conversation.
|
|
28
|
+
>
|
|
29
|
+
> Without that confirmation, remain read-only and provide defensive guidance only. Prefer a sandbox, disposable VM, or controlled lab.
|
|
30
|
+
|
|
31
|
+
# WEB3 SMART CONTRACT AUDIT
|
|
32
|
+
|
|
33
|
+
10 bug classes. Pre-dive kill signals. Foundry PoC template. Real paid examples.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## PRE-DIVE KILL SIGNALS (check BEFORE any code review)
|
|
38
|
+
|
|
39
|
+
> ZKsync lesson: $322M TVL + OZ audit + 750K LOC + 5 sessions = 0 findings. Large well-audited bridges are extremely hard.
|
|
40
|
+
|
|
41
|
+
1. **TVL < $500K** → max payout capped too low for effort
|
|
42
|
+
2. **2+ top-tier audits** (Halborn, ToB, Cyfrin, OpenZeppelin) on simple protocol → bugs already found
|
|
43
|
+
3. **Protocol < 500 lines, single A→B→C flow** → minimal attack surface
|
|
44
|
+
4. **Formula**: `max_realistic_payout = min(10% × TVL, program_cap)` — if < $10K, skip
|
|
45
|
+
|
|
46
|
+
**Soft kill:** OZ/ToB/Cyfrin audit on current version + codebase > 500K LOC → expect 40+ hours for maybe 1 finding. Only proceed if bounty floor > $50K AND you have protocol-specific expertise.
|
|
47
|
+
|
|
48
|
+
**Target scoring (go if >= 6/10):**
|
|
49
|
+
- TVL > $10M: +2
|
|
50
|
+
- Immunefi program with Critical >= $50K: +2
|
|
51
|
+
- No top-tier audit on current version: +2
|
|
52
|
+
- < 30 days since deploy: +1
|
|
53
|
+
- Protocol you've hunted before: +1
|
|
54
|
+
- Source code + natspec comments: +1
|
|
55
|
+
- Upgradeable proxies: +1
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## THE ONE RULE
|
|
60
|
+
|
|
61
|
+
> "Read ALL sibling functions. If `vote()` has a modifier, check `poke()`, `reset()`, `harvest()`. The missing modifier on the sibling IS the bug."
|
|
62
|
+
|
|
63
|
+
This single rule explains 19% of all Critical findings.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 1. ACCOUNTING STATE DESYNCHRONIZATION
|
|
68
|
+
> #1 Critical bug class — 28% of all Criticals on Immunefi.
|
|
69
|
+
|
|
70
|
+
### What It Is
|
|
71
|
+
Two state variables supposed to stay in sync. One code path updates A but forgets B. Later code reads both and makes decisions based on stale B.
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
Real Value = A - B
|
|
75
|
+
If A updated but B isn't → Real Value appears larger → phantom value
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Root Cause Patterns
|
|
79
|
+
|
|
80
|
+
**Variant 1: Phantom Yield** (Yeet protocol — 35 duplicate reports)
|
|
81
|
+
```solidity
|
|
82
|
+
function startUnstake(uint256 amount) external {
|
|
83
|
+
totalSupply -= amount; // decremented BEFORE transfer
|
|
84
|
+
// aToken.balanceOf(this) still reflects old value
|
|
85
|
+
// yieldAmount = aToken.balanceOf - totalSupply = phantom yield
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Variant 2: Fast Path Skips State Update** (Alchemix V3)
|
|
90
|
+
```solidity
|
|
91
|
+
function claimRedemption(uint256 tokenId) external {
|
|
92
|
+
if (transmuter.balance >= amount) {
|
|
93
|
+
transmuter.transfer(user, amount);
|
|
94
|
+
_burn(tokenId);
|
|
95
|
+
return; // EARLY RETURN — cumulativeEarmarked, _redemptionWeight, totalDebt never updated
|
|
96
|
+
}
|
|
97
|
+
// Slow path: updates all state vars correctly
|
|
98
|
+
alchemist.redeem(...);
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Variant 3: Update Happens in Wrong Order** (Alchemix)
|
|
103
|
+
```solidity
|
|
104
|
+
function deposit(uint256 amount) external {
|
|
105
|
+
_shares = (amount * totalShares) / totalAssets; // calculated BEFORE deposit
|
|
106
|
+
totalAssets += amount; // assets added AFTER shares calculated → wrong rate
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Grep Patterns
|
|
111
|
+
```bash
|
|
112
|
+
# Find all accounting variables
|
|
113
|
+
grep -rn "totalSupply\|totalShares\|totalAssets\|totalDebt\|cumulativeReward\|rewardPerShare" contracts/
|
|
114
|
+
|
|
115
|
+
# Find all early returns in claim/redeem functions
|
|
116
|
+
grep -rn "\breturn\b" contracts/ -B3 | grep -B3 "if\b"
|
|
117
|
+
|
|
118
|
+
# For each early return: which state updates in normal path are skipped?
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 2. ACCESS CONTROL
|
|
124
|
+
> #2 Critical — 19% of Criticals. $953M lost in 2024 alone.
|
|
125
|
+
|
|
126
|
+
### Variant 1: Missing Modifier on Sibling Function
|
|
127
|
+
```solidity
|
|
128
|
+
function vote(uint256 tokenId) external onlyNewEpoch(tokenId) { // guarded
|
|
129
|
+
function reset(uint256 tokenId) external onlyNewEpoch(tokenId) { // guarded
|
|
130
|
+
function poke(uint256 tokenId) external { // NO GUARD → infinite FLUX inflation
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Variant 2: Wrong Check (Existence vs Ownership)
|
|
135
|
+
```solidity
|
|
136
|
+
function split(uint256 tokenId, uint256 amount) external {
|
|
137
|
+
_requireOwned(tokenId); // checks if token EXISTS, not if caller OWNS it
|
|
138
|
+
_burn(tokenId);
|
|
139
|
+
_mint(msg.sender, amount); // attacker steals tokens they don't own
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Variant 3: Silent Modifier (if vs require)
|
|
144
|
+
```solidity
|
|
145
|
+
// VULNERABLE — non-admin silently gets through:
|
|
146
|
+
modifier onlyAdmin() {
|
|
147
|
+
if (msg.sender == admin) {
|
|
148
|
+
_; // body only executes for admin, but non-admin doesn't revert
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// CORRECT: require(msg.sender == admin, "Not admin"); _;
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Variant 4: Uninitialized Proxy
|
|
155
|
+
```solidity
|
|
156
|
+
function initialize(address _owner) public { // MISSING: initializer modifier
|
|
157
|
+
owner = _owner; // anyone can call → become owner
|
|
158
|
+
}
|
|
159
|
+
// Fix: constructor() { _disableInitializers(); }
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Grep Patterns
|
|
163
|
+
```bash
|
|
164
|
+
# Find sibling function families — do ALL have the same modifier set?
|
|
165
|
+
grep -rn "function vote\|function poke\|function reset\|function update\|function claim\|function harvest" contracts/ -A2
|
|
166
|
+
|
|
167
|
+
# Ownership check: existence vs ownership?
|
|
168
|
+
grep -rn "_requireOwned\|ownerOf\|_isApprovedOrOwner\|_checkAuthorized" contracts/ -B5
|
|
169
|
+
|
|
170
|
+
# Silent modifiers
|
|
171
|
+
grep -rn "modifier\b" contracts/ -A8 | grep -B3 "if (" | grep -v "require\|revert"
|
|
172
|
+
|
|
173
|
+
# Uninitialized initializer
|
|
174
|
+
grep -rn "function initialize\b" contracts/ -A3
|
|
175
|
+
grep -rn "_disableInitializers()" contracts/
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### Real Paid Examples
|
|
179
|
+
|
|
180
|
+
| Protocol | Payout | Bug |
|
|
181
|
+
|---|---|---|
|
|
182
|
+
| Wormhole | $10M | Uninitialized UUPS proxy → anyone calls initialize() |
|
|
183
|
+
| ZeroLend | n/a | split() uses existence check, not ownership check |
|
|
184
|
+
| Alchemix | n/a | poke() missing onlyNewEpoch → infinite FLUX inflation |
|
|
185
|
+
| Parity | $150M frozen | No access control on initWallet() in library |
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 3. INCOMPLETE CODE PATH
|
|
190
|
+
> #3 Critical — 17% of Criticals.
|
|
191
|
+
|
|
192
|
+
### The Function Family Comparison Test
|
|
193
|
+
```
|
|
194
|
+
1. List all state changes in function A (deposit/place/create)
|
|
195
|
+
2. List all state changes in function B (withdraw/update/cancel)
|
|
196
|
+
3. For each state change in A: does B have the corresponding reverse?
|
|
197
|
+
4. For each token transfer in A: does B have the corresponding refund?
|
|
198
|
+
If A does X but B doesn't do the reverse of X → BUG.
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Variant 1: Update Function Missing Refund (ThunderNFT)
|
|
202
|
+
```solidity
|
|
203
|
+
function place_order(OrderInput calldata order) external {
|
|
204
|
+
token.safeTransferFrom(msg.sender, address(this), order.price); // takes tokens
|
|
205
|
+
orders[orderId] = order;
|
|
206
|
+
}
|
|
207
|
+
function update_order(OrderInput calldata updatedOrder) external {
|
|
208
|
+
// BUG: NO REFUND for sell orders when price decreases → tokens permanently stuck
|
|
209
|
+
orders[orderId] = updatedOrder;
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Variant 2: Partial Fill Token Stuck (Plume)
|
|
214
|
+
```solidity
|
|
215
|
+
function swapForETH(uint256 amountIn) external {
|
|
216
|
+
token.safeTransferFrom(msg.sender, address(this), amountIn);
|
|
217
|
+
uint256 filled = dex.swap(amountIn); // partial fill possible
|
|
218
|
+
_refundExcessEth(amountIn - filled); // BUG: refunds ETH only, not ERC20
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Variant 3: mint() Bypasses Check That deposit() Has (MetaPool)
|
|
223
|
+
```solidity
|
|
224
|
+
function deposit(uint256 assets, address receiver) public override {
|
|
225
|
+
shares = _deposit(assets, receiver); // includes receipt validation
|
|
226
|
+
}
|
|
227
|
+
function mint(uint256 shares, address receiver) public override {
|
|
228
|
+
assets = convertToAssets(shares);
|
|
229
|
+
_mint(receiver, shares); // MISSING: _deposit() validation → mints without receiving assets
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Grep Patterns
|
|
234
|
+
```bash
|
|
235
|
+
grep -rn "function place_\|function create_\|function add_\|function open_" contracts/ -A5
|
|
236
|
+
grep -rn "function update_\|function modify_\|function cancel_" contracts/ -A5
|
|
237
|
+
grep -rn "safeApprove\b" contracts/ # safeApprove without zero-reset before
|
|
238
|
+
grep -rn "delete\b" contracts/ -B5 -A5 # delete before operation completes
|
|
239
|
+
grep -rn "function deposit\|function mint\|function withdraw\|function redeem" contracts/ -A10
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## 4. OFF-BY-ONE & BOUNDARY CONDITIONS
|
|
245
|
+
> #4 High — 22% of Highs. Single character change. Massive impact.
|
|
246
|
+
|
|
247
|
+
### Root Cause
|
|
248
|
+
```solidity
|
|
249
|
+
// VeChain Stargate — post-exit reward drain:
|
|
250
|
+
function _claimableDelegationPeriods(address delegator) internal view returns (uint256) {
|
|
251
|
+
if (endPeriod > nextClaimablePeriod) { // BUG: should be >=
|
|
252
|
+
return 0; // exited users get nothing
|
|
253
|
+
}
|
|
254
|
+
return nextClaimablePeriod - lastClaimedPeriod; // rewards for period AFTER exit
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Mental Test for Every Comparison
|
|
259
|
+
> For every `if (A > B)`: "What happens when A == B?" Is that correct?
|
|
260
|
+
|
|
261
|
+
### 6 Boundary Locations to Check
|
|
262
|
+
1. Period/Epoch boundaries: `>` vs `>=` at period end
|
|
263
|
+
2. Time-based locks: does `block.timestamp == deadline` lock or unlock?
|
|
264
|
+
3. Loop break conditions: `break` with `>` vs `>=`
|
|
265
|
+
4. Array index boundaries: `i <= array.length` (should be `i < array.length`)
|
|
266
|
+
5. Amount/balance boundaries: `>= amount` allows exact full withdrawal?
|
|
267
|
+
6. Rounding/precision: can any input produce 0 output that should be non-zero?
|
|
268
|
+
|
|
269
|
+
### Grep Patterns
|
|
270
|
+
```bash
|
|
271
|
+
# Boundaries in comparisons
|
|
272
|
+
grep -rn "Period\|Epoch\|Round\|Deadline\|period\|epoch\|deadline" contracts/ -A3 | grep "[<>][^=]"
|
|
273
|
+
|
|
274
|
+
# Loop breaks
|
|
275
|
+
grep -rn "\bbreak\b" contracts/ -B10
|
|
276
|
+
|
|
277
|
+
# Off-by-one in array access
|
|
278
|
+
grep -rn "\.length\s*-\s*1\|i\s*<=\s*.*\.length\b" contracts/
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## 5. ORACLE / PRICE MANIPULATION
|
|
284
|
+
> 12% of all reports. Largest individual payouts. $117M Mango, $70M Curve.
|
|
285
|
+
|
|
286
|
+
### Bug A: Missing Staleness Check (most common)
|
|
287
|
+
```solidity
|
|
288
|
+
// VULNERABLE:
|
|
289
|
+
(, int256 price,,,) = priceFeed.latestRoundData();
|
|
290
|
+
return uint256(price); // If Chainlink node goes down, stale price returned indefinitely
|
|
291
|
+
|
|
292
|
+
// CORRECT:
|
|
293
|
+
(, int256 price,, uint256 updatedAt,) = priceFeed.latestRoundData();
|
|
294
|
+
require(block.timestamp - updatedAt <= MAX_PRICE_AGE, "Stale price");
|
|
295
|
+
require(price > 0, "Invalid price");
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Bug B: Missing Confidence Interval (Pyth)
|
|
299
|
+
```solidity
|
|
300
|
+
// VULNERABLE:
|
|
301
|
+
PythStructs.Price memory p = pyth.getPriceUnsafe(priceFeed);
|
|
302
|
+
return p.price; // ignores p.conf (confidence interval)
|
|
303
|
+
|
|
304
|
+
// CORRECT:
|
|
305
|
+
require(p.conf * 10 <= uint64(p.price), "Price too uncertain");
|
|
306
|
+
// conf > 10% of price = untrustworthy
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Bug C: TWAP Too Short (flash loan manipulatable)
|
|
310
|
+
```solidity
|
|
311
|
+
// VULNERABLE: 60-second TWAP
|
|
312
|
+
uint32[] memory secondsAgos = new uint32[] (2);
|
|
313
|
+
secondsAgos[0] = 60; secondsAgos[1] = 0;
|
|
314
|
+
// Flash loan can shift price for entire 60s window
|
|
315
|
+
|
|
316
|
+
// CORRECT: 1800s minimum TWAP (30 min)
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Bug D: Single-Source Oracle
|
|
320
|
+
```solidity
|
|
321
|
+
// VULNERABLE: only Uniswap spot price
|
|
322
|
+
uint price = getUniswapSpotPrice(token); // flash loan manipulatable
|
|
323
|
+
|
|
324
|
+
// CORRECT: Chainlink primary, Uniswap TWAP as fallback, require close agreement
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### Grep Patterns
|
|
328
|
+
```bash
|
|
329
|
+
# Missing staleness check
|
|
330
|
+
grep -rn "latestRoundData" contracts/ -A5 | grep -v "updatedAt\|timestamp"
|
|
331
|
+
|
|
332
|
+
# Pyth price usage — confidence interval checked?
|
|
333
|
+
grep -rn "getPriceUnsafe\|getPrice\b" contracts/ -A8 | grep -v "conf\|confidence"
|
|
334
|
+
|
|
335
|
+
# TWAP windows — short TWAP flag
|
|
336
|
+
grep -rn "secondsAgo\|TWAP\|cardinality" contracts/ -A5
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## 6. ERC4626 VAULT ATTACKS
|
|
342
|
+
|
|
343
|
+
### Exchange Rate Manipulation (near-empty vault)
|
|
344
|
+
```solidity
|
|
345
|
+
// VULNERABLE — first depositor attack:
|
|
346
|
+
// 1. Attacker deposits 1 wei → gets 1 share
|
|
347
|
+
// 2. Attacker donates large amount directly (transfer, not deposit)
|
|
348
|
+
// 3. Exchange rate: 1 share = (1 + donation) assets
|
|
349
|
+
// 4. Victim deposits → rounds down to 0 shares → free donation to attacker
|
|
350
|
+
|
|
351
|
+
// CORRECT: virtual shares (OpenZeppelin v4.9+)
|
|
352
|
+
function _decimalsOffset() internal view virtual override returns (uint8) {
|
|
353
|
+
return 9; // add 1e9 virtual shares + assets to prevent manipulation
|
|
354
|
+
}
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### ERC4626 Transfer (moves shares but not stake/lock records)
|
|
358
|
+
```solidity
|
|
359
|
+
// VULNERABLE: shares transferred, but lock records stay with original owner
|
|
360
|
+
// → shares stuck, can't redeem → permanent freeze (Belong pattern)
|
|
361
|
+
function transfer(address to, uint256 amount) external override {
|
|
362
|
+
_transfer(msg.sender, to, amount); // moves shares
|
|
363
|
+
// MISSING: transfer lock record from msg.sender to `to`
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### Grep Patterns
|
|
368
|
+
```bash
|
|
369
|
+
grep -rn "function transfer\|function transferFrom" contracts/ -A15
|
|
370
|
+
grep -rn "function deposit\|function mint\|function withdraw\|function redeem" contracts/ -A10
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## 7. REENTRANCY
|
|
376
|
+
> 2016–present. CEI pattern prevents it. Still found in DeFi.
|
|
377
|
+
|
|
378
|
+
### Variants
|
|
379
|
+
- **Single-function**: attacker re-enters same function before state updated
|
|
380
|
+
- **Cross-function**: re-enters a sibling function with stale state
|
|
381
|
+
- **Cross-contract**: re-enters via a callback to another protocol
|
|
382
|
+
- **Read-only**: re-enters a view function that returns stale data used by attacker
|
|
383
|
+
|
|
384
|
+
### Root Cause Pattern
|
|
385
|
+
```solidity
|
|
386
|
+
// VULNERABLE (effects after interaction):
|
|
387
|
+
function withdraw(uint256 amount) external {
|
|
388
|
+
require(balances[msg.sender] >= amount);
|
|
389
|
+
(bool success,) = msg.sender.call{value: amount}(""); // INTERACTION first
|
|
390
|
+
require(success);
|
|
391
|
+
balances[msg.sender] -= amount; // EFFECT after → reentrancy window
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// CORRECT (CEI — Checks, Effects, Interactions):
|
|
395
|
+
function withdraw(uint256 amount) external {
|
|
396
|
+
require(balances[msg.sender] >= amount); // CHECK
|
|
397
|
+
balances[msg.sender] -= amount; // EFFECT
|
|
398
|
+
(bool success,) = msg.sender.call{value: amount}(""); // INTERACTION last
|
|
399
|
+
require(success);
|
|
400
|
+
}
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
### Grep Patterns
|
|
404
|
+
```bash
|
|
405
|
+
# External calls before state updates
|
|
406
|
+
grep -rn "\.call{value\|safeTransfer\|transfer(" contracts/ -B10 | grep -v "require\|revert"
|
|
407
|
+
|
|
408
|
+
# Missing nonReentrant modifier on critical functions
|
|
409
|
+
grep -rn "function withdraw\|function redeem\|function claim" contracts/ -A2 | grep -v "nonReentrant"
|
|
410
|
+
|
|
411
|
+
# Storage slot for reentrancy guard
|
|
412
|
+
grep -rn "nonReentrant\|ReentrancyGuard\|_notEntered" contracts/
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
## Contents
|
|
419
|
+
|
|
420
|
+
- [8. FLASH LOAN ATTACKS](references/details.md)
|
|
421
|
+
- [9. SIGNATURE REPLAY](references/details.md)
|
|
422
|
+
- [10. PROXY / UPGRADE ISSUES](references/details.md)
|
|
423
|
+
- [FOUNDRY POC TEMPLATE](references/details.md)
|
|
424
|
+
- [Related Skills & Chains](references/details.md)
|
|
425
|
+
- [Operator Notes (Claude-BugHunter)](references/details.md)
|
|
426
|
+
|
|
427
|
+
## When to Use
|
|
428
|
+
|
|
429
|
+
- You have explicit, written authorization to assess the target in scope, and the task matches this skill's vulnerability class or technique within a bug-bounty or penetration-test engagement.
|
|
430
|
+
- You need the recon, exploitation, or validation workflow described below — executed strictly inside the approved scope.
|
|
431
|
+
|
|
432
|
+
## Limitations
|
|
433
|
+
|
|
434
|
+
- Authorized scope only: the confirmation gate above is mandatory before any probing, exploitation, or credential-access command.
|
|
435
|
+
- Docs-only import: upstream helper scripts, commands, engine, and research assets are not bundled; reinstall tooling from the source repo when needed.
|
|
436
|
+
- Validate every finding (see `triage-validation`) before reporting; report via `report-writing`. Prefer a sandbox, disposable VM, or controlled lab.
|
|
437
|
+
|
|
438
|
+
### Example
|
|
439
|
+
|
|
440
|
+
```bash
|
|
441
|
+
# Read-only first step; confirm scope before anything active.
|
|
442
|
+
cat scope.txt # target list from the authorized engagement brief
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
> Adapted from [elementalsouls/Claude-BugHunter](https://github.com/elementalsouls/Claude-BugHunter) (MIT); frontmatter, When to Use/Limitations, and safety boundaries added for upstream compliance. Docs-only import: executable helpers, commands, engine, and research assets not bundled.
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# Details (moved from SKILL.md)
|
|
2
|
+
|
|
3
|
+
> Extended reference content for `web3-audit`, kept under `references/` so the entrypoint stays within the audit budget.
|
|
4
|
+
|
|
5
|
+
## 8. FLASH LOAN ATTACKS
|
|
6
|
+
|
|
7
|
+
### Oracle Manipulation via Flash Loan
|
|
8
|
+
```solidity
|
|
9
|
+
// Attack flow:
|
|
10
|
+
// 1. Borrow $100M from Aave flash loan
|
|
11
|
+
// 2. Dump token in Uniswap pool → crash spot price
|
|
12
|
+
// 3. Protocol reads Uniswap spot → undercollateralized loans accepted
|
|
13
|
+
// 4. Borrow max against cheap collateral
|
|
14
|
+
// 5. Repay flash loan, keep profits
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Price Oracle Sanity Checks (what to look for)
|
|
18
|
+
```bash
|
|
19
|
+
grep -rn "getReserves\|getAmountsOut\|slot0\b" contracts/ -A5
|
|
20
|
+
# spot price from reserves = manipulatable with flash loan
|
|
21
|
+
# slot0 = Uniswap V3 spot price = manipulatable
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
## 9. SIGNATURE REPLAY
|
|
28
|
+
|
|
29
|
+
### Missing Nonce
|
|
30
|
+
```solidity
|
|
31
|
+
// VULNERABLE:
|
|
32
|
+
function permit(address owner, address spender, uint256 value,
|
|
33
|
+
uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {
|
|
34
|
+
bytes32 hash = keccak256(abi.encodePacked(owner, spender, value, deadline));
|
|
35
|
+
// MISSING: nonce not included → same signature usable multiple times
|
|
36
|
+
require(ecrecover(hash, v, r, s) == owner);
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Missing Chain ID
|
|
41
|
+
```solidity
|
|
42
|
+
// VULNERABLE: signature valid on mainnet AND testnet AND all forks
|
|
43
|
+
bytes32 hash = keccak256(abi.encodePacked(params));
|
|
44
|
+
// MISSING: block.chainid not in hash → works on any chain
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Grep Patterns
|
|
48
|
+
```bash
|
|
49
|
+
grep -rn "ecrecover\|ECDSA\.recover" contracts/ -B20
|
|
50
|
+
# Check: does the signed hash include nonce + chainId + contract address?
|
|
51
|
+
|
|
52
|
+
grep -rn "nonce\|_nonces\|nonces\[" contracts/
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
## 10. PROXY / UPGRADE ISSUES
|
|
59
|
+
|
|
60
|
+
### Storage Collision
|
|
61
|
+
```solidity
|
|
62
|
+
// Implementation and proxy share storage layout
|
|
63
|
+
// Proxy slot 0: _owner
|
|
64
|
+
// Implementation slot 0: _initialized
|
|
65
|
+
// → writing to _initialized overwrites _owner
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Uninitialized Implementation
|
|
69
|
+
```solidity
|
|
70
|
+
// If implementation can be initialized directly → anyone becomes owner of implementation
|
|
71
|
+
// Attack: call initialize() on implementation contract → call upgradeTo() → replace logic
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### delegatecall to User-Controlled Address
|
|
75
|
+
```solidity
|
|
76
|
+
function execute(address target, bytes calldata data) external onlyOwner {
|
|
77
|
+
target.delegatecall(data); // target is validated, but what if owner is compromised?
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Grep Patterns
|
|
82
|
+
```bash
|
|
83
|
+
# UUPS initialization protection
|
|
84
|
+
grep -rn "function initialize\b\|_disableInitializers\|initializer" contracts/
|
|
85
|
+
|
|
86
|
+
# Delegate call
|
|
87
|
+
grep -rn "delegatecall\b" contracts/ -B3 -A5
|
|
88
|
+
|
|
89
|
+
# Storage layout — proxy uses EIP-1967 slots?
|
|
90
|
+
grep -rn "0x360894\|EIP1967\|_IMPLEMENTATION_SLOT" contracts/
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
## FOUNDRY POC TEMPLATE
|
|
97
|
+
|
|
98
|
+
```solidity
|
|
99
|
+
// SPDX-License-Identifier: MIT
|
|
100
|
+
pragma solidity ^0.8.0;
|
|
101
|
+
|
|
102
|
+
import "forge-std/Test.sol";
|
|
103
|
+
import "../src/VulnerableContract.sol";
|
|
104
|
+
|
|
105
|
+
contract ExploitTest is Test {
|
|
106
|
+
VulnerableContract target;
|
|
107
|
+
address attacker = makeAddr("attacker");
|
|
108
|
+
address victim = makeAddr("victim");
|
|
109
|
+
|
|
110
|
+
function setUp() public {
|
|
111
|
+
// Fork mainnet at specific block
|
|
112
|
+
vm.createSelectFork("mainnet", BLOCK_NUMBER);
|
|
113
|
+
|
|
114
|
+
// Deploy or load target
|
|
115
|
+
target = VulnerableContract(TARGET_ADDRESS);
|
|
116
|
+
|
|
117
|
+
// Fund accounts
|
|
118
|
+
deal(address(token), attacker, INITIAL_BALANCE);
|
|
119
|
+
deal(address(token), victim, VICTIM_BALANCE);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function test_exploit() public {
|
|
123
|
+
console.log("Attacker balance before:", token.balanceOf(attacker));
|
|
124
|
+
|
|
125
|
+
vm.startPrank(attacker);
|
|
126
|
+
|
|
127
|
+
// Step 1: Setup conditions
|
|
128
|
+
// Step 2: Execute exploit
|
|
129
|
+
// Step 3: Verify impact
|
|
130
|
+
|
|
131
|
+
vm.stopPrank();
|
|
132
|
+
|
|
133
|
+
console.log("Attacker balance after:", token.balanceOf(attacker));
|
|
134
|
+
assertGt(token.balanceOf(attacker), INITIAL_BALANCE, "Exploit failed");
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Key Foundry Cheatcodes
|
|
140
|
+
```solidity
|
|
141
|
+
vm.prank(address) // next call from address
|
|
142
|
+
vm.startPrank(address) // all calls from address until stopPrank()
|
|
143
|
+
vm.deal(address, amount) // set ETH balance
|
|
144
|
+
deal(token, address, amount) // set ERC20 balance
|
|
145
|
+
vm.warp(timestamp) // set block.timestamp
|
|
146
|
+
vm.roll(blockNumber) // set block.number
|
|
147
|
+
vm.createSelectFork("mainnet", blockNumber) // fork mainnet
|
|
148
|
+
vm.expectRevert(bytes) // next call should revert
|
|
149
|
+
vm.label(address, "name") // label for trace output
|
|
150
|
+
vm.assume(condition) // fuzz: discard inputs where false
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Running Tests
|
|
154
|
+
```bash
|
|
155
|
+
# Run specific test
|
|
156
|
+
forge test --match-test test_exploit -vvvv
|
|
157
|
+
|
|
158
|
+
# Run with fork
|
|
159
|
+
forge test --match-test test_exploit -vvvv --fork-url $MAINNET_RPC
|
|
160
|
+
|
|
161
|
+
# Gas report
|
|
162
|
+
forge test --gas-report
|
|
163
|
+
|
|
164
|
+
# Coverage
|
|
165
|
+
forge coverage --report summary
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
## Related Skills & Chains
|
|
172
|
+
|
|
173
|
+
- **`meme-coin-audit`** — When the target is a meme coin / SPL token rather than a DeFi protocol. Workflow primitive: pre-dive kill signals diverge — this skill's "TVL < $500K skip" doesn't apply to meme coins where the rug check (mint authority, freeze authority, LP lock) is the entire audit; route to `meme-coin-audit` instead.
|
|
174
|
+
- **`triage-validation`** — When a contract finding is ready to be filed on Immunefi. Workflow primitive: Immunefi has its own report format, but the impact-validated, chain-end-to-end discipline of `triage-validation` still applies; run the 7Q gate against the Foundry PoC before submitting.
|
|
175
|
+
- **`report-writing`** — When writing the Immunefi report body. Workflow primitive: `report-writing`'s Immunefi template (with Foundry PoC, root cause code snippet, quantified economic impact) is the body skeleton this skill's findings feed into.
|
|
176
|
+
- **`offensive-osint`** — When auditing a protocol's off-chain attack surface (frontend, admin API, RPC gateways). Workflow primitive: on-chain audit is this skill's job; any web2 component of the protocol (web-frontend, admin panel, indexer API) routes to `offensive-osint` for recon.
|
|
177
|
+
- **`bb-methodology`** — When deciding whether to dive at all. Workflow primitive: PART 0 of `bb-methodology` confirms engagement (web3 bug bounty / private audit / smart-contract review); this skill's pre-dive kill signals replace the standard scoring rubric for that engagement type.
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
## Operator Notes (Claude-BugHunter)
|
|
183
|
+
|
|
184
|
+
> Engagement-derived + 2026-specific additions to the vendored foundation.
|
|
185
|
+
> Wisdom from real authorized engagements + Phase 2 verification across
|
|
186
|
+
> this repo's 31+ skill-area live tests. The upstream content covers the WHAT;
|
|
187
|
+
> this layer covers the WHEN-IT-WORKS-vs-WHEN-IT-DOESN'T.
|
|
188
|
+
|
|
189
|
+
### Bug classes still paying in 2026
|
|
190
|
+
|
|
191
|
+
Flash-loan attacks remain top-paid on Immunefi (top 5 in 2024-2026 by bounty). The economic primitive — borrow $50M, manipulate price oracle, drain pool, repay — keeps reappearing because new protocols keep shipping with composability assumptions that don't hold under flash-loaned imbalance.
|
|
192
|
+
|
|
193
|
+
Reentrancy IS still paying because new protocols keep shipping with ERC-777 / hooks / callbacks. Don't assume the class is dead — the 2023-2025 paid corpus contains 40+ reentrancy bugs against post-Checks-Effects-Interactions codebases (cross-function reentrancy, read-only reentrancy via view functions called during state-mid-flight).
|
|
194
|
+
|
|
195
|
+
Oracle manipulation: still paid heavily but harder. Most projects use Chainlink price feeds now; the attack target is the SECONDARY oracle most projects also use (TWAP from a low-liquidity Uniswap V2 pair, the protocol's own internal oracle, a stale fallback path). Audit the failover chain, not just the primary feed.
|
|
196
|
+
|
|
197
|
+
### What's new since the vendored content was written
|
|
198
|
+
|
|
199
|
+
- **EIP-1153 (transient storage)** — introduced in 2024. New reentrancy classes: transient-storage reads cached across the same transaction can desync from persistent storage. Audit any `tload`/`tstore` usage for read-after-external-call.
|
|
200
|
+
- **EIP-7702 (Pectra hard fork 2025)** — added EOA-to-smart-account upgrades. New ATO-like primitives via re-delegation: an EOA signed-once can delegate to a contract that the attacker controls, then signature replay across delegations.
|
|
201
|
+
- **Account abstraction (ERC-4337 bundlers)** — paymaster sponsorship abuse and bundler griefing. Paymaster contracts that don't enforce strict sender allowlists drain on first call.
|
|
202
|
+
- **ZK-rollup bridge bugs** — proof-replay across rollups, off-chain prover compromise, sequencer censorship leading to forced-inclusion edge cases.
|
|
203
|
+
- **LST/LRT depeg dynamics** — liquid-staking and liquid-restaking tokens that assume 1:1 peg under loss conditions; oracle assumes peg, market reflects depeg, liquidation logic breaks.
|
|
204
|
+
|
|
205
|
+
### Tool stack for 2026
|
|
206
|
+
|
|
207
|
+
Foundry remains the test framework. `forge test --gas-report --debug` for invariant testing; `forge fuzz` for property-based testing; `forge inspect` for storage-layout audits. Slither + Echidna for static + fuzz. Mythril for symbolic execution on smaller contracts. tenderly.co for forking + simulation (best UX for replicating attacks against mainnet state).
|
|
208
|
+
|
|
209
|
+
For Solana: anchor framework, sealevel-attacks corpus (curated PoCs by anchor maintainers), soteria-sec / sec3 scanner. For Move (Aptos, Sui): move-prover, aptos-cli `aptos move test`.
|
|
210
|
+
|
|
211
|
+
For cross-chain: hyperlane and LayerZero each have audit-tooling repos; bridge bugs require simulating both endpoints, not just one.
|
|
212
|
+
|
|
213
|
+
### Where pre-dive kill signals matter
|
|
214
|
+
|
|
215
|
+
TVL under $500K isn't worth the audit time unless the bounty floor is high. Audit firm already covered it = low ROI unless you find what they missed — look at the audit-report scope-exclusion section for what they EXPLICITLY didn't audit (oracles, governance, off-chain components, frontend, the admin path).
|
|
216
|
+
|
|
217
|
+
Multisig signers > 5 + timelock > 48h = low rug-pull risk; if your finding requires team-malicious assumptions, it's low-impact and likely out of scope per Immunefi's "centralization risk" exclusion. Read the program brief — most Immunefi programs explicitly downgrade or reject findings that assume admin malice.
|
|
218
|
+
|
|
219
|
+
### Reporting discipline
|
|
220
|
+
|
|
221
|
+
Immunefi requires Foundry PoC. Submission without PoC is auto-rejected. Submission with a PoC that requires manual setup ("first deploy this, then call that") usually gets downgraded — the PoC should be a single `forge test` invocation that proves the impact, with explicit `assertEq` on the drained balance / minted token / corrupted state.
|
|
222
|
+
|
|
223
|
+
Severity claims must use Immunefi's severity matrix exactly; don't invent severities. The matrix gates on direct economic loss percentage of TVL — a critical against a $500K protocol pays differently than a critical against a $500M one. Read the program's specific severity assignment before claiming Critical.
|
|
224
|
+
|