Back to skill

Security audit

maya-umbrella-batch-antivirus

Security checks for vulnerabilities and agentic risk

Overview

This skill is a scoped Maya scene malware scanner/cleaner with disclosed install, scan, approval, backup, and cleanup controls.

Install only after reviewing the exact GitHub repository, version, release asset, checksum asset, and LOCALAPPDATA destination. Use cleanup only after reviewing the scan report, affected file list, backups, Maya version, and report hash, because cleanup force-saves approved infected scenes in place.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (1)

T03 · Remote Payload Retrieval and Execution

Warning
Location
scripts/install_cli.ps1:178
Finding

Unauthenticated Remote Release Payload Retrieval and Execution

Content
View full analysis

Vulnerability Details

File Location: scripts/install_cli.ps1, lines 178-274
Vulnerability Type: T03: Remote Payload Retrieval and Execution
Risk Level: Medium

The installer downloads an executable archive and its checksum from the same externally controlled GitHub release channel. It then executes the downloaded binary to validate its command-line interface.

powershell
$archiveName = "maya_umbrella_scanner-$Version.zip"
$checksumName = "SHA256SUMS"
$releaseBase = "https://github.com/loonghao/maya_umbrella_scanner/releases/download/v$Version"
$archiveUrl = "$releaseBase/$archiveName"
$checksumUrl = "$releaseBase/$checksumName"
$archivePath = Join-Path $temporaryRoot $archiveName
$checksumPath = Join-Path $temporaryRoot $checksumName
$stagingDirectory = Join-Path $temporaryRoot "payload"

# GitHub requires TLS 1.2; Windows PowerShell 5.1 can otherwise inherit an older default.
[System.Net.ServicePointManager]::SecurityProtocol =
    [System.Net.ServicePointManager]::SecurityProtocol -bor
    [System.Net.SecurityProtocolType]::Tls12

Invoke-WebRequest -UseBasicParsing -Uri $checksumUrl -OutFile $checksumPath | Out-Null
Invoke-WebRequest -UseBasicParsing -Uri $archiveUrl -OutFile $archivePath | Out-Null

if ((Get-Item -LiteralPath $checksumPath).Length -le 0) {
    throw "Downloaded SHA256SUMS is empty."
}
if ((Get-Item -LiteralPath $archivePath).Length -le 0) {
    throw "Downloaded release archive is empty."
}

$checksumPattern = '^(?<hash>[0-9A-Fa-f]{64})[ \t]+\*?(?<name>' +
    [System.Text.RegularExpressions.Regex]::Escape($archiveName) + ')$'
$checksumMatches = @()
foreach ($line in [System.IO.File]::ReadAllLines($checksumPath)) {
    $match = [System.Text.RegularExpressions.Regex]::Match(
        $line,
        $checksumPattern,
        [System.Text.RegularExpressions.RegexOptions]::CultureInvariant
    )
    if ($match.Success) {
        $checksumMatc
...[truncated 5511 chars]
Remediation
View remediation

Remediation Suggestions

  1. Verify releases using a cryptographically signed manifest whose public verification key or certificate identity is pinned in the reviewed Skill package.
  2. Alternatively, maintain an allowlist of approved version-to-SHA-256 mappings in a trusted, locally reviewed manifest rather than downloading the expected checksum from the same release.
  3. Validate the executable's Authenticode signature and require an explicitly pinned signer certificate or public-key identity before invoking it.
  4. Perform all signature, certificate-chain, revocation, artifact-hash, archive-structure, and expected-file checks before the first execution of any extracted binary.
  5. Reject unsigned payloads, unexpected signers, expired or revoked certificates, unlisted versions, and hash mismatches without offering a bypass.
  6. Where feasible, publish immutable release attestations through a separate trust channel and verify provenance using a framework such as Sigstore or SLSA-compatible attestations.
  7. Retain the existing exact-version requirement, non-elevated execution, ZIP traversal protections, reparse-point checks, no-clobber installation behavior, and CLI contract validation as defense-in-depth controls.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (1)

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

This code downloads release metadata and an archive from GitHub, then later creates directories, moves files into the install location, and deletes the temporary staging directory. While these actions are expected for an installer, the script provides no user-facing print/log message, confirmation, or top-level comment/docstring disclosing that it will contact the network and modify files on disk.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.