Announcing Beacon: Self-improving memory for coding agents
← All skills
Skill

competition-web-runtime

skill:zhaoxuya520/reverse-skill#competition-web-runtime

Internal downstream skill for ctf-sandbox-orchestrator. CTF-sandbox workflow for CTF web, API, SSR, frontend, queue-backed app, and routing challenges. Use when the user asks to inspect a site or API, follow real browser requests, debug auth or session flow, trace uploads or workers, find hidden routes, or explain why frontend and backend behavior diverge under sandbox-internal routing. Use only after `$ctf-sandbox-orchestrator` has already established sandbox assumptions and routed here.

Verdict
Suspicious

Risky behavior the analysis could not rule out.

Analyzed Oct 27, 2026, 21:28 UTC at cab634b

Dispute security verdict

If you believe this verdict is incorrect, submit a dispute and we'll review it.

2
findings
medium
highest severity
1
threat classes
632
files scanned
104/104
checks satisfied
0
package advisories

Why this verdict

  • suspicious: finding skill:CTF-Sandbox-Orchestrator/competition-web-runtime:CTF-Sandbox-Orchestrator/competition-web-runtime/references/cookie-hmac-key-reuse-auth-bypass.md:118:PRIVESC
  • suspicious: finding skill:CTF-Sandbox-Orchestrator/competition-web-runtime:CTF-Sandbox-Orchestrator/competition-web-runtime/references/cookie-hmac-key-reuse-auth-bypass.md:135:PRIVESC

Security findings 2

Privilege escalation

mediumContextual riskmedium confidence

The reference walkthrough instructs the agent to harvest the access token from the challenge entry URL, confirm the target reuses that token as the HMAC-SHA256 key for session cookies, forge an admin_session cookie with {admin:true}, and send it to https://target/api/admin/me via curl -k to verify unauthorized admin access on the target application.

curl -k -H 
vector:instruction
Counter-argument considered

Step 6 is not passive documentation but a directed command binding the Step 5 forged admin_session cookie into a live request to https://target/api/admin/me (a source-to-sink chain), and the detector confirms this network capability is 'not declared anywhere'; no carve-out (education material, declared core, sandbox install) covers an agent-executed forged-credential request against an arbitrary target, so no gate fails.

Privilege escalation

mediumContextual riskmedium confidence

The reference ships an immediately invoked browser payload (exploit()) that derives an HMAC-SHA256 key from the access token in the URL path, forges an admin_session cookie claiming {admin:true}, writes it into the challenge origin via document.cookie, and reloads the page to activate admin privileges.

document.cookie = `admin_session=${payload}.${sigB64}; path=/; Secure`;
vector:code
Counter-argument considered

The payload is an immediately invoked exploit() chaining the URL access token (source) through WebCrypto HMAC signing to a document.cookie write of a forged {admin:true} admin_session cookie and a reload (sink), an active privilege-escalation write no carve-out (hook shim, LD_PRELOAD, build cleanup) covers and no declared claim (D14, D26-D30) declares, so no gate fails.

Open questions 3

What the analysis could not settle from the code alone.

Whether the documented Steps 1-6 and the browser exploit() payload are meant to be executed autonomously by the agent upon routing or only consulted as on-demand reference material is not determined by the shown units.
Privilege escalation
[file request CTF-Sandbox-Orchestrator/competition-web-runtime/references/cookie-hmac-key-reuse-auth-bypass.md] Do the remaining steps of this reference restrict the exploitation target behind https://target to sandbox-internal challenge instances, or require explicit user authorization before forged-credential requests are sent?
Privilege escalation
[file request CTF-Sandbox-Orchestrator/ctf-sandbox-orchestrator/SKILL.md] Does the parent $ctf-sandbox-orchestrator skill restrict active-exploitation targets (the host behind placeholders like https://target) to sandbox-internal challenge instances, and does it require explicit user authorization before forged-credential requests are sent?
Privilege escalation
Refuted findings 1

Candidates the review stage examined and rejected, kept for transparency.

Privilege escalation

highRefutedmedium confidence

The skill's only exploitation-scope control is instructing the agent to assume the presented hosts, domains, and routes belong to the sandbox, and it nowhere requires explicit user authorization before active-exploitation or forged-credential requests.

Assume the presented hosts, domains, and routes belong to the sandbox.
Why it was refuted

The fully served SKILL.md shows the flagged assume-sandbox step is the openly declared operating posture of a CTF-sandbox skill whose use is gated on the parent orchestrator having already established node ownership, with a further scope-pacing control ('Expand Only After One Path Is Proven') and no instruction anywhere to actively exploit or forge credentials; the claim that line 16 is the only exploitation-scope control is contradicted by these declared/mitigating lines.

Coverage gaps 39

Parts of the artifact the static analysis could not fully examine.

context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/cli/CommandLineArgumentException.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/cli/CommandLineOption.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/cli/CommandLineParser$AfterOptions.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/cli/CommandLineParser$BeforeFirstSubCommand.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/cli/CommandLineParser$KnownOptionParserState.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/cli/CommandLineParser$MissingOptionArgState.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/cli/CommandLineParser$OptionAwareParserState.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/cli/CommandLineParser$OptionParserState.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/cli/CommandLineParser$OptionString.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/cli/CommandLineParser$ParserState.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/cli/CommandLineParser$UnknownOptionParserState.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/cli/CommandLineParser.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/cli/ParsedCommandLine.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/cli/ParsedCommandLineOption.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/internal/file/PathTraversalChecker.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/internal/file/locking/ExclusiveFileAccessManager.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/util/internal/WrapperDistributionUrlConverter.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/wrapper/BootstrapMainStarter$1.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/wrapper/Download$DefaultDownloadProgressListener.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/wrapper/Download$ProxyAuthenticator.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/wrapper/Download.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/wrapper/GradleUserHomeLookup.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/wrapper/GradleWrapperMain.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/wrapper/Install$1.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/wrapper/Install$InstallCheck.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/wrapper/Install.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/wrapper/Logger.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/wrapper/PathAssembler.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/wrapper/SystemPropertiesHandler.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/wrapper/WrapperConfiguration.class
context:unanalyzable_binary java_class content is only byte-scanned
burp-mcp-full/gradle/wrapper/gradle-wrapper.jar!/org/gradle/wrapper/WrapperExecutor.class
context:unanalyzable_binary binary content is only byte-scanned
skills/pentest-tools/src-hunter/references/payloader/by-category/web/文件漏洞.md
context:unanalyzable_binary binary content is only byte-scanned
skills/pentest-tools/src-hunter/references/payloader/by-category/web/请求走私.md
context:unanalyzable_binary binary content is only byte-scanned
skills/pentest-tools/src-hunter/references/payloader/waf-bypass.md
context:unanalyzable_binary binary content is only byte-scanned
skills/pentest-tools/src-hunter/references/playbooks/file-upload.md
context:unanalyzable_binary binary content is only byte-scanned
skills/pentest-tools/src-hunter/references/playbooks/http-smuggling.md
context:frontmatter_unparseable while parsing a block mapping
skills/field-journal/2026-05-16_pentest-personalblog-fun-mass-assignment.md
request_unanswered request.1: request.0/ref-target-scope: finding: no valid finding cites the answer's evidence
invalid_judge_finding request.1