Skip to main content

Внедрение скриптов

Общие сведения о рисках безопасности, связанных с внедрением скриптов и GitHub Actions рабочими процессами.

Осознание риска внедрения скриптов

При создании рабочих процессов, [пользовательских действий и составных действий](/actions/tutorials/create-actions/create-a-composite-action) следует всегда учитывать, может ли код выполнять ненадежные входные данные от злоумышленников. Это может произойти, когда злоумышленник добавляет в контекст вредоносные команды и сценарии. При запуске рабочего процесса эти строки могут быть интерпретированы как код, который затем выполняется в средстве выполнения тестов.

Злоумышленники могут добавлять собственное вредоносное содержимое в githubконтекст, что следует рассматривать как потенциально ненадежные входные данные. Эти контексты обычно заканчиваются на body, default_branch, email, head_ref, label, message, name, page_name,ref и title. Например, github.event.issue.title или github.event.pull_request.body.

Следует убедиться, что эти значения не передаются непосредственно в рабочие процессы, действия, вызовы API или куда-либо еще, где они могут быть интерпретированы как исполняемый код. Применяя ту же оборонительную позицию программирования, которую вы будете использовать для любого другого кода привилегированного приложения, вы можете помочь в обеспечении безопасности использования GitHub Actions. Сведения о некоторых шагах, которые может предпринять злоумышленник, см. в разделе Справочник по безопасному использованию.

Кроме того, существуют и другие менее очевидные источники потенциально ненадежных входных данных, такие как имена ветвей и адреса электронной почты, которые могут быть весьма гибкими с точки зрения разрешенного содержания. Например, zzz";echo${IFS}"hello";# будет допустимым именем ветви и возможным вектором атаки на целевой репозиторий.

В следующих разделах показано, как снизить риск внедрения скриптов.

Пример атаки путем внедрения сценария

Атака путем внедрения сценария может произойти непосредственно во встроенном сценарии рабочего процесса. В следующем примере действие использует выражение для проверки достоверности заголовка запроса на вытягивание, но также добавляет риск внедрения сценария:

      - name: Check PR title
        run: |
          title="${{ github.event.pull_request.title }}"
          if [[ $title =~ ^octocat ]]; then
          echo "PR title starts with 'octocat'"
          exit 0
          else
          echo "PR title did not start with 'octocat'"
          exit 1
          fi

Этот пример уязвим для внедрения сценария, так как команда run выполняется во временном сценарии оболочки в средстве выполнения тестов. Перед запуском скрипта оболочки вычисляются выражения внутри ${{ }} , а затем заменяются результируемыми значениями, что может сделать его уязвимым для внедрения команд оболочки.

Чтобы внедрить команды в этот рабочий процесс, злоумышленник может создать запрос на вытягивание с заголовком a"; ls $GITHUB_WORKSPACE":

Снимок экрана: заголовок запроса на вытягивание в режиме редактирования. В поле введен новый заголовок: a"; ls $GITHUB_WORKSPACE".

В этом примере " символ используется для прерыванияtitle="${{ github.event.pull_request.title }}"инструкции, что позволяет ls выполнять команду в средстве выполнения. Вы увидите выходные данные команды ls в журнале:

Run title="a"; ls $GITHUB_WORKSPACE""
README.md
code.yml
example.js

Рекомендации по обеспечению безопасности средств выполнения см. в разделе Справочник по безопасному использованию.