{"description":"Trending threats, MITRE ATT\u0026CK coverage, and detection metadata. Fed continuously.","favicon":"https://feed.craftedsignal.io/favicon-32x32.png","feed_url":"https://feed.craftedsignal.io/products/@argos-ci/cli/feed.json","home_page_url":"https://feed.craftedsignal.io/","icon":"https://feed.craftedsignal.io/apple-touch-icon.png","items":[{"_cs_actors":[],"_cs_cpes":[],"_cs_cves":[],"_cs_exploited":false,"_cs_has_poc":false,"_cs_poc_references":[],"_cs_products":["@argos-ci/core (\u003c= 6.2.0)","@argos-ci/cli"],"_cs_severities":["high"],"_cs_tags":["ci-cd","command-injection","supply-chain"],"_cs_type":"advisory","_cs_vendors":["Argos"],"content_html":"\u003cp\u003eThe @argos-ci/core package (version 6.2.0 and earlier) contains an OS command injection vulnerability located in the git interaction logic. When a project is configured with \u003ccode\u003ehasRemoteContentAccess: false\u003c/code\u003e, the Argos upload process triggers local Git commands, including \u003ccode\u003egit fetch\u003c/code\u003e and \u003ccode\u003egit merge-base\u003c/code\u003e, via Node.js \u003ccode\u003eexecSync\u003c/code\u003e calls. The vulnerability arises because the branch name (\u003ccode\u003einput.ref\u003c/code\u003e) and other input parameters are interpolated into command strings without any sanitization or escaping.\u003c/p\u003e\n\u003cp\u003eSince \u003ccode\u003eexecSync\u003c/code\u003e spawns a \u003ccode\u003e/bin/sh\u003c/code\u003e shell to execute the command, shell metacharacters provided in the CI branch name (such as \u003ccode\u003e$()\u003c/code\u003e, backticks, or \u003ccode\u003e;\u003c/code\u003e) are interpreted and executed by the shell before the \u003ccode\u003egit\u003c/code\u003e process begins. An attacker who can influence the CI environment variables or the branch name of a triggered build - such as via a pull request - can execute arbitrary OS commands on the CI runner. This allows for the theft of repository secrets, tampering with build artifacts, or lateral movement within the CI infrastructure.\u003c/p\u003e\n\u003ch2 id=\"attack-chain\"\u003eAttack Chain\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eAttacker creates a malicious pull request or branch name containing shell metacharacters, such as \u003ccode\u003emain$(touch /tmp/pwned)\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eThe CI pipeline initiates an Argos upload process within an environment where \u003ccode\u003ehasRemoteContentAccess\u003c/code\u003e is set to \u003ccode\u003efalse\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eThe \u003ccode\u003eargos\u003c/code\u003e CLI reads the malicious environment variable (e.g., \u003ccode\u003eGITHUB_HEAD_REF\u003c/code\u003e or \u003ccode\u003eARGOS_BRANCH\u003c/code\u003e) and passes it into the internal \u003ccode\u003econfig\u003c/code\u003e object.\u003c/li\u003e\n\u003cli\u003eThe \u003ccode\u003eupload.ts\u003c/code\u003e module calls \u003ccode\u003egetMergeBaseCommitSha()\u003c/code\u003e using the attacker-controlled branch name as the \u003ccode\u003ehead\u003c/code\u003e parameter.\u003c/li\u003e\n\u003cli\u003eThe \u003ccode\u003egitFetch()\u003c/code\u003e function in \u003ccode\u003epackages/core/src/ci-environment/git.ts\u003c/code\u003e receives the malicious string as the \u003ccode\u003eref\u003c/code\u003e input.\u003c/li\u003e\n\u003cli\u003eThe \u003ccode\u003eexecSync()\u003c/code\u003e function interpolates the malicious branch string into a shell command template literal.\u003c/li\u003e\n\u003cli\u003eThe underlying \u003ccode\u003e/bin/sh\u003c/code\u003e shell evaluates the embedded command substitution, executing the attacker's payload on the CI runner.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"impact\"\u003eImpact\u003c/h2\u003e\n\u003cp\u003eSuccessful exploitation results in full OS command execution on the build runner with the permissions of the CI agent process. This typically includes access to sensitive environment variables (API keys, cloud credentials, and repository secrets). Organizations using Argos in CI environments without external remote access verification are at risk, particularly those that process builds from untrusted contributors or forks.\u003c/p\u003e\n\u003ch2 id=\"recommendation\"\u003eRecommendation\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003eUpgrade to a version of \u003ccode\u003e@argos-ci/core\u003c/code\u003e that replaces vulnerable \u003ccode\u003eexecSync\u003c/code\u003e template-literal invocations with \u003ccode\u003eexecFileSync\u003c/code\u003e using discrete argument arrays to prevent shell interpolation.\u003c/li\u003e\n\u003cli\u003eIn the interim, implement strict input validation on all CI branch and reference environment variables to allow only alphanumeric characters, dashes, and underscores.\u003c/li\u003e\n\u003cli\u003eReview CI pipeline configurations to ensure that runners executing \u003ccode\u003eargos upload\u003c/code\u003e do not have access to sensitive secrets, or migrate to workflows that utilize \u003ccode\u003ehasRemoteContentAccess: true\u003c/code\u003e to avoid the vulnerable local Git code path.\u003c/li\u003e\n\u003c/ol\u003e\n","date_modified":"2026-09-11T00:54:24Z","date_published":"2026-09-11T00:54:24Z","id":"https://feed.craftedsignal.io/briefs/2026-09-argos-ci-rce/","summary":"The @argos-ci/core package is vulnerable to OS command injection when processing unvalidated branch or reference names in environments where hasRemoteContentAccess is disabled, allowing arbitrary code execution on CI runners.","title":"OS Command Injection in @argos-ci/core via CI Branch Names","url":"https://feed.craftedsignal.io/briefs/2026-09-argos-ci-rce/"}],"language":"en","title":"CraftedSignal Threat Feed - @Argos-Ci/Cli","version":"https://jsonfeed.org/version/1.1"}