Back to skill

Security audit

Skill Github Daily Ops

Security checks for vulnerabilities and agentic risk

Overview

This skill performs the advertised GitHub reporting and Dependabot automation, but its merge safeguards are weak and an included shell script can push local workspace commits without clear user approval.

Review this skill before installing. Use a narrowly scoped GitHub token, restrict it to intended repositories, and avoid unattended --merge-dependabot runs until the merge policy fails closed on unknown severity, missing CI, and pending CI. Do not run the shell daily-ops script unless you are comfortable with it checking the default workspace and pushing any unpushed commits to its configured remote.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/daily-ops.js:119
Finding

Fail-Open Dependabot Validation Can Merge Unverified or High-Risk Changes

Content
View full analysis
r.conclusion === 'success' || r.conclusion === 'skipped' || r.status === 'in_progress'); return { passing }; } ``` ```javascript if (opts.mergeDependabot && info.dependabotPRs.length > 0) { for (const pr of info.dependabotPRs) { const severity = getSeverityFromTitle(pr.title); if (severity === 'HIGH') { console.log(` ⛔ Skip HIGH CVE PR #${pr.number}: ${pr.title} (human review required)`); totalSkipped++; continue; } const { passing } = await getPRChecks(token, org, repo, pr); if (!passing) { console.log(` ⏳ Skip PR #${pr.number}: CI not passing yet`); totalSkipped++; continue; } console.log(` 🔀 Merging PR #${pr.number}: ${pr.title}`); const merged = await mergePR(token, org, repo, pr); ``` ### Technical Analysis The documented policy states that only LOW or MEDIUM severity Dependabot pull requests with passing CI are eligible for automatic merging. The implementation fails open in several ways: 1. A pull request with no check runs is considered passing. 2. A check run with `status === 'in_progress'` is considered passing, regardless of its eventual conclusion. 3. Severity values classified as `UNKNOWN` are eligible for merging because only `HIGH` is explicitly rejected. 4. Severity is inferred from untrusted pull-request title text in ...[truncated 1484 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/daily-ops.sh:247
Finding

Undeclared Automatic Push of Agent Workspace Commits

Content
View full analysis
/dev/null || echo "") uncommitted=$(git status --porcelain 2>/dev/null || echo "") if [[ -n "$uncommitted" ]]; then echo " ⚠️ Uncommitted changes in workspace (not auto-committing)" report_line "⚠️ Uncommitted changes present — manual commit required" git status --short fi if [[ -n "$unpushed" ]]; then commit_count=$(echo "$unpushed" | wc -l) echo " 📤 Pushing ${commit_count} unpushed commit(s)..." echo "$unpushed" | while read -r line; do echo " • $line"; done if git push 2>&1; then echo " ✅ Push successful" report_line "✅ Pushed ${commit_count} commit(s):" echo "$unpushed" | while IFS= read -r line; do report_line "- \`${line}\`" done else echo " ❌ Push failed" report_line "❌ Push failed — check remote/auth" fi else echo " ✓ Workspace is up to date" report_line "✓ No unpushed commits" fi else echo " ⚠️ Workspace is not a git repo" report_line "⚠️ Workspace at ${WORKSPACE} is not a git repo" fi ``` ### Technical Analysis The declared functionality is GitHub repository health reporting and safe Dependabot auto-merge. This script additionally enters `${WORKSPACE}`, which defaults to `$HOME/.openclaw/workspace`, identifies all committed but unpushed changes, and invokes `git push` using the workspace's configured remote and ambient credentials. This operation is not required to generate the report or merge eligible Dependabot pull requests. It crosses a least-privilege boundary by operating on unrelated workspace content and using Git credentials that may have broader access than the GitHub token expe ...[truncated 1321 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/daily-ops.sh:8
Finding

Predictable Temporary Report Path Permits Symlink-Based File Overwrite

Content
View full analysis
"$REPORT" < "$REPORT"` redirection follows the symbolic link and truncates the target. 5. Report content is written into the target file, potentially corrupting configuration, scripts, shell initialization files, or other user-owned data. ### Impact Assessment The attacker can overwrite or corrupt files writable by the account running the Skill. This does not independently bypass operating-system permissions, but it can cause denial of service, configuration corruption, or code execution during a later invocation if a security-sensitive user file is selected as the target. ]]>
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (11)

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

If the implementation pushes local workspace commits or modifies local repositories despite the skill being presented as a GitHub health-check/Dependabot merge helper, that is a significant undeclared side effect. Hidden local-repo modification combined with authenticated remote push can result in unauthorized code changes or exfiltration through repository updates.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

If the implementation pushes local workspace commits or modifies local repositories despite the skill being presented as a GitHub health-check/Dependabot merge helper, that is a significant undeclared side effect. Hidden local-repo modification combined with authenticated remote push can result in unauthorized code changes or exfiltration through repository updates.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 18)May include surrounding context.

md
node scripts/daily-ops.js --org Zero2Ai-hub --report

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 21)May include surrounding context.

md
node scripts/daily-ops.js --org Zero2Ai-hub --report

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 24)May include surrounding context.

md
node scripts/daily-ops.js --org Zero2Ai-hub --report

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill declares no explicit permissions or allowed tool scope even though it relies on environment-sourced credentials and can access sensitive data such as GITHUB_TOKEN or a fallback token file. In an automation context, undeclared capability use weakens reviewability and can lead operators to run a skill with more privilege than they intended.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script can perform repository state-changing actions by auto-merging PRs as soon as --merge-dependabot is supplied, with no interactive confirmation, dry-run default, allowlist, or secondary approval gate. In this skill context, that is meaningfully risky because it is explicitly designed for operational automation across an org or multiple repos, so a user mistake, overly broad token, incorrect repo selection, or weak merge criteria could cause unintended merges at scale.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script automatically merges Dependabot PRs and deletes branches whenever CI appears green, with no explicit confirmation, approval check, or stronger policy validation. This is risky because CI success alone does not guarantee the update is safe; compromised dependency updates, misconfigured author filtering, or insufficient branch protections could allow unwanted code changes to land automatically.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill’s stated purpose is GitHub health checks and Dependabot auto-merge, but it also performs git push on a local workspace repository. That creates an additional side effect outside the advertised read/merge workflow and can publish unintended local commits to a remote without operator review. In an agent context, this broadens the blast radius from repository maintenance to arbitrary local workspace state changes being propagated upstream.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script performs git push automatically when unpushed commits are present, without requiring user confirmation. In an agent-run workspace, that can exfiltrate unintended local changes, publish sensitive data accidentally committed earlier, or mutate remote branches in ways the operator did not expect from a reporting/maintenance skill.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

Reading ~/.github_token as an implicit fallback expands the skill’s privilege use beyond explicitly provided runtime credentials. This can cause the script to silently operate with whatever token happens to exist on the host, increasing the chance of unintended repository access or use of an overly privileged personal token in automated runs.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.